fundus 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -3
- package/build/client/_app/immutable/assets/3.BuCXJbRG.css +1 -0
- package/build/client/_app/immutable/assets/3.BuCXJbRG.css.br +0 -0
- package/build/client/_app/immutable/assets/3.BuCXJbRG.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.C0QkCMQ4.css +1 -0
- package/build/client/_app/immutable/assets/4.C0QkCMQ4.css.br +0 -0
- package/build/client/_app/immutable/assets/4.C0QkCMQ4.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css +1 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.B6By2-yb.css.gz +0 -0
- package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css +1 -0
- package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css.br +0 -0
- package/build/client/_app/immutable/assets/Popover.Et4sBRbI.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B9HdDE5n.js +1 -0
- package/build/client/_app/immutable/chunks/B9HdDE5n.js.br +0 -0
- package/build/client/_app/immutable/chunks/B9HdDE5n.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CAQ5okPf.js +2 -0
- package/build/client/_app/immutable/chunks/CAQ5okPf.js.br +0 -0
- package/build/client/_app/immutable/chunks/CAQ5okPf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ccz62-Hi.js +1 -0
- package/build/client/_app/immutable/chunks/Ccz62-Hi.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ccz62-Hi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ChVOZl2x.js +1 -0
- package/build/client/_app/immutable/chunks/ChVOZl2x.js.br +0 -0
- package/build/client/_app/immutable/chunks/ChVOZl2x.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CiBv7EZv.js +108 -0
- package/build/client/_app/immutable/chunks/CiBv7EZv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CiBv7EZv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UFAWUL-4.js +1 -0
- package/build/client/_app/immutable/chunks/UFAWUL-4.js.br +0 -0
- package/build/client/_app/immutable/chunks/UFAWUL-4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/YWIvyYJl.js +1 -0
- package/build/client/_app/immutable/chunks/YWIvyYJl.js.br +0 -0
- package/build/client/_app/immutable/chunks/YWIvyYJl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/YpiA5Xry.js +3 -0
- package/build/client/_app/immutable/chunks/YpiA5Xry.js.br +0 -0
- package/build/client/_app/immutable/chunks/YpiA5Xry.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CliRE4wo.js → jjXOSnwf.js} +1 -1
- package/build/client/_app/immutable/chunks/jjXOSnwf.js.br +0 -0
- package/build/client/_app/immutable/chunks/jjXOSnwf.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Rv8f5zSo.js +2 -0
- package/build/client/_app/immutable/entry/app.Rv8f5zSo.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Rv8f5zSo.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.C5jRg_CF.js +1 -0
- package/build/client/_app/immutable/entry/start.C5jRg_CF.js.br +1 -0
- package/build/client/_app/immutable/entry/start.C5jRg_CF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js +1 -0
- package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Gv5d6CcW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.8J9y5zyF.js +1 -0
- package/build/client/_app/immutable/nodes/1.8J9y5zyF.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.8J9y5zyF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js +3 -0
- package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BNvTqsKZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CmlRI2XA.js +1 -0
- package/build/client/_app/immutable/nodes/3.CmlRI2XA.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CmlRI2XA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CHTKk5QR.js +2 -0
- package/build/client/_app/immutable/nodes/4.CHTKk5QR.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CHTKk5QR.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +7 -7
- package/build/index.js +7 -7
- package/build/server/chunks/chunks/{context.js-Cg-Pih8x.js → context.js-BJfk3ZiR.js} +440 -6
- package/build/server/chunks/chunks/context.js-BJfk3ZiR.js.map +1 -0
- package/build/server/chunks/chunks/{contract.js-C6yL03Hj.js → contract.js-DRcxzb4o.js} +17 -3
- package/build/server/chunks/chunks/contract.js-DRcxzb4o.js.map +1 -0
- package/build/server/chunks/chunks/{exports.js-CKLcHEPO.js → exports.js-BcB5q0h5.js} +2 -2
- package/build/server/chunks/chunks/{exports.js-CKLcHEPO.js.map → exports.js-BcB5q0h5.js.map} +1 -1
- package/build/server/chunks/chunks/{http.js-B2joT3YT.js → http.js-DMkgmpI5.js} +2 -2
- package/build/server/chunks/chunks/{http.js-B2joT3YT.js.map → http.js-DMkgmpI5.js.map} +1 -1
- package/build/server/chunks/chunks/{internal.js-ByCfjWgU.js → internal.js-B6eePlP4.js} +3 -3
- package/build/server/chunks/chunks/{internal.js-ByCfjWgU.js.map → internal.js-B6eePlP4.js.map} +1 -1
- package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
- package/build/server/chunks/chunks/{shared.js-BDdrmPL3.js → shared.js-BO7vJlPc.js} +2 -2
- package/build/server/chunks/chunks/{shared.js-BDdrmPL3.js.map → shared.js-BO7vJlPc.js.map} +1 -1
- package/build/server/chunks/chunks/{utils.js-CD_wf0ka.js → utils.js-BTV5xnNv.js} +3 -3
- package/build/server/chunks/chunks/{utils.js-CD_wf0ka.js.map → utils.js-BTV5xnNv.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Cn8Ztaiw.js → _server.ts.js-m2QGyBiV.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-Cn8Ztaiw.js.map → _server.ts.js-m2QGyBiV.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-CrOiDQG8.js → _server.ts.js-eMNgdaf4.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-CrOiDQG8.js.map → _server.ts.js-eMNgdaf4.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-CpJ_OzDV.js → _server.ts.js-CEQd4Wxn.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-CpJ_OzDV.js.map → _server.ts.js-CEQd4Wxn.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BCZRAtqn.js → _server.ts.js-B2JoGCzy.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-BCZRAtqn.js.map → _server.ts.js-B2JoGCzy.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-CwyV_AMP.js → _server.ts.js-DTpkVywC.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-CwyV_AMP.js.map → _server.ts.js-DTpkVywC.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BZAM3HSB.js → _server.ts.js-D6Z_pGEZ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-BZAM3HSB.js.map → _server.ts.js-D6Z_pGEZ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CPNISyB1.js → _server.ts.js-CnDi9p0a.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-CPNISyB1.js.map → _server.ts.js-CnDi9p0a.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-5R7ywd4H.js → _server.ts.js-BCzuPX5Z.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-5R7ywd4H.js.map → _server.ts.js-BCzuPX5Z.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-ZQiaSMNA.js → _server.ts.js-CGbYyJ6S.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-ZQiaSMNA.js.map → _server.ts.js-CGbYyJ6S.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CE29dwBF.js → _server.ts.js-CL_89klb.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CE29dwBF.js.map → _server.ts.js-CL_89klb.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CU3gpNeg.js → _server.ts.js-DZUKtjz9.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-CU3gpNeg.js.map → _server.ts.js-DZUKtjz9.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-BhJDoTAq.js → _server.ts.js-Dz25LG_P.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-BhJDoTAq.js.map → _server.ts.js-Dz25LG_P.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-B72NkhD1.js → _server.ts.js-C-NuN3JJ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-B72NkhD1.js.map → _server.ts.js-C-NuN3JJ.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CWK5em43.js → _server.ts.js-CwL9UPh3.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-CWK5em43.js.map → _server.ts.js-CwL9UPh3.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-BBxmYiE6.js → _server.ts.js-DanXYrj1.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-BBxmYiE6.js.map → _server.ts.js-DanXYrj1.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-DR4xHt0w.js → _server.ts.js-BZrun0up.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-DR4xHt0w.js.map → _server.ts.js-BZrun0up.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-CfiypExu.js → _server.ts.js-DQOabHbS.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-CfiypExu.js.map → _server.ts.js-DQOabHbS.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DjmTUX8d.js → _server.ts.js-k8Ueydx1.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-DjmTUX8d.js.map → _server.ts.js-k8Ueydx1.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/usage/_server.ts.js-DmMmiFiu.js +82 -0
- package/build/server/chunks/entries/endpoints/api/usage/_server.ts.js-DmMmiFiu.js.map +1 -0
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-qfzdfNHQ.js → _server.ts.js-CT7yOdDS.js} +3 -3
- package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-qfzdfNHQ.js.map → _server.ts.js-CT7yOdDS.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CS_5SEL-.js → _server.ts.js-BQTC0OSC.js} +4 -4
- package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-CS_5SEL-.js.map → _server.ts.js-BQTC0OSC.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cv-y3Nqu.js → _server.ts.js-mv9cqSuS.js} +4 -4
- package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-Cv-y3Nqu.js.map → _server.ts.js-mv9cqSuS.js.map} +1 -1
- package/build/server/chunks/entries/{hooks.server.js-WOShZElI.js → hooks.server.js-BNQO3cZr.js} +3 -3
- package/build/server/chunks/entries/{hooks.server.js-WOShZElI.js.map → hooks.server.js-BNQO3cZr.js.map} +1 -1
- package/build/server/chunks/{handler-CIOnH690.js → handler-DQdjBhko.js} +5 -5
- package/build/server/chunks/{handler-CIOnH690.js.map → handler-DQdjBhko.js.map} +1 -1
- package/build/server/chunks/{index.js-nSuivP3M.js → index.js-DtKY5QD2.js} +5 -5
- package/build/server/chunks/{index.js-nSuivP3M.js.map → index.js-DtKY5QD2.js.map} +1 -1
- package/build/server/chunks/{manifest.js-CIFnCWGv.js → manifest.js-CJMiboeI.js} +35 -28
- package/build/server/chunks/manifest.js-CJMiboeI.js.map +1 -0
- package/build/server/chunks/nodes/{0.js-BSbmgTIm.js → 0.js-Ce__dNtc.js} +2 -2
- package/build/server/chunks/nodes/{0.js-BSbmgTIm.js.map → 0.js-Ce__dNtc.js.map} +1 -1
- package/build/server/chunks/nodes/1.js-BIwe5V8L.js +7 -0
- package/build/server/chunks/nodes/{1.js-kvz4iUXK.js.map → 1.js-BIwe5V8L.js.map} +1 -1
- package/build/server/chunks/nodes/2.js-Bj7c0eH1.js +7 -0
- package/build/server/chunks/nodes/{2.js-B9ILHJtB.js.map → 2.js-Bj7c0eH1.js.map} +1 -1
- package/build/server/chunks/nodes/3.js-BMOf9FTK.js +7 -0
- package/build/server/chunks/nodes/3.js-BMOf9FTK.js.map +1 -0
- package/build/server/chunks/nodes/4.js-CNLb7Xc5.js +7 -0
- package/build/server/chunks/nodes/4.js-CNLb7Xc5.js.map +1 -0
- package/dist/cli.js +6 -1
- package/dist/config.d.ts +1 -1
- package/dist/core/api-types.d.ts +36 -1
- package/dist/core/config.d.ts +35 -0
- package/dist/core/index.d.ts +2 -2
- package/dist/runtime/chroma-key-video-lifecycle.d.ts +2 -2
- package/dist/runtime/chroma-key-video-lifecycle.js +221 -124
- package/dist/runtime/components/ChromaKeyVideo.svelte +13 -2
- package/dist/runtime/components/Slice.svelte +22 -12
- package/dist/runtime/components/Slice.svelte.d.ts +3 -6
- package/dist/runtime/components/SliceCanvas.svelte +51 -40
- package/dist/runtime/components/SliceCanvas.svelte.d.ts +2 -2
- package/dist/runtime/components/SliceDom.svelte +96 -42
- package/dist/runtime/components/SliceDom.svelte.d.ts +2 -2
- package/dist/runtime/slice-source-lifecycle.d.ts +14 -0
- package/dist/runtime/slice-source-lifecycle.js +70 -0
- package/dist/server/check.d.ts +6 -0
- package/dist/server/check.js +4 -1
- package/dist/server/cli-commands.d.ts +3 -1
- package/dist/server/cli-commands.js +117 -2
- package/dist/server/codegen.d.ts +3 -0
- package/dist/server/codegen.js +19 -2
- package/dist/server/config-loader.d.ts +3 -1
- package/dist/server/config-loader.js +13 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +1 -1
- package/dist/server/operations.d.ts +7 -1
- package/dist/server/operations.js +85 -2
- package/dist/server/start.d.ts +8 -0
- package/dist/server/start.js +24 -0
- package/dist/server/usage.d.ts +24 -0
- package/dist/server/usage.js +441 -0
- package/package.json +4 -1
- package/build/client/_app/immutable/assets/3.CmXD8k9d.css +0 -1
- package/build/client/_app/immutable/assets/3.CmXD8k9d.css.br +0 -0
- package/build/client/_app/immutable/assets/3.CmXD8k9d.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.p004hmEN.css +0 -1
- package/build/client/_app/immutable/assets/4.p004hmEN.css.br +0 -0
- package/build/client/_app/immutable/assets/4.p004hmEN.css.gz +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css +0 -1
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.br +0 -0
- package/build/client/_app/immutable/assets/LibraryContextMenu.BSnKt_Is.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BD3hQKzV.js +0 -1
- package/build/client/_app/immutable/chunks/BD3hQKzV.js.br +0 -0
- package/build/client/_app/immutable/chunks/BD3hQKzV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C3HGm51f.js +0 -1
- package/build/client/_app/immutable/chunks/C3HGm51f.js.br +0 -0
- package/build/client/_app/immutable/chunks/C3HGm51f.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C7OUKWnm.js +0 -1
- package/build/client/_app/immutable/chunks/C7OUKWnm.js.br +0 -0
- package/build/client/_app/immutable/chunks/C7OUKWnm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CaKQ_luf.js +0 -1
- package/build/client/_app/immutable/chunks/CaKQ_luf.js.br +0 -0
- package/build/client/_app/immutable/chunks/CaKQ_luf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CliRE4wo.js.br +0 -1
- package/build/client/_app/immutable/chunks/CliRE4wo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DPZDGjcn.js +0 -1
- package/build/client/_app/immutable/chunks/DPZDGjcn.js.br +0 -0
- package/build/client/_app/immutable/chunks/DPZDGjcn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/JSnjcoVL.js +0 -108
- package/build/client/_app/immutable/chunks/JSnjcoVL.js.br +0 -0
- package/build/client/_app/immutable/chunks/JSnjcoVL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/NblqapDQ.js +0 -3
- package/build/client/_app/immutable/chunks/NblqapDQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/NblqapDQ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.p0Th9Q3c.js +0 -2
- package/build/client/_app/immutable/entry/app.p0Th9Q3c.js.br +0 -0
- package/build/client/_app/immutable/entry/app.p0Th9Q3c.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.p06L3A6u.js +0 -1
- package/build/client/_app/immutable/entry/start.p06L3A6u.js.br +0 -0
- package/build/client/_app/immutable/entry/start.p06L3A6u.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.D2yDRY2E.js +0 -2
- package/build/client/_app/immutable/nodes/0.D2yDRY2E.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D2yDRY2E.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.nLMgahSZ.js +0 -1
- package/build/client/_app/immutable/nodes/1.nLMgahSZ.js.br +0 -3
- package/build/client/_app/immutable/nodes/1.nLMgahSZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js +0 -3
- package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Cr-DsqQM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js +0 -1
- package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CmsMY1VJ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.CeeDVfsm.js +0 -2
- package/build/client/_app/immutable/nodes/4.CeeDVfsm.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CeeDVfsm.js.gz +0 -0
- package/build/server/chunks/chunks/context.js-Cg-Pih8x.js.map +0 -1
- package/build/server/chunks/chunks/contract.js-C6yL03Hj.js.map +0 -1
- package/build/server/chunks/manifest.js-CIFnCWGv.js.map +0 -1
- package/build/server/chunks/nodes/1.js-kvz4iUXK.js +0 -7
- package/build/server/chunks/nodes/2.js-B9ILHJtB.js +0 -7
- package/build/server/chunks/nodes/3.js-YAjQeV5C.js +0 -7
- package/build/server/chunks/nodes/3.js-YAjQeV5C.js.map +0 -1
- package/build/server/chunks/nodes/4.js-7My4KJNM.js +0 -7
- package/build/server/chunks/nodes/4.js-7My4KJNM.js.map +0 -1
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { isAbsolute } from 'node:path';
|
|
3
|
+
import { compareCodeUnits } from '../core/index.js';
|
|
4
|
+
const MAX_PATHS = 20;
|
|
5
|
+
const TOKEN_TTL_MS = 10 * 60 * 1000;
|
|
6
|
+
function locationKey(location) {
|
|
7
|
+
return `${location.file}\u0000${location.line}\u0000${location.column}`;
|
|
8
|
+
}
|
|
9
|
+
function compareLocations(left, right) {
|
|
10
|
+
return (compareCodeUnits(left.file, right.file) ||
|
|
11
|
+
left.line - right.line ||
|
|
12
|
+
left.column - right.column ||
|
|
13
|
+
compareCodeUnits(left.label ?? '', right.label ?? ''));
|
|
14
|
+
}
|
|
15
|
+
function validateLocation(value, context, allowLabel) {
|
|
16
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
17
|
+
throw new Error(`${context} must be an object.`);
|
|
18
|
+
}
|
|
19
|
+
const record = value;
|
|
20
|
+
if (typeof record.file !== 'string' || record.file.length === 0 || !isAbsolute(record.file)) {
|
|
21
|
+
throw new Error(`${context}.file must be an absolute path.`);
|
|
22
|
+
}
|
|
23
|
+
for (const key of ['line', 'column']) {
|
|
24
|
+
if (!Number.isSafeInteger(record[key]) || record[key] <= 0) {
|
|
25
|
+
throw new Error(`${context}.${key} must be a positive safe integer.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (allowLabel && record.label !== undefined && typeof record.label !== 'string') {
|
|
29
|
+
throw new Error(`${context}.label must be a string.`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
file: record.file,
|
|
33
|
+
line: record.line,
|
|
34
|
+
column: record.column,
|
|
35
|
+
...(allowLabel && typeof record.label === 'string' ? { label: record.label } : {})
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function normalizeResult(value, target) {
|
|
39
|
+
const context = `fundus.config: usage.referenceProvider for ${target.manifest}.${target.assetId}`;
|
|
40
|
+
try {
|
|
41
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
42
|
+
throw new Error(`${context} must return an object.`);
|
|
43
|
+
}
|
|
44
|
+
const result = value;
|
|
45
|
+
if (result.status === 'unknown') {
|
|
46
|
+
if (result.reason !== undefined && typeof result.reason !== 'string') {
|
|
47
|
+
throw new Error(`${context} unknown reason must be a string.`);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
status: 'unknown',
|
|
51
|
+
...(typeof result.reason === 'string' ? { reason: result.reason } : {})
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (result.status !== 'resolved' || !Array.isArray(result.references)) {
|
|
55
|
+
throw new Error(`${context} must return resolved references or unknown.`);
|
|
56
|
+
}
|
|
57
|
+
const declarationKey = locationKey(target.declaration);
|
|
58
|
+
const references = result.references
|
|
59
|
+
.map((reference, index) => validateLocation(reference, `${context} references[${index}]`, true))
|
|
60
|
+
.filter((reference) => locationKey(reference) !== declarationKey)
|
|
61
|
+
.sort(compareLocations);
|
|
62
|
+
const deduplicated = [];
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
for (const reference of references) {
|
|
65
|
+
const key = locationKey(reference);
|
|
66
|
+
if (seen.has(key))
|
|
67
|
+
continue;
|
|
68
|
+
seen.add(key);
|
|
69
|
+
deduplicated.push(reference);
|
|
70
|
+
}
|
|
71
|
+
return { status: 'resolved', references: deduplicated };
|
|
72
|
+
}
|
|
73
|
+
catch (cause) {
|
|
74
|
+
return { status: 'unknown', reason: cause instanceof Error ? cause.message : String(cause) };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
class FifoLimiter {
|
|
78
|
+
#active = 0;
|
|
79
|
+
#queue = [];
|
|
80
|
+
async run(operation) {
|
|
81
|
+
if (this.#active >= 4)
|
|
82
|
+
await new Promise((resolve) => this.#queue.push(resolve));
|
|
83
|
+
this.#active++;
|
|
84
|
+
try {
|
|
85
|
+
return await operation();
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
this.#active--;
|
|
89
|
+
this.#queue.shift()?.();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export class FundusUsageAnalyzer {
|
|
94
|
+
#usage;
|
|
95
|
+
#secret = randomBytes(32);
|
|
96
|
+
#limiter = new FifoLimiter();
|
|
97
|
+
#inflight = new Map();
|
|
98
|
+
#freshGeneration = 0;
|
|
99
|
+
constructor(usage) {
|
|
100
|
+
this.#usage = usage;
|
|
101
|
+
}
|
|
102
|
+
async analyze(snapshot, options = {}) {
|
|
103
|
+
if (options.assetId && !Object.hasOwn(snapshot.library.assets, options.assetId)) {
|
|
104
|
+
throw new Error(`Unknown asset "${options.assetId}".`);
|
|
105
|
+
}
|
|
106
|
+
const rootsToAnalyze = options.assetId
|
|
107
|
+
? relevantRootsForAsset(snapshot, options.assetId)
|
|
108
|
+
: snapshot.roots;
|
|
109
|
+
const freshKey = options.forceFresh ? `fresh:${++this.#freshGeneration}` : 'normal';
|
|
110
|
+
const rootResults = new Map();
|
|
111
|
+
await Promise.all(rootsToAnalyze.map(async (root) => {
|
|
112
|
+
const key = rootKey(root);
|
|
113
|
+
if (!root.declaration) {
|
|
114
|
+
rootResults.set(key, {
|
|
115
|
+
status: 'unknown',
|
|
116
|
+
reason: root.declarationError ??
|
|
117
|
+
`Cannot locate generated declaration for ${root.manifest}.${root.assetId}.`
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const target = {
|
|
122
|
+
assetId: root.assetId,
|
|
123
|
+
manifest: root.manifest,
|
|
124
|
+
declaration: root.declaration
|
|
125
|
+
};
|
|
126
|
+
const inflightKey = `${snapshot.revision}|${locationKey(root.declaration)}|${freshKey}`;
|
|
127
|
+
let run = !options.forceFresh ? this.#inflight.get(inflightKey) : undefined;
|
|
128
|
+
if (!run) {
|
|
129
|
+
run = this.#limiter.run(async () => {
|
|
130
|
+
try {
|
|
131
|
+
return normalizeResult(await this.#usage.referenceProvider(target), target);
|
|
132
|
+
}
|
|
133
|
+
catch (cause) {
|
|
134
|
+
return {
|
|
135
|
+
status: 'unknown',
|
|
136
|
+
reason: `usage.referenceProvider failed for ${root.manifest}.${root.assetId}: ${cause instanceof Error ? cause.message : String(cause)}`
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
if (!options.forceFresh) {
|
|
141
|
+
this.#inflight.set(inflightKey, run);
|
|
142
|
+
void run.finally(() => this.#inflight.delete(inflightKey));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
rootResults.set(key, await run);
|
|
146
|
+
}));
|
|
147
|
+
return this.#assemble(snapshot, rootResults, options.assetId);
|
|
148
|
+
}
|
|
149
|
+
stale(snapshot, assetId) {
|
|
150
|
+
const results = new Map();
|
|
151
|
+
for (const root of assetId ? relevantRootsForAsset(snapshot, assetId) : snapshot.roots) {
|
|
152
|
+
results.set(rootKey(root), {
|
|
153
|
+
status: 'unknown',
|
|
154
|
+
reason: 'The Fundus project changed repeatedly during usage analysis; refresh to retry.'
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return this.#assemble(snapshot, results, assetId);
|
|
158
|
+
}
|
|
159
|
+
async open(token) {
|
|
160
|
+
if (typeof token !== 'string' || token.length === 0) {
|
|
161
|
+
throw new Error('Usage location token must be a non-empty string.');
|
|
162
|
+
}
|
|
163
|
+
const [encoded, signature, extra] = token.split('.');
|
|
164
|
+
if (!encoded || !signature || extra !== undefined)
|
|
165
|
+
throw new Error('Invalid usage location token.');
|
|
166
|
+
const expected = createHmac('sha256', this.#secret).update(encoded).digest();
|
|
167
|
+
let received;
|
|
168
|
+
try {
|
|
169
|
+
received = Buffer.from(signature, 'base64url');
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
throw new Error('Invalid usage location token.');
|
|
173
|
+
}
|
|
174
|
+
if (received.length !== expected.length || !timingSafeEqual(received, expected)) {
|
|
175
|
+
throw new Error('Invalid usage location token; refresh usage and try again.');
|
|
176
|
+
}
|
|
177
|
+
let payload;
|
|
178
|
+
try {
|
|
179
|
+
payload = JSON.parse(Buffer.from(encoded, 'base64url').toString('utf8'));
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
throw new Error('Invalid usage location token.');
|
|
183
|
+
}
|
|
184
|
+
if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
|
|
185
|
+
throw new Error('Invalid usage location token.');
|
|
186
|
+
}
|
|
187
|
+
const record = payload;
|
|
188
|
+
if (record.v !== 1 || typeof record.expiresAt !== 'number' || Date.now() > record.expiresAt) {
|
|
189
|
+
throw new Error('Usage location token expired; refresh usage and try again.');
|
|
190
|
+
}
|
|
191
|
+
const location = validateLocation(record.location, 'Usage location token', false);
|
|
192
|
+
const normalized = { file: location.file, line: location.line, column: location.column };
|
|
193
|
+
try {
|
|
194
|
+
await this.#usage.openLocation(normalized);
|
|
195
|
+
}
|
|
196
|
+
catch (cause) {
|
|
197
|
+
throw new Error(`Could not open ${normalized.file}:${normalized.line}:${normalized.column}: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
#token(location) {
|
|
201
|
+
const encoded = Buffer.from(JSON.stringify({ v: 1, expiresAt: Date.now() + TOKEN_TTL_MS, location })).toString('base64url');
|
|
202
|
+
const signature = createHmac('sha256', this.#secret).update(encoded).digest('base64url');
|
|
203
|
+
return `${encoded}.${signature}`;
|
|
204
|
+
}
|
|
205
|
+
#assemble(snapshot, rootResults, requestedAssetId) {
|
|
206
|
+
const assetIds = requestedAssetId
|
|
207
|
+
? [requestedAssetId]
|
|
208
|
+
: Object.keys(snapshot.library.assets).sort(compareCodeUnits);
|
|
209
|
+
const analyzedRoots = snapshot.roots.filter((root) => rootResults.has(rootKey(root)));
|
|
210
|
+
const cyclicNodes = referenceCycleNodes(snapshot.referencesByAsset);
|
|
211
|
+
const cycleAncestors = reverseClosure(cyclicNodes, snapshot.referencesByAsset);
|
|
212
|
+
const adjustedResults = new Map();
|
|
213
|
+
for (const root of analyzedRoots) {
|
|
214
|
+
const result = rootResults.get(rootKey(root));
|
|
215
|
+
adjustedResults.set(rootKey(root), cycleAncestors.has(root.assetId) &&
|
|
216
|
+
result.status === 'resolved' &&
|
|
217
|
+
result.references.length === 0
|
|
218
|
+
? {
|
|
219
|
+
status: 'unknown',
|
|
220
|
+
reason: 'A reference cycle prevents complete usage analysis for this root.'
|
|
221
|
+
}
|
|
222
|
+
: result);
|
|
223
|
+
}
|
|
224
|
+
const usedAssets = referenceClosureFromSources(analyzedRoots
|
|
225
|
+
.filter((root) => {
|
|
226
|
+
const result = adjustedResults.get(rootKey(root));
|
|
227
|
+
return result?.status === 'resolved' && result.references.length > 0;
|
|
228
|
+
})
|
|
229
|
+
.map((root) => root.assetId), snapshot.referencesByAsset);
|
|
230
|
+
const unknownAssets = referenceClosureFromSources(analyzedRoots
|
|
231
|
+
.filter((root) => adjustedResults.get(rootKey(root))?.status === 'unknown')
|
|
232
|
+
.map((root) => root.assetId), snapshot.referencesByAsset);
|
|
233
|
+
const assets = assetIds.map((assetId) => {
|
|
234
|
+
const status = usedAssets.has(assetId)
|
|
235
|
+
? 'used'
|
|
236
|
+
: unknownAssets.has(assetId)
|
|
237
|
+
? 'unknown'
|
|
238
|
+
: 'unused';
|
|
239
|
+
if (!requestedAssetId) {
|
|
240
|
+
return { assetId, status, references: [], roots: [] };
|
|
241
|
+
}
|
|
242
|
+
const groups = [];
|
|
243
|
+
const pathCountMemo = new Map();
|
|
244
|
+
for (const root of analyzedRoots) {
|
|
245
|
+
const paths = pathsFromRoot(root.assetId, assetId, snapshot.referencesByAsset, pathCountMemo, cyclicNodes);
|
|
246
|
+
if (paths.count > 0n)
|
|
247
|
+
groups.push({ root, paths: paths.paths, count: paths.count });
|
|
248
|
+
}
|
|
249
|
+
const allReferences = [];
|
|
250
|
+
for (const group of groups) {
|
|
251
|
+
const result = adjustedResults.get(rootKey(group.root));
|
|
252
|
+
if (result?.status === 'resolved')
|
|
253
|
+
allReferences.push(...result.references);
|
|
254
|
+
}
|
|
255
|
+
allReferences.sort(compareLocations);
|
|
256
|
+
const uniqueReferences = [];
|
|
257
|
+
const referenceIdByKey = new Map();
|
|
258
|
+
for (const reference of allReferences) {
|
|
259
|
+
const key = locationKey(reference);
|
|
260
|
+
if (referenceIdByKey.has(key))
|
|
261
|
+
continue;
|
|
262
|
+
const id = `r${uniqueReferences.length}`;
|
|
263
|
+
referenceIdByKey.set(key, id);
|
|
264
|
+
uniqueReferences.push(reference);
|
|
265
|
+
}
|
|
266
|
+
const roots = groups.map(({ root, paths, count }) => {
|
|
267
|
+
const result = adjustedResults.get(rootKey(root)) ?? {
|
|
268
|
+
status: 'unknown',
|
|
269
|
+
reason: 'Usage analysis result is missing.'
|
|
270
|
+
};
|
|
271
|
+
const dtoResult = result.status === 'unknown'
|
|
272
|
+
? result
|
|
273
|
+
: {
|
|
274
|
+
status: 'resolved',
|
|
275
|
+
referenceIds: result.references
|
|
276
|
+
.map((reference) => referenceIdByKey.get(locationKey(reference)))
|
|
277
|
+
.filter((id) => id !== undefined)
|
|
278
|
+
};
|
|
279
|
+
return {
|
|
280
|
+
manifest: root.manifest,
|
|
281
|
+
rootAssetId: root.assetId,
|
|
282
|
+
paths,
|
|
283
|
+
pathsTruncated: count > BigInt(paths.length),
|
|
284
|
+
...(count > BigInt(paths.length)
|
|
285
|
+
? { additionalPathCount: (count - BigInt(paths.length)).toString() }
|
|
286
|
+
: {}),
|
|
287
|
+
declaration: root.declaration,
|
|
288
|
+
result: dtoResult
|
|
289
|
+
};
|
|
290
|
+
});
|
|
291
|
+
return {
|
|
292
|
+
assetId,
|
|
293
|
+
status,
|
|
294
|
+
references: uniqueReferences.map((reference, index) => ({
|
|
295
|
+
...reference,
|
|
296
|
+
id: `r${index}`,
|
|
297
|
+
openToken: this.#token(reference)
|
|
298
|
+
})),
|
|
299
|
+
roots
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
return { assets };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function rootKey(root) {
|
|
306
|
+
return `${root.manifest}\u0000${root.assetId}`;
|
|
307
|
+
}
|
|
308
|
+
function relevantRootsForAsset(snapshot, assetId) {
|
|
309
|
+
const ancestors = reverseClosure(new Set([assetId]), snapshot.referencesByAsset);
|
|
310
|
+
return snapshot.roots.filter((root) => ancestors.has(root.assetId));
|
|
311
|
+
}
|
|
312
|
+
function reverseClosure(sources, referencesByAsset) {
|
|
313
|
+
const incoming = new Map();
|
|
314
|
+
for (const [source, references] of Object.entries(referencesByAsset)) {
|
|
315
|
+
for (const target of new Set(references.map((reference) => reference.assetId))) {
|
|
316
|
+
const sources = incoming.get(target);
|
|
317
|
+
if (sources)
|
|
318
|
+
sources.push(source);
|
|
319
|
+
else
|
|
320
|
+
incoming.set(target, [source]);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const closure = new Set();
|
|
324
|
+
const pending = [...sources];
|
|
325
|
+
while (pending.length > 0) {
|
|
326
|
+
const current = pending.pop();
|
|
327
|
+
if (closure.has(current))
|
|
328
|
+
continue;
|
|
329
|
+
closure.add(current);
|
|
330
|
+
pending.push(...(incoming.get(current) ?? []));
|
|
331
|
+
}
|
|
332
|
+
return closure;
|
|
333
|
+
}
|
|
334
|
+
function referenceClosureFromSources(sources, referencesByAsset) {
|
|
335
|
+
const closure = new Set();
|
|
336
|
+
const pending = [...sources];
|
|
337
|
+
while (pending.length > 0) {
|
|
338
|
+
const current = pending.pop();
|
|
339
|
+
if (closure.has(current) || !Object.hasOwn(referencesByAsset, current))
|
|
340
|
+
continue;
|
|
341
|
+
closure.add(current);
|
|
342
|
+
for (const reference of referencesByAsset[current])
|
|
343
|
+
pending.push(reference.assetId);
|
|
344
|
+
}
|
|
345
|
+
return closure;
|
|
346
|
+
}
|
|
347
|
+
/** Tarjan SCC detection; singleton components count only when they self-reference. */
|
|
348
|
+
function referenceCycleNodes(referencesByAsset) {
|
|
349
|
+
let nextIndex = 0;
|
|
350
|
+
const indexByNode = new Map();
|
|
351
|
+
const lowLink = new Map();
|
|
352
|
+
const stack = [];
|
|
353
|
+
const onStack = new Set();
|
|
354
|
+
const cyclic = new Set();
|
|
355
|
+
const visit = (node) => {
|
|
356
|
+
indexByNode.set(node, nextIndex);
|
|
357
|
+
lowLink.set(node, nextIndex++);
|
|
358
|
+
stack.push(node);
|
|
359
|
+
onStack.add(node);
|
|
360
|
+
for (const target of new Set((referencesByAsset[node] ?? []).map((ref) => ref.assetId))) {
|
|
361
|
+
if (!Object.hasOwn(referencesByAsset, target))
|
|
362
|
+
continue;
|
|
363
|
+
if (!indexByNode.has(target)) {
|
|
364
|
+
visit(target);
|
|
365
|
+
lowLink.set(node, Math.min(lowLink.get(node), lowLink.get(target)));
|
|
366
|
+
}
|
|
367
|
+
else if (onStack.has(target)) {
|
|
368
|
+
lowLink.set(node, Math.min(lowLink.get(node), indexByNode.get(target)));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (lowLink.get(node) !== indexByNode.get(node))
|
|
372
|
+
return;
|
|
373
|
+
const component = [];
|
|
374
|
+
for (;;) {
|
|
375
|
+
const member = stack.pop();
|
|
376
|
+
onStack.delete(member);
|
|
377
|
+
component.push(member);
|
|
378
|
+
if (member === node)
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
if (component.length > 1 ||
|
|
382
|
+
(referencesByAsset[node] ?? []).some((reference) => reference.assetId === node)) {
|
|
383
|
+
for (const member of component)
|
|
384
|
+
cyclic.add(member);
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
for (const node of Object.keys(referencesByAsset)) {
|
|
388
|
+
if (!indexByNode.has(node))
|
|
389
|
+
visit(node);
|
|
390
|
+
}
|
|
391
|
+
return cyclic;
|
|
392
|
+
}
|
|
393
|
+
function pathsFromRoot(root, target, referencesByAsset, countMemo = new Map(), cyclicNodes = referenceCycleNodes(referencesByAsset)) {
|
|
394
|
+
const count = (assetId, visiting) => {
|
|
395
|
+
if (assetId === target)
|
|
396
|
+
return 1n;
|
|
397
|
+
const visitedCyclicNodes = [...visiting]
|
|
398
|
+
.filter((id) => cyclicNodes.has(id))
|
|
399
|
+
.sort(compareCodeUnits);
|
|
400
|
+
const memoKey = JSON.stringify([assetId, visitedCyclicNodes]);
|
|
401
|
+
const cached = countMemo.get(memoKey);
|
|
402
|
+
if (cached !== undefined)
|
|
403
|
+
return cached;
|
|
404
|
+
if (visiting.has(assetId)) {
|
|
405
|
+
return 0n;
|
|
406
|
+
}
|
|
407
|
+
const nextVisiting = new Set(visiting).add(assetId);
|
|
408
|
+
let total = 0n;
|
|
409
|
+
const nextIds = [...new Set((referencesByAsset[assetId] ?? []).map((ref) => ref.assetId))].sort(compareCodeUnits);
|
|
410
|
+
for (const next of nextIds)
|
|
411
|
+
total += count(next, nextVisiting);
|
|
412
|
+
countMemo.set(memoKey, total);
|
|
413
|
+
return total;
|
|
414
|
+
};
|
|
415
|
+
const total = count(root, new Set());
|
|
416
|
+
const paths = [];
|
|
417
|
+
const collect = (assetId, path, visiting) => {
|
|
418
|
+
if (paths.length >= MAX_PATHS)
|
|
419
|
+
return;
|
|
420
|
+
if (assetId === target) {
|
|
421
|
+
paths.push(path);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (visiting.has(assetId))
|
|
425
|
+
return;
|
|
426
|
+
const nextVisiting = new Set(visiting).add(assetId);
|
|
427
|
+
const nextIds = [...new Set((referencesByAsset[assetId] ?? []).map((ref) => ref.assetId))].sort(compareCodeUnits);
|
|
428
|
+
for (const next of nextIds) {
|
|
429
|
+
if (count(next, nextVisiting) > 0n)
|
|
430
|
+
collect(next, [...path, next], nextVisiting);
|
|
431
|
+
if (paths.length >= MAX_PATHS)
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
if (total > 0n)
|
|
436
|
+
collect(root, [root], new Set());
|
|
437
|
+
return { paths, count: total };
|
|
438
|
+
}
|
|
439
|
+
export function usageSnapshotRevision(parts) {
|
|
440
|
+
return createHash('sha256').update(parts.join('\u0000')).digest('hex');
|
|
441
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fundus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -67,7 +67,10 @@
|
|
|
67
67
|
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
|
68
68
|
"@types/ffprobe-static": "^2.0.3",
|
|
69
69
|
"@types/node": "^24.13.3",
|
|
70
|
+
"@vitest/browser": "^3.2.7",
|
|
70
71
|
"fuse.js": "^7.4.2",
|
|
72
|
+
"happy-dom": "^20.11.0",
|
|
73
|
+
"playwright": "^1.61.1",
|
|
71
74
|
"prettier": "^3.8.3",
|
|
72
75
|
"prettier-plugin-svelte": "^4.1.0",
|
|
73
76
|
"publint": "^0.3.21",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.detail.svelte-xy8zsr{flex:1;grid-template-columns:224px 1fr 280px;min-height:0;display:grid}.center.svelte-xy8zsr{flex-direction:column;min-width:0;min-height:0;padding:12px 16px;display:flex}.center.empty.svelte-xy8zsr,.empty.svelte-xy8zsr{color:var(--text-dim);flex:1;justify-content:center;align-items:center;display:flex}.inspector.svelte-xy8zsr{background:var(--panel);border-left:1px solid var(--border);overflow-y:auto}.inspector.svelte-xy8zsr section:where(.svelte-xy8zsr){border-bottom:1px solid var(--border-soft);padding:12px}.inspector.svelte-xy8zsr h2:where(.svelte-xy8zsr){word-break:break-all;margin:0;font-size:13px}.raw.svelte-xy8zsr{color:var(--text-dim);word-break:break-all;margin:4px 0 0}.warning.svelte-xy8zsr{color:var(--warning);margin:8px 0 0;font-size:11px}.hint.svelte-xy8zsr{color:var(--text-faint);margin:0;font-size:11px}.inspector.svelte-xy8zsr h4:where(.svelte-xy8zsr){text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);margin:8px 0 4px;font-size:10px}.reference-row.svelte-xy8zsr{border-radius:var(--radius);color:var(--text-dim);align-items:center;gap:6px;min-width:0;padding:3px 4px;display:flex}.reference-row.svelte-xy8zsr:hover{background:var(--panel-raised);color:var(--text)}.reference-field.svelte-xy8zsr{color:var(--text-faint);font-size:11px}.reference-arrow.svelte-xy8zsr{color:var(--text-faint);flex:none}.reference-asset.svelte-xy8zsr{color:var(--accent);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.rename.svelte-xy8zsr{gap:8px;margin-bottom:8px;display:flex}.replace-raw.svelte-xy8zsr{width:100%;margin-bottom:8px}.source-label.svelte-xy8zsr{margin-bottom:8px}.source-field.svelte-xy8zsr{color:var(--text-dim);flex-direction:column;gap:4px;margin-bottom:8px;font-size:11px;display:flex}.source-field.svelte-xy8zsr .control:where(.svelte-xy8zsr){width:100%}.source-actions.svelte-xy8zsr{flex-direction:column;gap:6px;display:flex}.source-actions.svelte-xy8zsr .control:where(.svelte-xy8zsr){text-align:center;width:100%}.rename.svelte-xy8zsr input:where(.svelte-xy8zsr){flex:1;min-width:0}.danger.svelte-xy8zsr{width:100%}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.popover-anchor.svelte-1rznwff{display:inline-flex;position:relative}.popover.svelte-1rznwff{z-index:10;background:var(--panel-raised);border:1px solid var(--border);border-radius:var(--radius);padding:8px;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 8px 24px #0006}.popover.right.svelte-1rznwff{left:auto;right:0}.controls.svelte-58t64l{align-items:center;gap:4px;display:inline-flex}.emoji-trigger.svelte-58t64l,.swatch-trigger.svelte-58t64l{border:1px solid var(--border);background:var(--panel-raised);cursor:pointer;justify-content:center;align-items:center;padding:0;display:inline-flex}.emoji-trigger.svelte-58t64l{border-radius:var(--radius-small);width:22px;height:22px;font-size:14px;line-height:1}.emoji-trigger.empty.svelte-58t64l{color:var(--text-faint)}.swatch-trigger.svelte-58t64l{background:var(--swatch);border-radius:50%;width:16px;height:16px}.swatch-trigger.empty.svelte-58t64l{background:0 0;position:relative}.swatch-trigger.empty.svelte-58t64l:after{content:"";background:var(--text-faint);height:1px;position:absolute;inset:50% 1px auto;transform:rotate(-45deg)}.emoji-trigger.active.svelte-58t64l,.swatch-trigger.active.svelte-58t64l{border-color:var(--accent)}.picker.svelte-58t64l{gap:4px;display:grid}.swatches.svelte-58t64l{grid-template-columns:repeat(7,18px)}.emojis.svelte-58t64l{grid-template-columns:repeat(8,24px)}.swatch.svelte-58t64l{border:1px solid var(--border);cursor:pointer;border-radius:50%;width:18px;height:18px;padding:0}.swatch.none.svelte-58t64l{background:0 0;position:relative}.swatch.none.svelte-58t64l:after{content:"";background:var(--text-faint);height:1px;position:absolute;inset:50% 1px auto;transform:rotate(-45deg)}.swatch.selected.svelte-58t64l{outline:2px solid var(--text);outline-offset:1px}.emoji.svelte-58t64l{border-radius:var(--radius-small);border:1px solid var(--border);background:var(--panel);cursor:pointer;width:24px;height:24px;padding:0;font-size:14px;line-height:1}.emoji.none.svelte-58t64l{color:var(--text-faint);font-size:12px}.emoji.selected.svelte-58t64l{border-color:var(--accent);background:var(--accent-soft)}.page.svelte-1k9wgg5{flex:1;min-height:0;padding:16px;overflow-y:auto}.create.svelte-1k9wgg5{align-items:center;gap:8px;margin-bottom:16px;display:flex}.create.svelte-1k9wgg5 input:where(.svelte-1k9wgg5){width:240px}.hint.svelte-1k9wgg5{color:var(--text-faint);font-size:11px}.empty.svelte-1k9wgg5{color:var(--text-dim);text-align:center;padding:48px}.list.svelte-1k9wgg5{flex-direction:column;gap:12px;max-width:640px;display:flex}.manifest.svelte-1k9wgg5{background:var(--panel);border:1px solid var(--manifest-color,var(--border-soft));border-radius:var(--radius-large);padding:12px}.manifest.svelte-1k9wgg5 header:where(.svelte-1k9wgg5){align-items:center;gap:12px;display:flex}.manifest.svelte-1k9wgg5 h2:where(.svelte-1k9wgg5){margin:0;font-size:13px}.size.svelte-1k9wgg5{color:var(--accent);font-variant-numeric:tabular-nums}.count.svelte-1k9wgg5{color:var(--text-dim);margin-left:auto}ul.svelte-1k9wgg5{margin:8px 0 0;padding:0;list-style:none}li.svelte-1k9wgg5 a:where(.svelte-1k9wgg5){border-radius:var(--radius);color:var(--text-dim);align-items:center;gap:12px;padding:4px 8px;display:flex}li.svelte-1k9wgg5 a:where(.svelte-1k9wgg5):hover{background:var(--panel-raised);color:var(--text)}.asset-id.svelte-1k9wgg5{color:var(--text);font-weight:600}.asset-type.svelte-1k9wgg5{border:1px solid var(--border);border-radius:4px;padding:0 5px;font-size:10px}.asset-size.svelte-1k9wgg5{font-variant-numeric:tabular-nums;margin-left:auto}.passive-member.svelte-1k9wgg5{margin-left:16px}.passive-member.svelte-1k9wgg5 a:where(.svelte-1k9wgg5),.passive-member.svelte-1k9wgg5 .asset-id:where(.svelte-1k9wgg5){color:var(--text-faint)}.passive-id.svelte-1k9wgg5{text-underline-offset:3px;font-weight:600;text-decoration-line:underline;text-decoration-style:dashed}.asset-via.svelte-1k9wgg5{color:var(--text-faint);font-size:11px}.dialog-text.svelte-1k9wgg5{color:var(--text-dim);margin:0 0 8px}.dialog-text.warn.svelte-1k9wgg5{color:var(--warning);font-size:11px}.dialog-row.svelte-1k9wgg5{align-items:center;gap:8px;margin-bottom:8px;display:flex}.dialog-label.svelte-1k9wgg5{color:var(--text-dim);flex:none}.dialog-row.svelte-1k9wgg5 input:where(.svelte-1k9wgg5){flex:1}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.playback.svelte-nchstv{align-items:center;gap:6px;width:100%;display:flex}.btn.svelte-nchstv{background:var(--panel-raised);border-radius:var(--radius);width:28px;height:28px;color:var(--text);border:1px solid #0000;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.btn.svelte-nchstv:hover:not(:disabled){border-color:var(--border)}.btn.svelte-nchstv:focus-visible{border-color:var(--accent);outline:none}.btn.svelte-nchstv:disabled{opacity:.4;cursor:not-allowed}.btn.active.svelte-nchstv{background:var(--accent-soft);color:var(--accent)}.btn.svelte-nchstv svg:where(.svelte-nchstv){width:16px;height:16px;display:block}.time.svelte-nchstv{color:var(--text-dim);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.volume-group.svelte-nchstv{align-items:center;gap:6px;margin-left:auto;display:inline-flex}.range.svelte-nchstv{appearance:none;background:var(--panel-raised);cursor:pointer;border-radius:999px;height:4px}.range.scrub.svelte-nchstv{flex:1;min-width:0;margin:0 2px}.range.volume.svelte-nchstv{flex:none;width:72px}.range.svelte-nchstv:disabled{opacity:.4;cursor:not-allowed}.range.svelte-nchstv::-webkit-slider-thumb{appearance:none;background:var(--accent);border:none;border-radius:50%;width:12px;height:12px}.range.svelte-nchstv::-moz-range-thumb{background:var(--accent);border:none;border-radius:50%;width:12px;height:12px}.range.svelte-nchstv:focus-visible{outline:none}.range.svelte-nchstv:focus-visible::-webkit-slider-thumb{box-shadow:0 0 0 3px var(--accent-soft)}.range.svelte-nchstv:focus-visible::-moz-range-thumb{box-shadow:0 0 0 3px var(--accent-soft)}.audio-waveform.svelte-1liihyn{flex-direction:column;gap:8px;width:100%;height:100%;min-height:0;display:flex}.wave.svelte-1liihyn{cursor:pointer;touch-action:none;flex:1;width:100%;min-height:0;display:block}.footer.svelte-1liihyn{flex:none;align-items:center;display:flex}.stage.svelte-1ww4cvx{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.audio-frame.svelte-1ww4cvx{width:min(90%,480px);height:128px}p.svelte-1ww4cvx{color:var(--text-dim)}.scrub-number.svelte-nhap92{flex:1;min-width:0;display:flex;position:relative}.input.svelte-nhap92{width:100%;min-width:0;color:var(--text);font-variant-numeric:tabular-nums;appearance:textfield;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}.scrub-number.with-suffix.svelte-nhap92 .input:where(.svelte-nhap92){flex:none}.suffix.svelte-nhap92{color:var(--text-dim);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;flex:none;margin-left:2px;font-size:11px}.scrub-number.right.svelte-nhap92 .input:where(.svelte-nhap92){text-align:right}.input.svelte-nhap92::-webkit-outer-spin-button{appearance:none;margin:0}.input.svelte-nhap92::-webkit-inner-spin-button{appearance:none;margin:0}.scrub-surface.svelte-nhap92{cursor:ew-resize;touch-action:none;position:absolute;inset:0}.number-field.svelte-368zap{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-368zap{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.number-input.svelte-368zap{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex;position:relative;overflow:hidden}.number-input.svelte-368zap:focus-within{border-color:var(--accent)}.fill.svelte-368zap{pointer-events:none;z-index:0;background:#4a4a4a;height:100%;position:absolute;top:0;left:0}.icon-slot.svelte-368zap{z-index:1;width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:500;display:flex;position:relative}.number-input.svelte-368zap .scrub-number{z-index:1}h3.svelte-1ol624f{letter-spacing:0;text-transform:none;color:#fff;margin:0 0 10px;font-size:11px;font-weight:400}.select-field.svelte-bczi6w{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-bczi6w{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.select-input.svelte-bczi6w{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.select-input.svelte-bczi6w:focus-within{border-color:var(--accent)}.icon-slot.svelte-bczi6w{width:24px;height:24px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;justify-content:center;align-items:center;font-size:11px;font-weight:500;display:flex}select.svelte-bczi6w{width:100%;min-width:0;height:100%;color:var(--text);background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}section.svelte-m9vwwu{border-bottom:1px solid var(--border-soft);padding:12px}.hint.svelte-m9vwwu{color:var(--text-faint);margin:4px 0 0;font-size:11px}.info.svelte-m9vwwu{font-variant-numeric:tabular-nums;margin:0}.file.svelte-m9vwwu{color:var(--text-dim);word-break:break-all}section.svelte-1by8n8t{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-1by8n8t{margin-bottom:8px}.fundus-slice.svelte-1820t2z{width:100%;height:100%;position:relative;overflow:hidden}.fundus-slice--overdraw.svelte-1820t2z{overflow:visible}.fundus-slice__cell.svelte-1820t2z{position:absolute;overflow:hidden}.fundus-slice__cell.svelte-1820t2z img:where(.svelte-1820t2z){pointer-events:none;-webkit-user-select:none;user-select:none;max-width:none;max-height:none;position:absolute}.fundus-slice-canvas.svelte-xdsbrz{width:100%;height:100%;position:relative}canvas.svelte-xdsbrz{pointer-events:none;display:block;position:absolute}.fundus-chroma-key-video.svelte-r30mxh{width:100%;height:100%;position:relative}canvas.svelte-r30mxh,img.svelte-r30mxh{width:100%;height:100%;display:block}video.svelte-r30mxh{visibility:hidden;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.stage.svelte-10eps7e{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.stage.svelte-10eps7e img{object-fit:contain;max-width:90%;max-height:90%}img.svelte-gdduef{object-fit:contain;max-width:100%;max-height:100%}section.svelte-1yd7n22{border-bottom:1px solid var(--border-soft);padding:12px}.modes.svelte-1yd7n22{flex-direction:column;gap:4px;display:flex}.modes.svelte-1yd7n22 button:where(.svelte-1yd7n22){text-align:left;background:var(--panel-raised);color:var(--text);border-radius:var(--radius);border:1px solid #0000;padding:6px 10px}.modes.svelte-1yd7n22 button:where(.svelte-1yd7n22):hover{border-color:var(--border)}.modes.svelte-1yd7n22 button.on:where(.svelte-1yd7n22){background:var(--accent-soft);border-color:var(--accent);color:var(--accent);font-weight:600}.insets.svelte-1yd7n22{grid-template-columns:1fr 1fr;gap:8px;min-width:0;display:grid}.insets.single.svelte-1yd7n22{grid-template-columns:1fr}.preview-panel.svelte-1mjaycs{flex-direction:column;height:100%;min-height:0;display:flex}.bar.svelte-1mjaycs{flex:none;align-items:center;gap:10px;padding:8px 0;display:flex}.size.svelte-1mjaycs{color:var(--text-dim);font-variant-numeric:tabular-nums}.backends.svelte-1mjaycs{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);gap:2px;margin-left:auto;padding:2px;display:inline-flex}.backends.svelte-1mjaycs button:where(.svelte-1mjaycs){color:var(--text-dim);background:0 0;border:none;border-radius:4px;padding:2px 8px}.backends.svelte-1mjaycs button.on:where(.svelte-1mjaycs){background:var(--accent-soft);color:var(--accent);font-weight:600}.reset.svelte-1mjaycs{background:var(--panel-raised);border:1px solid var(--border);color:var(--text);border-radius:var(--radius);padding:4px 10px}.reset.svelte-1mjaycs:hover{border-color:var(--accent)}.stage.svelte-1mjaycs{border:1px solid var(--border);border-radius:var(--radius-large);flex:1;min-height:0;padding:24px;overflow:auto}.box.svelte-1mjaycs{position:relative;box-shadow:0 0 0 1px #ffffff1f}.box.svelte-1mjaycs .fill{position:absolute;inset:0}.handle.svelte-1mjaycs{touch-action:none;background:0 0;position:absolute}.handle.edge-right.svelte-1mjaycs{cursor:ew-resize;width:10px;height:100%;top:0;right:-4px}.handle.edge-bottom.svelte-1mjaycs{cursor:ns-resize;width:100%;height:10px;bottom:-4px;left:0}.handle.corner.svelte-1mjaycs{cursor:nwse-resize;background:var(--accent);width:16px;height:16px;box-shadow:0 0 0 2px var(--canvas);border-radius:3px;bottom:-6px;right:-6px}.canvas.svelte-1jfrg6d{flex-direction:column;height:100%;min-height:0;display:flex}.toolbar.svelte-1jfrg6d{flex:none;align-items:center;gap:8px;padding:8px 0;display:flex}.toolbar.svelte-1jfrg6d button:where(.svelte-1jfrg6d){background:var(--panel-raised);border:1px solid var(--border);color:var(--text);border-radius:var(--radius);padding:4px 10px}.toolbar.svelte-1jfrg6d button:where(.svelte-1jfrg6d):hover{border-color:var(--accent)}.toolbar.svelte-1jfrg6d button.active:where(.svelte-1jfrg6d){background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.zoom.svelte-1jfrg6d{text-align:center;min-width:44px;color:var(--text-dim);font-variant-numeric:tabular-nums}.dims.svelte-1jfrg6d{color:var(--text-dim);font-variant-numeric:tabular-nums;margin-left:auto}.viewport.svelte-1jfrg6d{touch-action:none;cursor:grab;border:1px solid var(--border);border-radius:var(--radius-large);flex:1;min-height:0;position:relative;overflow:hidden}.viewport.panning.svelte-1jfrg6d{cursor:grabbing}.image-wrap.svelte-1jfrg6d{transform-origin:0 0;position:absolute;top:0;left:0;box-shadow:0 0 0 1px #ffffff14}.image-wrap.svelte-1jfrg6d img:where(.svelte-1jfrg6d){width:100%;height:100%;image-rendering:pixelated;pointer-events:none;-webkit-user-select:none;user-select:none;display:block}.center-rect.svelte-1jfrg6d{pointer-events:none;position:absolute}.center-rect.side-edges.svelte-1jfrg6d{border-left:1px dashed #0d99ff99;border-right:1px dashed #0d99ff99}.center-rect.cap-edges.svelte-1jfrg6d{border-top:1px dashed #0d99ff99;border-bottom:1px dashed #0d99ff99}.overdraw-band.svelte-1jfrg6d{pointer-events:none;background:#38bdf829;position:absolute}.line.svelte-1jfrg6d{background:var(--accent);touch-action:none;position:absolute}.line.overdraw-line.svelte-1jfrg6d{background:#38bdf8 padding-box content-box}.line.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){background:#38bdf8}.line.v.svelte-1jfrg6d{cursor:ew-resize;box-sizing:content-box;background-clip:content-box;width:1px;height:100%;margin-left:-.5px;padding:0 7px;top:0;transform:translate(-7px)}.line.h.svelte-1jfrg6d{cursor:ns-resize;box-sizing:content-box;background-clip:content-box;width:100%;height:1px;margin-top:-.5px;padding:7px 0;left:0;transform:translateY(-7px)}.line.active.svelte-1jfrg6d{background-color:var(--text);background-clip:content-box}.tag.svelte-1jfrg6d{background:var(--accent);color:var(--text);font-variant-numeric:tabular-nums;pointer-events:none;border-radius:4px;padding:1px 5px;font-size:11px;font-weight:600;position:absolute}.line.v.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:4px;left:50%;transform:translate(-50%)}.line.h.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:50%;left:4px;transform:translateY(-50%)}.line.v.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){top:auto;bottom:4px}.line.h.overdraw-line.svelte-1jfrg6d .tag:where(.svelte-1jfrg6d){left:auto;right:4px}.editor.svelte-1ea2lvt{flex-direction:column;flex:1;min-height:0;display:flex}.tabs.svelte-1ea2lvt{flex:none;gap:4px;margin-bottom:4px;display:inline-flex}.tabs.svelte-1ea2lvt button:where(.svelte-1ea2lvt){border-radius:var(--radius);color:var(--text-dim);background:0 0;border:none;padding:4px 10px}.tabs.svelte-1ea2lvt button.on:where(.svelte-1ea2lvt){background:var(--accent-soft);color:var(--accent)}.pane.svelte-1ea2lvt{flex:1;min-height:0}.empty.svelte-1ea2lvt{color:var(--text-dim);flex:1;justify-content:center;align-items:center;display:flex}section.svelte-ij1927{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-ij1927{margin-bottom:8px}.stage.svelte-qls820{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.preview-column.svelte-qls820{flex-direction:column;align-items:center;gap:8px;display:flex}.video-frame.svelte-qls820{width:min(90%,480px)}.video-frame.svelte-qls820 video{width:100%;height:100%}p.svelte-qls820{color:var(--text-dim)}video.svelte-ejgo9x{object-fit:contain;max-width:100%;max-height:100%}.picker.svelte-56kutb{flex-direction:column;gap:4px;min-width:0;margin-bottom:8px;display:flex}.caption.svelte-56kutb{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.reference-input.svelte-56kutb{border-radius:4px;align-items:center;min-width:0;height:24px;padding:0;display:flex;position:relative}.reference-input.svelte-56kutb:focus-within{border-color:var(--accent)}.current.svelte-56kutb{min-width:0;height:100%;color:var(--text);text-align:left;background:0 0;border:none;outline:none;flex:1;align-items:center;gap:4px;padding:0 6px 0 0;display:flex}.current.empty.svelte-56kutb{color:var(--text-faint)}.preview-slot.svelte-56kutb{box-sizing:border-box;background:#4a4a4a;border-radius:3px 0 0 3px;flex:none;justify-content:center;align-items:center;width:24px;height:24px;margin-left:-1px;padding:2px;display:flex;overflow:hidden}.preview.svelte-56kutb{object-fit:contain;width:100%;height:100%}.missing-preview.svelte-56kutb{color:var(--warning);font-weight:700}.clear.svelte-56kutb{border:none;border-left:1px solid var(--border-soft);width:24px;height:24px;color:var(--text-dim);background:0 0;border-radius:0 3px 3px 0;outline:none;flex:none;padding:0}.clear.svelte-56kutb:hover{color:var(--danger)}.id.svelte-56kutb,.placeholder.svelte-56kutb{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.dangling.svelte-56kutb{color:var(--warning)}.dropdown.svelte-56kutb{z-index:10;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);max-height:240px;padding:4px;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto;box-shadow:0 8px 24px #00000080}.option.svelte-56kutb{border-radius:var(--radius);width:100%;color:var(--text);text-align:left;background:0 0;border:none;align-items:center;gap:6px;padding:4px 6px;display:flex}.option.svelte-56kutb .thumbnail:where(.svelte-56kutb){object-fit:contain;background:var(--canvas);border-radius:3px;flex:none;width:24px;height:24px}.option.svelte-56kutb:hover{background:var(--panel-raised)}.option.selected.svelte-56kutb{background:var(--accent-soft);color:var(--accent)}.hint.svelte-56kutb{color:var(--text-faint);margin:4px;font-size:11px}.color-field.svelte-gjs979{flex-direction:column;gap:4px;min-width:0;display:flex}.caption.svelte-gjs979{letter-spacing:.27px;color:#ffffffb2;-webkit-user-select:none;user-select:none;font-size:9px;font-weight:500;line-height:14px}.color-input.svelte-gjs979{border-radius:4px;align-items:center;gap:4px;min-width:0;height:24px;padding:0 6px 0 0;display:flex}.color-input.svelte-gjs979:focus-within{border-color:var(--accent)}.swatch-slot.svelte-gjs979{flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.swatch.svelte-gjs979{cursor:pointer;background:0 0;border:1px solid #ffffff3d;border-radius:3px;width:16px;height:16px;margin:0;padding:0;overflow:hidden}.swatch.svelte-gjs979::-webkit-color-swatch-wrapper{padding:0}.swatch.svelte-gjs979::-webkit-color-swatch{border:none}.hex-input.svelte-gjs979{width:100%;min-width:0;color:var(--text);font-variant-numeric:tabular-nums;text-transform:uppercase;background:0 0;border:none;outline:none;flex:1;margin:0;padding:0;font-size:11px}section.svelte-rsjkek{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-rsjkek{margin-bottom:8px}.stage.svelte-1y3xro5{border:1px solid var(--border);border-radius:8px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:auto}.preview-column.svelte-1y3xro5{flex-direction:column;align-items:center;gap:8px;display:flex}.compare-row.svelte-1y3xro5{justify-content:center;align-items:flex-start;gap:16px;width:100%;max-width:760px;display:flex}figure.svelte-1y3xro5{flex-direction:column;flex:1 1 0;align-items:center;gap:6px;min-width:0;margin:0;display:flex}figcaption.svelte-1y3xro5{text-transform:uppercase;letter-spacing:.06em;color:var(--text-faint);font-size:10px}.video-frame.svelte-1y3xro5{width:100%}.video-frame.svelte-1y3xro5 video{width:100%;height:100%}p.svelte-1y3xro5{color:var(--text-dim)}section.svelte-3jblpy{border-bottom:1px solid var(--border-soft);padding:12px}.field.svelte-3jblpy{margin-bottom:8px}.backdrop.svelte-1f5yh58{z-index:100;background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog.svelte-1f5yh58{background:var(--panel);border:1px solid var(--border);border-radius:8px;width:360px;padding:16px;box-shadow:0 12px 32px #00000080}h2.svelte-1f5yh58{margin:0 0 4px;font-size:12px}.file-name.svelte-1f5yh58{color:var(--text-dim);font-variant-numeric:tabular-nums;margin:0}.destination.svelte-1f5yh58{color:var(--text-faint);margin:2px 0 16px}.row.svelte-1f5yh58{align-items:center;gap:8px;margin-bottom:8px;display:flex}.label.svelte-1f5yh58{width:64px;color:var(--text-dim);flex:none}.row.svelte-1f5yh58 input:where(.svelte-1f5yh58){flex:1}.row.manifests.svelte-1f5yh58{align-items:flex-start}.row.manifests.svelte-1f5yh58>.label:where(.svelte-1f5yh58){line-height:28px}.manifest-list.svelte-1f5yh58{flex:1;max-height:132px;overflow-y:auto}.empty-manifests.svelte-1f5yh58{color:var(--text-faint);margin:0;font-size:11px}.segmented.svelte-1f5yh58{border:1px solid var(--border);border-radius:var(--radius);display:inline-flex;overflow:hidden}.segmented.svelte-1f5yh58 button:where(.svelte-1f5yh58){background:var(--panel-raised);color:var(--text-dim);border:none;padding:4px 12px}.segmented.svelte-1f5yh58 button.on:where(.svelte-1f5yh58){background:var(--accent);color:var(--text)}.hint.svelte-1f5yh58{color:var(--text-dim);margin:4px 0 0;font-size:11px}.hint.warn.svelte-1f5yh58,.error.svelte-1f5yh58{color:var(--warning)}.actions.svelte-1f5yh58{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.backdrop.svelte-n5o24b{z-index:100;background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog.svelte-n5o24b{border:1px solid var(--border);background:var(--panel);border-radius:8px;width:420px;padding:16px;box-shadow:0 12px 32px #00000080}h2.svelte-n5o24b{margin:0 0 4px;font-size:12px}.destination.svelte-n5o24b{color:var(--text-faint);margin:0 0 16px}.row.svelte-n5o24b{gap:12px;display:flex}.field.svelte-n5o24b{color:var(--text-dim);flex-direction:column;flex:1;gap:4px;margin-bottom:10px;display:flex}.field.wide.svelte-n5o24b{width:100%}.warning.svelte-n5o24b{color:var(--warning);margin:6px 0 0;font-size:11px}.actions.svelte-n5o24b{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.directory.svelte-ftwms1{background:var(--panel);border-right:1px solid var(--border);flex-direction:column;width:220px;min-width:180px;max-width:320px;min-height:0;display:flex}header.svelte-ftwms1{border-bottom:1px solid var(--border-soft);align-items:center;height:40px;padding:0 8px 0 12px;display:flex}header.svelte-ftwms1 strong:where(.svelte-ftwms1){font-size:11px}.actions.svelte-ftwms1{margin-left:auto;display:flex}.icon-button.svelte-ftwms1{width:24px;height:24px;color:var(--text-dim);border-radius:var(--radius-small);background:0 0;border:0}.icon-button.svelte-ftwms1:hover:not(:disabled){background:var(--panel-raised);color:var(--text)}.icon-button.danger.svelte-ftwms1:hover:not(:disabled){color:var(--danger)}.icon-button.svelte-ftwms1:disabled{opacity:.3;cursor:default}.tree.svelte-ftwms1{padding:6px 4px;overflow:auto}.folder-row.svelte-ftwms1,.asset-row.svelte-ftwms1{padding-left:calc((var(--depth) + 2) * 14px);display:flex}.row.svelte-ftwms1{color:var(--text-dim);border-radius:var(--radius-small);text-align:left;background:0 0;border:0;align-items:center;gap:6px;min-width:0;height:28px;display:flex}.row.special.svelte-ftwms1{width:100%;padding:0 8px}.row.folder.svelte-ftwms1{flex:1;padding:0 8px 0 2px}.row.asset.svelte-ftwms1{cursor:grab;flex:1;padding:0 8px 0 2px}.row.asset.svelte-ftwms1:active{cursor:grabbing}.row.svelte-ftwms1:hover,.row.selected.svelte-ftwms1{background:var(--panel-raised);color:var(--text)}.row.asset.current.svelte-ftwms1,.row.selected.svelte-ftwms1{background:var(--accent-soft);color:var(--accent)}.row.drop-target.svelte-ftwms1{outline:1px solid var(--accent);background:var(--accent-soft)}.glyph.svelte-ftwms1{width:14px;color:var(--text-faint);flex:none;justify-content:center;align-items:center;display:flex}.asset-glyph.svelte-ftwms1{font-size:7px}.asset-warning.svelte-ftwms1{color:var(--warning);flex:none;margin-left:auto}.label.svelte-ftwms1{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.count.svelte-ftwms1{color:var(--text-faint);margin-left:auto;font-size:10px}.dialog-row.svelte-ftwms1{align-items:center;gap:8px;display:flex}.dialog-row.svelte-ftwms1 span:where(.svelte-ftwms1){width:44px;color:var(--text-dim)}.dialog-row.svelte-ftwms1 input:where(.svelte-ftwms1){flex:1}.dialog-path.svelte-ftwms1,.dialog-text.svelte-ftwms1,.dialog-warning.svelte-ftwms1{margin:8px 0 0}.dialog-path.svelte-ftwms1{color:var(--text-faint)}.dialog-warning.svelte-ftwms1{color:var(--warning)}.context-menu.svelte-10jgqdh{z-index:200;background:var(--panel-raised);border:1px solid var(--border);border-radius:6px;width:168px;padding:4px;position:fixed;box-shadow:0 8px 24px #00000073}button.svelte-10jgqdh{width:100%;color:var(--text);font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}button.svelte-10jgqdh:hover,button.svelte-10jgqdh:focus-visible{background:var(--accent-soft);outline:none}button.danger.svelte-10jgqdh{color:var(--danger)}hr.svelte-10jgqdh{background:var(--border);border:0;height:1px;margin:4px 8px}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,D as t,F as n,G as r,J as i,K as a,N as o,O as s,P as c,V as l,_ as u,i as d,nt as f,ot as p,tt as m,u as h,x as g}from"./NblqapDQ.js";import"./xihTtKlq.js";function _(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} kB`:`${(e/(1024*1024)).toFixed(2)} MB`}function v(e){return`${(e/1e3).toFixed(2)} s`}function y(e,t){let{maxWidth:n,...r}=e;return t===null||!Number.isFinite(t)||t<=0?r:{...r,maxWidth:Math.round(t)}}function b(e,t){return e.defaultPrevented||e.isComposing||t.busy?null:e.key===`Escape`?`cancel`:e.key===`Enter`&&!t.confirmDisabled?`confirm`:null}function x(e){return e instanceof Element&&e.closest(`button, select, textarea, [contenteditable]:not([contenteditable="false"])`)!==null}function S(e,t){let n=b(e,t);n===null||n===`confirm`&&x(e.target)||(e.preventDefault(),e.stopPropagation(),n===`confirm`?t.onConfirm():t.onCancel())}var C=e(`<div class="backdrop svelte-oozc38" role="presentation"><div class="dialog svelte-oozc38" role="dialog" tabindex="-1"><h2 class="svelte-oozc38"> </h2> <!> <div class="actions svelte-oozc38"><button class="control">Cancel</button> <button> </button></div></div></div>`);function w(e,o){f(o,!0);let _=d(o,`danger`,3,!1),v=d(o,`confirmDisabled`,3,!1),y=d(o,`busy`,3,!1);var b=C();n(`keydown`,r,e=>S(e,{busy:y(),confirmDisabled:v(),onConfirm:o.onConfirm,onCancel:o.onCancel}));var x=a(b),w=a(x),T=a(w,!0);p(w);var E=i(w,2);g(E,()=>o.children);var D=i(E,2),O=a(D),k=i(O,2);let A;var j=a(k,!0);p(k),p(D),p(x),p(b),l(()=>{h(x,`aria-label`,o.title),t(T,o.title),O.disabled=y(),A=u(k,1,`control`,null,A,{primary:!_(),danger:_()}),k.disabled=v()||y(),t(j,o.confirmLabel)}),c(`click`,b,e=>{e.target===e.currentTarget&&!y()&&o.onCancel()}),c(`click`,O,function(...e){o.onCancel?.apply(this,e)}),c(`click`,k,function(...e){o.onConfirm?.apply(this,e)}),s(e,b),m()}o([`click`]);export{y as a,v as i,S as n,_ as r,w as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,E as r,I as i,J as a,K as o,M as s,N as c,O as l,P as u,Q as d,S as f,V as p,_ as m,d as h,g,i as _,j as v,l as y,nt as b,ot as x,tt as S,u as C}from"./NblqapDQ.js";import"./xihTtKlq.js";import{O as w,t as T}from"./C7OUKWnm.js";var E={"arrow-up":`<path d="M12 19V5"/><path d="M6 11l6-6 6 6"/>`,"arrow-right":`<path d="M5 12h14"/><path d="M13 6l6 6-6 6"/>`,"arrow-down":`<path d="M12 5v14"/><path d="M6 13l6 6 6-6"/>`,"arrow-left":`<path d="M19 12H5"/><path d="M11 6l-6 6 6 6"/>`,sort:`<path d="m3 16 4 4 4-4"/><path d="M7 20V4"/><path d="M11 4h10"/><path d="M11 8h7"/><path d="M11 12h4"/>`,"asset-type":`<path d="M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z"/><rect x="3" y="14" width="7" height="7" rx="1"/><circle cx="17.5" cy="17.5" r="3.5"/>`,manifest:`<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/>`,"git-branch":`<path d="M15 6a9 9 0 0 0-9 9V3"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/>`,width:`<path d="M3 12h18"/><path d="M7 8l-4 4 4 4"/><path d="M17 8l4 4-4 4"/>`,ratio:`<rect x="4" y="4" width="7" height="7" rx="1"/><rect x="13" y="4" width="7" height="7" rx="1"/><rect x="4" y="13" width="7" height="7" rx="1"/><rect x="13" y="13" width="7" height="7" rx="1"/>`,preset:`<path d="M4 7h10"/><circle cx="17" cy="7" r="2"/><path d="M20 17H10"/><circle cx="7" cy="17" r="2"/>`,cutoff:`<circle cx="12" cy="12" r="8"/><path d="M12 4a8 8 0 0 1 0 16z" fill="currentColor" stroke="none"/>`,"color-feather":`<circle cx="12" cy="12" r="8" stroke-dasharray="1.5 3"/><circle cx="12" cy="12" r="3.5"/>`,"mask-feather":`<rect x="4" y="4" width="16" height="16" rx="3" stroke-dasharray="1.5 3"/><circle cx="12" cy="12" r="3.5"/>`,sharpen:`<path d="M4 18l8-12 8 12"/><path d="M4 18h16"/>`,despill:`<path d="M12 3s6 6 6 11a6 6 0 0 1-12 0c0-5 6-11 6-11z"/>`,"despill-lum":`<path d="M12 3s5.5 5.5 5.5 10a5.5 5.5 0 0 1-11 0c0-4.5 5.5-10 5.5-10z"/><path d="M12 10v5M9.5 12.5h5"/>`},D=v(`<svg class="icon svelte-jamecx" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"></svg>`);function O(e,t){let n=_(t,`size`,3,16);var r=D();f(r,()=>E[t.name],!0),x(r),p(()=>{C(r,`width`,n()),C(r,`height`,n())}),l(e,r)}function k(e){return e.length===0?[]:[e.includes(`main`)?`main`:e[0]]}function A(e,t){return w(e)??(t.has(e)?`An asset with id "${e}" already exists.`:null)}function j(e,t,n=[]){let r=e;for(let i of t)i.kind===`unsupported`||Object.hasOwn(e,i.token)||(r===e&&(r={...e}),r[i.token]={id:i.kind===`new`?i.proposedId:i.assetId,type:i.kind===`new`?i.compatibleTypes[0]??``:i.compatibleTypes.includes(i.currentType)?i.currentType:``,manifests:i.kind===`new`?k(n):[],error:null,busy:!1});return r}var M=e(`<span class="color-dot svelte-151zph4"></span>`),N=e(`<span class="via svelte-151zph4"> </span>`),P=e(`<label><input type="checkbox" class="svelte-151zph4"/> <span class="marker svelte-151zph4" aria-hidden="true"><!></span> <span class="name svelte-151zph4"> </span> <!></label>`),F=e(`<div class="manifest-selector svelte-151zph4" role="group" aria-label="Manifest assignments"></div>`);function I(e,c){b(c,!0);let f=_(c,`disabled`,3,!1);function v(e){return c.passive.find(t=>t.manifest===e)}function w(e,t,n){return t?`${e}: explicitly assigned`:n?`${e}: passive member via ${n.via.join(`, `)}`:`${e}: not assigned`}var E=F();t(E,20,()=>c.manifests,e=>e,(e,t)=>{let _=d(()=>T.manifestAppearance(t)),b=d(()=>c.selected.includes(t)),S=d(()=>v(t)),E=d(()=>i(_).color??`var(--accent)`);var D=P();let O,k;var A=o(D);y(A);var j=a(A,2),F=o(j),I=e=>{var t=s();p(()=>n(t,i(_).emoji)),l(e,t)},L=e=>{l(e,M())};r(F,e=>{i(_).emoji?e(I):e(L,-1)}),x(j);var R=a(j,2),z=o(R,!0);x(R);var B=a(R,2),V=e=>{var t=N(),r=o(t);x(t),p(e=>n(r,`passive · via ${e??``}`),[()=>i(S).via.join(`, `)]),l(e,t)};r(B,e=>{i(S)&&!i(b)&&e(V)}),x(D),p((e,r)=>{O=m(D,1,`manifest-option control svelte-151zph4`,null,O,{selected:i(b),passive:i(S)!==void 0&&!i(b),disabled:f()}),C(D,`title`,e),k=g(D,``,k,{"--manifest-color":i(E)}),h(A,i(b)),A.disabled=f(),C(A,`aria-label`,r),n(z,t)},[()=>w(t,i(b),i(S)),()=>w(t,i(b),i(S))]),u(`change`,A,()=>c.onToggle(t)),l(e,D)}),x(E),l(e,E),S()}c([`change`]);export{O as a,A as i,k as n,j as r,I as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as e,X as t,Z as n}from"./NblqapDQ.js";var r=class extends Error{status;constructor(e,t){super(t),this.name=`ApiResponseError`,this.status=e}};async function i(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw new r(e.status,t)}return await e.json()}async function a(e){if(!e.ok){let t=`${e.status} ${e.statusText}`;try{let n=await e.json();n.error?.message&&(t=n.error.message)}catch{}throw new r(e.status,t)}}async function o(){return i(await fetch(`/api/state`,{cache:`no-store`}))}async function s(){return i(await fetch(`/api/reconcile`,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`},body:JSON.stringify({})}))}async function c(e,t,n,r=[]){return i(await fetch(`/api/raw/adopt`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,id:t,type:n,manifests:r})}))}async function l(e,t){return i(await fetch(`/api/raw/edited/accept`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e,type:t})}))}async function u(e){return i(await fetch(`/api/raw/edited/dismiss`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({token:e})}))}async function d(e,t,n,r,a=[]){let o=new FormData;o.set(`file`,e),o.set(`type`,t),o.set(`id`,n),o.set(`folder`,r);for(let e of a)o.append(`manifests`,e);return i(await fetch(`/api/assets`,{method:`POST`,body:o}))}async function f(e){return i(await fetch(`/api/imports`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({importer:`figma`,input:{url:e.url,format:`png`,scale:e.scale},type:e.type,id:e.id,folder:e.folder,manifests:e.manifests})}))}async function ee(e,t){return i(await fetch(`/api/assets/${encodeURIComponent(e)}/reimport`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...t?{input:{...t,format:`png`}}:{}})}))}async function te(e,t){let n=new FormData;return n.set(`file`,t),i(await fetch(`/api/assets/${encodeURIComponent(e)}/raw`,{method:`PUT`,body:n}))}async function ne(e){return i(await fetch(`/api/folders`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:e})}))}async function re(e,t){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:t})}))}async function ie(e,t){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify({parent:t})}))}async function ae(e){return i(await fetch(`/api/folders/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function oe(e,t){return i(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}async function se(e,t){return i(await fetch(`/api/assets/move`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e,folder:t})}))}async function ce(e){return i(await fetch(`/api/assets/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function le(e){return i(await fetch(`/api/assets/delete`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetIds:e})}))}async function ue(e,t){return a(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({assetId:e,kind:t})}))}async function de(e){return a(await fetch(`/api/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folder:e})}))}async function fe(e){return i(await fetch(`/api/manifests`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({name:e})}))}async function pe(e){return i(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`DELETE`}))}async function me(e,t){return i(await fetch(`/api/manifests/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}))}var he=class{#e=null;#t=null;#n=0;#r=[];get value(){return this.#t}replaceBase(e){this.#e=e,this.#a()}mergeBase(e){this.#e!==null&&(this.#e=e(this.#e),this.#a())}add(e,t=[]){let n=++this.#n;return this.#r.push({id:n,update:e,dependencies:t}),this.#t!==null&&(this.#t=e(this.#t)),n}confirm(e,t,n){let r=this.#r.findIndex(t=>t.id===e);if(r===-1)return;let i=this.#r[r],a=this.#e;if(a===null){this.#e=t,this.#i(e),this.#a();return}this.#e=n(i.update(a)),this.#i(e),r===0&&this.#t!==null?this.#t=n(this.#t):this.#a()}reject(e){this.#i(e),this.#a()}rejectAffectedFrom(e,t){this.#r=this.#r.filter(n=>n.id<e||n.id>e&&!p(n.dependencies,t)),this.#a()}#i(e){this.#r=this.#r.filter(t=>t.id!==e)}#a(){let e=this.#e;if(e===null){this.#t=null;return}let t=e;for(let e of this.#r)t=e.update(t);this.#t=t}};function p(e,t){return e.some(e=>t.some(t=>{if(e===t)return!0;if(!e.startsWith(`folder:`)||!t.startsWith(`folder:`))return!1;let n=e.slice(7),r=t.slice(7);return n.startsWith(`${r}/`)||r.startsWith(`${n}/`)}))}var ge=/[\u0000-\u001f\u007f]/,_e=/[<>:"|?*]/,ve=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;function ye(e){return e.length===0?`Folder names must not be empty.`:e===e.trim()?e===`.`||e===`..`?`"${e}" is not a valid folder name.`:e.includes(`/`)||e.includes(`\\`)?`Folder names must not contain path separators.`:ge.test(e)?`Folder names must not contain control characters.`:_e.test(e)?`Folder names must not contain Windows-reserved characters (: * ? " < > |).`:e.endsWith(`.`)?`Folder names must not end with a dot.`:e.toLocaleLowerCase(`en-US`)===`root`?`"${e}" is reserved for the implicit Fundus root folder.`:e.toLocaleLowerCase(`en-US`)===`.gitkeep`?`"${e}" is reserved for Fundus folder management.`:ve.test(e)?`"${e}" is a reserved filesystem name.`:null:`Folder names must not start or end with whitespace.`}function be(e){return e.split(`/`).map(e=>e.normalize(`NFC`)).join(`/`)}function m(e){return be(e).toLocaleLowerCase(`en-US`)}function h(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function g(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}function _(e,t){return e===``?t:`${e}/${t}`}function v(e){return h(e)}function y(e){return g(e)}function b(e,t){return e===t||e.startsWith(`${t}/`)}function x(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}var S=`[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}`;RegExp(`^(?:\\.fundus-replace-${S}\\.tmp|\\.fundus-delete(?:-assets)?-${S})$`,`i`),RegExp(`\\.fundus-(?:replace-)?${S}$`,`i`);var C=[`preload`,`release`,`entries`,`constructor`,`prototype`,`hasOwnProperty`,`isPrototypeOf`,`propertyIsEnumerable`,`toLocaleString`,`toString`,`valueOf`],w=/^[a-z][A-Za-z0-9]*$/;function xe(e){return w.test(e)?C.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid asset id — use a camelCase identifier starting with a lowercase letter (e.g. "navigationPanel").`}function Se(e){return w.test(e)?C.includes(e)?`"${e}" is reserved (it collides with a Manifest member name).`:null:`"${e}" is not a valid manifest name — use a camelCase identifier starting with a lowercase letter (e.g. "mainCatalog").`}var T={type:`audio`,accepts:[`mp3`,`wav`,`m4a`,`ogg`,`flac`],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Audio parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Audio parameters need a non-empty string "preset".`);return{preset:t.preset}}};function Ce(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&typeof e.$asset==`string`&&e.$asset!==``}var E={keyColor:[0,1,0],colorCutoff:.2,colorFeathering:.33,maskFeathering:1,sharpening:.5,despill:1,despillLuminanceAdd:.2},we=[`colorCutoff`,`colorFeathering`,`maskFeathering`,`sharpening`,`despill`,`despillLuminanceAdd`];function D(e){return Math.min(1,Math.max(0,e))}function Te(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`"chromaKey" must be an object.`);let t=e,n=t.keyColor;if(!Array.isArray(n)||n.length!==3||n.some(e=>typeof e!=`number`||!Number.isFinite(e)))throw Error(`"chromaKey.keyColor" must be an array of three numbers (RGB, 0–1 each).`);let r={keyColor:[D(n[0]),D(n[1]),D(n[2])]};for(let e of we){let n=t[e];if(typeof n!=`number`||!Number.isFinite(n))throw Error(`"chromaKey.${e}" must be a number (0–1).`);r[e]=D(n)}return r}var O=[`mp4`,`mov`,`webm`,`m4v`];function k(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`${e} parameters must be an object.`);let n=t;if(typeof n.preset!=`string`||n.preset.length===0)throw Error(`${e} parameters need a non-empty string "preset".`);if(n.maxWidth!==void 0&&(typeof n.maxWidth!=`number`||!Number.isInteger(n.maxWidth)||n.maxWidth<=0))throw Error(`${e} "maxWidth" must be a positive integer when set.`);return{preset:n.preset,...n.maxWidth===void 0?{}:{maxWidth:n.maxWidth}}}var A={type:`video`,accepts:[...O],defaultParameters:()=>({preset:`default`}),validateParameters(e){return k(`Video`,e)}};function j(e,t){if(t!==void 0){if(!Ce(t))throw Error(`"${e}" must be an asset reference ({ "$asset": "<id>" }).`);return{$asset:t.$asset}}}var M={type:`chroma-key-video`,accepts:[...O],defaultParameters:()=>({preset:`default`,chromaKey:{...E,keyColor:[...E.keyColor]}}),validateParameters(e){let t=k(`Chroma-key-video`,e),n=e,r=Te(n.chromaKey),i=j(`mask`,n.mask),a=j(`fallback`,n.fallback);return{...t,chromaKey:r,...i===void 0?{}:{mask:i},...a===void 0?{}:{fallback:a}}},collectReferences(e){let t=[];return e.mask&&t.push({field:`mask`,assetId:e.mask.$asset,expectedTypes:[`image`]}),e.fallback&&t.push({field:`fallback`,assetId:e.fallback.$asset,expectedTypes:[`image`]}),t},processingParameters(e){return{preset:e.preset,...e.maxWidth===void 0?{}:{maxWidth:e.maxWidth}}}},N=[`png`,`jpg`,`jpeg`,`webp`,`avif`],P={type:`image`,accepts:[...N],defaultParameters:()=>({preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Image parameters must be an object.`);let t=e;if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Image parameters need a non-empty string "preset".`);if(t.targetWidth!==void 0&&(typeof t.targetWidth!=`number`||!Number.isInteger(t.targetWidth)||t.targetWidth<=0))throw Error(`Image "targetWidth" must be a positive integer when set.`);return{preset:t.preset,...t.targetWidth===void 0?{}:{targetWidth:t.targetWidth}}}},F=[`nine`,`three-horizontal`,`three-vertical`,`one`];function I(){return{top:0,right:0,bottom:0,left:0}}function L(e){return{horizontal:e===`nine`||e===`three-horizontal`,vertical:e===`nine`||e===`three-vertical`}}function R(e,t,n,r){return t===`left`?n-e.right:t===`right`?n-e.left:t===`top`?r-e.bottom:r-e.top}function Ee(e,t,n,r){return R(e,t,n,r)-1}function z(e,t,n){return Math.max(t,Math.min(n,e))}function De(e){let t=L(e.mode),n=e.overdraw??{top:0,right:0,bottom:0,left:0},r=t.horizontal&&(e.compression?.x??0)>0,i=t.vertical&&(e.compression?.y??0)>0,a=r?Math.max(e.insets.left,n.left):e.insets.left,o=r?Math.max(e.insets.right,n.right):e.insets.right,s=i?Math.max(e.insets.top,n.top):e.insets.top,c=i?Math.max(e.insets.bottom,n.bottom):e.insets.bottom,l=z(a,0,e.width),u=z(o,0,e.width-l),d=z(s,0,e.height);return{top:d,right:u,bottom:z(c,0,e.height-d),left:l}}function B(e,t){if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Slice ${e} must be an object with top/right/bottom/left.`);let n=t,r=[`top`,`right`,`bottom`,`left`],i=I();for(let t of r){let r=n[t];if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw Error(`Slice ${e}.${t} must be a non-negative integer.`);i[t]=r}return i}function Oe(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Slice compression must be an object with x/y percentages.`);let t=e,n={x:0,y:0};for(let e of[`x`,`y`]){let r=t[e];if(typeof r!=`number`||!Number.isInteger(r)||r<0||r>100)throw Error(`Slice compression.${e} must be an integer from 0 to 100.`);n[e]=r}return n}var V={type:`slice`,accepts:[...N],defaultParameters:()=>({mode:`nine`,insets:I(),pixelRatio:1,preset:`default`}),validateParameters(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Slice parameters must be an object.`);let t=e;if(typeof t.mode!=`string`||!F.includes(t.mode))throw Error(`Slice "mode" must be one of ${F.map(e=>`'${e}'`).join(` | `)}.`);let n=B(`insets`,t.insets);if(typeof t.pixelRatio!=`number`||!Number.isInteger(t.pixelRatio)||t.pixelRatio<1)throw Error(`Slice "pixelRatio" must be an integer ≥ 1.`);let r=t.overdraw===void 0?void 0:B(`overdraw`,t.overdraw),i=t.compression===void 0?void 0:Oe(t.compression);if(typeof t.preset!=`string`||t.preset.length===0)throw Error(`Slice parameters need a non-empty string "preset".`);return{mode:t.mode,insets:n,pixelRatio:t.pixelRatio,...r===void 0?{}:{overdraw:r},...i===void 0?{}:{compression:i},preset:t.preset}}},H=new class{#e=new Map;register(e){if(this.#e.has(e.type))throw Error(`Plugin type "${e.type}" is already registered.`);this.#e.set(e.type,e)}has(e){return this.#e.has(e)}values(){return[...this.#e.values()]}types(){return[...this.#e.keys()]}project(e,t){let n=Object.create(null);for(let r of this.#e.keys()){if(!Object.hasOwn(e,r))throw Error(`Registered plugin "${r}" has no ${t}.`);n[r]=e[r]}return n}};H.register(P),H.register(V),H.register(A),H.register(M),H.register(T);var U=H.values();function ke(e=U){return[...new Set(e.flatMap(e=>e.accepts))].sort().map(e=>`.${e}`)}function Ae(e,t=U){return t.find(t=>t.type===e)?.accepts.map(e=>`.${e}`).sort()??[]}function je(e,t=U){let n=e.slice(e.lastIndexOf(`.`)+1).toLowerCase();return t.filter(e=>e.accepts.includes(n)).map(e=>e.type)}function Me(e){let t=e.replace(/\.[^.]+$/,``).replace(/(?:@|[-_])\dx$/i,``).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).split(/[^a-zA-Z0-9]+/).filter(Boolean);if(t.length===0)return`asset`;let n=t.map((e,t)=>t===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``).replace(/^[0-9]+/,``);return n?n.charAt(0).toLowerCase()+n.slice(1):`asset`}function W(e){return K(e)}function G(e,t){return e<t?-1:+(e>t)}function K(e){if(e===void 0)return`null`;if(e===null||typeof e==`number`||typeof e==`boolean`||typeof e==`string`)return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(K).join(`,`)}]`;if(typeof e==`object`){let t=e,n=[];for(let e of Object.keys(t).sort())t[e]!==void 0&&n.push(`${JSON.stringify(e)}:${K(t[e])}`);return`{${n.join(`,`)}}`}throw Error(`Cannot canonicalize a ${typeof e} value.`)}function Ne(e,t){let n={};for(let[r,i]of Object.entries(e.assets)){n[r]=[];let e=t[i.type];if(e?.collectReferences)try{n[r]=e.collectReferences(e.validateParameters(i.parameters))}catch{}}return n}function Pe(e,t){let n=new Set,r=[...e];for(;r.length>0;){let e=r.pop();if(!(n.has(e)||!Object.hasOwn(t,e))){n.add(e);for(let n of t[e])r.push(n.assetId)}}return n}function Fe(e,t){let n=new Set(Object.keys(e.manifests));for(let t of Object.values(e.assets))for(let e of t.manifests)n.add(e);let r={};for(let i of[...n].sort(G)){let n=Object.entries(e.assets).filter(([,e])=>e.manifests.includes(i)).map(([e])=>e).sort(G),a=new Set(n),o=new Set(n),s=new Map;for(let e of n)for(let n of Pe([e],t)){if(o.add(n),a.has(n))continue;let t=s.get(n)??[];t.push(e),s.set(n,t)}r[i]={explicitMemberIds:n,passiveMembers:[...s.entries()].map(([e,t])=>({assetId:e,via:t})).sort((e,t)=>G(e.assetId,t.assetId)),deliveredAssetIds:o}}return r}function Ie(e,t,n,r){return n&&q(n,r)?`committed`:t&&q(t,r)?`rolled-back`:`unknown`}function q(e,t){return W(e)===W(t)}var J=Object.fromEntries(H.values().map(e=>[e.type,e]));function Le(e,t,n){let r=e.library.assets[t]?.type,i=r?J[r]:void 0;if(!i)return[`asset:${t}`];try{let e=i.validateParameters(n),r=i.collectReferences?.(e)??[];return[...new Set([`asset:${t}`,...r.map(e=>`asset:${e.assetId}`)])]}catch{return[`asset:${t}`]}}function Y(e,t){let n=new Map(t.assets.map(e=>[e.id,e])),r={...e,assets:e.assets.map(e=>{let t=n.get(e.id);return t?{...e,rawUrl:t.rawUrl,rawHash:t.rawHash,gitStatus:t.gitStatus,importSource:t.importSource,proxy:t.proxy,warnings:t.warnings,passiveManifests:t.passiveManifests,references:t.references}:e}),gitBranch:t.gitBranch,importDefaults:t.importDefaults,issues:t.issues,presetNames:t.presetNames,presetCapabilities:t.presetCapabilities,rawIngestionQueue:t.rawIngestionQueue};return X(r,r.library)}function Re(e,t){let n=structuredClone(e.library);n.folders=[...t.library.folders];for(let[e,r]of Object.entries(n.assets)){let i=t.library.assets[e];i?r.raw=i.raw:delete n.assets[e]}return Y(X(e,n),t)}function X(e,t,n=new Map){let r=new Map(e.assets.map(e=>[e.id,e])),i=new Map([...n.entries()].map(([e,t])=>[t,e])),a=Ne(t,J),o=Fe(t,a),s=ze(o),c=new Map;for(let[e,t]of Object.entries(a))for(let n of t){let t=c.get(n.assetId)??[];t.push({field:n.field,assetId:e}),c.set(n.assetId,t)}let l=Object.entries(t.assets).map(([e,t])=>{let n=r.get(i.get(e)??e);return n?{...n,id:e,raw:t.raw,folder:v(t.raw),parameters:t.parameters,manifests:t.manifests,passiveManifests:s.get(e)??[],references:{outgoing:a[e].map(e=>({field:e.field,assetId:e.assetId})),incoming:c.get(e)??[]}}:null}).filter(e=>e!==null).sort((e,t)=>e.id.localeCompare(t.id)),u=new Map(l.map(e=>[e.id,e.proxy?.fileSize??0])),d=Object.fromEntries(Object.keys(t.manifests).map(e=>{let t=o[e];return[e,{explicitMemberIds:t.explicitMemberIds,passiveMembers:t.passiveMembers}]})),f=Object.fromEntries(Object.keys(t.manifests).map(e=>[e,[...o[e].deliveredAssetIds].reduce((e,t)=>e+(u.get(t)??0),0)]));return{...e,library:t,assets:l,manifestMemberships:d,manifestDeliveredBytes:f,issues:e.issues.map(e=>({...e,...e.assetId&&n.has(e.assetId)?{assetId:n.get(e.assetId)}:{}}))}}function ze(e){let t=new Map;for(let[n,r]of Object.entries(e))for(let e of r.passiveMembers){let{assetId:r,via:i}=e,a=t.get(r)??[];a.push({manifest:n,via:i}),t.set(r,a)}for(let e of t.values())e.sort((e,t)=>e.manifest.localeCompare(t.manifest));return t}function Z(e){return t=>{let n=structuredClone(t.library);return X(t,n,e(n)??new Map)}}function Be(e,t){return Z(n=>{let r=n.assets[e];if(!r)return;t.parameters!==void 0&&(r.parameters=structuredClone(t.parameters)),t.manifests!==void 0&&(r.manifests=[...new Set(t.manifests)].sort());let i=t.renameTo??e;if(!(i!==e&&n.assets[i]))return i!==e&&(delete n.assets[e],n.assets[i]=r),t.folder!==void 0&&(r.raw=_(t.folder,y(r.raw))),i===e?void 0:new Map([[e,i]])})}function Ve(e,t){return Z(n=>{for(let r of new Set(e)){let e=n.assets[r];e&&(e.raw=_(t,y(e.raw)))}})}function He(e){return Z(t=>{for(let n of new Set(e))delete t.assets[n]})}function Ue(e){return Z(t=>{t.folders.includes(e)||t.folders.push(e),t.folders.sort()})}function Q(e,t){return Z(n=>{let r=n.folders.filter(t=>b(t,e)).map(n=>x(n,e,t)),i=new Set(n.folders.filter(t=>!b(t,e)).map(m));if(!r.some(e=>i.has(m(e)))){n.folders=n.folders.map(n=>b(n,e)?x(n,e,t):n).sort();for(let r of Object.values(n.assets)){let n=v(r.raw);b(n,e)&&(r.raw=_(x(n,e,t),y(r.raw)))}}})}function We(e,t){return Q(e,_(h(e),t))}function Ge(e,t){return Q(e,_(t,g(e)))}function Ke(e){return Z(t=>{t.folders=t.folders.filter(t=>!b(t,e));for(let[n,r]of Object.entries(t.assets))b(v(r.raw),e)&&delete t.assets[n]})}function qe(e){return Z(t=>{Object.hasOwn(t.manifests,e)||(t.manifests[e]={})})}function Je(e,t){return Z(n=>{let r=n.manifests[e];if(r&&(t.color!==void 0&&(t.color===null?delete r.color:r.color=t.color),t.emoji!==void 0&&(t.emoji===null?delete r.emoji:r.emoji=t.emoji),!(t.renameTo===void 0||t.renameTo===e)&&!n.manifests[t.renameTo])){delete n.manifests[e],n.manifests[t.renameTo]=r;for(let r of Object.values(n.assets))r.manifests=r.manifests.map(n=>n===e?t.renameTo:n).sort()}})}function Ye(e){return Z(t=>{delete t.manifests[e];for(let n of Object.values(t.assets))n.manifests=n.manifests.filter(t=>t!==e)})}var Xe=class{#e=Promise.resolve();#t=new Map;enqueue(e){let t=this.#e.then(e,e);return this.#e=t.then(()=>{},()=>{}),t}coalesce(e,t){let n=this.#t.get(e);if(n)return n;let r=this.enqueue(t).finally(()=>{this.#t.get(e)===r&&this.#t.delete(e)});return this.#t.set(e,r),r}},Ze=new class{#e=new Xe;#t=new he;#n=0;#r=0;#i=[];#a=n(null);get state(){return e(this.#a)}set state(e){t(this.#a,e,!0)}#o=n(!1);get saving(){return e(this.#o)}set saving(e){t(this.#o,e,!0)}#s=n(null);get error(){return e(this.#s)}set error(e){t(this.#s,e,!0)}#c=n(!1);get loaded(){return e(this.#c)}set loaded(e){t(this.#c,e,!0)}async refresh(){return this.#l(o,{rebaseEditableState:!0})}reconcile(){return this.#l(s,{coalesce:!0})}#l(e,t={}){let n=async()=>{try{let n=await e();this.#t.value===null||t.rebaseEditableState?this.#t.replaceBase(n):this.#t.mergeBase(e=>Re(e,n)),this.#d(),this.error=null}catch(e){this.error=e instanceof Error?e.message:String(e)}finally{this.loaded=!0}};return t.coalesce?this.#e.coalesce(`reconcile`,n):this.#e.enqueue(n)}mutate(e,t,n){return this.#u(e,t,n)}mutateFromServer(e,t){return this.#u(e,void 0,t)}#u(e,t,n={dependencies:[]}){let r=++this.#r,i=this.#t.value?.library,a=t?this.#t.add(t,n.dependencies):null,s=a===null?void 0:this.#t.value?.library;return a!==null&&this.#d(),this.#n+=1,this.saving=!0,this.#e.enqueue(async()=>{this.error=null;try{if(this.#i.some(e=>e.failedMutationId<r&&r<=e.throughMutationId&&p(n.dependencies,e.dependencies)))throw a!==null&&(this.#t.reject(a),this.#d()),new $;let t=await e();a===null?this.#t.replaceBase(t):this.#t.confirm(a,t,e=>Y(e,t)),this.#d()}catch(e){if(e instanceof $)throw this.error=e.message,e;let t=null;try{t=await o();let c=Ie(e,i,s,t.library);if(c===`committed`&&a!==null){let e=t;this.#t.confirm(a,e,t=>Y(t,e)),this.#d(),this.error=null;return}this.#t.replaceBase(t),c===`rolled-back`&&a!==null&&n.invalidatesOnFailure?.length?(this.#i.push({failedMutationId:r,throughMutationId:this.#r,dependencies:n.invalidatesOnFailure}),this.#t.rejectAffectedFrom(a,n.invalidatesOnFailure)):a!==null&&this.#t.reject(a)}catch{a!==null&&this.#t.reject(a)}throw this.#d(),this.error=e instanceof Error?e.message:String(e),e}finally{--this.#n,this.saving=this.#n>0,this.#n===0&&(this.#i=[])}})}#d(){this.state=this.#t.value}get manifestNames(){return Object.keys(this.state?.library.manifests??{}).sort()}manifestAppearance(e){return this.state?.library.manifests[e]??{}}get generalIssues(){return this.state?.issues.filter(e=>e.assetId===void 0).map(e=>e.message)??[]}assetById(e){return this.state?.assets.find(t=>t.id===e)??null}},$=class extends Error{constructor(){super(`Change was cancelled because an earlier structural save failed.`)}};export{re as $,ye as A,ne as B,L as C,T as D,A as E,h as F,pe as G,ce as H,m as I,se as J,u as K,x as L,v as M,b as N,xe as O,_ as P,ee as Q,l as R,Ee as S,M as T,le as U,fe as V,ae as W,oe as X,ie as Y,me as Z,H as _,He as a,I as b,Ve as c,Je as d,te as et,We as f,je as g,Me as h,qe as i,g as j,Se as k,Ge as l,Ae as m,Le as n,de as nt,Ke as o,ke as p,f as q,Ue as r,d as rt,Ye as s,Ze as t,ue as tt,Be as u,De as v,P as w,R as x,V as y,c as z};
|
|
Binary file
|
|
Binary file
|