diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 0c07fe8..bd615d9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -67,9 +67,47 @@ jobs:
permissions:
contents: read
+ # Empacota ANTES da tag: config de empacotamento quebrada não pode deixar uma
+ # tag publicada sem binário. Se este job falhar, nada foi criado ainda.
+ empacotar:
+ name: Empacotar
+ needs: [preparar, ci]
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v7
+
+ - uses: actions/setup-node@v7
+ with:
+ node-version: 24
+ cache: npm
+
+ - run: npm ci
+
+ - name: Garantir o binário do Electron
+ shell: pwsh
+ run: |
+ if (-not (Test-Path node_modules/electron/dist/electron.exe)) {
+ node node_modules/electron/install.js
+ }
+
+ - name: Instalador e portátil
+ run: npm run dist
+
+ # O E2E roda contra out/; só aqui o asar, o koffi desempacotado e a DLL em
+ # resources/ existem para ser testados.
+ - name: Fumaça no app empacotado
+ run: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON scripts/fumaca-empacotado.ts "dist/win-unpacked/WSLC UI.exe"
+
+ - uses: actions/upload-artifact@v7
+ with:
+ name: instaladores
+ path: dist/*.exe
+ if-no-files-found: error
+ retention-days: 7
+
publicar:
name: Publicar
- needs: [preparar, ci]
+ needs: [preparar, ci, empacotar]
runs-on: ubuntu-latest
permissions:
contents: write
@@ -85,6 +123,11 @@ jobs:
- name: Gerar as notas
run: npm run patchnotes -- --notas --saida notas.md
+ - uses: actions/download-artifact@v7
+ with:
+ name: instaladores
+ path: dist
+
- name: Criar a tag anotada
env:
TAG: ${{ needs.preparar.outputs.tag }}
@@ -103,5 +146,5 @@ jobs:
extra=()
# Versão com sufixo (0.2.0-rc.1) sai marcada como pré-lançamento.
if [[ "$VERSAO" == *-* ]]; then extra+=(--prerelease); fi
- gh release create "$TAG" --title "$TAG" --notes-file notas.md --verify-tag "${extra[@]}"
+ gh release create "$TAG" --title "$TAG" --notes-file notas.md --verify-tag "${extra[@]}" dist/*.exe
echo "[$TAG](https://github.com/$GITHUB_REPOSITORY/releases/tag/$TAG) publicada." >> "$GITHUB_STEP_SUMMARY"
diff --git a/.gitignore b/.gitignore
index 4436a83..ea683a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,8 +10,3 @@ playwright-report/
# Artefatos de build incremental do TypeScript / TanStack Router
*.tsbuildinfo
.tanstack/
-
-# SDK da Microsoft vendorizado — não redistribuído aqui.
-# Baixe o .nupkg Microsoft.WSL.Containers: ver vendor/wslcsdk/README.md
-vendor/wslcsdk/include/
-vendor/wslcsdk/win-x64/
diff --git a/README.md b/README.md
index 7616200..4f3a887 100644
--- a/README.md
+++ b/README.md
@@ -102,10 +102,32 @@ UI: o app já mostra o ID e tem terminal próprio). Detalhes na regra 18 do ROAD
## Motor nativo (wslcsdk via FFI)
-Além da CLI, o app carrega a **API C nativa** (`wslcsdk.dll`, vendorizada do NuGet
-`Microsoft.WSL.Containers` em `vendor/wslcsdk/`) via **koffi**: toda a superfície do header está
-vinculada em `src/main/services/wslc/native/bindings.ts`, e a view Sistema mostra o status do SDK
-(versão, DLL, componentes faltando).
+Além da CLI, o app carrega a **API C nativa** (`wslcsdk.dll`, do NuGet `Microsoft.WSL.Containers`)
+via **koffi**: toda a superfície do header está vinculada em
+`src/main/services/wslc/native/bindings.ts`, e a view Sistema mostra o status do SDK.
+
+### A DLL vem junto — e são duas
+
+O app **empacota** o SDK (`vendor/wslcsdk/`, licença MIT da Microsoft) e escolhe qual usar em tempo
+de execução, porque a versão do SDK precisa **casar** com a do WSL instalado. Isso foi medido nesta
+máquina, nas duas direções:
+
+| | WSL 2.9.4 | WSL 2.9.9 |
+| --------- | ------------------------------------------------ | ------------------------------------------------- |
+| SDK 2.9.3 | funciona | `WSLC_E_SDK_UPDATE_NEEDED` já no `WslcGetVersion` |
+| SDK 2.9.9 | **segfault** em `WslcGetSessionTerminationEvent` | funciona |
+
+SDK novo demais é o caso perigoso: **nada no header denuncia** — a declaração da função que quebra é
+byte a byte idêntica nas duas versões, e os 18 structs também. Não há binding que se defenda; o
+processo simplesmente morre. Daí a regra em `native/bundled.ts`: usar a DLL mais nova que **não
+passe** da versão do WSL. Quem quiser outra escolhe o arquivo na aba **Sistema** — o app sonda a DLL
+(carrega, lê, descarrega) antes de aceitar, e a troca vale ao reabrir, porque a sessão viva segura
+handles da atual.
+
+A 2.9.9 também mudou **duas assinaturas** sem mudar nada visível (`WslcSessionAuthenticate` ganhou
+`tokenType`; `WslcInstallWithDependencies` ganhou `components` e `options`), o que corromperia login
+em registry e instalação guiada em silêncio. O `bindings.ts` detecta a ABI pela presença do símbolo
+`WslcOpenContainer` e adapta as chamadas.
**Fases 1 a 7 (roadmap completo + cobertura 100%):** toggle **Motor: CLI / Nativo** em Sistema
(persistido em `settings.json`). No motor nativo o app mantém uma sessão própria (`WslcUi`,
@@ -276,6 +298,7 @@ npm test # vitest (test:watch, test:coverage)
npm run test:e2e # build + Playwright contra o app Electron (e2e/)
npm run check # typecheck + lint + format:check + test + patchnotes
npm run patchnotes # valida o patchnotes.json (--notas gera as notas da release)
+npm run dist # instalador NSIS + portátil em dist/ (electron-builder)
npm run cenario:nativo # povoa a sessão nativa com o cenário de teste (app fechado)
```
@@ -486,8 +509,15 @@ Publicar uma versão é **subir o `version` do `package.json` e escrever as nota
3. roda o CI inteiro no estado da `main` que vai virar tag;
4. cria a tag anotada `v` e publica a release com o corpo gerado do `patchnotes.json`.
-Versão com sufixo (`0.2.0-rc.1`) sai marcada como pré-lançamento. A release leva as notas e a tag,
-sem instalador: a `wslcsdk.dll` da Microsoft não é redistribuída aqui (ver [Licença](#licença)).
+Entre o passo 3 e o 4 o workflow **empacota** (instalador NSIS e portátil) e roda um teste de fumaça
+que abre o `.exe` de verdade — asar, koffi desempacotado e DLL em `resources/` são três coisas que só
+existem no app empacotado e que o E2E, rodando contra `out/`, nunca tocaria. Empacotar antes de criar
+a tag é de propósito: uma config quebrada não pode deixar uma tag publicada sem binário.
+
+Os dois `.exe` sobem como assets da release. **Não são assinados**: o SmartScreen vai avisar "editor
+desconhecido" e exigir _Mais informações → Executar assim mesmo_.
+
+Versão com sufixo (`0.2.0-rc.1`) sai marcada como pré-lançamento.
## Licença
@@ -495,8 +525,9 @@ Código deste repositório: **MIT** — ver [LICENSE](LICENSE).
### Componentes de terceiros
-- **`Microsoft.WSL.Containers`** (`wslcsdk.dll` / `wslcsdk.h`) — SDK da Microsoft, em preview, sob a
- licença do próprio pacote NuGet. **Não é redistribuído aqui**; baixe conforme
+- **`Microsoft.WSL.Containers`** (`wslcsdk.dll`) — SDK da Microsoft, em preview, sob licença **MIT**
+ (© Microsoft Corporation). É **redistribuído aqui**, no repositório e dentro do instalador, com
+ `LICENSE.txt` e `NOTICE.txt` do próprio pacote — ver
[`vendor/wslcsdk/README.md`](vendor/wslcsdk/README.md).
- **`wslc.exe`** — parte do WSL, distribuída pela Microsoft. Este projeto apenas o consome; não o
inclui nem o modifica.
diff --git a/ROADMAP.md b/ROADMAP.md
index 948f3aa..61608fa 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -350,6 +350,23 @@ Electron é por pasta de dados). No caminho, uma brecha real foi fechada: o
`setWindowOpenHandler` chamava `shell.openExternal` direto, fora do IPC — os
links de referência em Sistema abririam o navegador até em modo demo.
+### O que a 2.9.9 do SDK mudou (medido)
+
+`WslcOpenContainer` **levanta a limitação principal** documentada acima: um container criado numa
+execução do app pode ser reaberto por nome ou ID em outra. Medido: soltar a sessão derruba o
+container para EXITED, mas o registro fica; reabrir devolve um handle utilizável, e `Start` o põe
+de volta em RUNNING. O app passou a lembrar em disco (`native/known.ts`) os containers que criou e a
+reabri-los, em vez de apagá-los ao fechar — o que só era necessário porque, sem abrir por ID, eles
+virariam órfãos invisíveis. Na ABI 2.9.3 o comportamento antigo continua.
+
+Continua **não havendo enumeração** de containers: o único jeito de reencontrá-los é o app lembrar
+os nomes.
+
+E há uma armadilha nova, já tratada em `native/bundled.ts`: o SDK precisa CASAR com a versão do WSL.
+SDK novo demais dá segfault (`WslcGetSessionTerminationEvent` num WSL mais antigo); SDK velho demais
+é recusado com `WSLC_E_SDK_UPDATE_NEEDED` em qualquer chamada. Duas assinaturas também mudaram sem
+mudança visível no header — ver `SdkAbi`.
+
**Cobertura 100% da superfície do wslc 2.9.4 (CLI e SDK)** — tudo que a CLI e
o wslcsdk.h expõem está na UI, implementado nos dois motores quando possível,
ou documentado com o motivo quando não: `session enter/run/shell` (interativos
diff --git a/build/icon.ico b/build/icon.ico
new file mode 100644
index 0000000..e96ac40
Binary files /dev/null and b/build/icon.ico differ
diff --git a/build/icon.png b/build/icon.png
new file mode 100644
index 0000000..56ef653
Binary files /dev/null and b/build/icon.png differ
diff --git a/build/icon.svg b/build/icon.svg
new file mode 100644
index 0000000..ae33757
--- /dev/null
+++ b/build/icon.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/e2e/system.spec.ts b/e2e/system.spec.ts
index 55e29f4..22574f5 100644
--- a/e2e/system.spec.ts
+++ b/e2e/system.spec.ts
@@ -74,7 +74,8 @@ test.describe('Sistema · motor de execução', () => {
await expect(page.getByText('disponível', { exact: true })).toBeVisible()
await expect(page.getByText('0.9.0')).toBeVisible()
- await expect(page.getByText(/wslcsdk\.dll/)).toBeVisible()
+ // Específico: "wslcsdk.dll" sozinho casa também com o título da seção da DLL.
+ await expect(page.getByText(/demo.*wslcsdk\.dll/)).toBeVisible()
})
test('troca da CLI para o nativo e volta', async ({ page }) => {
@@ -256,3 +257,64 @@ test.describe('Sistema · caminhos tristes', () => {
})
})
})
+
+test.describe('Sistema · escolha da wslcsdk.dll', () => {
+ test('mostra a DLL empacotada, com origem e ABI', async ({ page }) => {
+ await goToSystem(page)
+
+ await expect(page.getByText('empacotada com o app')).toBeVisible()
+ await expect(page.getByText('2.9.9+', { exact: true })).toBeVisible()
+ await expect(page.getByRole('button', { name: /Escolher outra DLL/ })).toBeVisible()
+ // Sem escolha própria, não há o que desfazer.
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden()
+ })
+
+ test.describe('escolhendo uma DLL válida', () => {
+ test.use({ pick: 'D:\\baixado\\wslcsdk.dll' })
+
+ test('sonda, aceita e avisa que vale ao reabrir', async ({ page }) => {
+ await goToSystem(page)
+ await page.getByRole('button', { name: /Escolher outra DLL/ }).click()
+
+ await expectToast(page, /2\.9\.9\+ escolhida.*[Rr]eabra/)
+ await expect(page.getByText('D:\\baixado\\wslcsdk.dll')).toBeVisible()
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeVisible()
+ })
+
+ test('voltar para a empacotada limpa a escolha', async ({ page }) => {
+ await goToSystem(page)
+ await page.getByRole('button', { name: /Escolher outra DLL/ }).click()
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeVisible()
+
+ await page.getByRole('button', { name: 'Usar a empacotada' }).click()
+ await expectToast(page, /Voltando para a DLL empacotada/)
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden()
+ })
+ })
+
+ // O ponto do seletor: recusar ANTES de gravar. Sem isso, o erro só apareceria
+ // na próxima abertura do app, com o motor nativo fora do ar e sem pista.
+ test.describe('escolhendo um arquivo que não serve', () => {
+ test.use({ pick: 'C:\\Downloads\\leia-me.txt' })
+
+ test('recusa e não grava a escolha', async ({ page }) => {
+ await goToSystem(page)
+ await page.getByRole('button', { name: /Escolher outra DLL/ }).click()
+
+ await expectToast(page, /Não é uma wslcsdk.dll utilizável/)
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden()
+ })
+ })
+
+ test.describe('cancelando o diálogo', () => {
+ test.use({ pick: 'cancel' })
+
+ test('não muda nada', async ({ page }) => {
+ await goToSystem(page)
+ await page.getByRole('button', { name: /Escolher outra DLL/ }).click()
+
+ await expect(page.getByText('empacotada com o app')).toBeVisible()
+ await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden()
+ })
+ })
+})
diff --git a/electron-builder.yml b/electron-builder.yml
new file mode 100644
index 0000000..a8ac972
--- /dev/null
+++ b/electron-builder.yml
@@ -0,0 +1,67 @@
+appId: com.blackfoxsoftware.wslc-ui
+productName: WSLC UI
+copyright: © 2026 Rafael de Souza Sell
+
+directories:
+ output: dist
+ buildResources: build
+
+# O padrão do electron-builder já é "tudo menos o óbvio"; aqui só tiramos o que
+# é de desenvolvimento. `vendor` sai porque as DLLs entram por extraResources —
+# incluí-las nos dois lugares custaria 10 MB à toa.
+files:
+ - '!.github/**'
+ - '!e2e/**'
+ - '!scripts/**'
+ - '!src/**'
+ - '!vendor/**'
+ - '!coverage/**'
+ - '!test-results/**'
+ - '!playwright-report/**'
+ - '!{electron.vite.config.ts,playwright.config.ts,vitest.config.ts}'
+ - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json,tsconfig.e2e.json}'
+ - '!{.oxlintrc.json,.oxfmtrc.jsonc,skills-lock.json,patchnotes.json}'
+ - '!{README.md,ROADMAP.md,CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md}'
+
+# koffi carrega um .node por dlopen: dentro do asar ele não existe como arquivo
+# de verdade, e o require falha em tempo de execução.
+asarUnpack:
+ - '**/node_modules/koffi/**'
+
+# As duas wslcsdk.dll vão para resources/, de onde o locate as procura no app
+# instalado (process.resourcesPath). LICENSE e NOTICE acompanham porque o
+# pacote é MIT: redistribuir exige carregar os avisos junto.
+extraResources:
+ - from: vendor/wslcsdk/win-x64
+ to: vendor/wslcsdk/win-x64
+ - from: vendor/wslcsdk/LICENSE.txt
+ to: vendor/wslcsdk/LICENSE.txt
+ - from: vendor/wslcsdk/NOTICE.txt
+ to: vendor/wslcsdk/NOTICE.txt
+
+win:
+ icon: build/icon.ico
+ target:
+ - target: nsis
+ arch: [x64]
+ - target: portable
+ arch: [x64]
+ # Sem certificado: o SmartScreen vai avisar "editor desconhecido". Assinar
+ # depois não exige refazer nada aqui além de apontar o .pfx.
+ signAndEditExecutable: true
+
+nsis:
+ oneClick: false
+ perMachine: false
+ allowToChangeInstallationDirectory: true
+ createDesktopShortcut: true
+ createStartMenuShortcut: true
+ shortcutName: WSLC UI
+ artifactName: ${name}-${version}-setup.${ext}
+ uninstallDisplayName: WSLC UI ${version}
+
+portable:
+ artifactName: ${name}-${version}-portable.${ext}
+
+# Não publica sozinho: quem cria a release é o workflow, a partir da tag.
+publish: null
diff --git a/package-lock.json b/package-lock.json
index 7ee2d53..29acf0a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,27 +7,17 @@
"": {
"name": "wslc-ui",
"version": "0.1.0",
+ "license": "MIT",
"dependencies": {
- "@heroui/react": "^3.2.4",
- "@heroui/styles": "^3.2.4",
- "@tailwindcss/vite": "^4.3.3",
- "@tanstack/react-router": "^1.170.32",
- "@xterm/addon-fit": "^0.11.0",
- "@xterm/xterm": "^6.0.0",
- "clsx": "^2.1.1",
"koffi": "^3.1.6",
- "lucide-react": "^1.33.0",
- "react": "^19.2.8",
- "react-aria": "^3.52.0",
- "react-aria-components": "^1.21.0",
- "react-dom": "^19.2.8",
- "tailwind-merge": "^3.6.0",
- "tailwindcss": "^4.3.3",
- "zod": "^4.4.3",
- "zustand": "^5.0.15"
+ "zod": "^4.4.3"
},
"devDependencies": {
+ "@heroui/react": "^3.2.4",
+ "@heroui/styles": "^3.2.4",
"@playwright/test": "^1.62.1",
+ "@tailwindcss/vite": "^4.3.3",
+ "@tanstack/react-router": "^1.170.32",
"@tanstack/router-plugin": "^1.168.35",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.6",
@@ -36,20 +26,33 @@
"@types/react-dom": "^19.2.4",
"@vitejs/plugin-react": "^5.2.0",
"@vitest/coverage-v8": "^4.1.10",
+ "@xterm/addon-fit": "^0.11.0",
+ "@xterm/xterm": "^6.0.0",
+ "clsx": "^2.1.1",
"electron": "^43.4.1",
+ "electron-builder": "^26.15.3",
"electron-vite": "^5.0.0",
"happy-dom": "^20.11.6",
+ "lucide-react": "^1.33.0",
"oxfmt": "^0.64.0",
"oxlint": "^1.79.0",
+ "react": "^19.2.8",
+ "react-aria": "^3.52.0",
+ "react-aria-components": "^1.21.0",
+ "react-dom": "^19.2.8",
+ "tailwind-merge": "^3.6.0",
+ "tailwindcss": "^4.3.3",
"typescript": "^7.0.2",
"vite": "^7.3.6",
- "vitest": "^4.1.10"
+ "vitest": "^4.1.10",
+ "zustand": "^5.0.15"
}
},
"node_modules/@adobe/react-spectrum": {
"version": "3.47.4",
"resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.47.4.tgz",
"integrity": "sha512-SK5Wh1HhuI2sAL5/uZ6Cr3MucbvL49VQAfxmXIw6Uy++icifMVM02QVdouYdKzgYAEc3gKsgCQ8voTFED6PHXA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@internationalized/date": "^3.12.4",
@@ -74,6 +77,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.1.tgz",
"integrity": "sha512-wcrbEE2O/9WnEn6avBnaVRRx88S5PLFsPLr4wffzlbMfXeQsy+RMQwaJd3cbzrn18/j04Isit7f7Emfn0dhrJA==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0",
@@ -84,6 +88,7 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.5.tgz",
"integrity": "sha512-b53VIPwPWKb/T5gzE3qs+QlGP5gVrw/LnWV3xMksDU+CRl3rzOKUwxIGiZO8ICyYh1WiyqY4myGlPU/nAynBUg==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0",
@@ -344,6 +349,7 @@
"version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
"integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -417,6 +423,86 @@
"node": ">=22.12.0"
}
},
+ "node_modules/@electron/asar": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
+ "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "asar": "bin/asar.js"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/@electron/asar/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@electron/asar/node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@electron/asar/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@electron/fuses": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz",
+ "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "electron-fuses": "dist/bin.js"
+ }
+ },
+ "node_modules/@electron/fuses/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@electron/get": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz",
@@ -451,6 +537,199 @@
"node": ">=10"
}
},
+ "node_modules/@electron/notarize": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz",
+ "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@electron/notarize/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@electron/osx-sign": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz",
+ "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "compare-version": "^0.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.0.0",
+ "isbinaryfile": "^4.0.8",
+ "minimist": "^1.2.6",
+ "plist": "^3.0.5"
+ },
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/@electron/rebuild": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz",
+ "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "debug": "^4.1.1",
+ "node-abi": "^4.2.0",
+ "node-api-version": "^0.2.1",
+ "node-gyp": "^12.2.0",
+ "read-binary-file-arch": "^1.0.6"
+ },
+ "bin": {
+ "electron-rebuild": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/@electron/universal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz",
+ "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@electron/asar": "^3.3.1",
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^4.2.0",
+ "fs-extra": "^11.1.1",
+ "minimatch": "^9.0.3",
+ "plist": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16.4"
+ }
+ },
+ "node_modules/@electron/universal/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@electron/universal/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@electron/universal/node_modules/fs-extra": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz",
+ "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/@electron/universal/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@electron/windows-sign": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
+ "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "cross-dirname": "^0.1.0",
+ "debug": "^4.3.4",
+ "fs-extra": "^11.1.1",
+ "minimist": "^1.2.8",
+ "postject": "^1.0.0-alpha.6"
+ },
+ "bin": {
+ "electron-windows-sign": "bin/electron-windows-sign.js"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/@electron/windows-sign/node_modules/fs-extra": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz",
+ "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
@@ -897,6 +1176,7 @@
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz",
"integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==",
+ "dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
@@ -910,6 +1190,7 @@
"version": "2.2.7",
"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz",
"integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==",
+ "dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
@@ -920,6 +1201,7 @@
"version": "2.11.4",
"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz",
"integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==",
+ "dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
@@ -932,6 +1214,7 @@
"version": "1.8.16",
"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz",
"integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==",
+ "dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
@@ -943,6 +1226,7 @@
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz",
"integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==",
+ "dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
@@ -953,6 +1237,7 @@
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/@heroui/react/-/react-3.2.4.tgz",
"integrity": "sha512-ZXCTyz1G7bgCdHVxRPy4vIRI/wdb0ZvzEUJGG7CAEp0zqQsKrTH1o9i3Ns8yM6EidtAyfMosULN29gFA3wegBA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@heroui/styles": "3.2.4",
@@ -979,6 +1264,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz",
"integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@radix-ui/react-context": "1.1.3",
@@ -1006,6 +1292,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
"integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -1021,6 +1308,7 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz",
"integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -1036,6 +1324,7 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
"integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@radix-ui/react-slot": "1.2.4"
@@ -1059,6 +1348,7 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
"integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.2"
@@ -1077,6 +1367,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
"integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -1092,6 +1383,7 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
"integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"use-sync-external-store": "^1.5.0"
@@ -1110,6 +1402,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
"integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -1125,6 +1418,7 @@
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz",
"integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc",
@@ -1135,6 +1429,7 @@
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
"integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==",
+ "dev": true,
"license": "MIT",
"funding": {
"type": "github",
@@ -1145,6 +1440,7 @@
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/@heroui/styles/-/styles-3.2.4.tgz",
"integrity": "sha512-tjiT7VFUSjw7TA6ZjeT+D3oX62+D27l7dhPwW+emwPnkdkRoKALFJEPBsxpmEI/x18uNkKFIoTk85bICyOO8Vg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"tailwind-variants": "3.3.1",
@@ -1158,6 +1454,7 @@
"version": "3.12.4",
"resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.4.tgz",
"integrity": "sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@@ -1167,6 +1464,7 @@
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.10.tgz",
"integrity": "sha512-nc0Or6EdWHqZRcsXb6P9hBIpLsfSl/ILh0rk5h/OVBpzmhdExXtPy2cQtWsq8XKRBpRHwDNnAHt4OpolcB7dog==",
+ "dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
@@ -1178,6 +1476,7 @@
"version": "3.6.8",
"resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.8.tgz",
"integrity": "sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
@@ -1187,15 +1486,30 @@
"version": "3.2.10",
"resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.10.tgz",
"integrity": "sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
}
},
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -1206,6 +1520,7 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -1216,6 +1531,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -1225,12 +1541,14 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -1477,6 +1795,61 @@
"url": "https://liberapay.com/Koromix"
}
},
+ "node_modules/@malept/cross-spawn-promise": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
+ "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/malept"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+ }
+ ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/@malept/flatpak-bundler": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
+ "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.15",
+ "tmp-promise": "^3.0.2"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@napi-rs/lzma-linux-x64-gnu": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
@@ -1484,6 +1857,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -1496,6 +1870,19 @@
"node": "^22.20 || ^24.12 || >=25"
}
},
+ "node_modules/@noble/hashes": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz",
+ "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@oxfmt/binding-android-arm-eabi": {
"version": "0.64.0",
"resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.64.0.tgz",
@@ -2190,14 +2577,69 @@
"node": "^20.19.0 || >=22.12.0"
}
},
- "node_modules/@playwright/test": {
- "version": "1.62.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz",
- "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==",
+ "node_modules/@peculiar/asn1-schema": {
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz",
+ "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "playwright": "1.62.1"
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.10",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@peculiar/json-schema": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz",
+ "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@peculiar/utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
+ "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/webcrypto": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz",
+ "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.7.0",
+ "@peculiar/json-schema": "^1.1.12",
+ "@peculiar/utils": "^2.0.2",
+ "tslib": "^2.8.1",
+ "webcrypto-core": "^1.9.2"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/@playwright/test": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz",
+ "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.62.1"
},
"bin": {
"playwright": "cli.js"
@@ -2210,6 +2652,7 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.2.1.tgz",
"integrity": "sha512-v/pZh1yBNeayQ5Kio0xRIX0gBf6uu+KjCRW4QSydTyRpmhvk6sMzHT9i9/vIMdaDHaYHBXlXF+Tp/mvS9CG4Zw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0",
@@ -2224,6 +2667,7 @@
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.13.1.tgz",
"integrity": "sha512-z56ZYcbfpNmMyiGLhyEjytpmEfoTlBaksk84q4kds3HvNkf7QWKj+DJVfVDrJX+c1LyuBsszLSX7yxJRiHsYKQ==",
+ "dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
@@ -2242,6 +2686,7 @@
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.10.1.tgz",
"integrity": "sha512-jn038/ZYmu6DpfXJ6r2U9zFFppjbc9wnApPJSCxao2RZVEqep4YyoniHSy8qv6V21/xyS4IV7W9a+X2jOjSuag==",
+ "dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
@@ -2260,6 +2705,7 @@
"version": "3.34.1",
"resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.34.1.tgz",
"integrity": "sha512-H6+rGZL+0f58bBNaUMfctEnT+NogqwAk+nHiB8sR3K+YlQ37GTuCijy2U/pPvQtFMS5mURrjZeBH5JNNXsx14A==",
+ "dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
@@ -2276,6 +2722,7 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@react-spectrum/color/-/color-3.2.1.tgz",
"integrity": "sha512-FbB+GaVufsN+obNJmUAe8XGZTeJjEWvEf/k/7nxDxoDCBdg/o6eEPONAZyID5Dj1f8BZKNym8VURxDZx7IIyuQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@adobe/react-spectrum": "^3.47.0",
@@ -2291,6 +2738,7 @@
"version": "3.11.1",
"resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.11.1.tgz",
"integrity": "sha512-TsoNdVdmlQ7L+75ILq5Yb3+wp/I1AtIeat0o+Y+ZBxP+TtWpwT1ZtCB5l3cplFVzHzOpZlzO0VaDrDP9ElGYDw==",
+ "dev": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
@@ -2306,6 +2754,7 @@
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.10.1.tgz",
"integrity": "sha512-v4YlLa/oRQpPa/M9Yq1e0Bl8Z7xzGZdNDAIbfIMZuiJtacaOKriPW+AOgjjT/Ab0fNX2YDbwIYvkiMOJBnTi5A==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0",
@@ -2320,6 +2769,7 @@
"version": "3.12.1",
"resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.12.1.tgz",
"integrity": "sha512-NqKfzrknpfwiewx7R2vk1P+CneClInPDsIhw15+jOcUYSEfej0nta4cJywuKQJ2gsPwqX/ojDNixedCve9FWGw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0",
@@ -2334,6 +2784,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.2.0.tgz",
"integrity": "sha512-beV3vz80nzZ1EuYUM7296Kyi3AHcMrbQw0qub/9yzHWVTKKc5sy/e4dCMKcWL/ArkeAyc7jDOiui190RQ4l0Fw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@react-aria/color": "^3.2.0",
@@ -2350,6 +2801,7 @@
"version": "3.36.1",
"resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.36.1.tgz",
"integrity": "sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==",
+ "dev": true,
"license": "Apache-2.0",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
@@ -2369,6 +2821,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2382,6 +2835,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2395,6 +2849,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2408,6 +2863,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2421,6 +2877,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2434,6 +2891,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2447,6 +2905,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2463,6 +2922,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2479,6 +2939,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2495,6 +2956,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2511,6 +2973,7 @@
"cpu": [
"loong64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2527,6 +2990,7 @@
"cpu": [
"loong64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2543,6 +3007,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2559,6 +3024,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2575,6 +3041,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2591,6 +3058,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2607,6 +3075,7 @@
"cpu": [
"s390x"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2623,6 +3092,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2639,6 +3109,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2655,6 +3126,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2668,6 +3140,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2681,6 +3154,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2694,6 +3168,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2707,6 +3182,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2720,16 +3196,31 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
"node_modules/@spectrum-icons/ui": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.7.2.tgz",
"integrity": "sha512-7IuSHO+Ck8gJUIGIXqDcDIU4R8RHRUZhlfz8AwN1rSdCEvdgp6DWYN0LDTMrWh7TN/H5hrJ7oDO/gUpR3TnBjw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@adobe/react-spectrum-ui": "1.2.1",
@@ -2746,6 +3237,7 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.3.2.tgz",
"integrity": "sha512-UkVg8Kp9rInjfqtG27in9p7RWfN9JFSvZr7ZOpN2n9jkrQ1y88hZpK8dKce8lgVb7jALXtsi2p0rjyaWzO0QsA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@adobe/react-spectrum-workflow": "2.3.5",
@@ -2768,15 +3260,30 @@
"version": "0.5.23",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
"integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.8.0"
}
},
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "defer-to-connect": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@tailwindcss/node": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
"integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
@@ -2792,6 +3299,7 @@
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
"integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 20"
@@ -2818,6 +3326,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2834,6 +3343,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2850,6 +3360,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2866,6 +3377,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2882,6 +3394,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -2898,6 +3411,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2917,6 +3431,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2936,6 +3451,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -2955,6 +3471,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -2982,6 +3499,7 @@
"cpu": [
"wasm32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -3003,6 +3521,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3019,6 +3538,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -3032,6 +3552,7 @@
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
"integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@tailwindcss/node": "4.3.3",
@@ -3046,6 +3567,7 @@
"version": "1.162.1",
"resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.1.tgz",
"integrity": "sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=20.19"
@@ -3059,6 +3581,7 @@
"version": "1.170.32",
"resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.32.tgz",
"integrity": "sha512-SIpxvaTKco100a5ZR3ePmArbhtm3XOx+w1dpGYY9gxHDta4iXSKDdQuhLonwJbIMkVJsU1rwXf0UDHMrF/1snw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@tanstack/history": "1.162.1",
@@ -3082,6 +3605,7 @@
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz",
"integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@tanstack/store": "0.9.3",
@@ -3100,6 +3624,7 @@
"version": "1.171.27",
"resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.27.tgz",
"integrity": "sha512-wDwSLvoLwIaNcnx9UNcN9Mb7Y8QwCYq1U1RQZwyN186gnkIoIYI2SOxy8VqH1vFigbkHkk4FmwMAQlghPgDK2g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@tanstack/history": "1.162.1",
@@ -3216,6 +3741,7 @@
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz",
"integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==",
+ "dev": true,
"license": "MIT",
"funding": {
"type": "github",
@@ -3352,6 +3878,19 @@
"@babel/types": "^7.28.2"
}
},
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
+ }
+ },
"node_modules/@types/chai": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
@@ -3363,6 +3902,16 @@
"assertion-error": "^2.0.1"
}
},
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
"node_modules/@types/deep-eql": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
@@ -3374,13 +3923,48 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
"integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "26.2.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz",
"integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~8.3.0"
@@ -3390,7 +3974,7 @@
"version": "19.2.18",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
"integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"csstype": "^3.2.2"
@@ -3400,12 +3984,22 @@
"version": "19.2.4",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "^19.2.0"
}
},
+ "node_modules/@types/responselike": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
+ "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/whatwg-mimetype": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz",
@@ -3928,28 +4522,76 @@
"url": "https://opencollective.com/vitest"
}
},
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.15",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz",
+ "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/@xterm/addon-fit": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz",
"integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@xterm/xterm": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz",
"integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==",
+ "dev": true,
"license": "MIT",
"workspaces": [
"addons/*"
]
},
+ "node_modules/abbrev": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
+ "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=8"
}
@@ -3978,73 +4620,331 @@
"node": ">=14"
}
},
- "node_modules/aria-hidden": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
- "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "node_modules/app-builder-lib": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz",
+ "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "tslib": "^2.0.0"
+ "@electron/asar": "3.4.1",
+ "@electron/fuses": "^1.8.0",
+ "@electron/get": "^3.0.0",
+ "@electron/notarize": "2.5.0",
+ "@electron/osx-sign": "1.3.3",
+ "@electron/rebuild": "^4.0.4",
+ "@electron/universal": "2.0.3",
+ "@malept/flatpak-bundler": "^0.4.0",
+ "@noble/hashes": "^2.2.0",
+ "@peculiar/webcrypto": "^1.7.1",
+ "@types/fs-extra": "9.0.13",
+ "ajv": "^8.18.0",
+ "asn1js": "^3.0.10",
+ "async-exit-hook": "^2.0.1",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chromium-pickle-js": "^0.2.0",
+ "ci-info": "4.3.1",
+ "debug": "^4.3.4",
+ "dotenv": "^16.4.5",
+ "dotenv-expand": "^11.0.6",
+ "ejs": "^3.1.8",
+ "electron-publish": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "hosted-git-info": "^4.1.0",
+ "isbinaryfile": "^5.0.0",
+ "jiti": "^2.4.2",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.3",
+ "lazy-val": "^1.0.5",
+ "minimatch": "^10.2.5",
+ "pkijs": "^3.4.0",
+ "plist": "3.1.0",
+ "proper-lockfile": "^4.1.2",
+ "resedit": "^1.7.0",
+ "semver": "~7.7.3",
+ "tar": "^7.5.7",
+ "temp-file": "^3.4.0",
+ "tiny-async-pool": "1.3.0",
+ "unzipper": "^0.12.3",
+ "which": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "dmg-builder": "26.15.3",
+ "electron-builder-squirrel-windows": "26.15.3"
}
},
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "node_modules/app-builder-lib/node_modules/@electron/get": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz",
+ "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==",
"dev": true,
- "license": "Apache-2.0",
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "dequal": "^2.0.3"
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
}
},
- "node_modules/assertion-error": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/ast-v8-to-istanbul": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz",
- "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==",
+ "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.31",
- "estree-walker": "^3.0.3",
- "js-tokens": "^10.0.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
- "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
+ "node_modules/app-builder-lib/node_modules/ci-info": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true,
- "license": "MIT"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/babel-dead-code-elimination": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz",
- "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==",
+ "node_modules/app-builder-lib/node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/core": "^7.23.7",
- "@babel/parser": "^7.23.6",
- "@babel/traverse": "^7.23.7",
- "@babel/types": "^7.23.6"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/baseline-browser-mapping": {
- "version": "2.11.18",
+ "node_modules/app-builder-lib/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/asn1js": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
+ "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.5",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz",
+ "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.31",
+ "estree-walker": "^3.0.3",
+ "js-tokens": "^10.0.0"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
+ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/babel-dead-code-elimination": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz",
+ "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.7",
+ "@babel/parser": "^7.23.6",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.18",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.18.tgz",
"integrity": "sha512-1iEmLEYSiE1SeBoAfPo/Mnx3PzfzHUkDK61ASkCpuk3YXugYLH5DYK1SzqV55F8FMI6s0F+/tCP7Polz1QRjxw==",
"dev": true,
@@ -4056,6 +4956,35 @@
"node": ">=6.0.0"
}
},
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/browserslist": {
"version": "4.28.8",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
@@ -4090,6 +5019,13 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/buffer-image-size": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz",
@@ -4103,6 +5039,56 @@
"node": ">=4.0"
}
},
+ "node_modules/builder-util": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz",
+ "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.1.6",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "js-yaml": "^4.1.0",
+ "sanitize-filename": "^1.6.3",
+ "source-map-support": "^0.5.19",
+ "stat-mode": "^1.0.0",
+ "temp-file": "^3.4.0",
+ "tiny-async-pool": "1.3.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/builder-util-runtime": {
+ "version": "9.7.0",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz",
+ "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/bytestreamjs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
+ "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/cac": {
"version": "6.7.14",
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@@ -4113,6 +5099,49 @@
"node": ">=8"
}
},
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
+ "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001809",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz",
@@ -4144,6 +5173,39 @@
"node": ">=18"
}
},
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/chokidar": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
@@ -4160,38 +5222,217 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"dev": true,
"license": "MIT"
},
- "node_modules/cookie-es": {
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie-es": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz",
"integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/cross-dirname": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
+ "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/debug": {
@@ -4216,9 +5457,97 @@
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
"integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
"license": "MIT",
"peer": true
},
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -4234,11 +5563,20 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/diff": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
@@ -4249,6 +5587,61 @@
"node": ">=0.3.1"
}
},
+ "node_modules/dir-compare": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz",
+ "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5",
+ "p-limit": "^3.1.0 "
+ }
+ },
+ "node_modules/dir-compare/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dir-compare/node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/dir-compare/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dmg-builder": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz",
+ "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "js-yaml": "^4.1.0"
+ }
+ },
"node_modules/dom-accessibility-api": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
@@ -4261,12 +5654,83 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
"integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.8.7",
"csstype": "^3.0.2"
}
},
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dotenv": "^16.4.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/electron": {
"version": "43.4.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-43.4.1.tgz",
@@ -4286,6 +5750,63 @@
"node": ">= 22.12.0"
}
},
+ "node_modules/electron-builder": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz",
+ "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "dmg-builder": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "simple-update-notifier": "2.0.0",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "electron-builder": "cli.js",
+ "install-app-deps": "install-app-deps.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/electron-builder-squirrel-windows": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz",
+ "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "electron-winstaller": "5.4.0"
+ }
+ },
+ "node_modules/electron-publish": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz",
+ "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/fs-extra": "^9.0.11",
+ "aws4": "^1.13.2",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "form-data": "^4.0.5",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "mime": "^2.5.2"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.412",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz",
@@ -4323,10 +5844,70 @@
}
}
},
- "node_modules/electron/node_modules/@types/node": {
- "version": "24.13.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
- "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
+ "node_modules/electron-winstaller": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz",
+ "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@electron/asar": "^3.2.1",
+ "debug": "^4.1.1",
+ "fs-extra": "^7.0.1",
+ "lodash": "^4.17.21",
+ "temp": "^0.9.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@electron/windows-sign": "^1.1.2"
+ }
+ },
+ "node_modules/electron-winstaller/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/electron-winstaller/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/electron-winstaller/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/electron/node_modules/@types/node": {
+ "version": "24.13.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
+ "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4340,10 +5921,28 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/enhanced-resolve": {
"version": "5.24.5",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz",
"integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -4379,6 +5978,33 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz",
@@ -4386,6 +6012,43 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/esbuild": {
"version": "0.25.12",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
@@ -4428,81 +6091,426 @@
"@esbuild/win32-x64": "0.25.12"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz",
+ "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz",
+ "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=6"
+ "node": "*"
}
},
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
+ "optional": true,
"dependencies": {
- "@types/estree": "^1.0.0"
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=10.0"
}
},
- "node_modules/expect-type": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
- "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "node_modules/global-agent/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=12.0.0"
+ "node": ">=10"
}
},
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12.0.0"
+ "optional": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
- "peerDependencies": {
- "picomatch": "^3 || ^4"
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/got": {
+ "version": "11.8.6",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+ "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=10.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/happy-dom": {
@@ -4534,6 +6542,95 @@
"node": ">=8"
}
},
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -4541,10 +6638,79 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/intl-messageformat": {
"version": "10.7.18",
"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz",
"integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==",
+ "dev": true,
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
@@ -4554,15 +6720,56 @@
"tslib": "^2.8.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isbinaryfile": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
+ "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
"node_modules/isbot": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/isbot/-/isbot-5.2.1.tgz",
"integrity": "sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==",
+ "dev": true,
"license": "Unlicense",
"engines": {
"node": ">=18"
}
},
+ "node_modules/isexe": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
+ "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
@@ -4602,10 +6809,29 @@
"node": ">=8"
}
},
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jiti": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "dev": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
@@ -4615,8 +6841,32 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/js-yaml": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -4630,6 +6880,28 @@
"node": ">=6"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -4643,6 +6915,29 @@
"node": ">=6"
}
},
+ "node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
"node_modules/koffi": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/koffi/-/koffi-3.1.6.tgz",
@@ -4670,10 +6965,18 @@
"@koromix/koffi-win32-x64": "3.1.6"
}
},
+ "node_modules/lazy-val": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
+ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lightningcss": {
"version": "1.32.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -4706,6 +7009,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4726,6 +7030,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4746,6 +7051,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4766,6 +7072,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4786,6 +7093,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4806,6 +7114,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -4829,6 +7138,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -4852,6 +7162,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"glibc"
],
@@ -4875,6 +7186,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"libc": [
"musl"
],
@@ -4898,6 +7210,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4918,6 +7231,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4931,10 +7245,18 @@
"url": "https://opencollective.com/parcel"
}
},
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
@@ -4943,6 +7265,16 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -4957,6 +7289,7 @@
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.33.0.tgz",
"integrity": "sha512-MTRwMy0ZlL8Ur/vOAiJ9XGHE+kFPC7brq6MxAm0GiGXEBj0qy0jA/pG4N675oSzciO/UCdX8T+5yUQdmDeTLxg==",
+ "dev": true,
"license": "ISC",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -4977,6 +7310,7 @@
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
@@ -5023,6 +7357,139 @@
"node": ">=10"
}
},
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5034,6 +7501,7 @@
"version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -5048,6 +7516,146 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/node-abi": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.35.0.tgz",
+ "integrity": "sha512-ymk4aIzxdPopw2giv8Fs1Ec6vybGkjmyxUwVqhkI4MCy2tVfXdkOGGWieWVjL0THgH+7a8lRdevyupoYj3Js/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/node-abi/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-api-version": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz",
+ "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ }
+ },
+ "node_modules/node-api-version/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz",
+ "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "nopt": "^9.0.0",
+ "proc-log": "^6.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.5.4",
+ "tinyglobby": "^0.2.12",
+ "undici": "^6.25.0",
+ "which": "^6.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/node-gyp/node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/node-gyp/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-gyp/node_modules/undici": {
+ "version": "6.28.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz",
+ "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
+ "node_modules/node-gyp/node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^4.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-releases": {
"version": "2.0.53",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz",
@@ -5058,15 +7666,56 @@
"node": ">=18"
}
},
+ "node_modules/nopt": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^4.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/obug": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
@@ -5081,6 +7730,16 @@
"node": ">=12.20.0"
}
},
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
"node_modules/oxfmt": {
"version": "0.64.0",
"resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.64.0.tgz",
@@ -5182,6 +7841,52 @@
}
}
},
+ "node_modules/p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/pathe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
@@ -5189,16 +7894,33 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/pe-library": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz",
+ "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -5207,6 +7929,37 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pkijs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz",
+ "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@noble/hashes": "1.4.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/pkijs/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/playwright": {
"version": "1.62.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
@@ -5254,10 +8007,26 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -5282,6 +8051,36 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/postject": {
+ "version": "1.0.0-alpha.6",
+ "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",
+ "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "commander": "^9.4.0"
+ },
+ "bin": {
+ "postject": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/postject/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
"node_modules/prettier": {
"version": "3.9.6",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz",
@@ -5314,6 +8113,23 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/proc-log": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
+ "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -5324,10 +8140,25 @@
"node": ">=0.4.0"
}
},
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"loose-envify": "^1.4.0",
@@ -5339,12 +8170,70 @@
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/pvtsutils": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
+ "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/pvutils": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz",
+ "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/react": {
"version": "19.2.8",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
"integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -5354,6 +8243,7 @@
"version": "3.52.0",
"resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.52.0.tgz",
"integrity": "sha512-eGU8GOqT6Stn4Se/X3esz0Wum6TqSwQJBbK3jSLJIbFAS7XkvpICCVwmqZQG1/siXuCgB9DBRq9CttI+K9HPTA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@internationalized/date": "^3.12.4",
@@ -5375,6 +8265,7 @@
"version": "1.21.0",
"resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.21.0.tgz",
"integrity": "sha512-jbUPSvy3S3XhToxl+Ta5TGVnLTqr5lnWafN8JWqvmVps8KQOdUareZ8IzjU0XQtdIncSv6oxGkn6nQBG26CSCw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@internationalized/date": "^3.12.4",
@@ -5394,6 +8285,7 @@
"version": "19.2.8",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
"integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"scheduler": "^0.27.0"
@@ -5424,6 +8316,7 @@
"version": "3.50.0",
"resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.50.0.tgz",
"integrity": "sha512-TnckvpDQGU0672wEaLZqdzvhuSeXWjgW6vijMWxiKOxc8CosQUfPGISdcZyfHqjX3XMjEtRxj4w9HumvX4h4mw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@internationalized/date": "^3.12.4",
@@ -5441,6 +8334,7 @@
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
"integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/runtime": "^7.5.5",
@@ -5453,6 +8347,35 @@
"react-dom": ">=16.6.0"
}
},
+ "node_modules/read-binary-file-arch": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz",
+ "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "bin": {
+ "read-binary-file-arch": "cli.js"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
"node_modules/readdirp": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
@@ -5467,10 +8390,113 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resedit": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz",
+ "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pe-library": "^0.4.1"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lowercase-keys": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/rollup": {
"version": "4.62.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.5.tgz",
"integrity": "sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.9"
@@ -5512,10 +8538,38 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sanitize-filename": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz",
+ "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==",
+ "dev": true,
+ "license": "WTFPL OR ISC",
+ "dependencies": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "dev": true,
"license": "MIT"
},
"node_modules/semver": {
@@ -5528,10 +8582,36 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/seroval": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.3.tgz",
"integrity": "sha512-5PwLbVPpT4DEki1hYVSSsoxWY6xCNMVucAVLK/CH0mXSDfp/I4KaAex72q80GNt5hpn7CCMGdSpIg4YGqH/wXQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -5541,30 +8621,117 @@
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.3.tgz",
"integrity": "sha512-zQIy62HW683pMIUOKv9yKueQmOr+xMjpP2eH/qEPhr6nTAC+pJTh508md571Oduf/K/QpAoyeWpOhOp1+RFeDA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "seroval": "^1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
"node": ">=10"
- },
- "peerDependencies": {
- "seroval": "^1.0"
}
},
- "node_modules/siginfo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
- "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
- "license": "ISC"
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
"node_modules/stackback": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
@@ -5572,6 +8739,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stat-mode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
+ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/std-env": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
@@ -5579,6 +8756,44 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
@@ -5609,6 +8824,7 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
"integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
+ "dev": true,
"license": "MIT",
"funding": {
"type": "github",
@@ -5619,6 +8835,7 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.3.1.tgz",
"integrity": "sha512-4pAvwUtM4HKBiRZftncAbpn6V9Hhwoa5Fl7O2u5zbp7Z5Cvu+/o/6+176WY3WCEES209543quG8zFIcXCsc5Jw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=16.9.x",
@@ -5641,12 +8858,14 @@
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
"integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -5656,6 +8875,79 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/tar": {
+ "version": "7.5.22",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz",
+ "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/temp": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
+ "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mkdirp": "^0.5.1",
+ "rimraf": "~2.6.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/temp-file": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
+ "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-exit-hook": "^2.0.1",
+ "fs-extra": "^10.0.0"
+ }
+ },
+ "node_modules/tiny-async-pool": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz",
+ "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^5.5.0"
+ }
+ },
+ "node_modules/tiny-async-pool/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
"node_modules/tinybench": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -5677,6 +8969,7 @@
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
@@ -5709,21 +9002,67 @@
"node": ">=14.0.0"
}
},
+ "node_modules/tmp": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
+ "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/tmp-promise": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
+ "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tmp": "^0.2.0"
+ }
+ },
+ "node_modules/truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "dev": true,
+ "license": "WTFPL",
+ "dependencies": {
+ "utf8-byte-length": "^1.0.1"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
"license": "0BSD"
},
"node_modules/tw-animate-css": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz",
"integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Wombosvideo"
}
},
+ "node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typescript": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz",
@@ -5774,9 +9113,19 @@
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
"integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
"node_modules/unplugin": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz",
@@ -5832,6 +9181,35 @@
}
}
},
+ "node_modules/unzipper": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz",
+ "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "~3.7.2",
+ "duplexer2": "~0.1.4",
+ "fs-extra": "11.3.1",
+ "graceful-fs": "^4.2.2",
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/unzipper/node_modules/fs-extra": {
+ "version": "11.3.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz",
+ "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz",
@@ -5867,15 +9245,31 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
"integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "dev": true,
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/utf8-byte-length": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
+ "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==",
+ "dev": true,
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/vite": {
"version": "7.3.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
"integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.27.0 || ^0.28.0",
@@ -5953,6 +9347,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -5969,6 +9364,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -5985,6 +9381,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6001,6 +9398,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6017,6 +9415,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6033,6 +9432,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6049,6 +9449,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6065,6 +9466,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6081,6 +9483,7 @@
"cpu": [
"arm"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6097,6 +9500,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6113,6 +9517,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6129,6 +9534,7 @@
"cpu": [
"loong64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6145,6 +9551,7 @@
"cpu": [
"mips64el"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6161,6 +9568,7 @@
"cpu": [
"ppc64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6177,6 +9585,7 @@
"cpu": [
"riscv64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6193,6 +9602,7 @@
"cpu": [
"s390x"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6209,6 +9619,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6225,6 +9636,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6241,6 +9653,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6257,6 +9670,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6273,6 +9687,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6289,6 +9704,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6305,6 +9721,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6321,6 +9738,7 @@
"cpu": [
"arm64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6337,6 +9755,7 @@
"cpu": [
"ia32"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6353,6 +9772,7 @@
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -6366,6 +9786,7 @@
"version": "0.28.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
"integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
+ "dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -6493,6 +9914,20 @@
}
}
},
+ "node_modules/webcrypto-core": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz",
+ "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.7.0",
+ "@peculiar/json-schema": "^1.1.12",
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.10",
+ "tslib": "^2.8.1"
+ }
+ },
"node_modules/webpack-virtual-modules": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
@@ -6510,6 +9945,22 @@
"node": ">=12"
}
},
+ "node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
"node_modules/why-is-node-running": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
@@ -6527,6 +9978,47 @@
"node": ">=8"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/ws": {
"version": "8.21.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
@@ -6549,6 +10041,26 @@
}
}
},
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@@ -6556,6 +10068,48 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/yargs": {
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/zod": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
@@ -6569,6 +10123,7 @@
"version": "5.0.15",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz",
"integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12.20.0"
diff --git a/package.json b/package.json
index ffddc5d..aecc4c3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "wslc-ui",
- "version": "0.1.0",
+ "version": "0.2.0",
"private": true,
"description": "UI desktop para WSL Containers (wslc) — Electron + Vite",
"license": "MIT",
@@ -25,29 +25,20 @@
"typecheck:e2e": "tsc --noEmit -p tsconfig.e2e.json",
"test:e2e": "npm run build && playwright test",
"test:e2e:headed": "npm run build && playwright test --headed",
+ "dist": "npm run build && electron-builder --win --config electron-builder.yml",
+ "dist:dir": "npm run build && electron-builder --win --dir --config electron-builder.yml",
"cenario:nativo": "esbuild scripts/cenario-nativo.ts --bundle --platform=node --format=esm --packages=external --outfile=node_modules/.cache/cenario-nativo.mjs --log-level=warning && node node_modules/.cache/cenario-nativo.mjs"
},
"dependencies": {
- "@heroui/react": "^3.2.4",
- "@heroui/styles": "^3.2.4",
- "@tailwindcss/vite": "^4.3.3",
- "@tanstack/react-router": "^1.170.32",
- "@xterm/addon-fit": "^0.11.0",
- "@xterm/xterm": "^6.0.0",
- "clsx": "^2.1.1",
"koffi": "^3.1.6",
- "lucide-react": "^1.33.0",
- "react": "^19.2.8",
- "react-aria": "^3.52.0",
- "react-aria-components": "^1.21.0",
- "react-dom": "^19.2.8",
- "tailwind-merge": "^3.6.0",
- "tailwindcss": "^4.3.3",
- "zod": "^4.4.3",
- "zustand": "^5.0.15"
+ "zod": "^4.4.3"
},
"devDependencies": {
+ "@heroui/react": "^3.2.4",
+ "@heroui/styles": "^3.2.4",
"@playwright/test": "^1.62.1",
+ "@tailwindcss/vite": "^4.3.3",
+ "@tanstack/react-router": "^1.170.32",
"@tanstack/router-plugin": "^1.168.35",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.6",
@@ -56,14 +47,26 @@
"@types/react-dom": "^19.2.4",
"@vitejs/plugin-react": "^5.2.0",
"@vitest/coverage-v8": "^4.1.10",
+ "@xterm/addon-fit": "^0.11.0",
+ "@xterm/xterm": "^6.0.0",
+ "clsx": "^2.1.1",
"electron": "^43.4.1",
+ "electron-builder": "^26.15.3",
"electron-vite": "^5.0.0",
"happy-dom": "^20.11.6",
+ "lucide-react": "^1.33.0",
"oxfmt": "^0.64.0",
"oxlint": "^1.79.0",
+ "react": "^19.2.8",
+ "react-aria": "^3.52.0",
+ "react-aria-components": "^1.21.0",
+ "react-dom": "^19.2.8",
+ "tailwind-merge": "^3.6.0",
+ "tailwindcss": "^4.3.3",
"typescript": "^7.0.2",
"vite": "^7.3.6",
- "vitest": "^4.1.10"
+ "vitest": "^4.1.10",
+ "zustand": "^5.0.15"
},
"allowScripts": {
"electron@43.4.1": true,
diff --git a/patchnotes.json b/patchnotes.json
index a7d3ce7..fbe9bb4 100644
--- a/patchnotes.json
+++ b/patchnotes.json
@@ -1,5 +1,27 @@
{
"versoes": [
+ {
+ "versao": "0.2.0",
+ "data": "2026-09-01",
+ "titulo": "O app agora tem instalador, e leva o SDK do WSL consigo.",
+ "mudancas": {
+ "adicionado": [
+ "Instalador (NSIS) e versão portátil para Windows x64, publicados como assets da release. Não são assinados: o SmartScreen avisa 'editor desconhecido'.",
+ "A wslcsdk.dll vai empacotada com o app — duas versões, 2.9.3 e 2.9.9, com a escolha feita em tempo de execução pela versão do WSL instalado.",
+ "Seletor de wslcsdk.dll na aba Sistema, para apontar uma DLL própria. O arquivo é sondado antes de ser aceito: versão, ABI e SHA-256 são lidos na hora, e o que não serve é recusado ali.",
+ "A aba Sistema passa a mostrar a origem da DLL em uso (empacotada, escolhida, do WSL ou de variável de ambiente), a ABI detectada e o tamanho do binário.",
+ "Ícone próprio do app."
+ ],
+ "alterado": [
+ "Containers nativos SOBREVIVEM ao fechamento do app quando o SDK é 2.9.9+: eles param e são reabertos por nome na execução seguinte, em vez de serem apagados na saída.",
+ "O campo que a aba Sistema chamava de 'SDK' virou 'WSL (pelo SDK)': medindo, WslcGetVersion devolve a versão do WSL instalado, não a da DLL — binários diferentes respondem o mesmo número.",
+ "O app ficou ~100 MB menor: tudo o que só o renderer usa saiu de dependencies, onde viajava duas vezes (embutido no bundle e de novo em node_modules)."
+ ],
+ "corrigido": [
+ "Login em registry e instalação guiada não corrompem mais a chamada quando a DLL é 2.9.9: as duas funções mudaram de assinatura sem mudar o header de forma detectável, e o app agora identifica a ABI e se adapta."
+ ]
+ }
+ },
{
"versao": "0.1.0",
"data": "2026-09-01",
diff --git a/scripts/fumaca-empacotado.ts b/scripts/fumaca-empacotado.ts
new file mode 100644
index 0000000..5646803
--- /dev/null
+++ b/scripts/fumaca-empacotado.ts
@@ -0,0 +1,61 @@
+import { mkdtempSync } from 'node:fs'
+import { tmpdir } from 'node:os'
+import { join } from 'node:path'
+import { _electron as electron } from '@playwright/test'
+import type { WslcApi } from '../src/shared/ipc/api'
+
+/**
+ * Teste de fumaça do app EMPACOTADO — o que a suíte E2E não cobre.
+ *
+ * O E2E roda contra `out/`, com o Electron do node_modules e o projeto inteiro
+ * no disco. O instalador é outro mundo: o código vive dentro do asar, o koffi
+ * precisa estar desempacotado para o dlopen funcionar, e a wslcsdk.dll deixa de
+ * estar em `vendor/` para estar em `resources/`. Cada uma dessas três coisas
+ * quebra sozinha, sem quebrar nada no E2E.
+ *
+ * Então este script abre o .exe de verdade e confere justamente isso: que o
+ * motor nativo achou a DLL, e que ela veio de dentro do pacote.
+ *
+ * node scripts/fumaca-empacotado.ts "dist/win-unpacked/WSLC UI.exe"
+ */
+
+const exe = process.argv[2]
+if (!exe) {
+ console.error('uso: node scripts/fumaca-empacotado.ts ')
+ process.exit(1)
+}
+
+const app = await electron.launch({
+ executablePath: exe,
+ args: [`--user-data-dir=${mkdtempSync(join(tmpdir(), 'wslc-fumaca-'))}`]
+})
+
+try {
+ const page = await app.firstWindow()
+ await page.waitForLoadState('domcontentloaded')
+
+ // `globalThis` e não `window`: este script é typechecado com a lib de node,
+ // que não conhece DOM. O código roda no renderer de qualquer forma.
+ const status = await page.evaluate(() =>
+ (globalThis as unknown as { wslcApi: WslcApi }).wslcApi.getNativeStatus()
+ )
+ console.log(JSON.stringify(status, null, 2))
+
+ const problemas: string[] = []
+ if (!status.available) problemas.push(`SDK indisponível: ${status.detail}`)
+ if (status.source !== 'bundled') problemas.push(`DLL veio de "${status.source}", não do pacote`)
+ if (status.dllPath !== null && !/resources/i.test(status.dllPath)) {
+ problemas.push(`DLL fora de resources/: ${status.dllPath}`)
+ }
+ if (status.abi === null) problemas.push('ABI não detectada')
+
+ if (problemas.length > 0) {
+ console.error(`\nFumaça falhou (${problemas.length}):`)
+ for (const p of problemas) console.error(` - ${p}`)
+ process.exitCode = 1
+ } else {
+ console.log(`\nOK: app empacotado abriu, DLL ${status.abi} carregada de resources/.`)
+ }
+} finally {
+ await app.close().catch(() => undefined)
+}
diff --git a/src/main/ipc/index.ts b/src/main/ipc/index.ts
index 50f1b29..7bb8e91 100644
--- a/src/main/ipc/index.ts
+++ b/src/main/ipc/index.ts
@@ -1,6 +1,6 @@
import { app, BrowserWindow } from 'electron'
import { clearLogEntries, getLogEntries, logsDirectory, setOnLogEntry } from '../services/logger'
-import { readNativeTuning, settingsFilePath, writeNativeTuning } from '../settings'
+import { readNativeTuning, readSdkPath, settingsFilePath, writeNativeTuning, writeSdkPath } from '../settings'
import { resolveWslcService } from '../services/wslc'
import { currentEngine, getEngineStatus, setEngine } from '../services/wslc/engine'
import { ops } from '../services/wslc/ops'
@@ -20,6 +20,11 @@ export function registerIpc(): void {
// Tuning persistido da sessão nativa → aplicado quando a sessão for criada.
native.setTuning(readNativeTuning(settingsFile()))
+ // DLL escolhida na aba Sistema. Injetada ANTES de qualquer consulta ao motor
+ // nativo — é por isso que trocar de DLL só vale ao reabrir o app: quem já
+ // carregou a anterior tem handles dela.
+ native.setSdkPath(readSdkPath(settingsFile()))
+
// Sessão nativa terminou por fora (WSL desligado/crash) → avisa todas as janelas.
native.setOnSessionEnded((reason) => {
for (const win of BrowserWindow.getAllWindows()) {
@@ -174,6 +179,18 @@ export function registerIpc(): void {
native.setTuning(tuning)
},
'system:restart-native': () => native.restartSession(),
+ 'system:sdk-path': () => native.getSdkPath(),
+ // Escolher a DLL é: diálogo -> sonda -> grava. A sonda é a parte que
+ // importa: sem ela a pessoa só descobriria que errou o arquivo na próxima
+ // vez que abrisse o app, com o motor nativo indisponível e sem pista.
+ 'system:pick-sdk': async (_input, { event }) => {
+ const picked = await host.pickFile(BrowserWindow.fromWebContents(event.sender), 'wslcsdk.dll', ['dll'])
+ return picked === null ? null : native.probeSdk(picked)
+ },
+ 'system:set-sdk-path': ({ path }) => {
+ writeSdkPath(settingsFile(), path)
+ native.setSdkPath(path)
+ },
'system:native-status': () => native.status(),
'system:get-engine': () => getEngineStatus(),
'system:set-engine': ({ engine }) => setEngine(engine),
diff --git a/src/main/ipc/router.test.ts b/src/main/ipc/router.test.ts
index 4c54ced..a12f27b 100644
--- a/src/main/ipc/router.test.ts
+++ b/src/main/ipc/router.test.ts
@@ -74,10 +74,16 @@ function makeHandlers(overrides: Partial = {}): InvokeHandlers {
'system:native-status': async () => ({
available: false,
dllPath: null,
- sdkVersion: null,
+ source: null,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
missingComponents: [],
detail: 'teste'
}),
+ 'system:sdk-path': async () => null,
+ 'system:pick-sdk': async () => null,
+ 'system:set-sdk-path': () => undefined,
'system:get-engine': async () => ({ engine: 'cli' as const, sessionActive: false, detail: 'teste' }),
'system:set-engine': async () => ({ engine: 'cli' as const, sessionActive: false, detail: 'teste' }),
'system:reset-native': async () => okResult,
diff --git a/src/main/services/wslc/mock-ops.ts b/src/main/services/wslc/mock-ops.ts
index e8c0378..3776f1f 100644
--- a/src/main/services/wslc/mock-ops.ts
+++ b/src/main/services/wslc/mock-ops.ts
@@ -11,6 +11,7 @@ import type {
NativeTuning,
RegistryImage,
RunContainerOptions,
+ SdkProbe,
VhdVolumeOptions,
VolumeInfo
} from '@shared/schemas'
@@ -28,7 +29,8 @@ import type { HostOps, NativeOps, Ops, StreamOps } from './ops'
*
* A sessão nativa aqui imita as regras REAIS que a UI observa: ela tem
* storage próprio (as listas não são as mesmas do motor CLI), reiniciar
- * mantém as imagens e perde os containers, e resetar perde os dois.
+ * mantém as imagens e derruba os containers para exited (a ABI 2.9.9 os
+ * reabre), e resetar perde os dois.
*/
const ok = (stdout = ''): CommandResult => ({ ok: true, code: 0, stdout, stderr: '' })
@@ -194,6 +196,9 @@ const world: NativeWorld = {
let onEnded: (reason: NativeSessionEndedEvent['reason']) => void = () => {}
let onCrash: (ev: NativeCrashDumpEvent) => void = () => {}
+/** DLL escolhida na aba Sistema; null = a "empacotada" do modo demonstração. */
+let mockSdkPath: string | null = null
+
const findContainer = (id: string): ContainerInfo | undefined =>
world.containers.find((c) => c.id === id || c.name === id)
@@ -242,13 +247,18 @@ const nativeOps: NativeOps = {
if (shouldFail('system:restart-native')) {
return failure('system:restart-native', 'Falha ao reiniciar a sessão nativa.')
}
- // Reiniciar perde os containers e MANTÉM as imagens (regra do SDK real).
- world.containers = []
+ // Com a ABI 2.9.9 os containers NÃO se perdem: soltar a sessão os derruba
+ // para exited, e o app os reabre por nome (WslcOpenContainer). As imagens
+ // ficam, como sempre. Medido no SDK real.
+ for (const c of world.containers) {
+ Object.assign(c, { state: 'exited', status: 'Exited (0) agora' })
+ }
world.active = true
return ok('Sessão nativa reiniciada com as novas configurações (as imagens foram mantidas).')
},
cleanupContainers: async () => {
- world.containers = []
+ // Fechar o app não apaga mais nada na ABI 2.9.9 — os containers são
+ // reabertos na execução seguinte.
},
setTuning: (tuning) => {
world.tuning = tuning
@@ -264,17 +274,57 @@ const nativeOps: NativeOps = {
? {
available: false,
dllPath: null,
- sdkVersion: null,
+ source: null,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
missingComponents: ['Virtual Machine Platform'],
detail: '(demo) wslcsdk.dll não encontrada nesta máquina.'
}
: {
available: true,
- dllPath: 'C:\\demo\\vendor\\wslcsdk\\wslcsdk.dll',
- sdkVersion: '0.9.0',
+ dllPath: mockSdkPath ?? 'C:\\demo\\vendor\\wslcsdk\\win-x64\\wslcsdk.dll',
+ source: mockSdkPath === null ? 'bundled' : 'custom',
+ wslVersion: '0.9.0',
+ abi: '2.9.9+',
+ sizeBytes: 4_929_888,
missingComponents: [],
detail: '(demo) SDK simulado carregado; todos os componentes presentes.'
},
+ getSdkPath: () => mockSdkPath,
+ setSdkPath: (path: string | null) => {
+ mockSdkPath = path
+ },
+ // A sonda dublada lê o NOME do arquivo: um caminho com "2.9.3" devolve a ABI
+ // antiga, e qualquer coisa que não termine em .dll é recusada. É o bastante
+ // para o E2E exercitar escolher, recusar e voltar para a empacotada.
+ probeSdk: (path: string): SdkProbe => {
+ if (!path.toLowerCase().endsWith('.dll')) {
+ return {
+ path,
+ ok: false,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
+ sha256: null,
+ missingComponents: [],
+ detail: '(demo) Não é uma wslcsdk.dll utilizável: assinatura não reconhecida.'
+ }
+ }
+ const antiga = path.includes('2.9.3')
+ return {
+ path,
+ ok: true,
+ wslVersion: '0.9.0',
+ abi: antiga ? '2.9.3' : '2.9.9+',
+ sizeBytes: antiga ? 5_406_520 : 4_929_888,
+ sha256: antiga
+ ? 'a3881e7d239be9944a64868c323046aa0292d4806c289cb31c50c8df8d5dc68d'
+ : '8d4d55d4283fb32a5909b57e78b576d01363d7b28bb9b2595115e80faf61db5b',
+ missingComponents: [],
+ detail: `(demo) DLL válida, ABI ${antiga ? '2.9.3' : '2.9.9+'}.`
+ }
+ },
install: async (onProgress: (ev: InstallProgressEvent) => void) => {
const ms = tickMs()
const components = ['Virtual Machine Platform', 'Pacote WSL']
diff --git a/src/main/services/wslc/native/bindings.ts b/src/main/services/wslc/native/bindings.ts
index f3e5984..5d07317 100644
--- a/src/main/services/wslc/native/bindings.ts
+++ b/src/main/services/wslc/native/bindings.ts
@@ -23,12 +23,48 @@ export const WSLC_COMPONENT_FLAGS = {
SDK_NEEDS_UPDATE: 4
} as const
+/**
+ * O serviço recusou a DLL por ser velha demais para o WSL instalado. Chega em
+ * QUALQUER chamada, inclusive WslcGetVersion — ver bundled.ts.
+ */
+export const HR_SDK_UPDATE_NEEDED = '0x8004060B'
+
+/** WslcInstallOptions — só existe na ABI 2.9.9+. REPAIR reinstala o que já está lá. */
+export const WSLC_INSTALL_OPTIONS = {
+ NONE: 0,
+ REPAIR: 1
+} as const
+
export interface NativeVersion {
major: number
minor: number
revision: number
}
+/**
+ * Qual ABI da wslcsdk.dll está carregada.
+ *
+ * Por que isto existe: entre 2.9.3 e 2.9.9 a Microsoft mudou DUAS assinaturas
+ * sem mudar nenhum tamanho de struct — `WslcSessionAuthenticate` ganhou um
+ * `tokenType` ANTES do `errorMessage`, e `WslcInstallWithDependencies` ganhou
+ * `components` e `options` na frente. Chamar a DLL com a aridade errada não dá
+ * erro de link: passa ponteiro no lugar de enum e corrompe silenciosamente.
+ *
+ * E não dá para perguntar a versão ao SDK: `WslcGetVersion` devolve a versão do
+ * **WSL instalado** (medido: 2.9.3 e 2.9.9 respondem igual na mesma máquina), e
+ * a DLL não traz metadados de versão de arquivo. Sobra detectar por símbolo —
+ * `WslcOpenContainer` só existe a partir da 2.9.9, e nasceu junto com as duas
+ * assinaturas novas. É o que `modern` decide.
+ *
+ * Isso não é zelo teórico: a aba Sistema deixa escolher qualquer DLL do disco.
+ */
+export interface SdkAbi {
+ /** ABI 2.9.9+ (símbolo WslcOpenContainer presente). */
+ modern: boolean
+ /** Rótulo curto, para a UI e o log. */
+ label: string
+}
+
/** Assinatura genérica das funções nativas vinculadas (retornam HRESULT). */
export interface NativeFn {
(...args: unknown[]): number
@@ -107,6 +143,8 @@ export function decodeBytes(ptr: unknown, length: number): Buffer {
// eslint típico: assinaturas centralizadas em um objeto para uso nas fases seguintes.
export interface WslcSdk {
dllPath: string
+ /** ABI detectada por símbolo — ver SdkAbi. */
+ abi: SdkAbi
version(): NativeVersion
missingComponents(): number
/** Handles/funções cruas para as próximas fases (sessão, containers, processos, imagens). */
@@ -190,13 +228,17 @@ export function hrHex(hr: number): string {
return `0x${(hr >>> 0).toString(16).toUpperCase()}`
}
-/** Carrega a DLL e vincula toda a superfície do wslcsdk.h. Idempotente por caminho. */
-export function loadWslcSdk(dllPath: string): WslcSdk {
- if (cached && cached.dllPath === dllPath) return cached
- initCom()
-
- const lib = koffi.load(dllPath)
-
+/**
+ * Tipos koffi do wslcsdk.h, registrados UMA vez por processo.
+ *
+ * koffi registra struct/proto por NOME, num namespace global: repetir o
+ * registro lança. Como o app pode carregar uma segunda DLL — a aba Sistema
+ * sonda a candidata que a pessoa escolheu antes de adotá-la —, o registro não
+ * pode morar dentro do load. Os tipos descrevem o header, não o binário, então
+ * compartilhá-los entre DLLs é correto: o que muda entre 2.9.3 e 2.9.9 são
+ * assinaturas de função, tratadas em SdkAbi.
+ */
+function buildTypes() {
const WslcVersion = koffi.struct('WslcVersion', { major: 'uint32', minor: 'uint32', revision: 'uint32' })
const SessionSettings = koffi.struct('WslcSessionSettings', {
_opaque: koffi.array('uint64', SESSION_OPTIONS_U64)
@@ -285,15 +327,104 @@ export function loadWslcSdk(dllPath: string): WslcSdk {
const P = koffi.pointer(ProcessSettings)
const outHandle = koffi.out(koffi.pointer(HANDLE))
const outErr = koffi.out(koffi.pointer('str16'))
+ return {
+ WslcVersion,
+ SessionSettings,
+ ContainerSettings,
+ ProcessSettings,
+ VhdRequirements,
+ PortMapping,
+ ContainerVolume,
+ NamedVolume,
+ ImageInfo,
+ PullImageOptions,
+ ImageProgressDetail,
+ ImageProgressMessage,
+ ImportImageOptions,
+ TagImageOptions,
+ PushImageOptions,
+ ProcessCallbacks,
+ CrashDumpInfo,
+ StdIOCallback,
+ ProcessExitCallback,
+ ImageProgressCallback,
+ InstallCallback,
+ CrashDumpCallback,
+ S,
+ C,
+ P,
+ outHandle,
+ outErr
+ }
+}
+
+type SdkTypes = ReturnType
+
+let sdkTypes: SdkTypes | null = null
+
+function types(): SdkTypes {
+ sdkTypes ??= buildTypes()
+ return sdkTypes
+}
+
+/** Vincula toda a superfície do wslcsdk.h a partir de uma DLL, sem cache. */
+function build(dllPath: string): { sdk: WslcSdk; lib: ReturnType } {
+ initCom()
+
+ const lib = koffi.load(dllPath)
+
+ const t = types()
+ // Só o que este corpo usa; o registro completo vai em `sdk.types`, de
+ // onde as fases nativas puxam os protótipos de callback.
+ const {
+ WslcVersion,
+ VhdRequirements,
+ PortMapping,
+ ContainerVolume,
+ NamedVolume,
+ ImageInfo,
+ PullImageOptions,
+ ImageProgressMessage,
+ ImportImageOptions,
+ TagImageOptions,
+ PushImageOptions,
+ ProcessCallbacks,
+ CrashDumpInfo,
+ InstallCallback,
+ CrashDumpCallback,
+ S,
+ C,
+ P,
+ outHandle,
+ outErr
+ } = t
+
+ /** Vincula um símbolo opcional; devolve null se ele não existir nesta DLL. */
+ const optional = (name: string, ret: string, args: unknown[]): NativeFn | null => {
+ try {
+ return lib.func(name, ret, args as never[]) as NativeFn
+ } catch {
+ return null
+ }
+ }
+
+ // Sonda da ABI — ver SdkAbi. WslcOpenContainer é o marcador da 2.9.9.
+ const openContainer = optional('WslcOpenContainer', HR, [HANDLE, PTR, outHandle, outErr])
+ const setInitProcessIO = optional('WslcSetContainerInitProcessIOCallbacks', HR, [
+ HANDLE,
+ koffi.pointer(ProcessCallbacks),
+ PTR
+ ])
+ const abi: SdkAbi = openContainer ? { modern: true, label: '2.9.9+' } : { modern: false, label: '2.9.3' }
const raw: Record = {
// Instalação / versão
WslcGetVersion: lib.func('WslcGetVersion', HR, [koffi.out(koffi.pointer(WslcVersion))]),
WslcGetMissingComponents: lib.func('WslcGetMissingComponents', HR, [koffi.out(koffi.pointer('uint32'))]),
- WslcInstallWithDependencies: lib.func('WslcInstallWithDependencies', HR, [
- koffi.pointer(InstallCallback),
- PTR
- ]),
+ // 2.9.9 pôs `components` e `options` na frente (ver SdkAbi).
+ WslcInstallWithDependencies: abi.modern
+ ? lib.func('WslcInstallWithDependencies', HR, ['int32', 'int32', koffi.pointer(InstallCallback), PTR])
+ : lib.func('WslcInstallWithDependencies', HR, [koffi.pointer(InstallCallback), PTR]),
// Sessão
WslcInitSessionSettings: lib.func('WslcInitSessionSettings', HR, [PTR, PTR, S]),
@@ -321,14 +452,25 @@ export function loadWslcSdk(dllPath: string): WslcSdk {
outErr
]),
WslcReleaseCrashDumpSubscription: lib.func('WslcReleaseCrashDumpSubscription', HR, [HANDLE]),
- WslcSessionAuthenticate: lib.func('WslcSessionAuthenticate', HR, [
- HANDLE,
- PTR,
- PTR,
- PTR,
- koffi.out(koffi.pointer('str')),
- outErr
- ]),
+ // 2.9.9 encaixou `tokenType` ANTES do errorMessage (ver SdkAbi).
+ WslcSessionAuthenticate: abi.modern
+ ? lib.func('WslcSessionAuthenticate', HR, [
+ HANDLE,
+ PTR,
+ PTR,
+ PTR,
+ koffi.out(koffi.pointer('str')),
+ koffi.out(koffi.pointer('int32')),
+ outErr
+ ])
+ : lib.func('WslcSessionAuthenticate', HR, [
+ HANDLE,
+ PTR,
+ PTR,
+ PTR,
+ koffi.out(koffi.pointer('str')),
+ outErr
+ ]),
// Container
WslcInitContainerSettings: lib.func('WslcInitContainerSettings', HR, [PTR, C]),
@@ -357,6 +499,9 @@ export function loadWslcSdk(dllPath: string): WslcSdk {
'uint32'
]),
WslcCreateContainer: lib.func('WslcCreateContainer', HR, [HANDLE, C, outHandle, outErr]),
+ // Só existem na ABI 2.9.9+; quem usa precisa checar sdk.abi.modern antes.
+ ...(openContainer === null ? {} : { WslcOpenContainer: openContainer }),
+ ...(setInitProcessIO === null ? {} : { WslcSetContainerInitProcessIOCallbacks: setInitProcessIO }),
WslcStartContainer: lib.func('WslcStartContainer', HR, [HANDLE, 'int32', outErr]),
WslcCreateContainerProcess: lib.func('WslcCreateContainerProcess', HR, [HANDLE, P, outHandle, outErr]),
// Recebe um Buffer.alloc(65) — o ID (64 hex + NUL) é escrito nele.
@@ -450,6 +595,7 @@ export function loadWslcSdk(dllPath: string): WslcSdk {
const sdk: WslcSdk = {
dllPath,
+ abi,
version: () => {
const out: Partial = {}
const hr = raw['WslcGetVersion'](out)
@@ -466,31 +612,35 @@ export function loadWslcSdk(dllPath: string): WslcSdk {
decodeImages: (ptr, count) => koffi.decode(ptr, koffi.array(ImageInfo, count)) as RawNativeImage[],
decodeProgress: (ptr) => koffi.decode(ptr, ImageProgressMessage) as RawProgressMessage,
decodeCrashDump: (ptr) => koffi.decode(ptr, CrashDumpInfo) as RawCrashDump,
- types: {
- WslcVersion,
- SessionSettings,
- ContainerSettings,
- ProcessSettings,
- VhdRequirements,
- PortMapping,
- ContainerVolume,
- NamedVolume,
- ImageInfo,
- PullImageOptions,
- ImageProgressMessage,
- ImportImageOptions,
- TagImageOptions,
- PushImageOptions,
- ProcessCallbacks,
- StdIOCallback,
- ProcessExitCallback,
- ImageProgressCallback,
- InstallCallback,
- CrashDumpCallback,
- CrashDumpInfo
- },
+ types: t,
alloc: koffi.alloc
}
+ return { sdk, lib }
+}
+
+/** Carrega a DLL em uso. Idempotente por caminho. */
+export function loadWslcSdk(dllPath: string): WslcSdk {
+ if (cached && cached.dllPath === dllPath) return cached
+ const { sdk } = build(dllPath)
cached = sdk
return sdk
}
+
+/**
+ * Carrega uma DLL CANDIDATA sem tocar no cache — é o que a aba Sistema usa
+ * para ler versão e ABI de um arquivo escolhido antes de adotá-lo.
+ *
+ * O `unload` recusa descarregar a DLL em uso: a sessão nativa viva tem handles
+ * dela, e puxar o tapete derrubaria o app. Sondar a que já está carregada é o
+ * caso comum (a pessoa reabre o diálogo e escolhe a mesma), então isso não é
+ * hipótese remota.
+ */
+export function probeWslcSdk(dllPath: string): { sdk: WslcSdk; unload: () => void } {
+ const { sdk, lib } = build(dllPath)
+ return {
+ sdk,
+ unload: () => {
+ if (cached?.dllPath !== dllPath) lib.unload()
+ }
+ }
+}
diff --git a/src/main/services/wslc/native/bundled.test.ts b/src/main/services/wslc/native/bundled.test.ts
new file mode 100644
index 0000000..23efcb7
--- /dev/null
+++ b/src/main/services/wslc/native/bundled.test.ts
@@ -0,0 +1,60 @@
+import { describe, expect, it } from 'vitest'
+import { BUNDLED_SDKS, bundledPath, compareVersions, pickBundledSdk } from './bundled'
+
+describe('compareVersions', () => {
+ it('compara campo a campo, numericamente', () => {
+ expect(compareVersions('2.9.10', '2.9.9')).toBeGreaterThan(0)
+ expect(compareVersions('2.9.3', '2.9.4')).toBeLessThan(0)
+ expect(compareVersions('2.9.4', '2.9.4')).toBe(0)
+ expect(compareVersions('2.10.0', '2.9.99')).toBeGreaterThan(0)
+ })
+
+ it('trata partes ausentes como zero', () => {
+ expect(compareVersions('2.9', '2.9.0')).toBe(0)
+ expect(compareVersions('3', '2.9.9')).toBeGreaterThan(0)
+ })
+})
+
+describe('pickBundledSdk', () => {
+ // A regra existe porque o SDK 2.9.9 dá segfault num WSL 2.9.4 — medido em
+ // WslcGetSessionTerminationEvent. Nunca usar SDK mais novo que o WSL.
+ it('não escolhe SDK mais novo que o WSL instalado', () => {
+ expect(pickBundledSdk('2.9.4').version).toBe('2.9.3')
+ expect(pickBundledSdk('2.9.8').version).toBe('2.9.3')
+ })
+
+ it('usa a mais nova quando o WSL alcança', () => {
+ expect(pickBundledSdk('2.9.9').version).toBe('2.9.9')
+ expect(pickBundledSdk('2.10.0').version).toBe('2.9.9')
+ expect(pickBundledSdk('3.0.0').version).toBe('2.9.9')
+ })
+
+ // Errar para baixo custa recurso; errar para cima custa o processo.
+ it('sem saber a versão do WSL, fica na mais antiga', () => {
+ expect(pickBundledSdk(null).version).toBe('2.9.3')
+ })
+
+ it('WSL abaixo de todas ainda devolve a mais antiga', () => {
+ expect(pickBundledSdk('2.9.0').version).toBe('2.9.3')
+ })
+})
+
+describe('BUNDLED_SDKS', () => {
+ it('está ordenada da mais antiga para a mais nova', () => {
+ const versoes = BUNDLED_SDKS.map((s) => s.version)
+ expect(versoes.toSorted(compareVersions)).toEqual(versoes)
+ })
+
+ it('aponta para dentro de vendor/, por versão', () => {
+ // Comparado por segmento: o separador é do sistema, e o que importa é a
+ // pasta da versão estar no caminho.
+ expect(bundledPath(BUNDLED_SDKS[0]!, 'raiz').split(/[\\/]/)).toEqual([
+ 'raiz',
+ 'vendor',
+ 'wslcsdk',
+ 'win-x64',
+ '2.9.3',
+ 'wslcsdk.dll'
+ ])
+ })
+})
diff --git a/src/main/services/wslc/native/bundled.ts b/src/main/services/wslc/native/bundled.ts
new file mode 100644
index 0000000..aa7ca8d
--- /dev/null
+++ b/src/main/services/wslc/native/bundled.ts
@@ -0,0 +1,119 @@
+import { existsSync } from 'node:fs'
+import { join } from 'node:path'
+import { probeWslcSdk } from './bindings'
+
+/**
+ * Qual wslcsdk.dll empacotada usar — decidido pela versão do WSL instalado.
+ *
+ * O app leva DUAS DLLs porque o SDK precisa CASAR com o WSL — nas duas
+ * direções, e ambas medidas nesta máquina:
+ *
+ * | | WSL 2.9.4 | WSL 2.9.9 |
+ * | SDK 2.9.3 | funciona | `WSLC_E_SDK_UPDATE_NEEDED` já no WslcGetVersion |
+ * | SDK 2.9.9 | segfault em WslcGetSessionTerminationEvent | funciona |
+ *
+ * SDK novo demais é o caso perigoso: nada no header denuncia: a declaração da
+ * função que quebra é byte a byte idêntica nas duas versões, e os 18 structs
+ * também. Não há binding que se defenda — o processo simplesmente morre. SDK
+ * velho demais é o caso educado: o serviço recusa toda chamada com um HRESULT
+ * legível.
+ *
+ * A regra: usa a DLL mais nova que **não passe** da versão do WSL instalado.
+ * Com WSL 2.9.4 isso dá a 2.9.3; com 2.9.9 ou mais, a 2.9.9, que traz
+ * `WslcOpenContainer` e as assinaturas novas (ver SdkAbi).
+ *
+ * Quem quiser fugir da regra escolhe a DLL na aba Sistema — e a detecção de
+ * ABI cuida do resto.
+ */
+
+export interface BundledSdk {
+ /** Versão do pacote NuGet Microsoft.WSL.Containers. */
+ version: string
+ /** Caminho relativo à raiz onde `vendor/` foi instalado. */
+ relative: string[]
+}
+
+/** Da mais antiga para a mais nova — a ordem que `pickBundledSdk` assume. */
+export const BUNDLED_SDKS: BundledSdk[] = [
+ { version: '2.9.3', relative: ['vendor', 'wslcsdk', 'win-x64', '2.9.3', 'wslcsdk.dll'] },
+ { version: '2.9.9', relative: ['vendor', 'wslcsdk', 'win-x64', '2.9.9', 'wslcsdk.dll'] }
+]
+
+/** Compara "2.9.10" com "2.9.9" numericamente, campo a campo. */
+export function compareVersions(a: string, b: string): number {
+ const pa = a.split('.').map((n) => Number.parseInt(n, 10) || 0)
+ const pb = b.split('.').map((n) => Number.parseInt(n, 10) || 0)
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
+ const diff = (pa[i] ?? 0) - (pb[i] ?? 0)
+ if (diff !== 0) return diff
+ }
+ return 0
+}
+
+/**
+ * A DLL empacotada adequada ao WSL informado.
+ *
+ * `wslVersion` null (não deu para perguntar) cai na mais antiga: é a que
+ * funciona no WSL mínimo suportado, e errar para baixo custa recurso; errar
+ * para cima custa o processo.
+ */
+export function pickBundledSdk(wslVersion: string | null): BundledSdk {
+ const primeira = BUNDLED_SDKS[0] as BundledSdk
+ if (wslVersion === null) return primeira
+ let escolhida = primeira
+ for (const sdk of BUNDLED_SDKS) {
+ if (compareVersions(sdk.version, wslVersion) <= 0) escolhida = sdk
+ }
+ return escolhida
+}
+
+/** Caminho absoluto de uma DLL empacotada, sob a raiz dada. */
+export function bundledPath(sdk: BundledSdk, root: string): string {
+ return join(root, ...sdk.relative)
+}
+
+/** Memoizado: sondar a DLL custa carregar um binário de 5 MB. */
+let detected: string | null | undefined
+
+/**
+ * Versão do WSL instalado, perguntada à DLL empacotada mais NOVA que responder.
+ *
+ * Parece circular — carregar uma DLL para decidir qual DLL usar — mas não é.
+ * `WslcGetVersion` devolve a versão do WSL, não a da DLL, não abre sessão e é
+ * barato. O detalhe que importa é a ORDEM: da mais nova para a mais antiga.
+ *
+ * A primeira tentativa foi ao contrário, e a medição derrubou: num WSL 2.9.9, a
+ * DLL 2.9.3 recusa até o WslcGetVersion, com WSLC_E_SDK_UPDATE_NEEDED — perguntar
+ * à mais velha dava "não sei", caía na mais velha por precaução, e o app inteiro
+ * ficava sem motor nativo. A mais nova, ao contrário, responde a versão certa
+ * mesmo num WSL antigo (medido: a 2.9.9 respondeu 2.9.4 num WSL 2.9.4); ela só
+ * quebra depois, ao mexer na sessão — e é justamente disso que a regra protege.
+ */
+export function detectWslVersion(
+ roots: string[],
+ exists: (p: string) => boolean = existsSync
+): string | null {
+ if (detected !== undefined) return detected
+ detected = null
+ for (const sdk of BUNDLED_SDKS.toReversed()) {
+ for (const root of roots) {
+ const path = bundledPath(sdk, root)
+ if (!exists(path)) continue
+ try {
+ const probe = probeWslcSdk(path)
+ const v = probe.sdk.version()
+ detected = `${v.major}.${v.minor}.${v.revision}`
+ probe.unload()
+ } catch {
+ // Esta DLL não fala com este WSL; tenta a próxima.
+ }
+ if (detected !== null) return detected
+ }
+ }
+ return detected
+}
+
+/** Só para testes: esquece a versão detectada. */
+export function resetDetectedWslVersion(): void {
+ detected = undefined
+}
diff --git a/src/main/services/wslc/native/containers.test.ts b/src/main/services/wslc/native/containers.test.ts
index 337b409..d959f7e 100644
--- a/src/main/services/wslc/native/containers.test.ts
+++ b/src/main/services/wslc/native/containers.test.ts
@@ -1,4 +1,4 @@
-import { afterAll, describe, expect, it } from 'vitest'
+import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import {
cleanupNativeContainers,
execNativeContainer,
@@ -11,8 +11,8 @@ import {
runNativeContainer,
streamNativeLogs
} from './containers'
-import { locateWslcSdk } from './locate'
-import { releaseNativeSession, setNativeSessionTuning } from './session'
+import { isNativeUsable } from './status'
+import { acquireNativeSession, releaseNativeSession, setNativeSessionTuning } from './session'
const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms))
@@ -22,13 +22,65 @@ const uniq = Date.now().toString(36)
// oxlint-disable no-await-in-loop, no-unmodified-loop-condition -- polling intencional (callbacks mudam o estado)
+/**
+ * Remove TUDO da sessão nativa.
+ *
+ * Precisa existir porque, na ABI 2.9.9, fechar o app deixou de apagar
+ * containers — eles são reabertos na execução seguinte, de propósito. Ótimo
+ * para quem usa, péssimo para um teste que conta containers: sem limpar
+ * ANTES, sobra de execução anterior entra na conta.
+ */
+const removerTodos = async (): Promise => {
+ for (const c of await listNativeContainers(true)) {
+ // oxlint-disable-next-line no-await-in-loop -- sequencial (handles nativos)
+ await nativeContainerAction('remove', c.id)
+ }
+}
+
// Integração real: cria containers de verdade na sessão "WslcUi" (exige a
// wslcsdk.dll e a imagem alpine:latest já puxada para a sessão nativa).
-describe.skipIf(locateWslcSdk() === null)('containers nativos (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('containers nativos (integração real via FFI)', () => {
+ beforeAll(removerTodos, 60_000)
+
afterAll(async () => {
+ await removerTodos()
await cleanupNativeContainers()
releaseNativeSession()
- }, 30_000)
+ }, 60_000)
+
+ // A limitação levantada pela ABI 2.9.9: antes, fechar o app apagava os
+ // containers nativos, porque sem WslcOpenContainer eles virariam órfãos
+ // invisíveis. Aqui o ciclo inteiro é exercitado num processo só —
+ // cleanup solta os handles e esvazia o registro em memória, e a listagem
+ // seguinte precisa trazer o container de volta do arquivo.
+ it('container sobrevive ao fechamento do app e é reaberto', { timeout: 90_000 }, async () => {
+ const nome = `wslcuireabre${uniq}`
+ const res = await runNativeContainer({
+ image: 'alpine:latest',
+ name: nome,
+ command: 'sh -c "sleep 60"',
+ detach: true,
+ rm: false
+ })
+ expect(res.ok, res.stderr).toBe(true)
+
+ const { sdk } = await acquireNativeSession()
+ if (!sdk.abi.modern) return // ABI 2.9.3: o comportamento correto é apagar mesmo
+
+ // Fechar o app: com a ABI nova, isto NÃO apaga — só solta os handles.
+ await cleanupNativeContainers()
+ expect(nativeContainerCount()).toBe(0)
+
+ // Próxima execução: a listagem reabre pelo que ficou lembrado em disco.
+ const depois = await listNativeContainers(true)
+ const reaberto = depois.find((c) => c.name === nome)
+ expect(reaberto, `container ${nome} não voltou: ${depois.map((c) => c.name).join(', ')}`).toBeDefined()
+
+ // E dá para operá-lo de novo — reabrir sem poder agir seria inútil.
+ const removido = await nativeContainerAction('remove', nome)
+ expect(removido.ok, removido.stderr).toBe(true)
+ expect((await listNativeContainers(true)).some((c) => c.name === nome)).toBe(false)
+ })
it('run → logs por callback → estado exited com código → remove', { timeout: 60_000 }, async () => {
const res = await runNativeContainer({
diff --git a/src/main/services/wslc/native/containers.ts b/src/main/services/wslc/native/containers.ts
index bf76f42..bbd7c27 100644
--- a/src/main/services/wslc/native/containers.ts
+++ b/src/main/services/wslc/native/containers.ts
@@ -13,6 +13,7 @@ import {
type WslcSdk
} from './bindings'
import { formatUnixDate } from './images'
+import { forgetContainer, readKnownContainers, rememberContainer, type KnownContainer } from './known'
import { formatPortsDisplay, mapNativeState, parsePortSpec, parseVolumeSpec } from './run-spec'
import {
acquireNativeSession,
@@ -25,11 +26,17 @@ import {
/**
* Containers nativos (Fase 2 do ROADMAP).
*
- * O SDK preview NÃO tem enumeração nem "abrir por ID" — um container só é
- * gerenciável pelo handle criado neste processo. Por isso o app mantém um
- * registro em memória e REMOVE os containers nativos ao fechar (senão viram
- * órfãos permanentes: os registros sobrevivem até ao terminate da sessão e
- * só somem apagando o storage — ver resetNativeSession).
+ * O SDK não enumera containers em nenhuma versão, então o app mantém um
+ * registro EM MEMÓRIA dos que criou. O que muda com a ABI 2.9.9 é o resgate:
+ * `WslcOpenContainer` abre um container por nome ou ID, inclusive um criado
+ * por outra execução do app. Com ele, os containers passam a SOBREVIVER ao
+ * fechamento — o app lembra os nomes em disco (known.ts) e reabre na próxima
+ * subida, em vez de apagar tudo na saída.
+ *
+ * Na ABI 2.9.3 o comportamento antigo continua, e por necessidade: sem abrir
+ * por ID, um container deixado para trás vira órfão permanente (o registro
+ * sobrevive ao terminate da sessão e só some apagando o storage — ver
+ * resetNativeSession), então ali a saída do app apaga mesmo.
*
* Regras por probe (SDK 2.9.4): port mapping exige networking BRIDGED e só
* TCP; init process com callbacks exige start com WSLC_CONTAINER_START_FLAG_ATTACH.
@@ -309,6 +316,7 @@ export async function runNativeContainer(opts: RunContainerOptions): Promise {
+ const known = readKnownContainers()
+ if (known.length === 0) return
+
+ const { sdk, handle: session } = await acquireNativeSession()
+ if (!sdk.abi.modern) return
+
+ for (const k of known) {
+ if (registry.has(k.id)) continue
+ const out: unknown[] = [null]
+ const err: (string | null)[] = [null]
+ const keep = new Keep()
+ // oxlint-disable-next-line no-await-in-loop -- sequencial de propósito (handles nativos)
+ const hr = await callNative(sdk.raw['WslcOpenContainer'], session, keep.ansi(k.id), out, err)
+ if (!hrOk(hr) || !out[0]) {
+ forgetContainer(k.id)
+ continue
+ }
+ registry.set(k.id, fromKnown(sdk, out[0], k))
+ logInfo('native', `Container ${k.id.slice(0, 12)} (${k.name}) reaberto de uma execução anterior`)
+ }
+}
+
/** Lista os containers do registro com estado real (WslcGetContainerState). */
export async function listNativeContainers(all: boolean): Promise {
+ await reopenKnownContainers()
const result: ContainerInfo[] = []
const newestFirst = Array.from(registry.values()).toSorted((a, b) => b.createdAt - a.createdAt)
// oxlint-disable-next-line no-await-in-loop -- sequencial de propósito (handles nativos)
@@ -344,7 +421,8 @@ export async function listNativeContainers(all: boolean): Promise {
const all = [...registry.values()]
if (all.length === 0) return
+
+ const primeiro = all[0] as NativeContainer
+ if (primeiro.sdk.abi.modern) {
+ logInfo('native', `Mantendo ${all.length} container(s) nativo(s) — serão reabertos na próxima execução`)
+ await Promise.allSettled(all.map((c) => releaseLocal(c)))
+ return
+ }
+
logInfo('native', `Removendo ${all.length} container(s) nativo(s) no fechamento do app`)
let cap: NodeJS.Timeout | undefined
await Promise.race([
@@ -625,6 +721,8 @@ export async function resetNativeSession(): Promise {
logWarn('native', 'Reset da sessão nativa solicitado (terminate + wipe do storage)')
await Promise.allSettled(Array.from(registry.values()).map((c) => releaseLocal(c)))
await terminateNativeSession()
+ // Apaga o storage inteiro: containers.json mora lá dentro, então a
+ // memória dos containers vai junto, que é o esperado num reset.
const storage = sessionStoragePath()
rmSync(storage, { recursive: true, force: true })
mkdirSync(storage, { recursive: true })
diff --git a/src/main/services/wslc/native/crash-dumps.test.ts b/src/main/services/wslc/native/crash-dumps.test.ts
index c4a0738..f9f330d 100644
--- a/src/main/services/wslc/native/crash-dumps.test.ts
+++ b/src/main/services/wslc/native/crash-dumps.test.ts
@@ -8,7 +8,7 @@ import {
runNativeContainer
} from './containers'
import { mapCrashDump, signalName } from './crash-dumps'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import { releaseNativeSession, setOnNativeCrashDump } from './session'
const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms))
@@ -52,7 +52,7 @@ describe('mapCrashDump (puro)', () => {
// Integração real: crash de um processo dentro de um container da sessão
// nativa (exige a wslcsdk.dll e a imagem alpine:latest já puxada).
-describe.skipIf(locateWslcSdk() === null)('crash dumps (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('crash dumps (integração real via FFI)', () => {
afterAll(async () => {
setOnNativeCrashDump(() => {})
await cleanupNativeContainers()
diff --git a/src/main/services/wslc/native/image-ops.test.ts b/src/main/services/wslc/native/image-ops.test.ts
index 13552b7..45827b6 100644
--- a/src/main/services/wslc/native/image-ops.test.ts
+++ b/src/main/services/wslc/native/image-ops.test.ts
@@ -6,7 +6,7 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest'
import type { StreamDataEvent, StreamExitEvent, StreamProgressEvent } from '@shared/schemas'
import { stopStream, type StreamSink } from '../streams'
import { importNativeImage, pullNativeImage, pushNativeImage, tagNativeImage } from './image-ops'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import { listNativeImages, releaseNativeSession, removeNativeImage } from './session'
const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms))
@@ -46,7 +46,7 @@ async function hasImage(name: string): Promise {
// Integração real: pull com progresso estruturado, tag e import de tarball na
// sessão nativa (exige a wslcsdk.dll e rede para o Docker Hub).
-describe.skipIf(locateWslcSdk() === null)('imagens nativas (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('imagens nativas (integração real via FFI)', () => {
beforeAll(async () => {
// Sobra de execução anterior invalidaria o teste de cancelamento.
await removeNativeImage('busybox:latest').catch(() => null)
diff --git a/src/main/services/wslc/native/install.test.ts b/src/main/services/wslc/native/install.test.ts
index 405cc55..7ed5e42 100644
--- a/src/main/services/wslc/native/install.test.ts
+++ b/src/main/services/wslc/native/install.test.ts
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest'
import type { InstallProgressEvent } from '@shared/schemas'
import { componentLabel, installNativeComponents } from './install'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
describe('componentLabel (puro)', () => {
it('nomeia os componentes conhecidos', () => {
@@ -17,7 +17,7 @@ describe('componentLabel (puro)', () => {
// Integração real: nesta máquina (completa) a instalação guiada é um no-op
// idempotente — S_OK sem nenhum callback de progresso (validado por probe).
-describe.skipIf(locateWslcSdk() === null)('instalação guiada (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('instalação guiada (integração real via FFI)', () => {
it('é idempotente em máquina completa (ok, sem progresso)', { timeout: 60_000 }, async () => {
const events: InstallProgressEvent[] = []
const res = await installNativeComponents((ev) => events.push(ev))
diff --git a/src/main/services/wslc/native/install.ts b/src/main/services/wslc/native/install.ts
index b34ff4c..22fc1b4 100644
--- a/src/main/services/wslc/native/install.ts
+++ b/src/main/services/wslc/native/install.ts
@@ -6,7 +6,8 @@ import {
loadWslcSdk,
registerCallback,
unregisterCallback,
- WSLC_COMPONENT_FLAGS
+ WSLC_COMPONENT_FLAGS,
+ WSLC_INSTALL_OPTIONS
} from './bindings'
import { locateWslcSdk } from './locate'
import { callNative } from './session'
@@ -59,7 +60,18 @@ export async function installNativeComponents(
onProgress({ component: componentLabel(component), step, total })
}
cbId = registerCallback(cb as never, sdk.types['InstallCallback'])
- const hr = await callNative(sdk.raw['WslcInstallWithDependencies'], cbId, null)
+ // A ABI 2.9.9 pede quais componentes instalar (e opções) antes do callback.
+ // `before` são justamente os que faltam — com 0, a chamada vira no-op, que
+ // é o mesmo comportamento idempotente da 2.9.3 em máquina completa.
+ const hr = sdk.abi.modern
+ ? await callNative(
+ sdk.raw['WslcInstallWithDependencies'],
+ before,
+ WSLC_INSTALL_OPTIONS.NONE,
+ cbId,
+ null
+ )
+ : await callNative(sdk.raw['WslcInstallWithDependencies'], cbId, null)
if (!hrOk(hr)) {
const message =
diff --git a/src/main/services/wslc/native/known.test.ts b/src/main/services/wslc/native/known.test.ts
new file mode 100644
index 0000000..ea16cf9
--- /dev/null
+++ b/src/main/services/wslc/native/known.test.ts
@@ -0,0 +1,91 @@
+import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
+import { tmpdir } from 'node:os'
+import { join } from 'node:path'
+import { afterEach, beforeEach, describe, expect, it } from 'vitest'
+import {
+ forgetAllContainers,
+ forgetContainer,
+ knownFilePath,
+ readKnownContainers,
+ rememberContainer,
+ type KnownContainer
+} from './known'
+
+let dir: string
+let file: string
+
+const container = (id: string, name = id): KnownContainer => ({
+ id,
+ name,
+ image: 'alpine:latest',
+ command: 'sh',
+ createdAt: 1_700_000_000_000,
+ portsDisplay: '',
+ autoRemove: false
+})
+
+beforeEach(() => {
+ dir = mkdtempSync(join(tmpdir(), 'wslc-known-'))
+ file = knownFilePath(dir)
+})
+
+afterEach(() => {
+ rmSync(dir, { recursive: true, force: true })
+})
+
+describe('readKnownContainers', () => {
+ it('devolve lista vazia quando o arquivo não existe', () => {
+ expect(readKnownContainers(file)).toEqual([])
+ })
+
+ // O arquivo mora no storage da sessão, que o reset apaga inteiro — ler um
+ // resto corrompido não pode derrubar a listagem de containers.
+ it('devolve lista vazia com JSON podre', () => {
+ writeFileSync(file, '{isso não é json', 'utf8')
+ expect(readKnownContainers(file)).toEqual([])
+ })
+
+ it('ignora entradas sem id ou nome', () => {
+ writeFileSync(file, JSON.stringify([container('abc'), { image: 'x' }, null, 'texto']), 'utf8')
+ expect(readKnownContainers(file).map((c) => c.id)).toEqual(['abc'])
+ })
+})
+
+describe('rememberContainer', () => {
+ it('acrescenta e persiste', () => {
+ rememberContainer(container('a1'), file)
+ rememberContainer(container('b2'), file)
+ expect(readKnownContainers(file).map((c) => c.id)).toEqual(['a1', 'b2'])
+ expect(JSON.parse(readFileSync(file, 'utf8'))).toHaveLength(2)
+ })
+
+ it('substitui a entrada do mesmo id em vez de duplicar', () => {
+ rememberContainer(container('a1', 'antigo'), file)
+ rememberContainer(container('a1', 'novo'), file)
+ const lista = readKnownContainers(file)
+ expect(lista).toHaveLength(1)
+ expect(lista[0]?.name).toBe('novo')
+ })
+})
+
+describe('forgetContainer', () => {
+ it('remove só o id pedido', () => {
+ rememberContainer(container('a1'), file)
+ rememberContainer(container('b2'), file)
+ forgetContainer('a1', file)
+ expect(readKnownContainers(file).map((c) => c.id)).toEqual(['b2'])
+ })
+
+ it('id inexistente não mexe no arquivo', () => {
+ rememberContainer(container('a1'), file)
+ const antes = readFileSync(file, 'utf8')
+ forgetContainer('nao-existe', file)
+ expect(readFileSync(file, 'utf8')).toBe(antes)
+ })
+
+ it('forgetAll esvazia', () => {
+ rememberContainer(container('a1'), file)
+ forgetAllContainers(file)
+ expect(readKnownContainers(file)).toEqual([])
+ })
+})
diff --git a/src/main/services/wslc/native/known.ts b/src/main/services/wslc/native/known.ts
new file mode 100644
index 0000000..6880e0b
--- /dev/null
+++ b/src/main/services/wslc/native/known.ts
@@ -0,0 +1,80 @@
+import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'
+import { dirname, join } from 'node:path'
+import { sessionStoragePath } from './session'
+
+/**
+ * Containers nativos que este app criou, lembrados entre execuções.
+ *
+ * Por que um arquivo, e não só memória: o SDK **não enumera containers**. Nem
+ * na 2.9.9 — ela ganhou `WslcOpenContainer`, que abre um container por nome ou
+ * ID, mas continua não havendo "liste tudo". Então, para reencontrar o que o
+ * app criou, o app precisa lembrar os nomes.
+ *
+ * Isso é o que permite os containers nativos SOBREVIVEREM ao fechamento do app
+ * (na ABI 2.9.3 eles eram apagados na saída, senão viravam órfãos permanentes).
+ * Medido: soltar a sessão derruba os containers em execução para EXITED, mas o
+ * registro fica, `WslcOpenContainer` reabre por nome numa execução seguinte, e
+ * `WslcStartContainer` no handle reaberto os põe de volta em RUNNING.
+ *
+ * Mora dentro do storage da sessão, e não no settings.json, porque é estado
+ * DAQUELE storage: o reset da sessão apaga a pasta e leva este arquivo junto,
+ * que é exatamente o comportamento certo.
+ */
+
+export interface KnownContainer {
+ /** ID completo (64 hex) — é por ele que o reopen tenta primeiro. */
+ id: string
+ name: string
+ image: string
+ command: string
+ createdAt: number
+ portsDisplay: string
+ autoRemove: boolean
+}
+
+export function knownFilePath(storage: string = sessionStoragePath()): string {
+ return join(storage, 'containers.json')
+}
+
+export function readKnownContainers(file: string = knownFilePath()): KnownContainer[] {
+ try {
+ const parsed: unknown = JSON.parse(readFileSync(file, 'utf8'))
+ if (!Array.isArray(parsed)) return []
+ return parsed.filter(
+ (c): c is KnownContainer =>
+ typeof c === 'object' &&
+ c !== null &&
+ typeof (c as KnownContainer).id === 'string' &&
+ typeof (c as KnownContainer).name === 'string'
+ )
+ } catch {
+ // Sem arquivo, JSON podre ou storage recém-resetado: nada a lembrar.
+ return []
+ }
+}
+
+function write(list: KnownContainer[], file: string): void {
+ try {
+ mkdirSync(dirname(file), { recursive: true })
+ writeFileSync(file, JSON.stringify(list, null, 2), 'utf8')
+ } catch {
+ // Lembrar é melhor-esforço: falhar aqui não pode derrubar a criação de um
+ // container que já existe de verdade no storage.
+ }
+}
+
+export function rememberContainer(c: KnownContainer, file: string = knownFilePath()): void {
+ const list = readKnownContainers(file).filter((k) => k.id !== c.id)
+ list.push(c)
+ write(list, file)
+}
+
+export function forgetContainer(id: string, file: string = knownFilePath()): void {
+ const list = readKnownContainers(file)
+ const restante = list.filter((k) => k.id !== id)
+ if (restante.length !== list.length) write(restante, file)
+}
+
+export function forgetAllContainers(file: string = knownFilePath()): void {
+ write([], file)
+}
diff --git a/src/main/services/wslc/native/locate.test.ts b/src/main/services/wslc/native/locate.test.ts
index 4b5a343..6bc27e5 100644
--- a/src/main/services/wslc/native/locate.test.ts
+++ b/src/main/services/wslc/native/locate.test.ts
@@ -1,26 +1,72 @@
-import { describe, expect, it } from 'vitest'
-import { locateWslcSdk, sdkCandidates } from './locate'
+import { afterEach, describe, expect, it } from 'vitest'
+import { locateSdk, locateWslcSdk, sdkCandidates, setCustomSdkPath } from './locate'
const ENV = { ProgramFiles: 'C:\\Program Files' } as NodeJS.ProcessEnv
+const BASE = { env: ENV, appRoot: 'C:\\app', resourcesRoot: null }
+
+afterEach(() => {
+ setCustomSdkPath(null)
+})
describe('sdkCandidates', () => {
- it('prioriza o override, depois a DLL vendorizada, depois o Program Files', () => {
- const candidates = sdkCandidates({ ...ENV, WSLC_SDK_DLL: 'D:\\custom\\wslcsdk.dll' }, 'C:\\app')
+ it('ordena: override, escolha da pessoa, empacotada, Program Files', () => {
+ const candidates = sdkCandidates({
+ ...BASE,
+ env: { ...ENV, WSLC_SDK_DLL: 'D:\\dev\\wslcsdk.dll' },
+ custom: 'E:\\baixada\\wslcsdk.dll'
+ })
expect(candidates).toEqual([
- 'D:\\custom\\wslcsdk.dll',
- 'C:\\app\\vendor\\wslcsdk\\win-x64\\wslcsdk.dll',
+ { path: 'D:\\dev\\wslcsdk.dll', source: 'env' },
+ { path: 'E:\\baixada\\wslcsdk.dll', source: 'custom' },
+ { path: 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll', source: 'bundled' },
+ { path: 'C:\\Program Files\\WSL\\wslcsdk.dll', source: 'system' }
+ ])
+ })
+
+ // No app instalado a DLL vai como extraResource, fora do asar.
+ it('procura em resources antes do diretório do projeto', () => {
+ const paths = sdkCandidates({ ...BASE, resourcesRoot: 'C:\\Program Files\\WSLC UI\\resources' })
+ expect(paths.map((c) => c.path)).toEqual([
+ 'C:\\Program Files\\WSLC UI\\resources\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll',
+ 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll',
'C:\\Program Files\\WSL\\wslcsdk.dll'
])
})
+
+ it('usa o caminho escolhido guardado no módulo quando nenhum é passado', () => {
+ setCustomSdkPath('E:\\escolhida\\wslcsdk.dll')
+ expect(sdkCandidates(BASE)[0]).toEqual({ path: 'E:\\escolhida\\wslcsdk.dll', source: 'custom' })
+ })
})
-describe('locateWslcSdk', () => {
- it('retorna o primeiro candidato existente', () => {
- const found = locateWslcSdk(ENV, 'C:\\app', (p) => p.includes('Program Files'))
- expect(found).toBe('C:\\Program Files\\WSL\\wslcsdk.dll')
+describe('locateSdk', () => {
+ it('devolve o primeiro que existe, com a origem', () => {
+ const found = locateSdk({ ...BASE, exists: (p) => p.includes('Program Files') })
+ expect(found).toEqual({ path: 'C:\\Program Files\\WSL\\wslcsdk.dll', source: 'system' })
+ })
+
+ it('devolve null quando nada existe', () => {
+ expect(locateSdk({ ...BASE, exists: () => false })).toBeNull()
+ expect(locateWslcSdk({ ...BASE, exists: () => false })).toBeNull()
})
- it('retorna null quando nada existe', () => {
- expect(locateWslcSdk(ENV, 'C:\\app', () => false)).toBeNull()
+ // A escolha da pessoa pode apontar para um arquivo que sumiu: cai para a
+ // empacotada em vez de deixar o motor nativo indisponível.
+ it('ignora a escolha que não existe mais e cai para a empacotada', () => {
+ setCustomSdkPath('E:\\sumiu\\wslcsdk.dll')
+ const found = locateSdk({ ...BASE, exists: (p) => p.startsWith('C:\\app') })
+ expect(found).toEqual({
+ path: 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll',
+ source: 'bundled'
+ })
+ })
+})
+
+describe('escolha da DLL empacotada', () => {
+ it('acompanha a versão do WSL informada', () => {
+ const nova = sdkCandidates({ ...BASE, wslVersion: '2.9.9' })
+ expect(nova.find((c) => c.source === 'bundled')?.path).toContain('2.9.9')
+ const antiga = sdkCandidates({ ...BASE, wslVersion: '2.9.4' })
+ expect(antiga.find((c) => c.source === 'bundled')?.path).toContain('2.9.3')
})
})
diff --git a/src/main/services/wslc/native/locate.ts b/src/main/services/wslc/native/locate.ts
index 2565d24..c1850bb 100644
--- a/src/main/services/wslc/native/locate.ts
+++ b/src/main/services/wslc/native/locate.ts
@@ -1,28 +1,95 @@
import { existsSync } from 'node:fs'
import { join } from 'node:path'
+import type { SdkSource } from '@shared/schemas'
+import { bundledPath, detectWslVersion, pickBundledSdk } from './bundled'
/**
- * Candidatos à wslcsdk.dll, em ordem de preferência:
- * 1. Override explícito (WSLC_SDK_DLL)
- * 2. DLL vendorizada com o app (vendor/wslcsdk, vinda do NuGet Microsoft.WSL.Containers)
- * 3. Instalação do WSL em Program Files
+ * Onde achar a wslcsdk.dll, e de onde ela veio.
+ *
+ * A procedência importa porque a versão da DLL decide se o motor nativo
+ * funciona — e, pior, decide COMO chamá-la: entre 2.9.3 e 2.9.9 duas
+ * assinaturas mudaram (ver SdkAbi em bindings.ts). Por isso a aba Sistema
+ * mostra o caminho e a origem, e deixa escolher outra DLL.
*/
-export function sdkCandidates(
- env: NodeJS.ProcessEnv = process.env,
- appRoot: string = process.cwd()
-): string[] {
- const candidates: string[] = []
+
+export interface SdkLocation {
+ path: string
+ source: SdkSource
+}
+
+/**
+ * Caminho escolhido pela pessoa na aba Sistema (persistido no settings.json).
+ *
+ * Fica em módulo, e não em parâmetro, porque `locateWslcSdk()` é chamado de
+ * uma dúzia de lugares que não têm — nem deveriam ter — acesso às settings.
+ * O main injeta na subida e a cada troca.
+ */
+let customPath: string | null = null
+
+export function setCustomSdkPath(path: string | null): void {
+ customPath = path
+}
+
+export function getCustomSdkPath(): string | null {
+ return customPath
+}
+
+export interface LocateOptions {
+ env?: NodeJS.ProcessEnv
+ /** Raiz do projeto em desenvolvimento (cwd). */
+ appRoot?: string
+ /** `process.resourcesPath` no app empacotado; a DLL vai como extraResource. */
+ resourcesRoot?: string | null
+ /** Sobrepõe o caminho escolhido pela pessoa (testes). */
+ custom?: string | null
+ /**
+ * Versão do WSL, que decide QUAL DLL empacotada usar (ver bundled.ts).
+ * Ausente = pergunta à DLL base, memoizado por processo.
+ */
+ wslVersion?: string | null
+ exists?: (p: string) => boolean
+}
+
+/**
+ * Candidatos, em ordem de precedência:
+ * 1. `WSLC_SDK_DLL` — override de desenvolvimento, usado por scripts e sondas
+ * 2. escolha da pessoa na aba Sistema
+ * 3. DLL empacotada com o app (resources no instalado, vendor/ no dev)
+ * 4. instalação do WSL em Program Files
+ */
+export function sdkCandidates(options: LocateOptions = {}): SdkLocation[] {
+ const {
+ env = process.env,
+ appRoot = process.cwd(),
+ resourcesRoot = (process as { resourcesPath?: string }).resourcesPath ?? null,
+ custom = customPath
+ } = options
+
+ const candidates: SdkLocation[] = []
const override = env['WSLC_SDK_DLL']
- if (override) candidates.push(override)
- candidates.push(join(appRoot, 'vendor', 'wslcsdk', 'win-x64', 'wslcsdk.dll'))
- candidates.push(join(env['ProgramFiles'] ?? 'C:\\Program Files', 'WSL', 'wslcsdk.dll'))
+ if (override) candidates.push({ path: override, source: 'env' })
+ if (custom) candidates.push({ path: custom, source: 'custom' })
+
+ // Empacotadas: QUAL delas depende da versão do WSL — ver bundled.ts.
+ const roots = resourcesRoot ? [resourcesRoot, appRoot] : [appRoot]
+ const wsl = options.wslVersion === undefined ? detectWslVersion(roots, options.exists) : options.wslVersion
+ const escolhida = pickBundledSdk(wsl)
+ for (const root of roots) candidates.push({ path: bundledPath(escolhida, root), source: 'bundled' })
+
+ candidates.push({
+ path: join(env['ProgramFiles'] ?? 'C:\\Program Files', 'WSL', 'wslcsdk.dll'),
+ source: 'system'
+ })
return candidates
}
-export function locateWslcSdk(
- env: NodeJS.ProcessEnv = process.env,
- appRoot: string = process.cwd(),
- exists: (p: string) => boolean = existsSync
-): string | null {
- return sdkCandidates(env, appRoot).find((p) => exists(p)) ?? null
+/** Primeiro candidato que existe em disco, com a origem. */
+export function locateSdk(options: LocateOptions = {}): SdkLocation | null {
+ const exists = options.exists ?? existsSync
+ return sdkCandidates(options).find((c) => exists(c.path)) ?? null
+}
+
+/** Só o caminho — a forma usada pela maior parte do código nativo. */
+export function locateWslcSdk(options: LocateOptions = {}): string | null {
+ return locateSdk(options)?.path ?? null
}
diff --git a/src/main/services/wslc/native/probe.ts b/src/main/services/wslc/native/probe.ts
new file mode 100644
index 0000000..8adbe47
--- /dev/null
+++ b/src/main/services/wslc/native/probe.ts
@@ -0,0 +1,81 @@
+import { createHash } from 'node:crypto'
+import { readFileSync, statSync } from 'node:fs'
+import type { SdkProbe } from '@shared/schemas'
+import { HR_SDK_UPDATE_NEEDED, probeWslcSdk } from './bindings'
+import { missingComponentNames } from './status'
+
+/**
+ * Sonda uma wslcsdk.dll escolhida pela pessoa, antes de o app adotá-la.
+ *
+ * Existe porque a versão da DLL decide se o motor nativo funciona — e nem o
+ * SDK nem o arquivo dizem qual versão são: `WslcGetVersion` devolve a versão
+ * do WSL instalado (o mesmo número para binários diferentes) e a DLL não traz
+ * metadados. Então a sonda mede o que dá: o SHA-256 identifica o binário, e a
+ * ABI sai da presença do símbolo `WslcOpenContainer` (ver SdkAbi).
+ *
+ * Carregar uma DLL arbitrária é a parte arriscada, e por isso tudo aqui está
+ * sob try: arquivo que não é DLL, DLL que não é a wslcsdk, ou uma wslcsdk de
+ * uma versão que não exporta o que esperamos — os três viram `ok: false` com
+ * o motivo, nunca uma exceção subindo para o IPC.
+ */
+const noop = (): void => undefined
+
+export function probeSdkFile(path: string): SdkProbe {
+ const base: SdkProbe = {
+ path,
+ ok: false,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
+ sha256: null,
+ missingComponents: [],
+ detail: ''
+ }
+
+ let sizeBytes: number | null = null
+ let sha256: string | null = null
+ try {
+ sizeBytes = statSync(path).size
+ sha256 = createHash('sha256').update(readFileSync(path)).digest('hex')
+ } catch (e) {
+ return { ...base, detail: `Não consegui ler o arquivo: ${(e as Error).message}` }
+ }
+
+ let unload = noop
+ try {
+ const probe = probeWslcSdk(path)
+ unload = probe.unload
+ const version = probe.sdk.version()
+ const missing = missingComponentNames(probe.sdk.missingComponents())
+ return {
+ path,
+ ok: true,
+ wslVersion: `${version.major}.${version.minor}.${version.revision}`,
+ abi: probe.sdk.abi.label,
+ sizeBytes,
+ sha256,
+ missingComponents: missing,
+ detail:
+ missing.length === 0
+ ? `DLL válida, ABI ${probe.sdk.abi.label}.`
+ : `DLL válida (ABI ${probe.sdk.abi.label}), mas há componentes faltando.`
+ }
+ } catch (e) {
+ return {
+ ...base,
+ sizeBytes,
+ sha256,
+ detail: (e instanceof Error ? e.message : String(e)).includes(HR_SDK_UPDATE_NEEDED)
+ ? 'Esta DLL é antiga demais para o WSL instalado (WSLC_E_SDK_UPDATE_NEEDED).'
+ : `Não é uma wslcsdk.dll utilizável: ${e instanceof Error ? e.message : String(e)}`
+ }
+ } finally {
+ // Não deixa a candidata carregada no processo; a em uso é preservada
+ // pelo próprio unload (ver probeWslcSdk).
+ try {
+ unload()
+ } catch {
+ // descarregar é melhor-esforço: falhar aqui não invalida a sonda
+ }
+ }
+}
diff --git a/src/main/services/wslc/native/registry.test.ts b/src/main/services/wslc/native/registry.test.ts
index b9bf475..86fc1ad 100644
--- a/src/main/services/wslc/native/registry.test.ts
+++ b/src/main/services/wslc/native/registry.test.ts
@@ -1,5 +1,5 @@
import { afterAll, describe, expect, it } from 'vitest'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import {
clearRegistryCredentials,
DEFAULT_REGISTRY,
@@ -65,7 +65,7 @@ describe('logoutNativeRegistry (memória, sem SDK)', () => {
})
// Integração real: WslcSessionAuthenticate contra o Docker Hub (exige rede).
-describe.skipIf(locateWslcSdk() === null)('login nativo (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('login nativo (integração real via FFI)', () => {
afterAll(() => {
clearRegistryCredentials()
releaseNativeSession()
diff --git a/src/main/services/wslc/native/registry.ts b/src/main/services/wslc/native/registry.ts
index 15a4a27..a0976c5 100644
--- a/src/main/services/wslc/native/registry.ts
+++ b/src/main/services/wslc/native/registry.ts
@@ -100,6 +100,9 @@ export async function loginNativeRegistry(
const { sdk, handle: session } = await acquireNativeSession()
const tokenOut: (string | null)[] = [null]
const errOut: (string | null)[] = [null]
+ // A ABI 2.9.9 encaixou `tokenType` entre o token e o errorMessage; sem este
+ // desvio, a DLL nova escreveria o enum onde mora o ponteiro de erro.
+ const tokenTypeOut = [0]
const hr = await callNative(
sdk.raw['WslcSessionAuthenticate'],
session,
@@ -107,6 +110,7 @@ export async function loginNativeRegistry(
keep.ansi(username),
keep.ansi(password),
tokenOut,
+ ...(sdk.abi.modern ? [tokenTypeOut] : []),
errOut
)
if (!hrOk(hr)) {
diff --git a/src/main/services/wslc/native/session.test.ts b/src/main/services/wslc/native/session.test.ts
index c1b79eb..bdaba6d 100644
--- a/src/main/services/wslc/native/session.test.ts
+++ b/src/main/services/wslc/native/session.test.ts
@@ -1,6 +1,6 @@
import { afterAll, describe, expect, it } from 'vitest'
import { imageSchema } from '@shared/schemas'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import {
ensureNativeSession,
isNativeSessionActive,
@@ -25,7 +25,7 @@ describe('sessionStoragePath', () => {
// Integração real: roda apenas nas máquinas com a wslcsdk.dll (cria/solta a
// sessão "WslcUi" de verdade — a mesma que o app usa).
-describe.skipIf(locateWslcSdk() === null)('sessão nativa (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('sessão nativa (integração real via FFI)', () => {
afterAll(() => {
releaseNativeSession()
})
diff --git a/src/main/services/wslc/native/status.test.ts b/src/main/services/wslc/native/status.test.ts
index 7d23ba2..ee5834f 100644
--- a/src/main/services/wslc/native/status.test.ts
+++ b/src/main/services/wslc/native/status.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest'
-import { locateWslcSdk } from './locate'
-import { getNativeStatus, missingComponentNames } from './status'
+import { pickBundledSdk } from './bundled'
+import { getNativeStatus, missingComponentNames, isNativeUsable } from './status'
describe('missingComponentNames', () => {
it('mapeia os flags para nomes amigáveis', () => {
@@ -12,11 +12,22 @@ describe('missingComponentNames', () => {
// Integração real com a wslcsdk.dll — roda apenas onde a DLL existir
// (vendorizada no repo, então normalmente roda).
-describe.skipIf(locateWslcSdk() === null)('wslcsdk via FFI (integração)', () => {
+describe.skipIf(!isNativeUsable())('wslcsdk via FFI (integração)', () => {
it('carrega a DLL, inicializa COM e lê versão/componentes', () => {
const status = getNativeStatus()
expect(status.available).toBe(true)
- expect(status.sdkVersion).toMatch(/^\d+\.\d+\.\d+$/)
+ // É a versão do WSL instalado, não a da DLL — ver nativeStatusSchema.
+ expect(status.wslVersion).toMatch(/^\d+\.\d+\.\d+$/)
expect(status.dllPath).toContain('wslcsdk.dll')
+ expect(status.sizeBytes).toBeGreaterThan(0)
+ })
+
+ // O app leva duas DLLs e escolhe pela versão do WSL (ver bundled.ts). O teste
+ // não fixa qual: fixa a REGRA, para valer em qualquer máquina.
+ it('usa a DLL empacotada compatível com o WSL desta máquina', () => {
+ const status = getNativeStatus()
+ const esperada = pickBundledSdk(status.wslVersion)
+ expect(status.dllPath).toContain(esperada.version)
+ expect(status.abi).toBe(esperada.version === '2.9.9' ? '2.9.9+' : '2.9.3')
})
})
diff --git a/src/main/services/wslc/native/status.ts b/src/main/services/wslc/native/status.ts
index 946a7ec..0469f67 100644
--- a/src/main/services/wslc/native/status.ts
+++ b/src/main/services/wslc/native/status.ts
@@ -1,6 +1,7 @@
+import { statSync } from 'node:fs'
import type { NativeStatus } from '@shared/schemas'
-import { hrHex, loadWslcSdk, WSLC_COMPONENT_FLAGS } from './bindings'
-import { locateWslcSdk } from './locate'
+import { HR_SDK_UPDATE_NEEDED, hrHex, loadWslcSdk, WSLC_COMPONENT_FLAGS } from './bindings'
+import { locateSdk } from './locate'
/** Nomes amigáveis dos componentes que podem faltar. */
export function missingComponentNames(flags: number): string[] {
@@ -11,18 +12,47 @@ export function missingComponentNames(flags: number): string[] {
return names
}
-/** Sonda a API nativa (wslcsdk.dll): presença, versão do SDK e componentes. */
+function fileSize(path: string): number | null {
+ try {
+ return statSync(path).size
+ } catch {
+ return null
+ }
+}
+
+/**
+ * Mensagem acionável para uma DLL que não serve a este WSL.
+ *
+ * O caso comum não é arquivo corrompido: é versão trocada. Dizer só
+ * "0x8004060B" manda a pessoa pesquisar; dizer o que fazer resolve.
+ */
+function sdkFailureDetail(e: unknown): string {
+ const msg = e instanceof Error ? e.message : hrHex(Number(e))
+ if (msg.includes(HR_SDK_UPDATE_NEEDED)) {
+ return (
+ 'Esta wslcsdk.dll é antiga demais para o WSL instalado (WSLC_E_SDK_UPDATE_NEEDED). ' +
+ 'Atualize o WSL, ou escolha outra DLL aqui em Sistema.'
+ )
+ }
+ return `Falha ao carregar/consultar o SDK: ${msg}`
+}
+
+/** Sonda a API nativa (wslcsdk.dll): presença, origem, ABI e componentes. */
export function getNativeStatus(): NativeStatus {
- const dllPath = locateWslcSdk()
- if (!dllPath) {
+ const found = locateSdk()
+ if (!found) {
return {
available: false,
dllPath: null,
- sdkVersion: null,
+ source: null,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
missingComponents: [],
- detail: 'wslcsdk.dll não encontrada (vendor/wslcsdk ou C:\\Program Files\\WSL).'
+ detail: 'wslcsdk.dll não encontrada (empacotada com o app ou C:\\Program Files\\WSL).'
}
}
+ const { path: dllPath, source } = found
try {
const sdk = loadWslcSdk(dllPath)
const version = sdk.version()
@@ -31,7 +61,10 @@ export function getNativeStatus(): NativeStatus {
return {
available: true,
dllPath,
- sdkVersion: `${version.major}.${version.minor}.${version.revision}`,
+ source,
+ wslVersion: `${version.major}.${version.minor}.${version.revision}`,
+ abi: sdk.abi.label,
+ sizeBytes: fileSize(dllPath),
missingComponents: missing,
detail:
missing.length === 0
@@ -42,9 +75,25 @@ export function getNativeStatus(): NativeStatus {
return {
available: false,
dllPath,
- sdkVersion: null,
+ source,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: fileSize(dllPath),
missingComponents: [],
- detail: `Falha ao carregar/consultar o SDK: ${e instanceof Error ? e.message : hrHex(Number(e))}`
+ detail: sdkFailureDetail(e)
}
}
}
+
+/**
+ * O motor nativo é utilizável NESTA máquina? Guarda dos testes de integração.
+ *
+ * Era `locateWslcSdk() === null`, e funcionava por acidente: a DLL não era
+ * versionada, então no CI ela não existia e a suíte pulava. Ao empacotar o SDK
+ * no repositório, o arquivo passou a existir em qualquer runner — mas o WSL
+ * não. Presença de arquivo nunca foi a pergunta certa; a pergunta é se o SDK
+ * responde, e é isso que `available` mede (carrega a DLL e pede a versão).
+ */
+export function isNativeUsable(): boolean {
+ return getNativeStatus().available
+}
diff --git a/src/main/services/wslc/native/terminal.test.ts b/src/main/services/wslc/native/terminal.test.ts
index 8e3b07c..35dedfa 100644
--- a/src/main/services/wslc/native/terminal.test.ts
+++ b/src/main/services/wslc/native/terminal.test.ts
@@ -2,7 +2,7 @@ import { afterAll, describe, expect, it } from 'vitest'
import type { TerminalDataEvent, TerminalExitEvent } from '@shared/schemas'
import { closeTerminal, writeTerminal } from '../terminals'
import { cleanupNativeContainers, runNativeContainer } from './containers'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import { releaseNativeSession } from './session'
import { openNativeTerminal } from './terminal'
@@ -32,7 +32,7 @@ function memorySink(): MemorySink {
// Integração real: shell persistente via bridge FIFO dentro de um container
// nativo (exige a wslcsdk.dll e a imagem alpine:latest na sessão nativa).
-describe.skipIf(locateWslcSdk() === null)('terminal nativo (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('terminal nativo (integração real via FFI)', () => {
afterAll(async () => {
await cleanupNativeContainers()
releaseNativeSession()
diff --git a/src/main/services/wslc/native/volumes.test.ts b/src/main/services/wslc/native/volumes.test.ts
index a3d617d..4ab11bc 100644
--- a/src/main/services/wslc/native/volumes.test.ts
+++ b/src/main/services/wslc/native/volumes.test.ts
@@ -1,7 +1,7 @@
import { existsSync } from 'node:fs'
import { join } from 'node:path'
import { afterAll, describe, expect, it } from 'vitest'
-import { locateWslcSdk } from './locate'
+import { isNativeUsable } from './status'
import { releaseNativeSession } from './session'
import {
createNativeVolume,
@@ -34,7 +34,7 @@ describe('vhdxToVolume (mapeamento puro)', () => {
})
// Integração real: cria/lista/remove volumes VHDX na sessão nativa.
-describe.skipIf(locateWslcSdk() === null)('volumes VHD nativos (integração real via FFI)', () => {
+describe.skipIf(!isNativeUsable())('volumes VHD nativos (integração real via FFI)', () => {
const NAME = 'wslcui-teste-vol'
afterAll(async () => {
diff --git a/src/main/services/wslc/ops.ts b/src/main/services/wslc/ops.ts
index b56d070..3332fcf 100644
--- a/src/main/services/wslc/ops.ts
+++ b/src/main/services/wslc/ops.ts
@@ -11,6 +11,7 @@ import type {
NativeTuning,
RegistryImage,
RunContainerOptions,
+ SdkProbe,
VhdVolumeOptions,
VolumeInfo
} from '@shared/schemas'
@@ -45,8 +46,14 @@ export interface NativeOps {
setTuning(tuning: NativeTuning): void
setOnSessionEnded(cb: (reason: NativeSessionEndedEvent['reason']) => void): void
setOnCrashDump(cb: (ev: NativeCrashDumpEvent) => void): void
- /** Sonda a DLL: presença, versão e componentes faltando (não exige sessão). */
+ /** Sonda a DLL: presença, origem, ABI e componentes faltando (não exige sessão). */
status(): NativeStatus
+ /** Caminho da DLL escolhida na aba Sistema (null = a empacotada com o app). */
+ getSdkPath(): string | null
+ /** Passa a usar outra DLL. Só vale de fato na próxima abertura do app. */
+ setSdkPath(path: string | null): void
+ /** Lê versão, ABI e SHA-256 de uma DLL candidata, sem adotá-la. */
+ probeSdk(path: string): SdkProbe
/** Instalação guiada dos componentes (só precisa da DLL, não da sessão). */
install(onProgress: (ev: InstallProgressEvent) => void): Promise
diff --git a/src/main/services/wslc/real-ops.ts b/src/main/services/wslc/real-ops.ts
index df68ffe..ec99713 100644
--- a/src/main/services/wslc/real-ops.ts
+++ b/src/main/services/wslc/real-ops.ts
@@ -23,6 +23,8 @@ import {
tagNativeImage
} from './native/image-ops'
import { installNativeComponents } from './native/install'
+import { getCustomSdkPath, setCustomSdkPath } from './native/locate'
+import { probeSdkFile } from './native/probe'
import { loginNativeRegistry, logoutNativeRegistry } from './native/registry'
import {
ensureNativeSession,
@@ -62,6 +64,9 @@ const nativeOps: NativeOps = {
setOnSessionEnded: setOnNativeSessionEnded,
setOnCrashDump: setOnNativeCrashDump,
status: getNativeStatus,
+ getSdkPath: getCustomSdkPath,
+ setSdkPath: setCustomSdkPath,
+ probeSdk: probeSdkFile,
install: installNativeComponents,
listContainers: listNativeContainers,
diff --git a/src/main/settings.ts b/src/main/settings.ts
index 24e378e..98614b2 100644
--- a/src/main/settings.ts
+++ b/src/main/settings.ts
@@ -59,3 +59,26 @@ export function readNativeTuning(file: string, io: SettingsIo = defaultIo): Nati
export function writeNativeTuning(file: string, tuning: NativeTuning, io: SettingsIo = defaultIo): void {
io.write(file, JSON.stringify({ ...readAll(file, io), nativeTuning: tuning }, null, 2))
}
+
+/**
+ * Caminho da wslcsdk.dll escolhido na aba Sistema. null = usar a empacotada.
+ *
+ * Fica no settings.json (e não numa variável de ambiente) porque é escolha de
+ * quem usa o app, não de quem o desenvolve — e precisa sobreviver ao reinício,
+ * já que a troca de DLL só vale na próxima abertura.
+ */
+export function readSdkPath(file: string, io: SettingsIo = defaultIo): string | null {
+ try {
+ const parsed: unknown = JSON.parse(io.read(file))
+ const value = (parsed as { sdkPath?: unknown }).sdkPath
+ return typeof value === 'string' && value.trim() !== '' ? value : null
+ } catch {
+ return null
+ }
+}
+
+export function writeSdkPath(file: string, path: string | null, io: SettingsIo = defaultIo): void {
+ const atual = readAll(file, io)
+ if (path === null) delete atual['sdkPath']
+ io.write(file, JSON.stringify(path === null ? atual : { ...atual, sdkPath: path }, null, 2))
+}
diff --git a/src/preload/index.ts b/src/preload/index.ts
index 7ee54f5..85aadd0 100644
--- a/src/preload/index.ts
+++ b/src/preload/index.ts
@@ -68,6 +68,9 @@ const api: WslcApi = {
getNativeTuning: () => invoke('system:get-native-tuning', undefined),
setNativeTuning: (tuning) => invoke('system:set-native-tuning', tuning),
restartNativeSession: () => invoke('system:restart-native', undefined),
+ sdkPath: () => invoke('system:sdk-path', undefined),
+ pickSdk: () => invoke('system:pick-sdk', undefined),
+ setSdkPath: (path) => invoke('system:set-sdk-path', { path }),
getNativeStatus: () => invoke('system:native-status', undefined),
getEngine: () => invoke('system:get-engine', undefined),
setEngine: (engine) => invoke('system:set-engine', { engine }),
diff --git a/src/renderer/src/features/setup/SetupView.test.tsx b/src/renderer/src/features/setup/SetupView.test.tsx
index e54d3c1..e708573 100644
--- a/src/renderer/src/features/setup/SetupView.test.tsx
+++ b/src/renderer/src/features/setup/SetupView.test.tsx
@@ -17,7 +17,10 @@ const envIncompleto: WslcEnvironment = {
const nativeStatus = (available: boolean) => ({
available,
dllPath: available ? 'C:\\vendor\\wslcsdk.dll' : null,
- sdkVersion: available ? '2.9.4' : null,
+ source: available ? ('bundled' as const) : null,
+ wslVersion: available ? '2.9.4' : null,
+ abi: available ? '2.9.9+' : null,
+ sizeBytes: available ? 4_929_888 : null,
missingComponents: [],
detail: 'teste'
})
diff --git a/src/renderer/src/features/system/SystemView.tsx b/src/renderer/src/features/system/SystemView.tsx
index 8eb0471..89812c1 100644
--- a/src/renderer/src/features/system/SystemView.tsx
+++ b/src/renderer/src/features/system/SystemView.tsx
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useState } from 'react'
-import { FileCog, ListTree, Power, RefreshCw, RotateCcw, Save, Undo2 } from 'lucide-react'
-import type { NativeTuning, WslcSessionInfo } from '@shared/schemas'
+import { FileCog, FolderSearch, ListTree, Power, RefreshCw, RotateCcw, Save, Undo2 } from 'lucide-react'
+import type { NativeStatus, NativeTuning, WslcSessionInfo } from '@shared/schemas'
import {
Button,
Cell,
@@ -27,6 +27,14 @@ import { useEngineStore } from '@/stores/engine-store'
import { useEnvStore } from '@/stores/env-store'
import { useNativeStore } from '@/stores/native-store'
+/** Rótulo de onde a DLL em uso saiu (nativeStatus.source). */
+const SDK_SOURCES: Record, string> = {
+ bundled: 'empacotada com o app',
+ custom: 'escolhida por você',
+ system: 'instalação do WSL',
+ env: 'WSLC_SDK_DLL (ambiente)'
+}
+
const LINKS = [
{
href: 'https://learn.microsoft.com/windows/wsl/wsl-container',
@@ -115,6 +123,8 @@ export default function SystemView(): React.JSX.Element {
const [vhdSizeMb, setVhdSizeMb] = useState('')
const [gpu, setGpu] = useState(false)
const [savingTuning, setSavingTuning] = useState(false)
+ const [sdkPath, setSdkPath] = useState(null)
+ const [pickingSdk, setPickingSdk] = useState(false)
const refreshSessions = useCallback((): void => {
window.wslcApi
@@ -127,6 +137,10 @@ export default function SystemView(): React.JSX.Element {
void refreshNative()
void loadEngine()
refreshSessions()
+ window.wslcApi
+ .sdkPath()
+ .then(setSdkPath)
+ .catch(() => setSdkPath(null))
window.wslcApi
.getNativeTuning()
.then((t: NativeTuning) => {
@@ -138,6 +152,36 @@ export default function SystemView(): React.JSX.Element {
.catch(() => undefined)
}, [refreshNative, loadEngine, refreshSessions])
+ /**
+ * Escolher outra wslcsdk.dll. A sonda roda ANTES de gravar: um arquivo que
+ * não é a DLL certa é recusado aqui, e não vira um motor nativo quebrado na
+ * próxima abertura.
+ */
+ const pickSdk = async (): Promise => {
+ setPickingSdk(true)
+ try {
+ const probe = await window.wslcApi.pickSdk()
+ if (probe === null) return
+ if (!probe.ok) {
+ toast.danger(probe.detail)
+ return
+ }
+ await window.wslcApi.setSdkPath(probe.path)
+ setSdkPath(probe.path)
+ toast.success(`DLL ${probe.abi} escolhida. Reabra o app para passar a usá-la.`)
+ } catch (e) {
+ toast.danger(e instanceof Error ? e.message : String(e))
+ } finally {
+ setPickingSdk(false)
+ }
+ }
+
+ const useBundledSdk = async (): Promise => {
+ await window.wslcApi.setSdkPath(null)
+ setSdkPath(null)
+ toast.success('Voltando para a DLL empacotada. Reabra o app para aplicar.')
+ }
+
const saveTuning = async (): Promise => {
const tuning: NativeTuning = {
cpuCount: parseField(cpuCount),
@@ -312,11 +356,12 @@ export default function SystemView(): React.JSX.Element {
: 'criada na primeira operação'
: 'inativa'}
-
- {native?.sdkVersion ?? '-'}
+
+ {native?.wslVersion ?? '-'}
+
-
- {native?.dllPath ?? '-'}
+
+ {native?.abi ?? '-'}
{native && native.missingComponents.length > 0 && (
{native.missingComponents.join(', ')}
@@ -331,10 +376,59 @@ export default function SystemView(): React.JSX.Element {
pull e push com progresso por camada, login em registry, tag, load/import de tarball, remover) e
volumes VHDX (tamanho, tipo e dono) usam a sessão própria do app ("WslcUi") via FFI.
Crashes de processos nos containers geram um aviso com o caminho do dump (.dmp) coletado pelo WSL.
- Como o SDK preview não permite reabrir handles, os containers nativos são removidos quando o app
- fecha. Build, save, export, stats e redes nomeadas só existem no motor CLI.
+ A partir da ABI 2.9.9 os containers nativos SOBREVIVEM ao fechamento do app: eles param, e o app
+ os reabre pelo nome na próxima execução. Na 2.9.3 eles ainda são removidos na saída, porque sem
+ reabrir por ID virariam registros órfãos e invisíveis. Build, save, export, stats e redes nomeadas
+ só existem no motor CLI.
+
+
+ wslcsdk.dll em uso
+
+
+
+ {native?.source ? SDK_SOURCES[native.source] : '-'}
+ {sdkPath !== null && native?.source !== 'custom' && (
+
+ )}
+
+
+ {native?.sizeBytes ? `${(native.sizeBytes / 1024 / 1024).toFixed(1)} MB` : '-'}
+
+
+
+ {native?.dllPath ?? '-'}
+
+
+ {sdkPath !== null && (
+
+
+ {sdkPath}
+
+
+ )}
+
+
+ void pickSdk()}>
+
+ {pickingSdk ? 'Verificando…' : 'Escolher outra DLL…'}
+
+ {sdkPath !== null && (
+ void useBundledSdk()}>
+
+ Usar a empacotada
+
+ )}
+
+
+ A versão da DLL decide o que o motor nativo consegue fazer, e como o app precisa chamá-la: entre
+ a 2.9.3 e a 2.9.9 duas funções mudaram de assinatura sem mudar nada visível. O app detecta isso
+ sozinho pela ABI e se adapta — mas a troca só vale ao reabrir, porque a sessão nativa viva
+ segura handles da DLL atual.
+
+
+
Tuning da sessão nativa
diff --git a/src/renderer/src/test/wslc-api.ts b/src/renderer/src/test/wslc-api.ts
index 88a2505..175ad74 100644
--- a/src/renderer/src/test/wslc-api.ts
+++ b/src/renderer/src/test/wslc-api.ts
@@ -62,10 +62,16 @@ export function installWslcApiMock(overrides: Partial = {}): WslcApi {
getNativeTuning: vi.fn(async () => ({})),
setNativeTuning: vi.fn(async () => undefined),
restartNativeSession: vi.fn(async () => okResult()),
+ sdkPath: vi.fn(async () => null),
+ pickSdk: vi.fn(async () => null),
+ setSdkPath: vi.fn(async () => undefined),
getNativeStatus: vi.fn(async () => ({
available: false,
dllPath: null,
- sdkVersion: null,
+ source: null,
+ wslVersion: null,
+ abi: null,
+ sizeBytes: null,
missingComponents: [],
detail: 'mock'
})),
diff --git a/src/shared/ipc/api.ts b/src/shared/ipc/api.ts
index ffddf51..b7a6f7d 100644
--- a/src/shared/ipc/api.ts
+++ b/src/shared/ipc/api.ts
@@ -17,6 +17,7 @@ import type {
NetworkInfo,
RegistryImage,
RunContainerOptions,
+ SdkProbe,
StreamDataEvent,
StreamExitEvent,
StreamProgressEvent,
@@ -92,6 +93,12 @@ export interface WslcApi {
setNativeTuning(tuning: NativeTuning): Promise
/** Termina e recria a sessão nativa aplicando o tuning (mantém imagens). */
restartNativeSession(): Promise
+ /** Caminho da wslcsdk.dll escolhida (null = a empacotada com o app). */
+ sdkPath(): Promise
+ /** Abre o diálogo e sonda o arquivo escolhido; null se cancelou. */
+ pickSdk(): Promise
+ /** Grava a escolha — vale na próxima abertura do app. */
+ setSdkPath(path: string | null): Promise
/** Estado da API nativa (wslcsdk.dll via FFI). */
getNativeStatus(): Promise
/** Motor atual (CLI ou nativo) e estado da sessão nativa. */
diff --git a/src/shared/ipc/contract.ts b/src/shared/ipc/contract.ts
index faa2891..7d9b177 100644
--- a/src/shared/ipc/contract.ts
+++ b/src/shared/ipc/contract.ts
@@ -19,6 +19,7 @@ import {
networkSchema,
registryImageSchema,
runContainerOptionsSchema,
+ sdkProbeSchema,
streamDataEventSchema,
streamExitEventSchema,
streamProgressEventSchema,
@@ -173,6 +174,11 @@ export const invokeContract = {
// Termina e recria a sessão nativa (mantém imagens; containers são perdidos).
'system:restart-native': { input: z.void(), output: commandResultSchema },
+ // Escolha da wslcsdk.dll (a versão dela decide se o motor nativo funciona).
+ 'system:sdk-path': { input: z.void(), output: z.string().nullable() },
+ 'system:pick-sdk': { input: z.void(), output: sdkProbeSchema.nullable() },
+ 'system:set-sdk-path': { input: z.object({ path: z.string().nullable() }), output: z.void() },
+
'streams:stop': { input: z.object({ streamId: streamIdSchema }), output: z.void() },
// Terminal embutido: shell interativo dentro do container (os dois motores).
diff --git a/src/shared/schemas.ts b/src/shared/schemas.ts
index bb896a6..fe288c0 100644
--- a/src/shared/schemas.ts
+++ b/src/shared/schemas.ts
@@ -181,11 +181,44 @@ export const containerStatsSchema = z.object({
blockIO: z.string()
})
+/** De onde saiu a wslcsdk.dll em uso, na ordem de precedência do locate. */
+export const sdkSourceSchema = z.enum(['env', 'custom', 'bundled', 'system'])
+
/** Estado da API nativa (wslcsdk.dll via FFI). */
export const nativeStatusSchema = z.object({
available: z.boolean(),
dllPath: z.string().nullable(),
- sdkVersion: z.string().nullable(),
+ source: sdkSourceSchema.nullable(),
+ /**
+ * Versão do WSL **instalado**, como o SDK a reporta. NÃO é a versão da DLL:
+ * WslcGetVersion devolve o mesmo número para binários diferentes (medido com
+ * 2.9.3 e 2.9.9 na mesma máquina), e a DLL não traz metadados de arquivo.
+ */
+ wslVersion: z.string().nullable(),
+ /** ABI detectada por símbolo — '2.9.9+' ou '2.9.3'. Ver SdkAbi. */
+ abi: z.string().nullable(),
+ /** Tamanho da DLL: o único jeito barato de distinguir dois binários. */
+ sizeBytes: z.number().nullable(),
+ missingComponents: z.array(z.string()),
+ detail: z.string()
+})
+
+/**
+ * Resultado de sondar uma wslcsdk.dll candidata, escolhida na aba Sistema.
+ *
+ * A sonda carrega a DLL num binding próprio, lê o que ela sabe dizer e a
+ * descarrega — sem trocar a que está em uso, que só muda ao reabrir o app.
+ */
+export const sdkProbeSchema = z.object({
+ path: z.string(),
+ /** false = não é uma wslcsdk.dll utilizável (não carregou, faltam símbolos). */
+ ok: z.boolean(),
+ /** Versão do WSL instalado, como ESTA DLL a reporta. */
+ wslVersion: z.string().nullable(),
+ abi: z.string().nullable(),
+ sizeBytes: z.number().nullable(),
+ /** Identidade forte do binário — a única forma de distinguir duas DLLs. */
+ sha256: z.string().nullable(),
missingComponents: z.array(z.string()),
detail: z.string()
})
@@ -345,6 +378,8 @@ export type ContainerStats = z.infer
export type BuildImageOptions = z.infer
export type RegistryImage = z.infer
export type NativeStatus = z.infer
+export type SdkSource = z.infer
+export type SdkProbe = z.infer
export type Engine = z.infer
export type EngineStatus = z.infer
export type NativeSessionEndedEvent = z.infer
diff --git a/vendor/wslcsdk/LICENSE.txt b/vendor/wslcsdk/LICENSE.txt
new file mode 100644
index 0000000..6d74843
--- /dev/null
+++ b/vendor/wslcsdk/LICENSE.txt
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) Microsoft Corporation.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE
+
diff --git a/vendor/wslcsdk/NOTICE.txt b/vendor/wslcsdk/NOTICE.txt
new file mode 100644
index 0000000..cda1491
--- /dev/null
+++ b/vendor/wslcsdk/NOTICE.txt
@@ -0,0 +1,2711 @@
+NOTICES AND INFORMATION
+Do Not Translate or Localize
+
+This software incorporates material from third parties.
+Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com,
+or you may send a check or money order for US $5.00, including the product name,
+the open source component name, platform, and version number, to:
+
+Source Code Compliance Team
+Microsoft Corporation
+One Microsoft Way
+Redmond, WA 98052
+USA
+
+Notwithstanding any other terms, you may reverse engineer this software to the extent
+required to debug changes to any libraries licensed under the GNU Lesser General Public License.
+
+---------------------------------------------------------
+
+llvm/llvm-project d32170dbd5b0d54436537b6b75beaf44324e0c28 - Apache-2.0 WITH LLVM-exception
+
+
+(c) (tm)
+(c) Value A
+(c) auto AS
+(c) Value Sd
+(c) auto AST
+(c) CXType PT
+(c) Type I1Ty
+(c) Value RHS
+(c) X1 ... X1
+(c) Type I32Ty
+(c) Value Elt0
+Copyright 2014
+(c) Type Int8Ty
+(c) Type V8x8Ty
+(c) Value FMSub
+(c) unsigned AS
+(c) Constant One
+(c) Type FloatTy
+(c) Type Int16Ty
+(c) Type Int32Ty
+(c) Type Int64Ty
+(c) Value AllocA
+(c) Value Alloca
+Alloc1 a1 (c) R1
+Alloc1 a2 (c) R1
+(c) FileID MainID
+(c) Lower C Upper
+(c) Stmt NumExprs
+(c) Type DoubleTy
+(c) Type I32PtrTy
+(c) Value AllocaA
+Coproc, Opc1, CRm
+(c) ConstantInt C2
+(c) EUR CHECK-NEXT
+(c) Scale 1 Offset
+(c) State UNQUOTED
+(c) Type IndexType
+Copyright (c) 2012
+Copyright (c) 2013
+Copyright (c) 2019
+Exprs new (c) Stmt
+(c) ExprResult NewE
+(c) Metadata Ops MD
+(c) SelectInst SelI
+(c) SmallVector MDs
+(c) TransferBatch B
+(c) Type Int32PtrTy
+(c) Type Int64PtrTy
+(c) BasicBlock Entry
+(c) CXXRecordDecl CD
+(c) FunctionType FTy
+(c) Offset C- Offset
+Copyright 2010 INRIA
+Copyright 2011 INRIA
+Copyright 2012 INRIA
+Copyright 2014 INRIA
+Copyright 2015 INRIA
+Copyright 2016 INRIA
+(c) FunctionType FnTy
+(c) QualType ResultTy
+(c) SourceRange Range
+AsmToks new (c) Token
+SubExprs new (c) Stmt
+(c) 2008 Red Hat, Inc.
+(c) 2011 Anthony Green
+(c) BasicBlock EntryBB
+(c) FunctionType FFnTy
+(c) FunctionType IFnTy
+(c) SourceLocation Loc
+Condition (c) Branches
+Context (c) LineToUnit
+Copyright (c) 2013 IBM
+(c) ErrMsg Stream Error
+(c) SmallVector NewVars
+(c) SmallVector ToErase
+Bbb kind copyright' Bbb
+(c) Constant PosDivisorC
+CommonPtr new (c) Common
+Copyright (c) 2012 CHECK
+(c) CharUnits AlignedSize
+(c) Constant NullV2I32Ptr
+(c) Constant PosDividendC
+Copyright 2010-2011 INRIA
+Copyright 2014-2015 INRIA
+COPYRIGHT,v 1.3 2003/06/02
+Coproc, Opc1, Rt, Rt2, CRm
+Copyright 2003 Google Inc.
+Copyright 2008 Google Inc.
+Copyright 2009 Google Inc.
+Copyright 2015 Google Inc.
+Copyright 2018 Google Inc.
+Copyright The LLVM project
+coprime. APInt A HugePrime
+copyrighted by the author.
+(c) IdentifierInfo NumExprs
+(c) VectorType Int8PtrVecTy
+(c) Willem van Schaik, 1999
+Copyright (c) 1997, Phillip
+Copyright 2005, Google Inc.
+Copyright 2006, Google Inc.
+Copyright 2007, Google Inc.
+Copyright 2008, Google Inc.
+Copyright 2012 Google, Inc.
+Copyright 2013, Google Inc.
+Copyright 2015, Google Inc.
+InitCache (c) TransferBatch
+copyright u'2015, LLVM Team
+Copyright 2006, Dean Edwards
+(c) CHECK-NEXT 194 CHECK-NEXT
+(c) CXXBaseSpecifier NumBases
+(c) Designator NumDesignators
+(c) StringLiteral NumClobbers
+Constraints new (c) StringRef
+Copyright (c) 2002 Bo Thorsen
+Copyright (c) 2010 Apple Inc.
+Copyright (c) by P.J. Plauger
+Copyright 2010 Zencoder, Inc.
+Copyright 2017 Roman Lebedev.
+ParamInfo new (c) ParmVarDecl
+Copyright (c) 2000 Software AG
+Copyright (c) 2002 Roger Sayle
+Copyright (c) 2008 David Daney
+Copyright (c) 2009 Google Inc.
+Copyright (c) 2016 Aaron Watry
+Copyright (c) 2017 Google Inc.
+Copyright (c) 2018 Jim Ingham.
+Copyright 2009 The Go Authors.
+Copyright 2010 The Go Authors.
+Copyright 2011 The Go Authors.
+Copyright 2012 The Go Authors.
+Copyright 2013 The Go Authors.
+Copyright 2014 The Go Authors.
+Copyright 2015 The Go Authors.
+(c) (3) educational corporation
+(c) CHECK-NEXT foo() CHECK-NEXT
+(copr0) ConstantDataVector CDV1
+(copr1) ConstantDataVector CDV2
+Copyright (c) 1994 X Consortium
+Copyright (c) 2008 Matteo Frigo
+Copyright (c) 2009 Matteo Frigo
+Copyright (c) 2010 CodeSourcery
+Copyright (c) 2011 Kyle Moffett
+Copyright (c) 2011 Tilera Corp.
+Copyright (c) 2011 Timothy Wall
+Copyright (c) 2012 Peter Harris
+Copyright (c) 2012 Tilera Corp.
+Copyright 2008-2010 Apple, Inc.
+Copyright 2015 Sven Verdoolaege
+Copyright 2016 Sven Verdoolaege
+Copyright 2017 Sven Verdoolaege
+Copyright 2018 Sven Verdoolaege
+Copyright, License, and Patents
+Other Coprocessor Instructions.
+(c) StringLiteral NumConstraints
+Copyright (c) 1996 Red Hat, Inc.
+Copyright (c) 2002 Ranjit Mathew
+Copyright (c) 2004 Anthony Green
+Copyright (c) 2004 Simon Posnjak
+Copyright (c) 2008 Anthony Green
+Copyright (c) 2008 Red Hat, Inc.
+Copyright (c) 2011 Anthony Green
+Copyright (c) 2012 Anthony Green
+Copyright (c) 2014 Red Hat, Inc.
+Copyright 2011 Sven Verdoolaege.
+(c) foo() pragma omp target teams
+Copyright (c) 1992 Henry Spencer.
+Copyright (c) 2000 John Hornkvist
+Copyright (c) 2001 John Hornkvist
+Copyright (c) 2006 Kirill Simonov
+Copyright (c) 2012 Alan Hourihane
+Copyright 2001-2004 Unicode, Inc.
+copyright u'2003- d, LLVM Project
+copyright u'2011- d, LLVM Project
+(c) CyclesSaved + LocalCyclesSaved
+Copyright (c) 1999-2007 Apple Inc.
+Copyright (c) 2009 The Go Authors.
+Copyright (c) 2009-2019 Polly Team
+Copyright (c) 2012 Thorsten Glaser
+Copyright (c) 2013 Tensilica, Inc.
+Copyright 2012 Universiteit Leiden
+Copyright 2016-2017 Tobias Grosser
+copyright u'2007- d, The LLDB Team
+copyright u'2013- d, Analyzer Team
+Constraint new (c) AtomicConstraint
+Copyright (c) 1998 Cygnus Solutions
+Copyright (c) 1998 Geoffrey Keating
+Copyright (c) 2001 David E. O'Brien
+Copyright (c) 2013 Mentor Graphics.
+Copyright (c) 2015the LLVM Project.
+Copyright 2009-2010 The Go Authors.
+copyright u'2007- d, The Clang Team
+copyright u'2010- d, The Polly Team
+copyright u'2011-2018, LLVM Project
+Copyright (C ) Microsoft Corporation
+Copyright (c) 2000, 2007 Software AG
+Copyright (c) 2001 Alexander Peslyak
+Copyright (c) 2012, 2013 Xilinx, Inc
+Copyright (c) 2014, 2015 Google Inc.
+Copyright (c) 2019 The MLIR Authors.
+Copyright (c) Microsoft Corporation.
+Copyright 2009, 2010 The Go Authors.
+Copyright 2015-2016 Sven Verdoolaege
+Copyright 2016, 2017 Tobias Grosser.
+Copyright 2016-2017 Sven Verdoolaege
+(c) PointerType InitPtrType InitValue
+Copyright (c) 1996-2003 Red Hat, Inc.
+Copyright (c) 1996-2004 Red Hat, Inc.
+Copyright (c) 1999-2003 Steve Purcell
+Copyright (c) 2012-2016, Yann Collet.
+Copyright 2011,2015 Sven Verdoolaege.
+Copyright (c) 1996, 1998 Red Hat, Inc.
+Copyright (c) 1998, 2008 Red Hat, Inc.
+Copyright (c) 1999, 2008 Red Hat, Inc.
+Copyright (c) 2004 Renesas Technology.
+Copyright (c) 2008 Christian Haggstrom
+Copyright (c) 2008, 2010 Red Hat, Inc.
+Copyright (c) 2011, 2012 Anthony Green
+Copyright (c) 2011, 2013 Anthony Green
+Copyright (c) 2011, 2014 Anthony Green
+Copyright (c) 2012, 2013 Anthony Green
+Copyright (c) 2012, 2014 Anthony Green
+Copyright 2007-2010 by the Sphinx team
+(c) 2006 Free Software Foundation, Inc.
+(c) CHECK-NEXT T break CHECK-NEXT Preds
+Copyright (c) 1998, 2012 Andreas Schwab
+Copyright (c) 2002-2004 Tim J. Robbins.
+Copyright (c) 2005 Free Standards Group
+Copyright 2005-2007 Universiteit Leiden
+Copyright 2006-2007 Universiteit Leiden
+Copyright 2012 Ecole Normale Superieure
+Copyright 2013 Ecole Normale Superieure
+Copyright 2014 Ecole Normale Superieure
+Copyright 2016 Ismael Jimenez Martinez.
+Portions Copyright 2009 The Go Authors.
+in LLVM, Diploma Thesis, (c) April 2011
+(c) StringRef NumClobbers // FIXME Avoid
+Copyright (c) 1996-1998 John D. Polstra.
+Copyright (c) 2002-2008, 2012 Kaz Kojima
+Copyright (c) 1997-2019 Intel Corporation
+Copyright (c) 2005 Axis Communications AB
+Copyright (c) 2010-2015 Benjamin Peterson
+Copyright 1992, 1993, 1994 Henry Spencer.
+coproc_option_imm Operand let PrintMethod
+(c) CXXCtorInitializer NumIvarInitializers
+Copyright (c) 2000 Hewlett Packard Company
+Copyright (c) 2002 Bo Thorsen
+Copyright (c) 1996-2003, 2010 Red Hat, Inc.
+Copyright (c) 2004 eXtensible Systems, Inc.
+Copyright (c) 2009-2014 by the contributors
+Copyright (c) 2009-2015 by the contributors
+Copyright (c) 2009-2016 by the contributors
+Copyright (c) 2009-2019 by the contributors
+Copyright (c) 2011 Free Software Foundation
+Copyright (c) 2011-2014 by the contributors
+Copyright (c) 2011-2019 by the contributors
+Copyright (c) 2013 Imagination Technologies
+Copyright (c) 2017-2019 by the contributors
+(c) CHECK-NEXT Preds (1) B4 CHECK-NEXT Succs
+(c) CHECK-NEXT Preds (1) B5 CHECK-NEXT Succs
+(c) CHECK-NEXT Preds (1) B7 CHECK-NEXT Succs
+CoprocNumAsmOperand AsmOperandClass let Name
+CoprocRegAsmOperand AsmOperandClass let Name
+Copyright (c) 1993 by Sun Microsystems, Inc.
+Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
+Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
+Copyright (c) 1999, 2007, 2008 Red Hat, Inc.
+Copyright (c) 2004 by Sun Microsystems, Inc.
+Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
+Copyright (c) 2011, 2012, 2013 Anthony Green
+Copyright 2012,2014 Ecole Normale Superieure
+Copyright 2012-2013 Ecole Normale Superieure
+Copyright 2012-2014 Ecole Normale Superieure
+Copyright 2013-2014 Ecole Normale Superieure
+Copyright (c) 1992, 1993, 1994 Henry Spencer.
+Copyright (c) 2002-2007 Michael J. Fromberger
+Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
+Copyright (c) 2012, 2013 Anthony Green Target
+Copyright 2000 Free Software Foundation, Inc.
+Copyright 2004 Free Software Foundation, Inc.
+Copyright (c) 2008 Ryan McCabe
+(c) 2003-2004 Randolph Chung
+CoprocOptionAsmOperand AsmOperandClass let Name
+Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
+Copyright (c) 2014 Advanced Micro Devices, Inc.
+Copyright (c) 2015 Advanced Micro Devices, Inc.
+Copyright (c) 1994-1999 Lucent Technologies Inc.
+Copyright (c) 2002, 2007 Bo Thorsen
+Copyright (c) 2013 Imagination Technologies Ltd.
+(c) Designator NumDesigs NumDesignators NumDesigs
+Copyright (c) 1992, 1993 UNIX International, Inc.
+Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+Copyright (c) 2004 Free Software Foundation, Inc.
+Copyright (c) 2006 Free Software Foundation, Inc.
+Copyright (c) 2007 Free Software Foundation, Inc.
+Copyright (c) 2008 Free Software Foundation, Inc.
+Copyright (c) 2009 Free Software Foundation, Inc.
+Copyright (c) 2011 Free Software Foundation, Inc.
+Copyright (c) 2012 Free Software Foundation, Inc.
+Copyright (c) 2012, Noah Spurrier
+Copyright (c) 2013-2014, Pexpect development team
+Copyright (c) 2013-2016, Pexpect development team
+Copyright (c) 2014 Free Software Foundation, Inc.
+Copyright (c) 2015 Paul Norman
+Copyright (c) 2016 Aaron Watry
+Copyright extcopyright~ he year the LLVM Project.
+(c) CHECK-NEXT Preds (3) B3 B4 B2 CHECK-NEXT Succs
+(c) CHECK-NEXT Preds (3) B3 B5 B6 CHECK-NEXT Succs
+Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc.
+Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
+Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc.
+Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc.
+Copyright (c) 2003-2010 Python Software Foundation
+Copyright (c) 2012 Zack Weinberg
+Copyright 1992-2018 Free Software Foundation, Inc.
+Copyright 2008-2009 Katholieke Universiteit Leuven
+(c) Stmt NumExprs std::copy Exprs, Exprs + NumExprs
+Copyright (c) 1996, MPEG Software Simulation Group.
+Copyright (c) 2003 Jakub Jelinek
+Copyright (c) 2008 Guido U. Draheim
+Copyright (c) 2008 Stepan Kasal
+Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+Copyright (c) 2012 Qualcomm Innovation Center, Inc.
+Copyright (c) 2008 Benjamin Kosnik
+Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com)
+Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
+Copyright (c) 2014,2015 Advanced Micro Devices, Inc.
+Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
+Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima
+Copyright (c) 2013 Miodrag Vallat.
+Copyright (c) 2014, 2015 Advanced Micro Devices, Inc.
+Copyright (c) 2016 Krzesimir Nowak
+Copyright (c) 1994-2014 Free Software Foundation, Inc.
+Copyright (c) 1994-2017 Free Software Foundation, Inc.
+Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
+Copyright (c) 1996-2014 Free Software Foundation, Inc.
+Copyright (c) 1996-2015 Free Software Foundation, Inc.
+Copyright (c) 1996-2017 Free Software Foundation, Inc.
+Copyright (c) 1997-2014 Free Software Foundation, Inc.
+Copyright (c) 1997-2017 Free Software Foundation, Inc.
+Copyright (c) 1999-2013 Free Software Foundation, Inc.
+Copyright (c) 1999-2014 Free Software Foundation, Inc.
+Copyright (c) 1999-2017 Free Software Foundation, Inc.
+Copyright (c) 2001-2014 Free Software Foundation, Inc.
+Copyright (c) 2001-2017 Free Software Foundation, Inc.
+Copyright (c) 2002-2014 Free Software Foundation, Inc.
+Copyright (c) 2002-2017 Free Software Foundation, Inc.
+Copyright (c) 2003-2014 Free Software Foundation, Inc.
+Copyright (c) 2003-2017 Free Software Foundation, Inc.
+Copyright (c) 2004-2014 Free Software Foundation, Inc.
+Copyright (c) 2004-2015 Free Software Foundation, Inc.
+Copyright (c) 2004-2017 Free Software Foundation, Inc.
+Copyright (c) 2006-2014 Free Software Foundation, Inc.
+Copyright (c) 2006-2017 Free Software Foundation, Inc.
+Copyright (c) 2007, 2008 Free Software Foundation, Inc
+Copyright (c) 2008 Sven Verdoolaege
+Copyright (c) 2009-2014 Free Software Foundation, Inc.
+Copyright (c) 2009-2017 Free Software Foundation, Inc.
+Copyright (c) 2010-2015 Free Software Foundation, Inc.
+Copyright (c) 2010-2017 Free Software Foundation, Inc.
+Copyright (c) 2011-2013 Free Software Foundation, Inc.
+Copyright (c) 2011-2014 Free Software Foundation, Inc.
+Copyright (c) 2012-2014 Free Software Foundation, Inc.
+Copyright (c) 2012-2015 Free Software Foundation, Inc.
+Copyright (c) 2013-2014 Free Software Foundation, Inc.
+Copyright (c) 2013-2015 Free Software Foundation, Inc.
+Copyright (c) 2002, 2009 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005 Free Software Foundation, Inc.
+Copyright (c) 2004, 2010 Free Software Foundation, Inc.
+Copyright (c) 2006, 2008 Free Software Foundation, Inc.
+Copyright (c) 2008, 2010 Free Software Foundation, Inc.
+Copyright (c) 2014 Sebastian Macke
+Copyright (c) 2015 Moritz Klammler
+Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
+Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat
+Copyright (c) 2009 Bradley Smith
+Copyright (c) 2013 Jesse Towner
+Copyright (c) 2013 Roy Stogner
+(c) Type AtExitFuncArgs VoidStar FunctionType AtExitFuncTy
+copyright (c) 1991-2011, Thomas G. Lane, Guido Vollbeding.
+(c) GlobalVariable Handle new GlobalVariable M, DsoHandleTy
+(c) Type ArgTys Int32Ty, Int32Ty, Int32Ty FunctionType FnTy
+Copyright (c) 2004 Scott James Remnant
+Copyright (c) 2008 Steven G. Johnson
+Copyright (c) 2009 Steven G. Johnson
+Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2007, 2008, 2010 Free Software Foundation, Inc
+Copyright (c) 2007, 2009, 2010 Free Software Foundation, Inc
+Copyright (c) 2013 Victor Oliveira
+Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
+(c) DeclRefExpr DR M.makeDeclRefExpr(PV) ImplicitCastExpr ICE
+(c) IdentifierInfo NumExprs std::copy Names, Names + NumExprs
+Copyright (c) 1998 Todd C. Miller
+Copyright (c) 2001, 2003, 2005 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2012 Free Software Foundation, Inc.
+Copyright (c) 2006, 2008, 2010 Free Software Foundation, Inc.
+(c) BranchInst BI BranchInst::Create(Exit, Exit, False, Entry)
+Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc.
+Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc.
+Copyright (c) 1994 The Regents of the University of California.
+Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others.
+Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+Copyright (c) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign.
+Copyright (c) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+Copyright (c) 2007-2018 University of Illinois at Urbana-Champaign.
+Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign.
+Copyright (c) 2002, 2003, 2004, 2010, Free Software Foundation, Inc.
+Copyright (c) 2006-2009 Steven J. Bethard
+Copyright (c) 1992, 1993 The Regents of the University of California.
+(c) StringLiteral NumClobbers std::copy Clobbers, Clobbers + NumClobbers
+Copyright (c) 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com).
+Copyright (c) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, Inc.
+Copyright (c) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+Copyright (c) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994 The Regents of the University of California.
+Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2012 Alexandre K. I. de Mendonca
+Copyright (c) 2001, 2002, 2003, 2005, 2008, 2010 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+(c) StringLiteral NumConstraints std::copy Constraints, Constraints + NumConstraints
+Copyright (c) 1996, 1997, 2000, 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc.
+Copyright (c) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+Copyright (c) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+Copyright (c) 2012 Alexandre K. I. de Mendonca , Paulo Pizarro
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2014 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+
+Apache-2.0 WITH LLVM-exception
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+Microsoft.Windows.SDK.NET.Ref 10.0.26100.81 - LicenseRef-scancode-unknown
+
+
+(c) Microsoft Corporation
+Copyright (c) Microsoft Corporation
+
+LicenseRef-scancode-unknown
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+CommunityToolkit.Mvvm 8.4.0 - MIT
+
+
+Copyright (c) 2021 Sergio Pedri
+Copyright (c) 2020 Michael Dietrich
+Copyright (c) Microsoft Corporation
+(c) .NET Foundation and Contributors
+Copyright (c) 2009 - 2018 Laurent Bugnion
+Copyright (c) .NET Foundation and Contributors
+Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com
+
+# .NET Community Toolkit
+
+Copyright © .NET Foundation and Contributors
+
+All rights reserved.
+
+## MIT License (MIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+CommunityToolkit.WinUI.Animations 8.2.250402 - MIT
+
+
+(c) .NET Foundation and Contributors
+Copyright (c) .NET Foundation and Contributors
+
+# Windows Community Toolkit
+
+Copyright © .NET Foundation and Contributors
+
+All rights reserved.
+
+## MIT License (MIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+CommunityToolkit.WinUI.Controls.SettingsControls 8.2.250402 - MIT
+
+
+(c) .NET Foundation and Contributors
+Copyright (c) .NET Foundation and Contributors
+
+# Windows Community Toolkit
+
+Copyright © .NET Foundation and Contributors
+
+All rights reserved.
+
+## MIT License (MIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+Microsoft.Extensions.Hosting 10.0.0 - MIT
+
+
+Copyright (c) 2021
+Copyright (c) Six Labors
+(c) Microsoft Corporation
+Copyright (c) 2022 FormatJS
+Copyright (c) Andrew Arnott
+Copyright 2019 LLVM Project
+Copyright (c) 1998 Microsoft
+Copyright 2018 Daniel Lemire
+Copyright (c) .NET Foundation
+Copyright (c) 2011, Google Inc.
+Copyright (c) 2020 Dan Shechter
+(c) 1997-2005 Sean Eron Anderson
+Copyright (c) 2015 Andrew Gallant
+Copyright (c) 2022, Wojciech Mula
+Copyright (c) 2017 Yoshifumi Kawai
+Copyright (c) 2022, Geoff Langdale
+Copyright (c) 2005-2020 Rich Felker
+Copyright (c) 2012-2021 Yann Collet
+Copyright (c) Microsoft Corporation
+Copyright (c) 2007 James Newton-King
+Copyright (c) 1991-2024 Unicode, Inc.
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2018 Nemanja Mijailovic
+Copyright 2012 the V8 project authors
+Copyright (c) 1999 Lucent Technologies
+Copyright (c) 2008-2016, Wojciech Mula
+Copyright (c) 2011-2020 Microsoft Corp
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2015-2018, Wojciech Mula
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2015 The Chromium Authors
+Copyright (c) 2018 Alexander Chermyanin
+Copyright (c) The Internet Society 1997
+Copyright (c) 2004-2006 Intel Corporation
+Copyright (c) 2011-2015 Intel Corporation
+Copyright (c) 2013-2017, Milosz Krajewski
+Copyright (c) 2016-2017, Matthieu Darbois
+Copyright (c) The Internet Society (2003)
+Copyright (c) .NET Foundation Contributors
+(c) 1995-2024 Jean-loup Gailly and Mark Adler
+Copyright (c) 2020 Mara Bos
+Copyright (c) 2012 - present, Victor Zverovich
+Copyright (c) 2006 Jb Evain (jbevain@gmail.com)
+Copyright (c) 2008-2020 Advanced Micro Devices, Inc.
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors
+Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Portions (c) International Organization for Standardization 1986
+Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang) Disclaimers
+Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip
+Copyright (c) 1980, 1986, 1993 The Regents of the University of California
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass
+
+MIT License
+
+Copyright (c)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+Microsoft.Windows.CppWinRT 3.0.260520.1 - MIT
+
+
+(c) Microsoft 2026
+(c) Microsoft Corporation
+Copyright (c) Microsoft Corporation
+
+ MIT License
+
+ Copyright (c) Microsoft Corporation.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE
+
+
+---------------------------------------------------------
+
+---------------------------------------------------------
+
+Microsoft.WSL.Containers 2.9.3 - MIT
+
+
+(c) (tm)
+(c) Type I1Ty
+(c) April 2011
+Copyright 2013
+Copyright 2014
+(c) Type ArgTys
+(c) Value A (c)
+(c) CHECK-NEXT T
+(c) Constant One
+(c) Value Sd (c)
+Bbb (c) Constant
+(c) BranchInst BI
+(c) Lower C Upper
+(c) Stmt NumExprs
+(c) Value RHS (c)
+Copyright (c) DFS
+Copyright 2013 DI
+Copyright 2014 DI
+Copyright 2015 DI
+copyright 2013- d
+(c) EUR CHECK-NEXT
+(c) Scale 1 Offset
+(c) State UNQUOTED
+(c) Type IndexType
+Copyright (c) 2008
+Copyright (c) 2009
+Copyright (c) 2010
+Copyright (c) 2011
+Copyright (c) 2012
+Copyright (c) 2014
+Copyright (c) 2016
+Copyright (c) 2019
+(c) Type Int8Ty (c)
+Stmt (c) ExprResult
+(c) CHECK-NEXT Preds
+(c) Offset C- Offset
+(c) Type FloatTy (c)
+Copyright 2010 INRIA
+Copyright 2011 INRIA
+Copyright 2012 INRIA
+Copyright 2014 INRIA
+Copyright 2015 ANSSI
+Copyright 2015 INRIA
+(c) 2023 GitHub, Inc.
+(c) QualType ResultTy
+(c) Type DoubleTy (c)
+(c) 2008 Red Hat, Inc.
+Copyright (c) 2009 THE
+Copyright (c) 2011 THE
+Copyright (c) 2013 IBM
+Copyright 2011 Samsung
+Copyright 2011 Vic Lee
+Copyright 2012 Vic Lee
+Copyright 2014 Vic Lee
+Copyright Jeff Sharkey
+(c) ErrMsg Stream Error
+(c) Metadata Ops MD (c)
+(c) SmallVector NewVars
+(c) TransferBatch B (c)
+(c) Value Alloca Alloc1
+Copyright (c) Microsoft
+(c) BasicBlock Entry (c)
+(c) Branches Context (c)
+Copyright (c) 2012 CHECK
+Copyright 2016 INRIA (c)
+Copyright 2017 Ben Cohen
+(c) GlobalVariable Handle
+(c) Microsoft Corporation
+Copyright 2010-2011 INRIA
+Copyright 2013 Felix Long
+Copyright 2014-2015 INRIA
+copyright 2015, LLVM Team
+(c) 2007-2010 Novell, Inc.
+(c) 2011 Anthony Green (c)
+(c) 2013 DENSO CORPORATION
+Copyright (c) 2010 Rosetta
+Copyright 2003 Google Inc.
+Copyright 2008 Google Inc.
+Copyright 2009 Daniel Mack
+Copyright 2009 Google Inc.
+Copyright 2011 Jiten Pathy
+Copyright 2013 Blaz Bacnik
+Copyright 2014 Wim Taymans
+Copyright 2015 Georg Chini
+Copyright 2015 Google Inc.
+Copyright 2018 Google Inc.
+Copyright 2019 Rangee Gmbh
+Copyright The LLVM project
+(c) SmallVector ToErase Bbb
+(c) Willem van Schaik, 1999
+Copyright (c) 1997, Phillip
+Copyright (c) 2022 FormatJS
+Copyright (c) Andrew Arnott
+Copyright 2005, Google Inc.
+Copyright 2006, Google Inc.
+Copyright 2007, Google Inc.
+Copyright 2008 Sci-Fi Hi-Fi
+Copyright 2008, Google Inc.
+Copyright 2009 Ted Percival
+Copyright 2010-2011 Vic Lee
+Copyright 2010-2012 Vic Lee
+Copyright 2011-2012 Vic Lee
+Copyright 2012 Atrust corp.
+Copyright 2012 Google, Inc.
+Copyright 2013 Albert Zeyer
+Copyright 2013, Google Inc.
+Copyright 2015-2017 Vic Lee
+Copyright 2016 Inuvika Inc.
+Copyright 2019 LLVM Project
+Copyright Kungliga Tekniska
+Copyright (c) 1998 Microsoft
+Copyright (c) 2008, 2009 the
+Copyright (c) 2012 Rob Clark
+Copyright (c) 2018 Simon Ser
+Copyright 2006 Diego Petteno
+Copyright 2006 Shams E. King
+Copyright 2006, Dean Edwards
+Copyright 2008 Colin Guthrie
+Copyright 2009 Canonical Ltd
+Copyright 2009 Colin Guthrie
+Copyright 2009 Tanu Kaskinen
+Copyright 2009-2011 Jay Sorg
+Copyright 2009-2012 Jay Sorg
+Copyright 2010 Arun Raghavan
+Copyright 2010 Colin Guthrie
+Copyright 2011 Canonical Ltd
+Copyright 2011 Colin Guthrie
+Copyright 2013 Hajime Fujita
+Copyright 2018 Daniel Lemire
+(c) CharUnits AlignedSize (c)
+(c) Designator NumDesignators
+(c) SourceRange Range AsmToks
+(c) Value Elt0 Copyright 2014
+Copyright (c) .NET Foundation
+Copyright (c) 1999 Tom Tromey
+Copyright (c) 2008 PULSEAUDIO
+Copyright (c) 2010 Apple Inc.
+Copyright (c) 2012 Modelon AB
+Copyright (c) 2018 Jim Ingham
+Copyright (c) by P.J. Plauger
+Copyright 2008 Matt Gallagher
+Copyright 2009 The Go Authors
+Copyright 2010 Canonical Ltd.
+Copyright 2010 The Go Authors
+Copyright 2010 Zencoder, Inc.
+Copyright 2011 The Go Authors
+Copyright 2012 Gerald Richter
+Copyright 2012 Jason Champion
+Copyright 2012 The Go Authors
+Copyright 2012 Thomas Goddard
+Copyright 2013 Collabora Ltd.
+Copyright 2013 The Go Authors
+Copyright 2014 The Go Authors
+Copyright 2015 Canonical Ltd.
+Copyright 2017 Artur Zaprzala
+Copyright (c) 2000 Software AG
+Copyright (c) 2002 Roger Sayle
+Copyright (c) 2007 Google Inc.
+Copyright (c) 2008 David Daney
+Copyright (c) 2009 Google Inc.
+Copyright (c) 2010 Google Inc.
+Copyright (c) 2012 Jonas Adahl
+Copyright (c) 2013 Jonas Adahl
+Copyright (c) 2015 Armin Novak
+Copyright (c) 2016 Aaron Watry
+Copyright (c) 2017 Google Inc.
+Copyright 2011 Stephen Erisman
+Copyright 2018 Collabora, Ltd.
+Copyright 2019 Collabora, Ltd.
+(c) IdentifierInfo NumExprs (c)
+Copyright (c) 1994 X Consortium
+Copyright (c) 2008 Matteo Frigo
+Copyright (c) 2008 Timo Jyrinki
+Copyright (c) 2009 Chris Wilson
+Copyright (c) 2009 Matteo Frigo
+Copyright (c) 2010 CodeSourcery
+Copyright (c) 2011 Kyle Moffett
+Copyright (c) 2011 Tilera Corp.
+Copyright (c) 2011 Timothy Wall
+Copyright (c) 2011, Google Inc.
+Copyright (c) 2012 Peter Harris
+Copyright (c) 2012 Scott Moreau
+Copyright (c) 2012 Tilera Corp.
+Copyright (c) 2017 Red Hat Inc.
+Copyright (c) 2020 Dan Shechter
+Copyright (c) 2021 Sergio Pedri
+Copyright (c) Mesa contributors
+Copyright 2008-2010 Apple, Inc.
+Copyright 2011-2012 Jiten Pathy
+Copyright 2013 Martin Blanchard
+Copyright 2015 Sven Verdoolaege
+Copyright 2016 Sven Verdoolaege
+Copyright 2017 Sven Verdoolaege
+Copyright 2018 Sven Verdoolaege
+SelectInst SelI (c) SmallVector
+copyright 2003- d, LLVM Project
+(c) 1997-2005 Sean Eron Anderson
+(c) SourceLocation Loc Condition
+(c) StringLiteral NumConstraints
+Copyright (c) 1992 Henry Spencer
+Copyright (c) 1996 Red Hat, Inc.
+Copyright (c) 2000 Red Hat, Inc.
+Copyright (c) 2001 Chris Bagwell
+Copyright (c) 2002 Ranjit Mathew
+Copyright (c) 2004 Anthony Green
+Copyright (c) 2004 Simon Posnjak
+Copyright (c) 2008 Anthony Green
+Copyright (c) 2008 Red Hat, Inc.
+Copyright (c) 2011 Anthony Green
+Copyright (c) 2012 Anthony Green
+Copyright (c) 2013 Red Hat, Inc.
+Copyright (c) 2014 Red Hat, Inc.
+Copyright (c) 2015 Red Hat, Inc.
+Copyright 2004 Joe Marcus Clarke
+Copyright 2008 Nokia Corporation
+Copyright 2009 Intel Corporation
+Copyright 2009 Nokia Corporation
+Copyright 2010 Intel Corporation
+Copyright 2011 Intel Corporation
+Copyright 2012 Intel Corporation
+Copyright 2013 Alexander Couzens
+Copyright 2013 Intel Corporation
+Copyright 2014 Intel Corporation
+Copyright James Newton-King 2008
+copyright 2007- d, The LLDB Team
+copyright 2019, Weston community
+(c) CHECK-NEXT 194 CHECK-NEXT (c)
+Copyright (c) 2000 John Hornkvist
+Copyright (c) 2001 John Hornkvist
+Copyright (c) 2006 Kirill Simonov
+Copyright (c) 2009 The Go Authors
+Copyright (c) 2011 Tim Wiederhake
+Copyright (c) 2012 Alan Hourihane
+Copyright (c) 2012 Canonical Ltd.
+Copyright (c) 2012 Martin Minarik
+Copyright (c) 2012 Openismus GmbH
+Copyright (c) 2013 Collabora Ltd.
+Copyright (c) 2013 David Herrmann
+Copyright (c) 2013 Jason Ekstrand
+Copyright (c) 2013 Richard Hughes
+Copyright (c) 2014 Jason Ekstrand
+Copyright (c) 2015 Andrew Gallant
+Copyright (c) 2015 Collabora Ltd.
+Copyright (c) 2015 Giulio Camuffo
+Copyright (c) 2016 Armin Krezovic
+Copyright (c) 2016 Giulio Camuffo
+Copyright (c) 2019 Collabora Ltd.
+Copyright (c) 2022, Wojciech Mula
+Copyright 2001-2004 Unicode, Inc.
+Copyright 2004 Lennart Poettering
+Copyright 2004-2009 Kitware, Inc.
+Copyright 2006 Lennart Poettering
+Copyright 2006-2009 Kitware, Inc.
+Copyright 2007 Lennart Poettering
+Copyright 2007-2009 Kitware, Inc.
+Copyright 2008 Lennart Poettering
+Copyright 2009 Lennart Poettering
+Copyright 2010 Lennart Poettering
+Copyright 2012 Dmitry Baryshnikov
+Copyright 2012 Lennart Poettering
+Copyright 2013 Matthias Wabersich
+Copyright 2014 Thomas Erbesdobler
+copyright 2007- d, The Clang Team
+copyright 2010- d, The Polly Team
+copyright 2011-2018, LLVM Project
+Copyright (c) 1999-2007 Apple Inc.
+Copyright (c) 1999-2007 Brian Paul
+Copyright (c) 2008 Alexandre Oliva
+Copyright (c) 2009-2019 Polly Team
+Copyright (c) 2011 Collabora, Ltd.
+Copyright (c) 2012 Collabora, Ltd.
+Copyright (c) 2012 Thorsten Glaser
+Copyright (c) 2013 BMW Car IT GmbH
+Copyright (c) 2013 Collabora, Ltd.
+Copyright (c) 2013 Mentor Graphics
+Copyright (c) 2013 Philip Withnall
+Copyright (c) 2013 Tensilica, Inc.
+Copyright (c) 2013 The Chromium OS
+Copyright (c) 2014 Collabora, Ltd.
+Copyright (c) 2015 Collabora, Ltd.
+Copyright (c) 2015 Martin Grasslin
+Copyright (c) 2015the LLVM Project
+Copyright (c) 2016 Benoit Gschwind
+Copyright (c) 2016 Collabora, Ltd.
+Copyright (c) 2017 Collabora, Ltd.
+Copyright (c) 2017 Yoshifumi Kawai
+Copyright (c) 2018 Collabora, Ltd.
+Copyright (c) 2019 Collabora, Ltd.
+Copyright (c) 2022, Geoff Langdale
+Copyright 2009-2010 The Go Authors
+Copyright 2012 Universiteit Leiden
+Copyright 2013 bct electronic GmbH
+Copyright 2015 The Go Authors. (c)
+Copyright 2016-2017 Tobias Grosser
+copyright (c) 2001 Fabrice Bellard
+Copyright (c) 1998 Cygnus Solutions
+Copyright (c) 1998 Geoffrey Keating
+Copyright (c) 2001 David E. O'Brien
+Copyright (c) 2005-2020 Rich Felker
+Copyright (c) 2011 Benjamin Franzke
+Copyright (c) 2011 Charles Scalesse
+Copyright (c) 2012 Benjamin Franzke
+Copyright (c) 2012-2021 Yann Collet
+Copyright (c) 2019 The MLIR Authors
+Copyright (c) 2020 Michael Dietrich
+Copyright (c) Microsoft Corporation
+Copyright 2009, 2010 The Go Authors
+Copyright 2011 Collabora Multimedia
+Copyright 2016 The Chromium Authors
+Copyright 2016, 2017 Tobias Grosser
+Copyright 2017-2018 Collabora, Ltd.
+Copyright 2018-2019 Collabora, Ltd.
+copyright 2011- d, LLVM Project (c)
+(c) .NET Foundation and Contributors
+(c) .NET Foundation and contributors
+Copyright (c) 2000, 2007 Software AG
+Copyright (c) 2001 Alexander Peslyak
+Copyright (c) 2007 James Newton-King
+Copyright (c) 2008 Kristian Hogsberg
+Copyright (c) 2009 Intel Corporation
+Copyright (c) 2010 Intel Corporation
+Copyright (c) 2010 Kristian Hogsberg
+Copyright (c) 2011 Intel Corporation
+Copyright (c) 2011 Kristian Hogsberg
+Copyright (c) 2012 Intel Corporation
+Copyright (c) 2012 John Kare Alsaker
+Copyright (c) 2012 Kristian Hogsberg
+Copyright (c) 2012, 2013 Xilinx, Inc
+Copyright (c) 2012, Victor Lazzarini
+Copyright (c) 2012-2016, Yann Collet
+Copyright (c) 2013 DENSO CORPORATION
+Copyright (c) 2013 Intel Corporation
+Copyright (c) 2013 Jasper St. Pierre
+Copyright (c) 2013 Rafael Antognolli
+Copyright (c) 2014 DENSO CORPORATION
+Copyright (c) 2014, 2015 Google Inc.
+Copyright (c) 2015 Jasper St. Pierre
+Copyright (c) 2015-2017 Red Hat Inc.
+Copyright (c) 2016 DENSO CORPORATION
+Copyright (c) 2018 Intel Corporation
+Copyright (c) 2019 Intel Corporation
+Copyright 2011 Sven Verdoolaege. (c)
+Copyright 2011,2015 Sven Verdoolaege
+Copyright 2011-2013 BMW Car IT GmbH.
+Copyright 2013 Joao Paulo Rechi Vita
+Copyright 2014, 2015 Andrey Semashev
+Copyright 2015-2016 Sven Verdoolaege
+Copyright 2016, 2017 Collabora, Ltd.
+Copyright 2021-2025 - Morten Nielsen
+(c) 2016 Samsung Electronics Co., Ltd
+Copyright (c) 1991-2024 Unicode, Inc.
+Copyright (c) 1996-2003 Red Hat, Inc.
+Copyright (c) 1996-2004 Red Hat, Inc.
+Copyright (c) 1999-2003 Steve Purcell
+Copyright (c) 2004 Renesas Technology
+Copyright (c) 2006 Lennart Poettering
+Copyright (c) 2012-2013 A Tasty Pixel
+Copyright (c) 2013-2017, Alfred Klomp
+Copyright (c) 2016 NVIDIA Corporation
+Copyright (c) 2018 Nemanja Mijailovic
+Copyright 2010-2012 Intel Corporation
+Copyright 2012 the V8 project authors
+Copyright 2013 Christian Hofstaedtler
+Copyright (c) 1996, 1998 Red Hat, Inc.
+Copyright (c) 1998, 2008 Red Hat, Inc.
+Copyright (c) 1999 Lucent Technologies
+Copyright (c) 1999, 2008 Red Hat, Inc.
+Copyright (c) 2002-2004 Tim J. Robbins
+Copyright (c) 2008 Christian Haggstrom
+Copyright (c) 2008, 2010 Red Hat, Inc.
+Copyright (c) 2008-2016, Wojciech Mula
+Copyright (c) 2011, 2012 Anthony Green
+Copyright (c) 2011, 2013 Anthony Green
+Copyright (c) 2011, 2014 Anthony Green
+Copyright (c) 2011-2020 Microsoft Corp
+Copyright (c) 2012, 2013 Anthony Green
+Copyright (c) 2012, 2014 Anthony Green
+Copyright (c) 2014,2018 Collabora Ltd.
+Copyright (c) 2015-2017, Wojciech Mula
+Copyright (c) 2015-2018, Wojciech Mula
+Copyright 2004-2006 Lennart Poettering
+Copyright 2004-2008 Lennart Poettering
+Copyright 2004-2009 Lennart Poettering
+Copyright 2005-2006 Lennart Poettering
+Copyright 2005-2009 Lennart Poettering
+Copyright 2006-2008 Lennart Poettering
+Copyright 2006-2009 Lennart Poettering
+Copyright 2007-2010 by the Sphinx team
+Copyright 2013 Raspberry Pi Foundation
+Copyright 2016 Ismael Jimenez Martinez
+Copyright 2021-2025 - Morten Nielsen A
+(c) 2006 Free Software Foundation, Inc.
+Copyright (c) 1996-1998 John D. Polstra
+Copyright (c) 1998, 2012 Andreas Schwab
+Copyright (c) 2005 Free Standards Group
+Copyright (c) 2005-2007, Nick Galbreath
+Copyright (c) 2005-2014 Lode Vandevenne
+Copyright (c) 2011-2012 Collabora, Ltd.
+Copyright (c) 2012 Philipp Bruschweiler
+Copyright (c) 2012-2013 Collabora, Ltd.
+Copyright (c) 2012-2018 Collabora, Ltd.
+Copyright (c) 2015 The Chromium Authors
+Copyright (c) 2015,2019 Collabora, Ltd.
+Copyright (c) 2018 Alexander Chermyanin
+Copyright (c) Microsoft Corporation.All
+Copyright (c) The Internet Society 1997
+Copyright 2005-2007 Universiteit Leiden
+Copyright 2006-2007 Universiteit Leiden
+Copyright 2010 Red Hat
+Copyright 2012 Ecole Normale Superieure
+Copyright 2013 Ecole Normale Superieure
+Copyright 2014 Ecole Normale Superieure
+Copyright 2017 Roman Lebedev. ParamInfo
+Copyright 2018 General Electric Company
+StringRef Copyright (c) 2002 Bo Thorsen
+(c) Stmt NumExprs std::copy Exprs, Exprs
+(c) StringRef NumClobbers // FIXME Avoid
+Copyright (c) 2002-2008, 2012 Kaz Kojima
+Copyright (c) 2010-2011 Benjamin Franzke
+Copyright (c) 2014, 2015 Collabora, Ltd.
+Copyright (c) 2014, 2016 Collabora, Ltd.
+Copyright (c) 2014, 2019 Collabora, Ltd.
+Copyright (c) 2015, 2019 Collabora, Ltd.
+Copyright (c) 2016, 2019 Collabora, Ltd.
+Copyright (c) 2017, 2018 Collabora, Ltd.
+Copyright (c) 2018 DisplayLink (UK) Ltd.
+Copyright (c) 2021-2025 - Morten Nielsen
+Copyright 1992, 1993, 1994 Henry Spencer
+Copyright 2011-2012,2020 Collabora, Ltd.
+Copyright 2016 Thinast Technologies GmbH
+Copyright 2016-2017 Sven Verdoolaege (c)
+Copyright 2018 Thicast Technologies GmbH
+(c) StringLiteral NumClobbers Constraints
+Copyright (c) 1997-2019 Intel Corporation
+Copyright (c) 2004-2006 Intel Corporation
+Copyright (c) 2005 Axis Communications AB
+Copyright (c) 2006-2010 Nokia Corporation
+Copyright (c) 2008-2011 Kristian Hogsberg
+Copyright (c) 2008-2012 Kristian Hogsberg
+Copyright (c) 2008-2013 Kristian Hogsberg
+Copyright (c) 2009 - 2018 Laurent Bugnion
+Copyright (c) 2010-2011 Intel Corporation
+Copyright (c) 2010-2012 Intel Corporation
+Copyright (c) 2010-2013 Intel Corporation
+Copyright (c) 2010-2015 Benjamin Peterson
+Copyright (c) 2011-2012 Intel Corporation
+Copyright (c) 2011-2015 Intel Corporation
+Copyright (c) 2013-2017, Milosz Krajewski
+Copyright (c) 2014 - 2015 Collabora, Ltd.
+Copyright (c) 2016-2017, Matthieu Darbois
+Copyright (c) 2018-2019 Intel Corporation
+Copyright (c) The Internet Society (1998)
+Copyright (c) The Internet Society (2000)
+Copyright (c) The Internet Society (2003)
+Copyright 2008-2013 Joao Paulo Rechi Vita
+Copyright 2010 O.S. Systems Software Ltda
+Copyright 2011 O.S. Systems Software Ltda
+Copyright 2012 Thincast Technologies GmbH
+Copyright 2013 Thincast Technologies GmbH
+Copyright 2014 Thincast Technologies GmbH
+Copyright 2014 Thincast Technologies Gmbh
+Copyright 2015 Thincast Technologies GmbH
+Copyright 2015, Google Inc. InitCache (c)
+Copyright 2016 Thincast Technologies GmbH
+Copyright 2017 Thincast Technologies GmbH
+Copyright 2018 Thincast Technologies GmbH
+Copyright 2019 Thincast Technologies GmbH
+Copyright Iowa State University 2009-2010
+Copyright James Newton-King 2008 Json.NET
+copyright was claimed by the wine project
+Copyright (c) .NET Foundation Contributors
+Copyright (c) 2000 Hewlett Packard Company
+Copyright (c) 2002 Bo Thorsen
+Copyright (c) 2006-2008 Lennart Poettering
+Copyright (c) 2010, 2013 Intel Corporation
+Copyright (c) 2011, 2012 Intel Corporation
+Copyright (c) 2012 Raspberry Pi Foundation
+Copyright (c) 2013 Raspberry Pi Foundation
+Copyright 2012 HP Development Company, LLC
+Copyright 2014, 2016, 2020 Collabora, Ltd.
+Copyright (c) 1996-2003, 2010 Red Hat, Inc.
+Copyright (c) 1998-2016 The OpenSSL Project
+Copyright (c) 2004 eXtensible Systems, Inc.
+Copyright (c) 2008 Free Software Foundation
+Copyright (c) 2009-2014 by the contributors
+Copyright (c) 2009-2015 by the contributors
+Copyright (c) 2009-2016 by the contributors
+Copyright (c) 2009-2019 by the contributors
+Copyright (c) 2010 Red Hat
+Copyright (c) 2011 Free Software Foundation
+Copyright (c) 2011-2014 by the contributors
+Copyright (c) 2011-2019 by the contributors
+Copyright (c) 2013 Copyright (c) 2019 Exprs
+Copyright (c) 2013 Imagination Technologies
+Copyright (c) 2015 General Electric Company
+Copyright (c) 2017 Pekka Paalanen pq@iki.fi
+Copyright (c) 2017-2019 by the contributors
+Copyright (c) 2021 Copyright (c) Six Labors
+Copyright 2011 Wolfson Microelectronics PLC
+copyrighted by the Free Software Foundation
+(c) Microsoft Corporation. Med enerett. Hvis
+Copyright (c) 1992, 1993, 1994 Henry Spencer
+Copyright (c) 1993 by Sun Microsystems, Inc.
+Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
+Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
+Copyright (c) 1999, 2007, 2008 Red Hat, Inc.
+Copyright (c) 2004 by Sun Microsystems, Inc.
+Copyright (c) 2007, 2009, 2010 Red Hat, Inc.
+Copyright (c) 2011, 2012, 2013 Anthony Green
+Copyright (c) 2016 Quentin Sardem FF7 Glidic
+Copyright (c) 2018 Renesas Electronics Corp.
+Copyright 2004-2006, 2009 Lennart Poettering
+Copyright 2011 Jay Sorg
+Copyright 2011 Shea Levy
+Copyright 2012 Jay Sorg
+Copyright 2012,2014 Ecole Normale Superieure
+Copyright 2012-2013 Ecole Normale Superieure
+Copyright 2012-2014 Ecole Normale Superieure
+Copyright 2013-2014 Ecole Normale Superieure
+Copyright 2015 Vic Lee
+Copyright 2017-2018 General Electric Company
+(c) 1995-2024 Jean-loup Gailly and Mark Adler
+(c) Copyright 2014 Thincast Technologies GmbH
+Copyright (c) 2002-2007 Michael J. Fromberger
+Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd.
+Copyright (c) 2012, 2017-2019 Collabora, Ltd.
+Copyright (c) 2014 Pekka Paalanen
+Copyright (c) 2014 Thincast Technologies GmbH
+Copyright (c) 2015 Thincast Technologies GmbH
+Copyright (c) 2017 Pekka Paalanen
+Copyright (c) 2018 Thincast Technologies GmbH
+Copyright (c) 2020 Mara Bos
+Copyright 2000 Free Software Foundation, Inc.
+Copyright 2004 Free Software Foundation, Inc.
+Copyright 2015 bernhard.miklautz@thincast.com
+Copyright AssemblyDescription AssemblyProduct
+(c) Copyright 2012 HP Development Company, LLC
+Copyright (c) .NET Foundation and Contributors
+Copyright (c) .NET Foundation and contributors
+Copyright (c) 2008 Ryan McCabe
+Copyright (c) 2008 Stepan Kasal
+Copyright (c) 2012 - present, Victor Zverovich
+Copyright (c) 2012, 2017, 2018 Collabora, Ltd.
+Copyright (c) 2018 Zodiac Inflight Innovations
+Copyright 2009 Jason Newton
+Copyright 2011-2013 Thincast Technologies GmbH
+Copyright 2012 Alam Arias
+Copyright 2015-2016 Thincast Technologies GmbH
+Copyright 2015-2017 Thincast Technologies GmbH
+Copyright 2016,2018 Thincast Technologies GmbH
+Copyright 2016-2017 Thincast Technologies GmbH
+(c) 2003-2004 Randolph Chung
+Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima
+Copyright (c) 2006 Jb Evain (jbevain@gmail.com)
+Copyright (c) 2014 Advanced Micro Devices, Inc.
+Copyright (c) 2015 Advanced Micro Devices, Inc.
+Copyright (c) 2015 Samsung Electronics Co., Ltd
+Copyright (c) 2016 Samsung Electronics Co., Ltd
+Copyright 2012 Rolf Eike Beer
+Copyright 2014 Christian Plattner
+Copyright 2016 Christian Plattner
+Copyright 2019 Idan Freiberg
+Copyright (c) 1994-1999 Lucent Technologies Inc.
+Copyright (c) 2002, 2007 Bo Thorsen
+Copyright (c) 2007-2008 Free Software Foundation
+Copyright (c) 2009 Jason Newton nevion@gmail.com
+Copyright (c) 2013 Imagination Technologies Ltd.
+Copyright 2011 David Henningsson, Canonical Ltd.
+Copyright 2012 Fujitsu Technology Solutions GmbH
+Copyright 2014 David Henningsson, Canonical Ltd.
+Copyright 2017 Armin Novak
+Copyright 2018 Armin Novak
+Copyright 2019 Pali Rohar
+Copyright extcopyright~ he year the LLVM Project
+(c) Designator NumDesigs NumDesignators NumDesigs
+Copyright (c) 1992, 1993 UNIX International, Inc.
+Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
+Copyright (c) 2004 Free Software Foundation, Inc.
+Copyright (c) 2006 Free Software Foundation, Inc.
+Copyright (c) 2007 Free Software Foundation, Inc.
+Copyright (c) 2008 Free Software Foundation, Inc.
+Copyright (c) 2008-2019 Copyright 2009 Finn Thain
+Copyright (c) 2009 Free Software Foundation, Inc.
+Copyright (c) 2011 Free Software Foundation, Inc.
+Copyright (c) 2012 Free Software Foundation, Inc.
+Copyright (c) 2012, Noah Spurrier
+Copyright (c) 2013-2014, Pexpect development team
+Copyright (c) 2013-2016, Pexpect development team
+Copyright (c) 2014 Free Software Foundation, Inc.
+Copyright (c) 2015 Paul Norman
+Copyright (c) 2016 Aaron Watry
+Copyright (c) 2017, 2018 General Electric Company
+Copyright 2004-2012 Jay Sorg
+Copyright 2007-2008 Miguel A. Figueroa-Villanueva
+Copyright 2009,2010 Daniel Mack
+Copyright 2011 Anthony Tong
+Copyright 2013 Peter Meerwald
+Copyright 2014 Peter Meerwald
+copyright (c) 2011 Petr Vanek
+(c) IdentifierInfo NumExprs std::copy Names, Names
+Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc.
+Copyright (c) 1996, MPEG Software Simulation Group
+Copyright (c) 1998 Bjorn Reese and Daniel Stenberg
+Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc.
+Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc.
+Copyright (c) 2000 Bjorn Reese and Daniel Stenberg
+Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc.
+Copyright (c) 2001 Bjorn Reese and Daniel Stenberg
+Copyright (c) 2003-2010 Python Software Foundation
+Copyright (c) 2006 The Android Open Source Project
+Copyright (c) 2008 Andreas Schwab
+Copyright (c) 2008 The Android Open Source Project
+Copyright (c) 2010 The Android Open Source Project
+Copyright (c) 2011 The Android Open Source Project
+Copyright (c) 2012 Zack Weinberg
+Copyright (c) 2016 The Android Open Source Project
+Copyright 1992-2018 Free Software Foundation, Inc.
+Copyright 2008-2009 Katholieke Universiteit Leuven
+Copyright 2010 Wim Taymans
+Copyright 2013 Armin Novak
+Copyright 2014 Armin Novak
+Copyright 2015 Jiang Zihao
+Copyright 2016 Armin Novak
+Copyright 2016 Jiang Zihao
+Copyright (c) 2003 Jakub Jelinek
+Copyright (c) 2006, Tim Beaulen
+Copyright (c) 2008 Alan Woodland
+Copyright (c) 2008 Guido U. Draheim
+Copyright (c) 2008 Stepan Kasal
+Copyright (c) 2011 Plausible Labs Cooperative, Inc.
+Copyright (c) 2012 Qualcomm Innovation Center, Inc.
+Copyright (c) 2013 Hardening
+Copyright 2010 David Henningsson
+Copyright 2013 Zhang Zhaolong
+Copyright 2019 Mati Shabtay
+Copyright (c) 2008 Benjamin Kosnik
+Copyright (c) 2008-2020 Advanced Micro Devices, Inc.
+Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com)
+Copyright (c) 2013 Synposys, Inc. (www.synopsys.com)
+Copyright (c) 2014,2015 Advanced Micro Devices, Inc.
+Copyright (c) 2015 Rozhuk Ivan
+Copyright (c) 2015-2017 Samsung Electronics Co., Ltd
+Copyright (c) 2018 Pali Rohar
+Copyright (c) 2019 Pali Rohar
+Copyright 2006 Alexander Neundorf
+Copyright 2010 Alexander Neundorf
+Copyright 2011 Nils Andresen
+Copyright 2012 Alexander Neundorf
+Copyright 2012 Alfred Liu
+Copyright 2012 Corey Clayton
+Copyright 2013 Corey Clayton
+Copyright 2014 Manuel Bachmann
+Copyright 2016 Armin Novak
+Copyright 2016 Arun Raghavan
+Copyright 2019 Kobi Mizrachi
+Copyright (c) 1988-2004 Keith Packard and Bart Massey
+Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
+Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima
+Copyright (c) 2013 Miodrag Vallat.
+Copyright (c) 2014, 2015 Advanced Micro Devices, Inc.
+Copyright (c) 2016 Krzesimir Nowak
+Copyright (c) 2019 Microsoft Corporation, Daan Leijen
+Copyright (c) Alexi Volkov 2006
+Copyright 2013 Armin Novak
+Copyright 2014 Armin Novak
+Copyright 2015 Armin Novak
+Copyright 2016 Armin Novak
+Copyright 2016 David PHAM-VAN
+Copyright 2017 Alexei Lozovsky
+Copyright 2017 Armin Novak
+Copyright 2018 Armin Novak
+Copyright 2018-2019 Pali Rohar
+Copyright 2019 Armin Novak
+Copyright (c) 1994-2014 Free Software Foundation, Inc.
+Copyright (c) 1994-2017 Free Software Foundation, Inc.
+Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com)
+Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc.
+Copyright (c) 1996-2014 Free Software Foundation, Inc.
+Copyright (c) 1996-2015 Free Software Foundation, Inc.
+Copyright (c) 1996-2017 Free Software Foundation, Inc.
+Copyright (c) 1997-2014 Free Software Foundation, Inc.
+Copyright (c) 1997-2017 Free Software Foundation, Inc.
+Copyright (c) 1999-2013 Free Software Foundation, Inc.
+Copyright (c) 1999-2014 Free Software Foundation, Inc.
+Copyright (c) 1999-2017 Free Software Foundation, Inc.
+Copyright (c) 2001-2014 Free Software Foundation, Inc.
+Copyright (c) 2001-2017 Free Software Foundation, Inc.
+Copyright (c) 2002-2014 Free Software Foundation, Inc.
+Copyright (c) 2002-2017 Free Software Foundation, Inc.
+Copyright (c) 2003-2014 Free Software Foundation, Inc.
+Copyright (c) 2003-2017 Free Software Foundation, Inc.
+Copyright (c) 2004-2014 Free Software Foundation, Inc.
+Copyright (c) 2004-2015 Free Software Foundation, Inc.
+Copyright (c) 2004-2017 Free Software Foundation, Inc.
+Copyright (c) 2006-2014 Free Software Foundation, Inc.
+Copyright (c) 2006-2017 Free Software Foundation, Inc.
+Copyright (c) 2007, 2008 Free Software Foundation, Inc
+Copyright (c) 2008 Sven Verdoolaege
+Copyright (c) 2008-2017 Free Software Foundation, Inc.
+Copyright (c) 2009-2014 Free Software Foundation, Inc.
+Copyright (c) 2009-2017 Free Software Foundation, Inc.
+Copyright (c) 2010-2015 Free Software Foundation, Inc.
+Copyright (c) 2010-2017 Free Software Foundation, Inc.
+Copyright (c) 2011 Novell, Inc (http://www.novell.com)
+Copyright (c) 2011-2013 Free Software Foundation, Inc.
+Copyright (c) 2011-2014 Free Software Foundation, Inc.
+Copyright (c) 2012-2014 Free Software Foundation, Inc.
+Copyright (c) 2012-2015 Free Software Foundation, Inc.
+Copyright (c) 2013 Sam Spilsbury
+Copyright (c) 2013-2014 Free Software Foundation, Inc.
+Copyright (c) 2013-2015 Free Software Foundation, Inc.
+Copyright (c) Microsoft Corporation. Med enerett. Hvis
+Copyright 2015 Ahmed S. Darwish
+Copyright 2016 Ahmed S. Darwish
+Copyright (c) 1989, 1991 Free Software Foundation, Inc.
+Copyright (c) 1991, 1999 Free Software Foundation, Inc.
+Copyright (c) 2002, 2009 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005 Free Software Foundation, Inc.
+Copyright (c) 2004, 2010 Free Software Foundation, Inc.
+Copyright (c) 2006, 2008 Free Software Foundation, Inc.
+Copyright (c) 2008, 2010 Free Software Foundation, Inc.
+Copyright (c) 2011 Daniel Richard G.
+Copyright (c) 2014 Sebastian Macke
+Copyright (c) 2015 Moritz Klammler
+Copyright 2015 Denis Vincent
+Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc.
+Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat
+Copyright (c) 1998, 2009 Bjorn Reese and Daniel Stenberg
+Copyright (c) 2006 Andreas Schneider
+Copyright (c) 2009 Bradley Smith
+Copyright (c) 2011 Maarten Bosmans
+Copyright (c) 2012, 2016. Free Software Foundation, Inc.
+Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com)
+Copyright 2009 Wim Taymans
+Copyright 2010 Wim Taymans
+Copyright 2011 Otavio Salvador
+Copyright 2012 Hewlett-Packard Development Company, L.P.
+Copyright 2014 Hewlett-Packard Development Company, L.P.
+Copyright 2015 Copyright 2015 Thincast Technologies GmbH
+Copyright 2015 Hewlett-Packard Development Company, L.P.
+(c) Copyright 2014 Armin Novak
+Copyright (c) 2004 Michael Niedermayer
+Copyright (c) 2008 Kyle Machulis
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors
+Copyright (c) 2013 David Herrmann
+Copyright (c) 2013 Jesse Towner
+Copyright (c) 2013 Roy Stogner
+Copyright (c) 2013 Vasily Khoruzhick
+Copyright (c) 2015 Armin Novak
+Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com
+Copyright (c) 2018 Armin Novak
+Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas
+Copyright 2011 Martin Fleisz
+Copyright 2011 Roman Barabanov
+Copyright 2012-2013 Corey Clayton
+Copyright 2013 Martin Fleisz
+Copyright 2016 Martin Fleisz
+Copyright 2018 Pascal Bourguignon
+copyright (c) 1991-2011, Thomas G. Lane, Guido Vollbeding
+(c) StringLiteral NumClobbers std::copy Clobbers, Clobbers
+Copyright (c) 2006, Alexander Neundorf,
+Copyright (c) 2008, Kevin Kofler,
+Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com
+Copyright (c) Microsoft Corporation https://aka.ms/privacy
+Copyright 2008-2011 Alexander Neundorf,
+Copyright 2012 Alexander Kurtz
+Copyright 2015-2017 Armin Novak
+Copyright 2016,2018 Armin Novak
+Copyright 2016-2017 Armin Novak
+Copyright 2017 Sebastian Droge
+Copyright 2019 Russell Treleaven
+Copyright (c) 2004 Scott James Remnant
+Copyright (c) 2008 Steven G. Johnson
+Copyright (c) 2009 Steven G. Johnson
+Copyright (c) 2010 Diego Elio Petteno
+Copyright 2011 Collabora Ltd. 2015 Aldebaran SoftBank Group
+Copyright 2011 Norbert Federa
+Copyright 2012 Flavio Ceolin
+Copyright 2012 Laxmikant Rashinkar
+Copyright 2013 Norbert Federa
+Copyright 2014 Hardening
+Copyright 2014 Norbert Federa
+Copyright 2015 Norbert Federa
+Copyright 2016 Norbert Federa
+(c) Copyright 2012 Hewlett-Packard Development Company, L.P.
+(c) Copyright 2014 Hewlett-Packard Development Company, L.P.
+Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2007, 2008, 2010 Free Software Foundation, Inc
+Copyright (c) 2007, 2009, 2010 Free Software Foundation, Inc
+Copyright (c) 2011 Antonio Ospite
+Copyright (c) 2012 Raphael Kubo da Costa
+Copyright (c) 2013 Victor Oliveira
+Copyright (c) 2014 Collabora Ltd. http://www.collabora.co.uk
+Copyright (c) 2015 Hewlett-Packard Development Company, L.P.
+Copyright 2009 Wim Taymans
+Copyright 2010 Arun Raghavan
+Copyright 2010 Eduardo Fiss Beloni
+Copyright 2011 Arun Raghavan
+Copyright 2011 Eduardo Fiss Beloni
+Copyright 2014 David FORT
+Copyright 2014 David Fort
+Copyright 2015 David FORT
+Copyright 2015 David Fort
+Copyright 2016 David FORT
+Copyright 2016 David Fort
+Copyright 2017 David Fort
+Copyright 2017 Dorian Ducournau
+Copyright 2018 David Fort
+Copyright 2019 David Fort
+Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+Copyright (c) 1994, 1996, 1997 Free Software Foundation, Inc.
+Copyright (c) 1998 Todd C. Miller
+Copyright (c) 2001 Bjorn Reese
+Copyright (c) 2001, 2003, 2005 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2012 Free Software Foundation, Inc.
+Copyright (c) 2004-2010 Marcel Holtmann
+Copyright (c) 2006, 2008, 2010 Free Software Foundation, Inc.
+Copyright (c) 2010, Luigi Toscano,
+Copyright (c) 2013 Roy Stogner (c)
+Copyright (c) 2017 Peter Meerwald-Stadler
+Copyright 2001-2003, 2006-2012 Free Software Foundation, Inc.
+Copyright 2006 Pierre Ossman for Cendio AB
+Copyright 2009 Marc-Andre Moreau
+Copyright 2010 Marc-Andre Moreau
+Copyright 2011 Marc-Andre Moreau
+Copyright 2012 Dmitrij Jasnov
+Copyright 2012 Marc-Andre Moreau
+Copyright 2012 Peter Meerwald
+Copyright 2013 Marc-Andre Moreau
+Copyright 2013 Peter Meerwald
+Copyright 2014 Marc-Andre Moreau
+Copyright 2015 Marc-Andre Moreau
+Copyright (c) 1994 The Regents of the University of California
+Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc.
+Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc.
+Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc.
+Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others
+Copyright 2013 Dell Software
+Copyright 2014 Dell Software
+Copyright 2014 Mike McDonald
+Copyright 2015 Dell Software
+Copyright (c) 2014 Hardening
+Copyright (c) 2016 Norbert Federa
+Portions Copyright 2009 The Go Authors. in LLVM, Diploma Thesis
+Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies)
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies)
+Copyright (c) 2014 David FORT
+Copyright (c) 2015 David FORT
+Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier (c)
+Copyright 2015-2017 Norbert Federa
+Copyright 2016-2017 Norbert Federa
+Portions (c) International Organization for Standardization 1986
+Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang) Disclaimers
+Copyright 2012 Bernhard Miklautz
+Copyright 2012 Feng Wei , Freescale Ltd.
+Copyright 2013 Bernhard Miklautz
+Copyright 2015 Bernhard Miklautz
+Copyright 2018 Bernhard Miklautz
+Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign
+Copyright (c) 2004, 2006 The Linux Foundation and its contributors
+Copyright (c) 2007-2018 University of Illinois at Urbana-Champaign
+Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign
+Copyright 2006-2007 Pierre Ossman for Cendio AB
+Copyright 2009-2012 Marc-Andre Moreau
+Copyright 2010-2011 Marc-Andre Moreau
+Copyright 2010-2012 Marc-Andre Moreau
+Copyright 2010-2014 Marc-Andre Moreau
+Copyright 2011-2012 Marc-Andre Moreau
+Copyright 2011-2013 Marc-Andre Moreau
+Copyright 2011-2014 Marc-Andre Moreau
+Copyright 2012-2013 Marc-Andre Moreau
+Copyright 2012-2014 Marc-Andre Moreau
+Copyright 2013-2014 Marc-Andre Moreau
+(c) StringLiteral NumConstraints std::copy Constraints, Constraints
+Copyright (c) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+Copyright (c) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip
+Copyright 2009-2011 Mathieu Malaterre
+Copyright (c) 1992, 1993 The Regents of the University of California
+Copyright (c) 2002, 2003, 2004, 2010, Free Software Foundation, Inc.
+Copyright (c) 2006-2009 Steven J. Bethard
+Copyright (c) 2015 Bernhard Miklautz
+Copyright (c) Microsoft Corporation. Med ensamr Sekretessinformation
+Copyright (c) 2014-2015 David FORT
+Copyright 2006 Enrico Scholz
+Copyright 2012 Niels Ole Salscheider
+Copyright (c) 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
+Copyright 2009 Vincent Filali-Ansary
+Copyright (c) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (c) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, Inc.
+Copyright (c) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+Copyright (c) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc.
+Copyright (c) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1980, 1986, 1993 The Regents of the University of California
+Copyright (c) 1992, 1993, 1994 The Regents of the University of California
+Copyright (c) 2019 Pengutronix, Michael Olbrich
+Copyright (c) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc.
+Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2008, 2009, 2012, 2015, 2019 The Free Software Foundation, Inc
+Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc.
+Copyright (c) 2012 Alexandre K. I. de Mendonca
+Copyright (c) 2001, 2002, 2003, 2005, 2008, 2010 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright (c) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld
+Copyright (c) 1996, 1997, 2000, 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc.
+Copyright 2018 Kai Harms Copyright.txt or https://cmake.org/licensing
+Copyright (c) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+Copyright (c) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright 2008-2013 Joao Paulo Rechi Vita Copyrigth 2018-2019 Pali Rohar
+Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
+Copyright (c) Microsoft Corporation. https://aka.ms/privacy wsl.exe Argument Options... CommandLine
+Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California
+Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011 Free Software Foundation, Inc.
+Copyright (c) 2000-2002 Oliver Kurth 2003 Lennart Poettering
+Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass
+Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+Copyright (c) 2012 Alexandre K. I. de Mendonca , Paulo Pizarro
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2014 Free Software Foundation, Inc.
+Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+
+MIT License
+
+Copyright (c)