From 4b1ea1c242356a0b1e446b82f91fd42a7c171447 Mon Sep 17 00:00:00 2001 From: K8Sewell Date: Thu, 2 Jul 2026 09:33:28 -0500 Subject: [PATCH 1/5] Add AV tests --- __tests__/test.js | 179 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 165 insertions(+), 14 deletions(-) diff --git a/__tests__/test.js b/__tests__/test.js index 1f050fcb1..02737af90 100644 --- a/__tests__/test.js +++ b/__tests__/test.js @@ -11,6 +11,18 @@ const COOKBOOK_BOUND_MULTIVOLUME_MANIFEST = const PDF_MULTI_FILE_MANIFEST = "https://digital.library.villanova.edu/Item/vudl:294631/Manifest"; +// AV (audiovisual) manifest for AV-specific behaviour. A simple single-file +// AV manifest (no ranges) is rendered by the mediaelement extension. +const AV_VIDEO_MANIFEST = + "https://iiif.io/api/cookbook/recipe/0003-mvm-video/manifest.json"; + +// AV manifest WITH a table of contents (structures/ranges). When an AV manifest +// has ranges and preferMediaElementExtension is false (the default), the viewer +// uses uv-av-extension -> AVCenterPanel (iiif-av-component) instead of the +// mediaelement player. +const AV_TOC_MANIFEST = + "https://iiif.io/api/cookbook/recipe/0064-opera-one-canvas/manifest.json"; + const viewerUrl = (manifestUrl) => { //const separator = BASE_URL.includes("#?") ? "&" : "#?"; return `${BASE_URL}#?manifest=${encodeURIComponent(manifestUrl)}`; @@ -211,9 +223,8 @@ describe("Universal Viewer", () => { // COOKBOOK MANIFEST TEST describe("viewer controls", () => { beforeEach(async () => { - await page.goto(viewerUrl(COOKBOOK_BOUND_MULTIVOLUME_MANIFEST), - { - waitUntil: "domcontentloaded" + await page.goto(viewerUrl(COOKBOOK_BOUND_MULTIVOLUME_MANIFEST), { + waitUntil: "domcontentloaded", }); }); @@ -434,7 +445,7 @@ describe("Universal Viewer", () => { const viewerFrame = page.frames().find((f) => { const url = f.url(); - + return ( url.includes("uv.html") || url.includes("viewer") || @@ -443,14 +454,12 @@ describe("Universal Viewer", () => { }); expect(viewerFrame).toBeTruthy(); - - await viewerFrame.waitForSelector("canvas", { visible: true}); - + + await viewerFrame.waitForSelector("canvas", { visible: true }); + const canvasInfo = await viewerFrame.evaluate(() => { - const canvas = document.querySelector( - "canvas" - ); - + const canvas = document.querySelector("canvas"); + if (!canvas) return null; return { width: canvas.width, @@ -460,9 +469,11 @@ describe("Universal Viewer", () => { expect(canvasInfo).not.toBeNull(); expect(canvasInfo.width).toBeGreaterThan(0); expect(canvasInfo.height).toBeGreaterThan(0); - - const pageText = await viewerFrame.evaluate(() => document.body.innerText); - + + const pageText = await viewerFrame.evaluate( + () => document.body.innerText + ); + expect(pageText).not.toContain("Unable to load"); expect(pageText).not.toContain("Error loading"); }); @@ -483,4 +494,144 @@ describe("Universal Viewer", () => { expect(page.url()).toContain("cv=1"); }); }); + + // AV MANIFEST TEST + describe("AV manifest", () => { + // Use a dedicated page so the AV tests are isolated from whatever state + // (e.g. in-flight iframe loads) earlier suites left on the shared page. + let avPage; + + beforeAll(async () => { + avPage = await browser.newPage(); + }); + + afterAll(async () => { + await avPage.close(); + }); + + beforeEach(async () => { + // The example page reads the manifest from the URL only on the initial + // document load, so force a full reload (a hash-only change would not + // re-initialise the viewer). + await avPage.goto("about:blank"); + await avPage.goto(viewerUrl(AV_VIDEO_MANIFEST), { + waitUntil: "domcontentloaded", + }); + }, 60000); + + it("loads the AV manifest into the mediaelement player", async () => { + expect(avPage.url()).toContain(encodeURIComponent(AV_VIDEO_MANIFEST)); + + await avPage.waitForSelector(".uv", { visible: true }); + + // The AV manifest is handled by the mediaelement extension, which adds + // this class to the extension host element. + await avPage.waitForSelector(".uv-mediaelement-extension", { + visible: true, + }); + + // The MediaElement.js player renders into a .mejs__container. For a + // video canvas it also carries the .mejs__video class. + await avPage.waitForSelector(".mejs__container.mejs__video", { + visible: true, + }); + + // The underlying media element points at the canvas' video resource. + const videoSrc = await avPage.$eval( + ".mejs__mediaelement video", + (el) => el.src || el.querySelector("source")?.src || "" + ); + expect(videoSrc).toMatch(/\.mp4($|\?)/); + + const pageText = await avPage.evaluate(() => document.body.innerText); + expect(pageText).not.toContain("Unable to load"); + expect(pageText).not.toContain("Error loading"); + }, 60000); + + it("renders AV playback controls", async () => { + await avPage.waitForSelector(".mejs__controls", { visible: true }); + + // Play / pause button. + const playButton = await avPage.$(".mejs__playpause-button"); + expect(playButton).toBeTruthy(); + + // Current time readout. + const currentTime = await avPage.$eval(".mejs__currenttime", (el) => + el.textContent.trim() + ); + expect(currentTime).toMatch(/^\d{2}:\d{2}/); + }, 60000); + }); + + // AV MANIFEST WITH TABLE OF CONTENTS TEST + // An AV manifest that defines ranges/structures is routed to the AV extension + // (AVCenterPanel / iiif-av-component) rather than the mediaelement player. + describe("AV manifest with table of contents", () => { + // Use a dedicated page so the AV tests are isolated from whatever state + // (e.g. in-flight iframe loads) earlier suites left on the shared page. + let avPage; + + beforeAll(async () => { + avPage = await browser.newPage(); + }); + + afterAll(async () => { + await avPage.close(); + }); + + beforeEach(async () => { + // Force a full reload so the viewer re-initialises on this manifest + // (a hash-only change would keep the previously loaded manifest). + await avPage.goto("about:blank"); + await avPage.goto(viewerUrl(AV_TOC_MANIFEST), { + waitUntil: "domcontentloaded", + }); + }, 60000); + + it("loads the AV manifest into the AV center panel", async () => { + expect(avPage.url()).toContain(encodeURIComponent(AV_TOC_MANIFEST)); + + await avPage.waitForSelector(".uv", { visible: true }); + + // The AV extension mounts the AVComponent into a .iiif-av-component + // wrapper inside the center panel. + await avPage.waitForSelector(".iiif-av-component .player", { + visible: true, + }); + + // This path must NOT fall back to the mediaelement player. + const mejsCount = await avPage.$$eval( + ".mejs__container", + (els) => els.length + ); + expect(mejsCount).toBe(0); + + // The media element is created as video.anno / audio.anno. + await avPage.waitForSelector( + ".iiif-av-component video.anno, .iiif-av-component audio.anno" + ); + + const pageText = await avPage.evaluate(() => document.body.innerText); + expect(pageText).not.toContain("Unable to load"); + expect(pageText).not.toContain("Error loading"); + }, 60000); + + it("renders AV component playback controls", async () => { + await avPage.waitForSelector(".iiif-av-component .controls-container", { + visible: true, + }); + + // Play/pause button. + const playButton = await avPage.$( + ".iiif-av-component .controls-container .av-icon-play" + ); + expect(playButton).toBeTruthy(); + + // Duration display. + const duration = await avPage.$( + ".iiif-av-component .time-display .canvas-duration" + ); + expect(duration).toBeTruthy(); + }, 60000); + }); }); From 209eaf5690e327dfec7c91f70e71bd658336fc3e Mon Sep 17 00:00:00 2001 From: K8Sewell Date: Thu, 2 Jul 2026 09:36:55 -0500 Subject: [PATCH 2/5] Move iiif-av-component into project --- package-lock.json | 1550 +---------- package.json | 5 +- .../uv-av-extension/DownloadDialogue.ts | 4 +- .../modules/iiif-av-component-module/Utils.ts | 225 ++ .../components/av-component.ts | 842 ++++++ .../components/canvas-instance.ts | 2350 +++++++++++++++++ .../components/volume-control.ts | 122 + .../css/iiif-av-component.less | 359 +++ .../css/img/collapse.png | Bin 0 -> 3675 bytes .../css/img/expand.png | Bin 0 -> 3657 bytes .../css/img/fast-forward.svg | 10 + .../css/img/fast-rewind.svg | 10 + .../iiif-av-component-module/css/img/next.png | Bin 0 -> 277 bytes .../css/img/pause.png | Bin 0 -> 994 bytes .../iiif-av-component-module/css/img/play.png | Bin 0 -> 219 bytes .../css/img/previous.png | Bin 0 -> 274 bytes .../css/img/volume-off.png | Bin 0 -> 348 bytes .../css/img/volume-on.png | Bin 0 -> 432 bytes .../iiif-av-component-module/css/styles.less | 2 + .../css/variables.less | 1 + .../elements/composite-media-element.ts | 252 ++ .../elements/media-element.ts | 244 ++ .../elements/timeplan-player.ts | 733 +++++ .../elements/virtual-canvas.ts | 96 + .../events/av-component-events.ts | 10 + .../events/canvas-instance-events.ts | 6 + .../events/volume-events.ts | 3 + .../iiif-av-component-module/globals.d.ts | 20 + .../helpers/can-play-hls.ts | 19 + .../helpers/composite-media-from-canvases.ts | 58 + .../helpers/convert-to-percentage.ts | 3 + .../create-time-plans-from-manifest.ts | 155 ++ .../helpers/debounce.ts | 26 + .../helpers/diff-data.ts | 13 + .../extract-media-from-annotation-bodies.ts | 52 + .../helpers/format-time.ts | 34 + .../helpers/get-first-targeted-canvas-id.ts | 21 + .../helpers/get-hls.ts | 7 + .../get-media-source-from-annotation-body.ts | 67 + .../helpers/get-spatial-component.ts | 11 + .../helpers/get-timestamp.ts | 3 + .../helpers/hls-media-types.ts | 15 + .../iiif-av-component-module/helpers/index.ts | 44 + .../helpers/is-hls-format.ts | 6 + .../iiif-av-component-module/helpers/is-ie.ts | 39 + .../helpers/is-mpeg-dash-format.ts | 5 + .../helpers/is-safari.ts | 4 + .../helpers/is-virtual.ts | 11 + .../helpers/logger.ts | 44 + .../helpers/normalise-number.ts | 3 + .../helpers/relative-time.ts | 53 + .../helpers/retarget-temporal-component.ts | 34 + .../modules/iiif-av-component-module/index.ts | 9 + .../interfaces/canvas-instance-data.ts | 11 + .../interfaces/component-content.ts | 16 + .../interfaces/component-data.ts | 27 + .../interfaces/max-min.ts | 5 + .../interfaces/volume-control-state.ts | 4 + .../media-formats/abstract-media-format.ts | 13 + .../media-formats/dash-format.ts | 21 + .../media-formats/default-format.ts | 8 + .../media-formats/hls-format.ts | 31 + .../media-formats/mpeg-format.ts | 11 + .../types/media-options.ts | 5 + .../types/media-source.ts | 18 + .../types/time-plan.ts | 16 + .../types/time-stop.ts | 18 + .../uv-avcenterpanel-module/AVCenterPanel.ts | 7 +- .../uv-avcenterpanel-module/css/styles.less | 2 +- .../uv-shared-module/GalleryComponent.ts | 2 +- .../modules/uv-shared-module/ThumbsView.ts | 2 +- 71 files changed, 6365 insertions(+), 1432 deletions(-) create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/Utils.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/components/av-component.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/components/canvas-instance.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/components/volume-control.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/iiif-av-component.less create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/collapse.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/expand.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/fast-forward.svg create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/fast-rewind.svg create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/next.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/pause.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/play.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/previous.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/volume-off.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/img/volume-on.png create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/styles.less create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/css/variables.less create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/elements/composite-media-element.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/elements/media-element.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/elements/timeplan-player.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/elements/virtual-canvas.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/events/av-component-events.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/events/canvas-instance-events.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/events/volume-events.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/globals.d.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/can-play-hls.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/composite-media-from-canvases.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/convert-to-percentage.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/create-time-plans-from-manifest.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/debounce.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/diff-data.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/extract-media-from-annotation-bodies.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/format-time.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/get-first-targeted-canvas-id.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/get-hls.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/get-media-source-from-annotation-body.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/get-spatial-component.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/get-timestamp.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/hls-media-types.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/index.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/is-hls-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/is-ie.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/is-mpeg-dash-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/is-safari.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/is-virtual.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/logger.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/normalise-number.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/relative-time.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/helpers/retarget-temporal-component.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/index.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/interfaces/canvas-instance-data.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/interfaces/component-content.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/interfaces/component-data.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/interfaces/max-min.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/interfaces/volume-control-state.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/media-formats/abstract-media-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/media-formats/dash-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/media-formats/default-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/media-formats/hls-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/media-formats/mpeg-format.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/types/media-options.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/types/media-source.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/types/time-plan.ts create mode 100644 src/content-handlers/iiif/modules/iiif-av-component-module/types/time-stop.ts diff --git a/package-lock.json b/package-lock.json index dcf14f3ed..834898312 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "@google/model-viewer": "^4.0.0", "@iiif/base-component": "2.0.1", - "@iiif/iiif-av-component": "1.2.4", "@iiif/manifold": "^2.3.0", "@iiif/presentation-3": "^1.0.5", "@iiif/vocabulary": "^1.0.31", @@ -22,10 +21,12 @@ "classnames": "^2.3.1", "clean-css": "^5.2.2", "copyfiles": "^2.4.1", + "dashjs": "2.6.7", "esbuild": "^0.28.1", "esbuild-plugin-less": "^1.1.5", "esbuild-plugin-svg": "^0.1.0", "jquery": "3.5.0", + "jquery-ui-dist": "^1.12.1", "jsviews": "1.0.15", "less-plugin-clean-css": "^1.5.1", "manifesto.js": "^4.3.0", @@ -1641,102 +1642,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.52.tgz", "integrity": "sha512-2RbW7WXeLex6RI+kQSxq6Ym0GiVcODeQ4Km7MnnTX5BHdOGQnqVa+s6AUmAW+OFYAJ8wv9QxvNZXm7/kBdGTVw==" }, - "node_modules/@iiif/iiif-av-component": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@iiif/iiif-av-component/-/iiif-av-component-1.2.4.tgz", - "integrity": "sha512-BHBEHf0tSCO5Pf1M/ZBUyUJk12z+5aaK7JOdtS+n9DEvxmG0Q1uWScRNKc1s+Lh68BFT5g19X5cUV9PMw5okgQ==", - "dependencies": { - "@iiif/base-component": "2.*", - "@iiif/manifold": "^2.0.5", - "@types/jquery": "2.0.34", - "@types/jqueryui": "^1.11.36", - "css-loader": "^5.2.7", - "dashjs": "2.6.7", - "happy-dom": "^6.0.4", - "jquery": "^3.5.0", - "jquery-ui-dist": "^1.12.1", - "jsdom": "^20.0.0", - "less-loader": "^7.3.0", - "manifesto.js": "^4.2.4", - "node-polyfill-webpack-plugin": "^2.0.0", - "style-loader": "^2.0.0", - "url-loader": "^4.1.1", - "waveform-panel": "^1.2.0" - } - }, - "node_modules/@iiif/iiif-av-component/node_modules/@types/jquery": { - "version": "2.0.34", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.34.tgz", - "integrity": "sha512-zydaVQrBPlZhn+PwHOPGnvffCppxw01TyYXuD90CcYiAwwkrPheui9WWkpLyKAUVGfYRXmyF8XJS4Qp+obyiUg==" - }, - "node_modules/@iiif/iiif-av-component/node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/@iiif/iiif-av-component/node_modules/less-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", - "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", - "dependencies": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@iiif/iiif-av-component/node_modules/style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, "node_modules/@iiif/manifold": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@iiif/manifold/-/manifold-2.3.0.tgz", @@ -2821,15 +2726,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -2903,14 +2799,6 @@ "@types/node": "*" } }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -3005,14 +2893,6 @@ "@types/send": "*" } }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", @@ -3103,22 +2983,16 @@ "version": "3.5.14", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", "integrity": "sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg==", + "dev": true, "dependencies": { "@types/sizzle": "*" } }, - "node_modules/@types/jqueryui": { - "version": "1.12.16", - "resolved": "https://registry.npmjs.org/@types/jqueryui/-/jqueryui-1.12.16.tgz", - "integrity": "sha512-6huAQDpNlso9ayaUT9amBOA3kj02OCeUWs+UvDmbaJmwkHSg/HLsQOoap/D5uveN9ePwl72N45Bl+Frp5xyG1Q==", - "dependencies": { - "@types/jquery": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/jszip": { @@ -3156,6 +3030,7 @@ "version": "22.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dev": true, "dependencies": { "undici-types": "~6.19.8" } @@ -3163,7 +3038,8 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -3235,7 +3111,8 @@ "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true }, "node_modules/@types/sockjs": { "version": "0.3.36", @@ -3937,11 +3814,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3949,17 +3821,6 @@ "license": "ISC", "optional": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3977,6 +3838,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3985,15 +3847,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, "node_modules/acorn-import-phases": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", @@ -4021,6 +3874,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -4029,6 +3883,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "devOptional": true, "dependencies": { "debug": "4" }, @@ -4040,6 +3895,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -4055,12 +3911,14 @@ "node_modules/agent-base/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4126,6 +3984,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -4133,7 +3992,8 @@ "node_modules/ajv/node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -4428,28 +4288,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, "node_modules/asn1js": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", @@ -4472,17 +4310,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -4542,12 +4369,14 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -4818,6 +4647,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -4863,6 +4693,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "engines": { "node": "*" } @@ -4880,12 +4711,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bn.js": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", - "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", - "license": "MIT" - }, "node_modules/body-parser": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", @@ -4988,87 +4813,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "license": "MIT", - "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -5130,6 +4874,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -5162,17 +4907,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/bundle-name": { "version": "4.1.0", @@ -5225,6 +4961,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -5243,6 +4980,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5256,6 +4994,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5343,11 +5082,6 @@ "node": ">=6" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "node_modules/chai": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", @@ -5488,19 +5222,6 @@ "node": ">=8" } }, - "node_modules/cipher-base": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cjs-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", @@ -5600,6 +5321,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5663,20 +5385,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -5687,11 +5395,6 @@ "node": ">=0.8" } }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -5699,11 +5402,6 @@ "license": "ISC", "optional": true }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5938,46 +5636,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -6029,45 +5687,6 @@ "node": ">= 8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.1", - "browserify-sign": "^4.2.3", - "create-ecdh": "^4.0.4", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "diffie-hellman": "^5.0.3", - "hash-base": "~3.0.4", - "inherits": "^2.0.4", - "pbkdf2": "^3.1.2", - "public-encrypt": "^4.0.3", - "randombytes": "^2.1.0", - "randomfill": "^1.0.4" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/crypto-browserify/node_modules/hash-base": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/css-functions-list": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", @@ -6152,15 +5771,11 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6184,27 +5799,6 @@ "node": ">=8.0.0" } }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -6256,19 +5850,6 @@ "node": ">= 14" } }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -6332,12 +5913,6 @@ "ms": "2.0.0" } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -6432,6 +6007,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -6462,6 +6038,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -6494,6 +6071,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -6515,15 +6093,6 @@ "node": ">= 0.8" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6578,22 +6147,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6669,17 +6222,6 @@ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "node_modules/domain-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", - "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -6691,17 +6233,6 @@ } ] }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", @@ -6751,6 +6282,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -6775,27 +6307,6 @@ "dev": true, "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -6818,6 +6329,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, "engines": { "node": ">= 4" } @@ -6982,6 +6494,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6991,6 +6504,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7035,6 +6549,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -7047,6 +6562,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7115,11 +6631,6 @@ "es6-symbol": "^3.1.1" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" - }, "node_modules/es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -7223,6 +6734,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -7635,6 +7147,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7672,6 +7185,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -7680,6 +7194,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7703,14 +7218,6 @@ "es5-ext": "~0.10.14" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -7721,19 +7228,11 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "engines": { "node": ">=0.8.x" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7956,7 +7455,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -8090,14 +7590,6 @@ "node": ">=8" } }, - "node_modules/filter-obj": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -8237,6 +7729,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -8248,23 +7741,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz", - "integrity": "sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8368,6 +7844,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8440,6 +7917,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -8470,18 +7948,11 @@ "node": ">=8.0.0" } }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "engines": { - "node": ">=4" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -8678,6 +8149,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8727,20 +8199,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/happy-dom": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-6.0.4.tgz", - "integrity": "sha512-b+ID23Ms0BY08UNLymsOMG7EI2jSlwEt4cbJs938GZfeNAg+fqgkSO3TokQMgSOFoHznpjWmpVjBUL5boJ9PWw==", - "dependencies": { - "css.escape": "^1.5.1", - "he": "^1.2.0", - "node-fetch": "^2.x.x", - "sync-request": "^6.1.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -8768,6 +8226,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -8796,6 +8255,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8808,6 +8268,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -8826,34 +8287,11 @@ "license": "ISC", "optional": true }, - "node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -8866,20 +8304,11 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, "bin": { "he": "bin/he" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -8912,17 +8341,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -9028,20 +8446,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -9085,40 +8489,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/http-proxy-middleware": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", @@ -9144,28 +8514,11 @@ } } }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "devOptional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -9178,6 +8531,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -9193,7 +8547,8 @@ "node_modules/https-proxy-agent/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true }, "node_modules/human-signals": { "version": "2.1.0", @@ -9232,6 +8587,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9243,6 +8599,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -9417,21 +8774,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -9527,6 +8869,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9649,6 +8992,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9703,21 +9047,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-network-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", @@ -9783,11 +9112,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -9881,6 +9205,7 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -10941,66 +10266,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -11030,7 +10295,8 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -11043,6 +10309,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -11140,14 +10407,6 @@ "node": ">=6" } }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "engines": { - "node": ">= 8" - } - }, "node_modules/known-css-properties": { "version": "0.36.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", @@ -11338,6 +10597,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11550,6 +10810,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11566,16 +10827,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -11706,24 +10957,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -11740,6 +10973,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -11748,6 +10982,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -11790,12 +11025,8 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "node_modules/minimatch": { "version": "3.1.5", @@ -11915,6 +11146,7 @@ "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, "funding": [ { "type": "github", @@ -12066,100 +11298,26 @@ "dev": true, "license": "MIT" }, - "node_modules/node-polyfill-webpack-plugin": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", - "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", - "dependencies": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.22.0", - "events": "^3.3.0", - "filter-obj": "^2.0.2", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^4.0.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "^0.0.1", - "type-fest": "^2.14.0", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": ">=5" - } + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" }, - "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", - "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" } }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/node-polyfill-webpack-plugin/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "node_modules/noms/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "node_modules/noms/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "node_modules/noms/node_modules/readable-stream": { "version": "1.0.34", @@ -12227,12 +11385,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12247,6 +11399,7 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12255,25 +11408,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -12461,11 +11600,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -12703,27 +11837,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "license": "ISC", - "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -12761,30 +11874,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -12812,11 +11901,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12890,23 +11974,6 @@ "node": ">= 14.16" } }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", - "license": "MIT", - "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/pdfjs-dist": { "version": "3.11.174", "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", @@ -13004,6 +12071,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -13013,6 +12081,7 @@ "version": "8.5.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -13054,6 +12123,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" @@ -13066,6 +12136,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", @@ -13083,6 +12154,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" @@ -13098,6 +12170,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -13146,6 +12219,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13158,7 +12232,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -13261,14 +12336,6 @@ "node": ">=0.4.0" } }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, "node_modules/promise-worker-transferable": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", @@ -13434,30 +12501,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "optional": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -13473,6 +12516,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13648,6 +12692,7 @@ "version": "6.15.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -13659,28 +12704,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -13701,23 +12724,6 @@ } ] }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13993,7 +12999,8 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "node_modules/resolve": { "version": "1.22.8", @@ -14097,19 +13104,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/round10": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/round10/-/round10-1.0.3.tgz", @@ -14199,6 +13193,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "devOptional": true, "funding": [ { "type": "github", @@ -14259,24 +13254,14 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -14287,6 +13272,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14324,6 +13310,7 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -14464,6 +13451,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -14520,26 +13508,6 @@ "dev": true, "license": "ISC" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -14589,6 +13557,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -14608,6 +13577,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -14624,6 +13594,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -14642,6 +13613,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -14847,6 +13819,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -15067,30 +14040,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/streamx": { "version": "2.22.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", @@ -15109,6 +14058,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "devOptional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15809,32 +14759,6 @@ "node": ">=11.0.0" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dependencies": { - "get-port": "^3.1.0" - } - }, "node_modules/synckit": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", @@ -16150,32 +15074,6 @@ "b4a": "^1.6.4" } }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -16217,17 +15115,6 @@ "dev": true, "license": "MIT" }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -16265,26 +15152,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-buffer/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16318,32 +15185,6 @@ "node": ">=6" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/tree-dump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", @@ -16509,11 +15350,6 @@ "node": ">= 6.0.0" } }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" - }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -16542,17 +15378,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -16571,6 +15396,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -16651,11 +15477,6 @@ "dev": true, "license": "MIT" }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "node_modules/typedoc": { "version": "0.28.19", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.19.tgz", @@ -16845,21 +15666,14 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -16913,23 +15727,16 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -16952,25 +15759,11 @@ } } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/url-polyfill": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.12.tgz", "integrity": "sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==" }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, "node_modules/urlpattern-polyfill": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", @@ -16987,18 +15780,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17053,22 +15834,6 @@ "node": ">= 0.8" } }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/wait-on": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.5.tgz", @@ -17164,14 +15929,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, "node_modules/webpack": { "version": "5.105.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.3.tgz", @@ -17680,48 +16437,6 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17814,6 +16529,7 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -17904,6 +16620,7 @@ "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -17921,19 +16638,6 @@ } } }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, "node_modules/xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", diff --git a/package.json b/package.json index 002517e03..769f654e5 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "build": "webpack -c webpack.config.js", "build-es": "node ./esbuild.mjs", "build-tsc": "tsc --skipLibCheck --module CommonJS --esModuleInterop --declarationDir ./dist/cjs --declaration --outDir ./dist/cjs -p . && npm run copy-files", - "copy-files": "copyfiles -u 1 src/**/*.svg dist/cjs && copyfiles -u 1 src/**/*.gif dist/cjs && copyfiles -u 1 src/**/*.less dist/cjs && copyfiles -u 1 src/extensions/**/*.less dist/cjs && copyfiles -u 1 src/**/*.css dist/cjs", + "copy-files": "copyfiles -u 1 src/**/*.svg dist/cjs && copyfiles -u 1 src/**/*.gif dist/cjs && copyfiles -u 1 src/**/*.png dist/cjs && copyfiles -u 1 src/**/*.less dist/cjs && copyfiles -u 1 src/extensions/**/*.less dist/cjs && copyfiles -u 1 src/**/*.css dist/cjs", "docs": "typedoc --plugin typedoc-plugin-missing-exports ; echo docs.universalviewer.io > docs/CNAME", "test": "jest", "prepublishOnly": "npm run build && npm run build-tsc && npm run build-es", @@ -98,7 +98,6 @@ "dependencies": { "@google/model-viewer": "^4.0.0", "@iiif/base-component": "2.0.1", - "@iiif/iiif-av-component": "1.2.4", "@iiif/manifold": "^2.3.0", "@iiif/presentation-3": "^1.0.5", "@iiif/vocabulary": "^1.0.31", @@ -109,10 +108,12 @@ "classnames": "^2.3.1", "clean-css": "^5.2.2", "copyfiles": "^2.4.1", + "dashjs": "2.6.7", "esbuild": "^0.28.1", "esbuild-plugin-less": "^1.1.5", "esbuild-plugin-svg": "^0.1.0", "jquery": "3.5.0", + "jquery-ui-dist": "^1.12.1", "jsviews": "1.0.15", "less-plugin-clean-css": "^1.5.1", "manifesto.js": "^4.3.0", diff --git a/src/content-handlers/iiif/extensions/uv-av-extension/DownloadDialogue.ts b/src/content-handlers/iiif/extensions/uv-av-extension/DownloadDialogue.ts index a584d3d37..b09b9848f 100644 --- a/src/content-handlers/iiif/extensions/uv-av-extension/DownloadDialogue.ts +++ b/src/content-handlers/iiif/extensions/uv-av-extension/DownloadDialogue.ts @@ -62,8 +62,8 @@ export class DownloadDialogue extends BaseDownloadDialogue { const $selectedOption: JQuery = that.getSelectedOption(); - const id: string = $selectedOption.attr("id"); - const label: string = $selectedOption.attr("title"); + const id: string = $selectedOption.attr("id") as string; + const label: string = $selectedOption.attr("title") as string; const type: string = DownloadOption.UNKNOWN; if (this.renderingUrls[id]) { diff --git a/src/content-handlers/iiif/modules/iiif-av-component-module/Utils.ts b/src/content-handlers/iiif/modules/iiif-av-component-module/Utils.ts new file mode 100644 index 000000000..e013ff301 --- /dev/null +++ b/src/content-handlers/iiif/modules/iiif-av-component-module/Utils.ts @@ -0,0 +1,225 @@ +import { Canvas, Range, Utils } from "manifesto.js"; +import { MediaType } from "@iiif/vocabulary"; + +export class AVComponentUtils { + private static _compare(a: any, b: any): string[] { + const changed: string[] = []; + Object.keys(a).forEach((p) => { + if (!Object.is(b[p], a[p])) { + changed.push(p); + } + }); + return changed; + } + + public static diff(a: any, b: any) { + return Array.from( + new Set( + AVComponentUtils._compare(a, b).concat(AVComponentUtils._compare(b, a)) + ) + ); + } + + public static getSpatialComponent(target: string): number[] | null { + const spatial: RegExpExecArray | null = /xywh=([^&]+)/g.exec(target); + let xywh: number[] | null = null; + + if (spatial && spatial[1]) { + xywh = spatial[1].split(","); + } + + return xywh; + } + + public static getFirstTargetedCanvasId(range: Range): string | undefined { + let canvasId: string | undefined; + + if (range.canvases && range.canvases.length) { + canvasId = range.canvases[0]; + } else { + const childRanges: Range[] = range.getRanges(); + + if (childRanges.length) { + return AVComponentUtils.getFirstTargetedCanvasId(childRanges[0]); + } + } + + if (canvasId !== undefined) { + return Utils.normaliseUrl(canvasId); + } + + return undefined; + } + + public static getTimestamp(): string { + return String(new Date().valueOf()); + } + + public static retargetTemporalComponent( + canvases: Canvas[], + target: string + ): string | undefined { + let t: number[] | null = Utils.getTemporalComponent(target); + + if (t) { + let offset: number = 0; + let targetWithoutTemporal: string = target.substr(0, target.indexOf("#")); + + // loop through canvases adding up their durations until we reach the targeted canvas + for (let i = 0; i < canvases.length; i++) { + const canvas: Canvas = canvases[i]; + if (!canvas.id.includes(targetWithoutTemporal)) { + const duration: number | null = canvas.getDuration(); + if (duration) { + offset += duration; + } + } else { + // we've reached the canvas whose target we're adjusting + break; + } + } + + t[0] = Number(t[0]) + offset; + t[1] = Number(t[1]) + offset; + + return targetWithoutTemporal + "#t=" + t[0] + "," + t[1]; + } + + return undefined; + } + + public static formatTime(aNumber: number): string { + let hours: number | string, + minutes: number | string, + seconds: number | string, + hourValue: string; + + seconds = Math.ceil(aNumber); + hours = Math.floor(seconds / (60 * 60)); + hours = hours >= 10 ? hours : "0" + hours; + minutes = Math.floor((seconds % (60 * 60)) / 60); + minutes = minutes >= 10 ? minutes : "0" + minutes; + seconds = Math.floor((seconds % (60 * 60)) % 60); + seconds = seconds >= 10 ? seconds : "0" + seconds; + + if (Number(hours) >= 1) { + hourValue = hours + ":"; + } else { + hourValue = ""; + } + + return hourValue + minutes + ":" + seconds; + } + + public static isIE(): number | boolean { + const ua = window.navigator.userAgent; + + // Test values; Uncomment to check result … + + // IE 10 + // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; + + // IE 11 + // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; + + // Edge 12 (Spartan) + // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; + + // Edge 13 + // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; + + const msie = ua.indexOf("MSIE "); + if (msie > 0) { + // IE 10 or older => return version number + return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10); + } + + const trident = ua.indexOf("Trident/"); + if (trident > 0) { + // IE 11 => return version number + const rv = ua.indexOf("rv:"); + return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10); + } + + const edge = ua.indexOf("Edge/"); + if (edge > 0) { + // Edge (IE 12+) => return version number + return parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10); + } + + // other browser + return false; + } + + public static isSafari() { + // https://stackoverflow.com/questions/7944460/detect-safari-browser?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa + return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + } + + public static debounce(fn: any, debounceDuration: number): any { + // summary: + // Returns a debounced function that will make sure the given + // function is not triggered too much. + // fn: Function + // Function to debounce. + // debounceDuration: Number + // OPTIONAL. The amount of time in milliseconds for which we + // will debounce the function. (defaults to 100ms) + debounceDuration = debounceDuration || 100; + + return function () { + if (!fn.debouncing) { + const args: any = Array.prototype.slice.apply(arguments); + fn.lastReturnVal = fn.apply(window, args); + fn.debouncing = true; + } + clearTimeout(fn.debounceTimeout); + fn.debounceTimeout = setTimeout(function () { + fn.debouncing = false; + }, debounceDuration); + + return fn.lastReturnVal; + }; + } + + public static hlsMimeTypes = [ + // Apple santioned + "application/vnd.apple.mpegurl", + "vnd.apple.mpegurl", + // Apple sanctioned for backwards compatibility + "audio/mpegurl", + // Very common + "audio/x-mpegurl", + // Very common + "application/x-mpegurl", + // Included for completeness + "video/x-mpegurl", + "video/mpegurl", + "application/mpegurl", + ]; + + public static normalise(num: number, min: number, max: number): number { + return (num - min) / (max - min); + } + + public static isHLSFormat(format: MediaType) { + return this.hlsMimeTypes.includes(format.toString()); + } + + public static isMpegDashFormat(format: MediaType) { + return format.toString() === "application/dash+xml"; + } + + public static canPlayHls() { + const doc = typeof document === "object" && document, + videoelem = doc && doc.createElement("video"), + isvideosupport = Boolean(videoelem && videoelem.canPlayType); + + return ( + isvideosupport && + this.hlsMimeTypes.some(function (canItPlay) { + return /maybe|probably/i.test((videoelem).canPlayType(canItPlay)); + }) + ); + } +} diff --git a/src/content-handlers/iiif/modules/iiif-av-component-module/components/av-component.ts b/src/content-handlers/iiif/modules/iiif-av-component-module/components/av-component.ts new file mode 100644 index 000000000..de170c4ad --- /dev/null +++ b/src/content-handlers/iiif/modules/iiif-av-component-module/components/av-component.ts @@ -0,0 +1,842 @@ +/* eslint-disable no-debugger */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/ban-ts-ignore */ +const $ = require("jquery"); +require("jquery-ui-dist/jquery-ui"); +require("jquery-ui-dist/jquery-ui.css"); +import { Canvas, Range, Utils } from "manifesto.js"; +import { Behavior } from "@iiif/vocabulary/dist-commonjs"; +import { CanvasInstanceEvents } from "../events/canvas-instance-events"; +import { BaseComponent, IBaseComponentOptions } from "@iiif/base-component"; +import { IAVComponentData } from "../interfaces/component-data"; +import { VolumeEvents } from "../events/volume-events"; +import { VirtualCanvas } from "../elements/virtual-canvas"; +import { IAVComponentContent } from "../interfaces/component-content"; +import { CanvasInstance } from "./canvas-instance"; +import { diffData } from "../helpers/diff-data"; +import { getFirstTargetedCanvasId } from "../helpers/get-first-targeted-canvas-id"; +import { Events } from "../events/av-component-events"; +import { TimelineTime } from "../helpers/relative-time"; +import { Logger } from "../helpers/logger"; +import "dashjs/dist/dash.mediaplayer.min"; +import "../css/styles.less"; + +export class AVComponent extends BaseComponent { + static newRanges = true; + private _data: IAVComponentData = this.data(); + public options: IBaseComponentOptions; + public canvasInstances: CanvasInstance[] = []; + private _checkAllMediaReadyInterval: any; + private _checkAllWaveformsReadyInterval: any; + private _readyMedia = 0; + private _readyWaveforms = 0; + private _posterCanvasWidth = 0; + private _posterCanvasHeight = 0; + + private _$posterContainer: JQuery; + private _$posterImage: JQuery; + private _$posterExpandButton: JQuery; + private _$element: JQuery; + + private _posterImageExpanded = false; + + constructor(options: IBaseComponentOptions) { + super(options); + this._init(); + this._resize(); + } + + protected _init(): boolean { + const success: boolean = super._init(); + + this._$element = $(this.el); + + if (!success) { + Logger.error("Component failed to initialise"); + } + + return success; + } + + public getCurrentCanvasInstance(): Canvas | null { + const range = this._data.helper!.getRangeById(this._data.range.id); + if (!range) { + return null; + } + // @ts-ignore + const canvasId: string | undefined = getFirstTargetedCanvasId(range); + // @ts-ignore + return canvasId ? this._data.helper!.getCanvasById(canvasId) : null; + } + + public data(): IAVComponentData { + return { + autoPlay: false, + constrainNavigationToRange: false, + defaultAspectRatio: 0.56, + doubleClickMS: 350, + halveAtWidth: 200, + limitToRange: false, + autoAdvanceRanges: true, + posterImageRatio: 0.3, + virtualCanvasEnabled: true, + content: { + currentTime: "Current Time", + collapse: "Collapse", + duration: "Duration", + expand: "Expand", + mute: "Mute", + next: "Next", + pause: "Pause", + play: "Play", + previous: "Previous", + unmute: "Unmute", + } as IAVComponentContent, + enableFastForward: true, + enableFastRewind: true, + }; + } + + public set(data: IAVComponentData): void { + // eslint-disable-next-line no-debugger + Logger.groupCollapsed("AVComponent.set()"); + Logger.log("Data", data); + + const oldData: IAVComponentData = Object.assign({}, this._data); + this._data = Object.assign(this._data, data); + const diff: string[] = diffData(oldData, this._data); + + // changing any of these data properties forces a reload. + if (diff.includes("helper")) { + // create canvases + this._reset(); + } + + if (!this._data.helper) { + Logger.warn("must pass a helper object"); + return; + } + + this.canvasInstances.forEach( + (canvasInstance: CanvasInstance, index: number) => { + const toSet: any = {}; + + if (diff.includes("limitToRange") && this._data.canvasId) { + toSet.limitToRange = this._data.limitToRange; + } + if (diff.includes("autoAdvanceRanges") && this._data.canvasId) { + toSet.autoAdvanceRanges = this._data.autoAdvanceRanges; + } + + if ( + diff.includes("constrainNavigationToRange") && + this._data.canvasId + ) { + toSet.constrainNavigationToRange = + this._data.constrainNavigationToRange; + } + + if (diff.includes("autoSelectRange") && this._data.canvasId) { + toSet.autoSelectRange = this._data.autoSelectRange; + } + + canvasInstance.set(toSet); + } + ); + + if ( + (diff.includes("virtualCanvasEnabled") || diff.includes("canvasId")) && + this._data.canvasId + ) { + const nextCanvasInstance: CanvasInstance | undefined = + this._getCanvasInstanceById(this._data.canvasId); + + if (nextCanvasInstance) { + this.canvasInstances.forEach((canvasInstance: CanvasInstance) => { + // hide canvases that don't have the same id + if ( + canvasInstance.getCanvasId() !== nextCanvasInstance.getCanvasId() + ) { + canvasInstance.set({ + visible: false, + }); + } else { + if (diff.includes("range")) { + canvasInstance.set({ + visible: true, + range: this._data.range + ? jQuery.extend(true, {}, this._data.range) + : undefined, + }); + } else { + canvasInstance.set({ + visible: true, + }); + } + } + }); + } + } + + if (diff.includes("virtualCanvasEnabled")) { + this.set({ + range: undefined, + }); + + // as you don't know the id of virtual canvases, you can toggle them on + // but when toggling off, you must call showCanvas to show the next canvas + if (this._data.virtualCanvasEnabled) { + this.canvasInstances.forEach((canvasInstance: CanvasInstance) => { + if (canvasInstance.isVirtual()) { + this.set({ + canvasId: canvasInstance.getCanvasId(), + range: undefined, + }); + } + }); + } + } + + if (diff.includes("range") && this._data.range) { + // @ts-ignore + let range: Range | null = this._data.helper.getRangeById( + this._data.range.id + ); + + if (!range) { + Logger.warn("range not found", { id: this._data.range.id }); + } else { + let canvasId: string | undefined = getFirstTargetedCanvasId(range); + + if (canvasId) { + // get canvas by normalised id (without temporal part) + const canvasInstance: CanvasInstance | undefined = + this._getCanvasInstanceById(canvasId); + + if (canvasInstance) { + if (canvasInstance.isVirtual() && this._data.virtualCanvasEnabled) { + if (canvasInstance.includesVirtualSubCanvas(canvasId)) { + canvasId = canvasInstance.getCanvasId(); + + // use the retargeted range + for (let i = 0; i < canvasInstance.ranges.length; i++) { + const r: Range = canvasInstance.ranges[i]; + + if (r.id === range.id) { + range = r; + break; + } + } + } + } + + // if not using the correct canvasinstance, switch to it + if ( + this._data.canvasId && + (this._data.canvasId.includes("://") + ? Utils.normaliseUrl(this._data.canvasId) + : this._data.canvasId) !== canvasId + ) { + this.set({ + canvasId: canvasId, + range: jQuery.extend(true, {}, range), // force diff + }); + } else { + canvasInstance.set({ + range: jQuery.extend(true, {}, range), + }); + } + } + } + } + } + + this._render(); + this._resize(); + Logger.groupEnd(); + } + + private _render(): void { + // no-op + } + + public reset(): void { + this._reset(); + } + + private _reset(): void { + this._readyMedia = 0; + this._readyWaveforms = 0; + this._posterCanvasWidth = 0; + this._posterCanvasHeight = 0; + + clearInterval(this._checkAllMediaReadyInterval); + clearInterval(this._checkAllWaveformsReadyInterval); + + this.canvasInstances.forEach((canvasInstance: CanvasInstance) => { + canvasInstance.destroy(); + }); + + this.canvasInstances = []; + + this._$element.empty(); + + if (this._data && this._data.helper && this._data.helper.manifest) { + // if the manifest has an auto-advance behavior, join the canvases into a single "virtual" canvas + const behavior: Behavior | null = + this._data.helper.manifest.getBehavior(); + const canvases: Canvas[] = this._getCanvases(); + + if (behavior && behavior.toString() === "auto-advance") { + // @todo - use time-slices to create many virtual canvases with support for sliced canvases with start and end times. + + const virtualCanvas: VirtualCanvas = new VirtualCanvas(); + + canvases.forEach((canvas: Canvas) => { + virtualCanvas.addCanvas(canvas); + }); + + this._initCanvas(virtualCanvas); + } + + // all canvases need to be individually navigable + canvases.forEach((canvas: Canvas) => { + this._initCanvas(canvas); + }); + + if (this.canvasInstances.length > 0) { + this._data.canvasId = this.canvasInstances[0].getCanvasId(); + } + + this._checkAllMediaReadyInterval = setInterval( + this._checkAllMediaReady.bind(this), + 100 + ); + this._checkAllWaveformsReadyInterval = setInterval( + this._checkAllWaveformsReady.bind(this), + 100 + ); + + this._$posterContainer = $('
'); + this._$element.append(this._$posterContainer); + + this._$posterImage = $('
'); + this._$posterExpandButton = $(` + + `); + this._$posterImage.append(this._$posterExpandButton); + + this._$posterImage.on("touchstart click", (e) => { + e.preventDefault(); + + const target: any = this._getPosterImageCss(!this._posterImageExpanded); + //this._$posterImage.animate(target,"fast", "easein"); + this._$posterImage.animate(target); + this._posterImageExpanded = !this._posterImageExpanded; + + if (this._data.content) { + if (this._posterImageExpanded) { + const label: string = this._data.content.collapse; + this._$posterExpandButton.prop("title", label); + this._$posterExpandButton + .find("i") + .switchClass("expand", "collapse"); + } else { + const label: string = this._data.content.expand; + this._$posterExpandButton.prop("title", label); + this._$posterExpandButton + .find("i") + .switchClass("collapse", "expand"); + } + } + }); + + // this._logMessage('get accompanying canvas'); + + // poster canvas + // @ts-ignore + let accompanyingCanvas: Canvas | null = + this._data.helper.getAccompanyingCanvas(); + + //this._logMessage(accompanyingCanvas); + + if (!accompanyingCanvas) { + accompanyingCanvas = this._data.helper.getPosterCanvas(); + } + + if (accompanyingCanvas) { + this._posterCanvasWidth = accompanyingCanvas.getWidth(); + this._posterCanvasHeight = accompanyingCanvas.getHeight(); + + let posterImage: string | null = this._data.helper.getPosterImage(); + + if (!posterImage) { + posterImage = this._data.helper.getAccompanyingCanvasImage(); + } + + if (posterImage) { + this._$posterContainer.append(this._$posterImage); + + let css: any = this._getPosterImageCss(this._posterImageExpanded); + css = Object.assign({}, css, { + "background-image": "url(" + posterImage + ")", + }); + + this._$posterImage.css(css); + } + } + } + } + + public async setCurrentTime(time: number, external = false): Promise { + const canvas: CanvasInstance | undefined = this._getCurrentCanvas(); + if (canvas) { + return canvas.setCurrentTime(time as TimelineTime, external); + } + return; + } + public async setCurrentRangeTime( + time: number, + rangeId: string, + external = false + ): Promise { + const canvas: CanvasInstance | undefined = this._getCurrentCanvas(); + if (canvas) { + return canvas.setCurrentRangeTime( + time as TimelineTime, + rangeId, + external + ); + } + return; + } + + public getCurrentTime(): number { + const canvas: CanvasInstance | undefined = this._getCurrentCanvas(); + if (canvas) { + return canvas.getClockTime(); + } + return 0; + } + + public isPlaying(): boolean { + return this.canvasInstances.reduce( + (isPlaying: boolean, next: CanvasInstance) => { + return isPlaying || next.isPlaying(); + }, + false + ); + } + + private _checkAllMediaReady(): void { + if (this._readyMedia === this.canvasInstances.length) { + clearInterval(this._checkAllMediaReadyInterval); + this.fire(Events.MEDIA_READY); + this.resize(); + } + } + + private _checkAllWaveformsReady(): void { + if ( + this._readyWaveforms === this._getCanvasInstancesWithWaveforms().length + ) { + clearInterval(this._checkAllWaveformsReadyInterval); + this.fire(Events.WAVEFORMS_READY); + this.resize(); + } + } + + private _getCanvasInstancesWithWaveforms(): CanvasInstance[] { + return this.canvasInstances.filter((c) => { + return c.waveforms.length > 0; + }); + } + + private _getCanvases(): Canvas[] { + // @todo - figure out when this is used and if it needs time slicing considerations. + if (this._data.helper) { + // @ts-ignore + return this._data.helper.getCanvases(); + } + + return []; + } + + private _initCanvas(canvas: Canvas | VirtualCanvas): void { + // @todo - change these events for time-slicing + + const canvasInstance: CanvasInstance = new CanvasInstance({ + target: document.createElement("div"), + data: Object.assign({}, { canvas: canvas }, this._data), + }); + + canvasInstance.logMessage = this._logMessage.bind(this); + canvasInstance.isOnlyCanvasInstance = this._getCanvases().length === 1; + this._$element.append(canvasInstance.$playerElement); + + canvasInstance.autoAdvanceRanges = + this._data.autoAdvanceRanges === false + ? this._data.autoAdvanceRanges + : true; + canvasInstance.limitToRange = this._data.limitToRange || false; + + canvasInstance.init(); + this.canvasInstances.push(canvasInstance); + + canvasInstance.on( + "play", + () => { + this.fire(Events.PLAY, canvasInstance); + }, + false + ); + + canvasInstance.on( + "pause", + () => { + this.fire(Events.PAUSE, canvasInstance); + }, + false + ); + + canvasInstance.on( + Events.MEDIA_READY, + () => { + this._readyMedia++; + canvasInstance.loaded(); + }, + false + ); + canvasInstance.on( + Events.MEDIA_ERROR, + (err) => { + this.fire(Events.MEDIA_ERROR, err); + }, + false + ); + + canvasInstance.on( + Events.WAVEFORM_READY, + () => { + this._readyWaveforms++; + }, + false + ); + + // canvasInstance.on(Events.RESETCANVAS, () => { + // this.playCanvas(canvasInstance.canvas.id); + // }, false); + + canvasInstance.on( + CanvasInstanceEvents.PREVIOUS_RANGE, + () => { + this._prevRange(); + this.play(); + }, + false + ); + + canvasInstance.on( + CanvasInstanceEvents.NEXT_RANGE, + () => { + this._nextRange(); + this.play(); + }, + false + ); + + canvasInstance.on( + Events.RANGE_CHANGED, + (rangeId: string | null) => { + this.fire(Events.RANGE_CHANGED, rangeId); + }, + false + ); + + canvasInstance.on( + VolumeEvents.VOLUME_CHANGED, + (volume: number) => { + this._setCanvasInstanceVolumes(volume); + this.fire(VolumeEvents.VOLUME_CHANGED, volume); + }, + false + ); + } + + public getCurrentRange(): Range | null { + // @todo - change for time-slicing + const rangeId = this._data!.helper!.getCurrentRange()!.id; + return ( + this._getCurrentCanvas()!.ranges.find((range) => { + return range.id === rangeId; + }) || null + ); + } + + private _prevRange(): void { + // @todo - change for time-slicing + if (!this._data || !this._data.helper) { + return; + } + + const currentRange: Range | null = this.getCurrentRange(); + if (currentRange) { + const currentTime = this.getCurrentTime(); + const startTime = currentRange.getDuration()!.start || 0; + // 5 = 5 seconds before going back to current range. + if (currentTime - startTime > 5) { + this.setCurrentTime(startTime as TimelineTime); + return; + } + } + + // @ts-ignore + const prevRange: Range | null = this._data.helper.getPreviousRange(); + + if (prevRange) { + this.playRange(prevRange.id); + } else { + // no previous range. rewind. + this._rewind(); + } + } + + private _nextRange(): void { + // @todo - change for time-slicing + if (!this._data || !this._data.helper) { + return; + } + + // @ts-ignore + const nextRange: Range | null = this._data.helper.getNextRange(); + + if (nextRange) { + this.playRange(nextRange.id); + } + } + + private _setCanvasInstanceVolumes(volume: number): void { + this.canvasInstances.forEach((canvasInstance: CanvasInstance) => { + canvasInstance.set({ + volume: volume, + }); + }); + } + + private _getNormaliseCanvasId(canvasId: string): string { + return canvasId.includes("://") ? Utils.normaliseUrl(canvasId) : canvasId; + } + + private _getCanvasInstanceById(canvasId: string): CanvasInstance | undefined { + // @todo - figure out when this is used and if it needs time slicing considerations. + + canvasId = this._getNormaliseCanvasId(canvasId); + + // if virtual canvas is enabled, check for that first + if (this._data.virtualCanvasEnabled) { + for (let i = 0; i < this.canvasInstances.length; i++) { + const canvasInstance: CanvasInstance = this.canvasInstances[i]; + + let currentCanvasId: string | undefined = canvasInstance.getCanvasId(); + + if (currentCanvasId) { + currentCanvasId = this._getNormaliseCanvasId(currentCanvasId); + + if ( + ((canvasInstance.isVirtual() || + this.canvasInstances.length === 1) && + currentCanvasId === canvasId) || + canvasInstance.includesVirtualSubCanvas(canvasId) + ) { + return canvasInstance; + } + } + } + } else { + for (let i = 0; i < this.canvasInstances.length; i++) { + const canvasInstance: CanvasInstance = this.canvasInstances[i]; + const id: string | undefined = canvasInstance.getCanvasId(); + + if (id) { + const canvasInstanceId: string = Utils.normaliseUrl(id); + + if (canvasInstanceId === canvasId) { + return canvasInstance; + } + } + } + } + + return undefined; + } + + private _getCurrentCanvas(): CanvasInstance | undefined { + // @todo - use time slices to get current virtual canvas + if (this._data.canvasId) { + return this._getCanvasInstanceById(this._data.canvasId); + } + + return undefined; + } + + private _rewind(): void { + if (this._data.limitToRange) { + return; + } + + const canvasInstance: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (canvasInstance) { + canvasInstance.set({ + range: undefined, + }); + } + } + + public play(): void { + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (currentCanvas) { + currentCanvas.play(); + } + } + + viewRange(rangeId: string) { + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (currentCanvas) { + currentCanvas.viewRange(rangeId); + } + } + + public pause(): void { + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (currentCanvas) { + currentCanvas.pause(); + } + } + + public playRange(rangeId: string, autoChanged = false): void { + if (!this._data.helper) { + return; + } + + // @ts-ignore + const range: Range | null = this._data.helper.getRangeById(rangeId); + + if (range) { + this.set({ + range: jQuery.extend(true, { autoChanged }, range), + }); + } + } + + public showCanvas(canvasId: string): void { + // @todo - change for time-slicing, see where it's used and probably not used it. + + // if the passed canvas id is already the current canvas id, but the canvas isn't visible + // (switching from virtual canvas) + + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if ( + this._data.virtualCanvasEnabled && + currentCanvas && + currentCanvas.getCanvasId() === canvasId && + !currentCanvas.isVisible() + ) { + currentCanvas.set({ + visible: true, + }); + } else { + this.set({ + canvasId: canvasId, + }); + } + } + + private _logMessage(message: string): void { + this.fire(Events.LOG, message); + } + + private _getPosterImageCss(expanded: boolean): any { + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (currentCanvas) { + const $options: JQuery = + currentCanvas.$playerElement.find(".options-container"); + const containerWidth: number = currentCanvas.$playerElement + .parent() + .width() as number; + const containerHeight: number = + (currentCanvas.$playerElement.parent().height() as number) - + ($options.height() as number); + + if (expanded) { + return { + top: 0, + left: 0, + width: containerWidth, + height: containerHeight, + }; + } else { + // get the longer edge of the poster canvas and make that a ratio of the container height/width. + // scale the shorter edge proportionally. + let ratio: number; + let width: number; + let height: number; + + if (this._posterCanvasWidth > this._posterCanvasHeight) { + ratio = this._posterCanvasHeight / this._posterCanvasWidth; + width = containerWidth * (this._data.posterImageRatio || 1); + height = width * ratio; + } else { + // either height is greater, or width and height are equal + ratio = this._posterCanvasWidth / this._posterCanvasHeight; + height = containerHeight * (this._data.posterImageRatio || 1); + width = height * ratio; + } + + return { + top: 0, + left: containerWidth - width, + width: width, + height: height, + }; + } + } + + return null; + } + + public resize(): void { + this.canvasInstances.forEach((canvasInstance: CanvasInstance) => { + canvasInstance.resize(); + }); + + // get the visible player and align the poster to it + const currentCanvas: CanvasInstance | undefined = this._getCurrentCanvas(); + + if (currentCanvas) { + if (this._$posterImage && this._$posterImage.is(":visible")) { + if (this._posterImageExpanded) { + this._$posterImage.css(this._getPosterImageCss(true)); + } else { + this._$posterImage.css(this._getPosterImageCss(false)); + } + + // this._$posterExpandButton.css({ + // top: this._$posterImage.height() - this._$posterExpandButton.outerHeight() + // }); + } + } + } +} diff --git a/src/content-handlers/iiif/modules/iiif-av-component-module/components/canvas-instance.ts b/src/content-handlers/iiif/modules/iiif-av-component-module/components/canvas-instance.ts new file mode 100644 index 000000000..42401ce0b --- /dev/null +++ b/src/content-handlers/iiif/modules/iiif-av-component-module/components/canvas-instance.ts @@ -0,0 +1,2350 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/ban-ts-ignore */ +import { convertToPercentage } from "../helpers/convert-to-percentage"; + +const $ = require("jquery"); +import { + Annotation, + AnnotationBody, + Canvas, + Duration, + Range, + Utils, +} from "manifesto.js"; +import { Behavior, MediaType } from "@iiif/vocabulary/dist-commonjs"; +import { BaseComponent, IBaseComponentOptions } from "@iiif/base-component"; +import { IAVCanvasInstanceData } from "../interfaces/canvas-instance-data"; +import { MediaElement } from "../elements/media-element"; +import { TimePlanPlayer } from "../elements/timeplan-player"; +import { VolumeEvents } from "../events/volume-events"; +import { extractMediaFromAnnotationBodies } from "../helpers/extract-media-from-annotation-bodies"; +import { AVVolumeControl } from "./volume-control"; +import { CompositeMediaElement } from "../elements/composite-media-element"; +import { createTimePlansFromManifest } from "../helpers/create-time-plans-from-manifest"; +import { getMediaSourceFromAnnotationBody } from "../helpers/get-media-source-from-annotation-body"; +import { CanvasInstanceEvents } from "../events/canvas-instance-events"; +import { AVComponent } from "./av-component"; +import { VirtualCanvas } from "../elements/virtual-canvas"; +import { Events } from "../events/av-component-events"; +import { isHLSFormat } from "../helpers/is-hls-format"; +import { isMpegDashFormat } from "../helpers/is-mpeg-dash-format"; +import { retargetTemporalComponent } from "../helpers/retarget-temporal-component"; +import { getSpatialComponent } from "../helpers/get-spatial-component"; +import { canPlayHls } from "../helpers/can-play-hls"; +import { formatTime } from "../helpers/format-time"; +import { isSafari } from "../helpers/is-safari"; +import { diffData } from "../helpers/diff-data"; +import { isVirtual } from "../helpers/is-virtual"; +import { + addTime, + fromMs, + minusTime, + timelineTime, + TimelineTime, + TimelineTimeMs, + toMs, +} from "../helpers/relative-time"; +import { Logger } from "../helpers/logger"; +import { getHls } from "../helpers/get-hls"; +import "waveform-panel"; +import { WaveformPanel } from "waveform-panel"; + +export class CanvasInstance extends BaseComponent { + private _$canvasContainer: JQuery; + private _$canvasDuration: JQuery; + private _$canvasHoverHighlight: JQuery; + private _$canvasHoverPreview: JQuery; + private _$canvasTime: JQuery; + private _$canvasTimelineContainer: JQuery; + private _$controlsContainer: JQuery; + private _$durationHighlight: JQuery; + private _$hoverPreviewTemplate: JQuery; + private _$nextButton: JQuery; + private _$fastForward: JQuery; + private _$fastRewind: JQuery; + private _$optionsContainer: JQuery; + private _$playButton: JQuery; + private _$prevButton: JQuery; + private _$rangeHoverHighlight: JQuery; + private _$rangeHoverPreview: JQuery; + private _$rangeTimelineContainer: JQuery; + private _$timeDisplay: JQuery; + private _$timelineItemContainer: JQuery; + private _canvasClockFrequency = 25; + private _canvasClockInterval: number; + private _canvasClockStartDate: TimelineTimeMs = 0 as TimelineTimeMs; + private _canvasClockTime: TimelineTime = 0 as TimelineTime; + private _canvasHeight = 0; + private _canvasWidth = 0; + private _waveformPanel?: WaveformPanel; + private _contentAnnotations: any[]; // todo: type as HTMLMediaElement? + private _data: IAVCanvasInstanceData = this.data(); + private _highPriorityFrequency = 25; + private _highPriorityInterval: number; + private _isPlaying = false; + private _isStalled = false; + //private _lastCanvasHeight: number | undefined; + //private _lastCanvasWidth: number | undefined; + private _lowPriorityFrequency = 250; + private _lowPriorityInterval: number; + private _mediaSyncMarginSecs = 1; + private _rangeSpanPadding = 0.25; + private _readyMediaCount = 0; + private _stallRequestedBy: any[] = []; //todo: type + private _volume: AVVolumeControl; + private _wasPlaying = false; + public ranges: Range[] = []; + public waveforms: string[] = []; + public waveformSources: { + source: string; + canvas: string; + start: number; + end: number; + itemData: any; + }[] = []; + private _buffering = false; + private _bufferShown = false; + public $playerElement: JQuery; + public _$element: JQuery; + public isOnlyCanvasInstance = false; + public logMessage: (message: string) => void; + public timePlanPlayer: TimePlanPlayer; + + constructor(options: IBaseComponentOptions) { + super(options); + this._$element = $(this.options.target); + this._data = this.options.data; + this.$playerElement = $('
'); + this.$playerElement.hide(); + } + + public loaded(): void { + setTimeout(() => { + this.$playerElement.removeClass("player--loading"); + }, 500); + } + + public isPlaying(): boolean { + return this._isPlaying; + } + + public getClockTime(): TimelineTime { + return this._canvasClockTime; + } + + public createTimeStops() { + const helper = this._data.helper; + const virtualCanvas = this._data.canvas as VirtualCanvas; + if (!helper || !virtualCanvas) { + return; + } + + this.ranges = []; + this._contentAnnotations = []; + + const canvases = virtualCanvas.canvases; + const mediaElements: MediaElement[] = []; + for (const canvas of canvases) { + const annotations = canvas.getContent(); + for (const annotation of annotations) { + const annotationBody = extractMediaFromAnnotationBodies(annotation); + if (!annotationBody) { + continue; + } + const mediaSource = getMediaSourceFromAnnotationBody( + annotation, + annotationBody, + { + id: canvas.id, + duration: canvas.getDuration() || 0, + height: canvas.getHeight(), + width: canvas.getWidth(), + } + ); + + const mediaElement = new MediaElement(mediaSource, { + adaptiveAuthEnabled: this._data.adaptiveAuthEnabled, + probed: this.options.data?.canvas?.externalResource?.isProbed, + }); + + mediaElement.setSize( + this._convertToPercentage(mediaSource.x || 0, canvas.getHeight()), + this._convertToPercentage(mediaSource.y || 0, canvas.getWidth()), + this._convertToPercentage( + mediaSource.width || canvas.getWidth(), + canvas.getWidth() + ), + this._convertToPercentage( + mediaSource.height || canvas.getHeight(), + canvas.getHeight() + ) + ); + + mediaElements.push(mediaElement); + + const seeAlso: any = annotation.getProperty("seeAlso"); + if (seeAlso && seeAlso.length) { + const dat: string = seeAlso[0].id; + this.waveforms.push(dat); + + const temporalOffsets: RegExpExecArray | null = /t=([^&]+)/g.exec( + annotation.__jsonld.target + ); + const [start, end] = ((temporalOffsets || [])[1] || "") + .split(",") + .map((i) => parseFloat(i)); + + this.waveformSources.push({ + source: dat, + canvas: canvas.id, + start, + end, + itemData: { start, end, source: annotation.id }, + }); + } + } + } + + if (mediaElements.length === 0) { + // Since this is a constructor call. + setTimeout(() => { + this.fire( + Events.MEDIA_ERROR, + this._data?.content?.noMediaMessage || "No media available to play" + ); + }, 200); + } + + const compositeMediaElement = new CompositeMediaElement(mediaElements); + + compositeMediaElement.appendTo(this.$playerElement); + + compositeMediaElement.load().then(() => { + // this._updateDurationDisplay(); + this.fire(Events.MEDIA_READY); + }); + + // this._renderSyncIndicator(data) + + // @ts-ignore + const plan = createTimePlansFromManifest( + helper.manifest as any, + mediaElements + ); + + // @ts-ignore + window.timePlanPlayer = this.timePlanPlayer = new TimePlanPlayer( + compositeMediaElement, + plan, + (rangeId) => { + this.setCurrentRangeId(rangeId, { autoChanged: true }); + }, + (time) => { + this._canvasClockTime = time; + }, + (isPlaying) => { + if (this._buffering) { + return; + } + if (isPlaying) { + this.play(true); + } else { + this.pause(true); + } + }, + () => { + this._buffering = true; + } + ); + } + + public init() { + if (!this._data || !this._data.content || !this._data.canvas) { + Logger.warn("unable to initialise, missing canvas or content"); + return; + } + + this._$hoverPreviewTemplate = $( + '
' + ); + this._$canvasContainer = $('
'); + this._$optionsContainer = $('
'); + this._$rangeTimelineContainer = $( + '
' + ); + this._$canvasTimelineContainer = $( + '
' + ); + this._$canvasHoverPreview = this._$hoverPreviewTemplate.clone(); + this._$canvasHoverHighlight = $('
'); + this._$rangeHoverPreview = this._$hoverPreviewTemplate.clone(); + this._$rangeHoverHighlight = $('
'); + this._$durationHighlight = $('
'); + this._$timelineItemContainer = $( + '
' + ); + this._$controlsContainer = $('
'); + this._$prevButton = $(` + `); + this._$fastRewind = $(` + `); + + this._$timeDisplay = $( + '
/
' + ); + this._$canvasTime = this._$timeDisplay.find(".canvas-time"); + this._$canvasDuration = this._$timeDisplay.find(".canvas-duration"); + + if (this.isVirtual()) { + this.$playerElement.addClass("virtual"); + } + + const $volume: JQuery = $('
'); + this._volume = new AVVolumeControl({ + target: $volume[0] as HTMLElement, + data: Object.assign({}, this._data), + }); + + this._volume.on( + VolumeEvents.VOLUME_CHANGED, + (value: number) => { + this.fire(VolumeEvents.VOLUME_CHANGED, value); + }, + false + ); + + // @todo make the buttons for FF and FR configurable. + this._$controlsContainer.append( + this._$prevButton, + (this._data.enableFastRewind ? this._$fastRewind : null) as JQuery, + this._$playButton, + (this._data.enableFastForward ? this._$fastForward : null) as JQuery, + this._$nextButton, + this._$timeDisplay, + $volume + ); + this._$canvasTimelineContainer.append( + this._$canvasHoverPreview, + this._$canvasHoverHighlight, + this._$durationHighlight + ); + this._$rangeTimelineContainer.append( + this._$rangeHoverPreview, + this._$rangeHoverHighlight + ); + this._$optionsContainer.append( + this._$canvasTimelineContainer, + this._$rangeTimelineContainer, + this._$controlsContainer + ); + this.$playerElement.append(this._$canvasContainer, this._$optionsContainer); + + this._$canvasHoverPreview.hide(); + this._$rangeHoverPreview.hide(); + + const newRanges = this.isVirtual() && AVComponent.newRanges; + + // Should bootstrap ranges and content. + if (newRanges) { + this.createTimeStops(); + } + + if (!newRanges) { + if (this._data && this._data.helper && this._data.canvas) { + let ranges: Range[] = []; + + // if the canvas is virtual, get the ranges for all sub canvases + if (isVirtual(this._data.canvas)) { + this._data.canvas.canvases.forEach((canvas: Canvas) => { + if (this._data && this._data.helper) { + // @ts-ignore + const r: Range[] = this._data.helper.getCanvasRanges(canvas); + + const clonedRanges: Range[] = []; + + // shift the range targets forward by the duration of their previous canvases + r.forEach((range: Range) => { + const clonedRange = jQuery.extend(true, {}, range); + clonedRanges.push(clonedRange); + + if (clonedRange.canvases && clonedRange.canvases.length) { + for (let i = 0; i < clonedRange.canvases.length; i++) { + if (isVirtual(this._data.canvas)) { + clonedRange.canvases[i] = retargetTemporalComponent( + this._data.canvas.canvases, + clonedRange.__jsonld.items[i].id + ) as string; + } + } + } + }); + + ranges.push(...clonedRanges); + } + }); + } else { + // @ts-ignore + ranges = ranges.concat( + this._data.helper.getCanvasRanges(this._data.canvas as Canvas) + ); + } + + ranges.forEach((range: Range) => { + this.ranges.push(range); + }); + } + } + + const canvasWidth: number = this._data.canvas.getWidth(); + const canvasHeight: number = this._data.canvas.getHeight(); + + if (!canvasWidth) { + this._canvasWidth = this.$playerElement.parent().width() as number; // this._data.defaultCanvasWidth; + } else { + this._canvasWidth = canvasWidth; + } + + if (!canvasHeight) { + this._canvasHeight = + this._canvasWidth * (this._data.defaultAspectRatio || 1); //this._data.defaultCanvasHeight; + } else { + this._canvasHeight = canvasHeight; + } + + // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this; + + let prevClicks = 0; + let prevTimeout = 0; + + this._$prevButton.on("touchstart click", (e) => { + e.preventDefault(); + + prevClicks++; + + if (prevClicks === 1) { + // single click + this._previous(false); + prevTimeout = setTimeout(() => { + prevClicks = 0; + prevTimeout = 0; + }, this._data.doubleClickMS) as any; + } else { + // double click + this._previous(true); + clearTimeout(prevTimeout); + prevClicks = 0; + prevTimeout = 0; + } + }); + + this._$playButton.on("touchstart click", (e) => { + e.preventDefault(); + + if (this._isPlaying) { + this.pause(); + } else { + this.play(); + } + }); + + this._$nextButton.on("touchstart click", (e) => { + e.preventDefault(); + + this._next(); + }); + + this._$fastForward.on("touchstart click", (e) => { + const { end } = this.getRangeTiming(); + const goToTime = addTime(this.getClockTime(), 20 as TimelineTime); + if (goToTime < end) { + return this._setCurrentTime(goToTime); + } + return this._setCurrentTime(end); + }); + + this._$fastRewind.on("touchstart click", (e) => { + const { start } = this.getRangeTiming(); + const goToTime = minusTime(this.getClockTime(), 20 as TimelineTime); + if (goToTime >= start) { + return this._setCurrentTime(goToTime); + } + return this._setCurrentTime(start); + }); + + if (newRanges) { + this._$canvasTimelineContainer.slider({ + value: 0, + step: 0.01, + orientation: "horizontal", + range: "min", + min: 0, + max: this.timePlanPlayer.getDuration(), + animate: false, + slide: (evt: any, ui: any) => { + this._setCurrentTime(this.timePlanPlayer.plan.start + ui.value); + }, + }); + } else { + this._$canvasTimelineContainer.slider({ + value: 0, + step: 0.01, + orientation: "horizontal", + range: "min", + max: that._getDuration(), + animate: false, + create: function (evt: any, ui: any) { + // on create + }, + slide: function (evt: any, ui: any) { + that._setCurrentTime(ui.value); + }, + stop: function (evt: any, ui: any) { + //this._setCurrentTime(ui.value); + }, + }); + } + + this._$canvasTimelineContainer.mouseout(() => { + that._$canvasHoverHighlight.width(0); + that._$canvasHoverPreview.hide(); + }); + + this._$rangeTimelineContainer.mouseout(() => { + that._$rangeHoverHighlight.width(0); + that._$rangeHoverPreview.hide(); + }); + + this._$canvasTimelineContainer.on("mousemove", (e) => { + if (newRanges) { + this._updateHoverPreview( + e, + this._$canvasTimelineContainer, + this.timePlanPlayer.getDuration() + ); + } else { + this._updateHoverPreview( + e, + this._$canvasTimelineContainer, + this._getDuration() + ); + } + }); + + this._$rangeTimelineContainer.on("mousemove", (e) => { + if (newRanges) { + this._updateHoverPreview( + e, + this._$canvasTimelineContainer, + this.timePlanPlayer.getDuration() + ); + } else if (this._data.range) { + const duration: Duration | undefined = this._data.range.getDuration(); + this._updateHoverPreview( + e, + this._$rangeTimelineContainer, + duration ? duration.getLength() : 0 + ); + } + }); + + if (newRanges) { + return; + } + + // create annotations + + this._contentAnnotations = []; + + const items: Annotation[] = this._data.canvas.getContent(); // (this._data.canvas).__jsonld.content[0].items; + + // always hide timelineItemContainer for now + this._$timelineItemContainer.hide(); + + for (let i = 0; i < items.length; i++) { + const item: Annotation = items[i]; + + let mediaSource: any; + const bodies: AnnotationBody[] = item.getBody(); + + if (!bodies.length) { + Logger.warn("item has no body"); + return; + } + + const body: AnnotationBody | null = this._getBody(bodies); + + if (!body) { + // if no suitable format was found for the current browser, skip this item. + Logger.warn("unable to find suitable format for", item.id); + continue; + } + + const type: string | null = body.getType(); + const format = body.getFormat(); + + if (type && type.toString() === "textualbody") { + //mediaSource = (body).value; + } else { + mediaSource = body.id.split("#")[0]; + } + + const target: string | null = item.getTarget(); + + if (!target) { + Logger.warn("item has no target"); + return; + } + + let xywh: number[] | null = getSpatialComponent(target); + let t: number[] | null = Utils.getTemporalComponent(target); + + if (!xywh) { + xywh = [0, 0, this._canvasWidth, this._canvasHeight]; + } + + if (!t) { + t = [0, this._getDuration()]; + } + + const positionLeft = parseInt(String(xywh[0])), + positionTop = parseInt(String(xywh[1])), + mediaWidth = parseInt(String(xywh[2])), + mediaHeight = parseInt(String(xywh[3])), + startTime = parseInt(String(t[0])), + endTime = parseInt(String(t[1])); + + const percentageTop = this._convertToPercentage( + positionTop, + this._canvasHeight + ), + percentageLeft = this._convertToPercentage( + positionLeft, + this._canvasWidth + ), + percentageWidth = this._convertToPercentage( + mediaWidth, + this._canvasWidth + ), + percentageHeight = this._convertToPercentage( + mediaHeight, + this._canvasHeight + ); + + const temporalOffsets: RegExpExecArray | null = /t=([^&]+)/g.exec( + body.id + ); + + let ot; + + if (temporalOffsets && temporalOffsets[1]) { + ot = temporalOffsets[1].split(","); + } else { + ot = [null, null]; + } + + const offsetStart = ot[0] ? parseInt(ot[0]) : ot[0], + offsetEnd = ot[1] ? parseInt(ot[1]) : ot[1]; + + // todo: type this + const itemData: any = { + active: false, + end: endTime, + endOffset: offsetEnd, + format: format, + height: percentageHeight, + left: percentageLeft, + source: mediaSource, + start: startTime, + startOffset: offsetStart, + top: percentageTop, + type: type, + width: percentageWidth, + }; + + this._renderMediaElement(itemData); + + // waveform + // todo: create annotation.getSeeAlso + const seeAlso: any = item.getProperty("seeAlso"); + + if (seeAlso && seeAlso.length) { + const dat: string = seeAlso[0].id; + this.waveforms.push(dat); + this.waveformSources.push({ + canvas: this._data.canvas.id, + source: dat, + start: 0, + end: itemData.end - itemData.start, + itemData, + }); + } + } + } + + private _getBody(bodies: AnnotationBody[]): AnnotationBody | null { + // if there's an HLS format and HLS is supported in this browser + for (let i = 0; i < bodies.length; i++) { + const body: AnnotationBody = bodies[i]; + const format: MediaType | null = body.getFormat(); + + if (format) { + if (isHLSFormat(format) && canPlayHls()) { + return body; + } + } + } + + // if there's a Dash format and the browser isn't Safari + for (let i = 0; i < bodies.length; i++) { + const body: AnnotationBody = bodies[i]; + const format: MediaType | null = body.getFormat(); + + if (format) { + if (isMpegDashFormat(format) && !isSafari()) { + return body; + } + } + } + + // otherwise, return the first format that isn't HLS or Dash + for (let i = 0; i < bodies.length; i++) { + const body: AnnotationBody = bodies[i]; + const format: MediaType | null = body.getFormat(); + + if (format) { + if (!isHLSFormat(format) && !isMpegDashFormat(format)) { + return body; + } + } + } + + // couldn't find a suitable format + return null; + } + + getDuration() { + return this._getDuration(); + } + + private _getDuration(): TimelineTime { + if (this.isVirtual() && AVComponent.newRanges) { + return this.timePlanPlayer.getDuration(); + } + + if (this._data && this._data.canvas) { + return Math.floor( + this._data.canvas.getDuration() as number + ) as TimelineTime; + } + + return 0 as TimelineTime; + } + + public data(): IAVCanvasInstanceData { + return { + waveformColor: "#fff", + waveformBarSpacing: 4, + waveformBarWidth: 2, + volume: 1, + }; + } + + /** + * @deprecated + */ + public isVirtual(): boolean { + return this._data.canvas instanceof VirtualCanvas; + } + + public isVisible(): boolean { + return !!this._data.visible; + } + + public includesVirtualSubCanvas(canvasId: string): boolean { + if ( + isVirtual(this._data.canvas) && + this._data.canvas && + this._data.canvas.canvases + ) { + for (let i = 0; i < this._data.canvas.canvases.length; i++) { + const canvas: Canvas = this._data.canvas.canvases[i]; + if (Utils.normaliseUrl(canvas.id) === canvasId) { + return true; + } + } + } + + return false; + } + + setVisibility(visibility: boolean) { + if (this._data.visible === visibility) { + return; + } + + this._data.visible = visibility; + if (visibility) { + this._rewind(); + this.$playerElement.show(); + } else { + this.$playerElement.hide(); + this.pause(); + } + this.resize(); + } + + viewRange(rangeId: string) { + if (this.currentRange !== rangeId) { + Logger.log(`Switching range from ${this.currentRange} to ${rangeId}`); + this.setCurrentRangeId(rangeId, { noRender: false }); + // Entrypoint for changing a range. Only get's called when change came from external source. + if (AVComponent.newRanges && this.isVirtual()) { + this._setCurrentTime(this.timePlanPlayer.setRange(rangeId), true); + } else { + // this is called when timePlanPlayer isn't available (it's not a virtual canvas) + const range = this._data!.helper!.getRangeById(rangeId); + this.set({ + range: jQuery.extend(true, { autoChanged: true }, range), + }); + } + + this._render(); + } + } + + limitToRange: boolean; + autoAdvanceRanges = true; + currentRange?: string; + setCurrentRangeId( + range: null | string, + { + autoChanged = false, + limitToRange = false, + noRender = false, + }: { + autoChanged?: boolean; + limitToRange?: boolean; + noRender?: boolean; + } = {} + ) { + if (autoChanged && !this.autoAdvanceRanges) { + return; + } + + Logger.log("Setting current range id", range); + + // This is the end of the chain for changing a range. + if (range && this.currentRange !== range) { + this.currentRange = range; + this.fire(Events.RANGE_CHANGED, range); + } else if (range === null) { + this.currentRange = undefined; + this.fire(Events.RANGE_CHANGED, null); + } + + if (!noRender) { + this._render(); + } + } + + setVolume(volume: number) { + this._volume.set({ volume }); + if (AVComponent.newRanges && this.isVirtual()) { + this.timePlanPlayer.setVolume(volume); + } + } + + setLimitToRange(limitToRange: boolean) { + Logger.log(this._data.constrainNavigationToRange); + if (this.limitToRange !== limitToRange) { + this.limitToRange = limitToRange; + this._render(); + } + } + + public set(data: IAVCanvasInstanceData): void { + // Simplification of setting state. + if (AVComponent.newRanges && this.isVirtual()) { + if (typeof data.range !== "undefined") { + this.setCurrentRangeId(data.range.id, { + limitToRange: data.limitToRange, + }); + } + if (typeof data.rangeId !== "undefined") { + this.setCurrentRangeId(data.rangeId, { + limitToRange: data.limitToRange, + }); + } + if (typeof data.volume !== "undefined") { + this.setVolume(data.volume); + } + if (typeof data.limitToRange !== "undefined") { + this.setLimitToRange(data.limitToRange); + } + if (typeof data.visible !== "undefined") { + this.setVisibility(data.visible); + } + + return; + } + + const oldData: IAVCanvasInstanceData = Object.assign({}, this._data); + this._data = Object.assign(this._data, data); + const diff: string[] = diffData(oldData, this._data); + + if (diff.includes("visible")) { + if (this._data.canvas) { + if (this._data.visible) { + this._rewind(); + this.$playerElement.show(); + } else { + this.$playerElement.hide(); + this.pause(); + } + + this.resize(); + } + } + + if (diff.includes("volume")) { + this._contentAnnotations.forEach(($mediaElement: any) => { + const volume: number = + this._data.volume !== undefined ? this._data.volume : 1; + + $($mediaElement.element).prop("volume", volume); + + this._volume.set({ + volume: this._data.volume, + }); + }); + } else { + if (this.isVisible()) { + this._render(); + } + } + + if (diff.includes("range")) { + if (this._data.helper) { + if (!this._data.range) { + this.fire(Events.RANGE_CHANGED, null); + } else { + const duration: Duration | undefined = this._data.range.getDuration(); + + if (duration) { + if (typeof duration !== "undefined") { + // Only change the current time if the current time is outside of the current time. + if ( + duration.start >= this._canvasClockTime || + duration.end <= this._canvasClockTime + ) { + this._setCurrentTime(duration.start as TimelineTime); + } + + if (this._data.autoPlay) { + this.play(); + } + + this.fire( + Events.RANGE_CHANGED, + this._data.range.id, + this._data.range + ); + } + } + } + } + + if (diff.includes("limitToRange")) { + this._render(); + } + } + } + + private _hasRangeChanged(): void { + if (this.isVirtual() && AVComponent.newRanges) { + return; + } + + const range: Range | undefined = this._getRangeForCurrentTime(); + + if ( + range && + !this._data.limitToRange && + (!this._data.range || + (this._data.range && range.id !== this._data.range.id)) + ) { + this.set({ + range: jQuery.extend(true, { autoChanged: true }, range), + }); + } + } + + private _getRangeForCurrentTime(parentRange?: Range): Range | undefined { + let ranges: Range[]; + + if (!parentRange) { + ranges = this.ranges; + } else { + ranges = parentRange.getRanges(); + } + + for (let i = 0; i < ranges.length; i++) { + const range: Range = ranges[i]; + const rangeBehavior = range.getBehavior(); + if (rangeBehavior && rangeBehavior !== "no-nav") { + continue; + } + + // if the range spans the current time, and is navigable, return it. + // otherwise, try to find a navigable child range. + if (this._rangeSpansCurrentTime(range)) { + if (this._rangeNavigable(range)) { + return range; + } + + const childRanges: Range[] = range.getRanges(); + + // if a child range spans the current time, recurse into it + for (let j = 0; j < childRanges.length; j++) { + const childRange: Range = childRanges[j]; + + if (this._rangeSpansCurrentTime(childRange)) { + return this._getRangeForCurrentTime(childRange); + } + } + + // this range isn't navigable, and couldn't find a navigable child range. + // therefore return the parent range (if any). + return range.parentRange; + } + } + + return undefined; + } + + private _rangeSpansCurrentTime(range: Range): boolean { + if ( + range.spansTime(Math.ceil(this._canvasClockTime) + this._rangeSpanPadding) + ) { + return true; + } + + return false; + } + + private _rangeNavigable(range: Range): boolean { + const behavior: Behavior | null = range.getBehavior(); + + if (behavior && behavior.toString() === "no-nav") { + return false; + } + + return true; + } + + private _render(): void { + if (this.isVirtual() && AVComponent.newRanges && this.isVisible()) { + Logger.groupCollapsed("CanvasInstance._render()"); + Logger.log({ + dataRange: this._data.rangeId, + range: this.currentRange, + newLimitToRange: this.limitToRange, + constraintToRange: this._data.constrainNavigationToRange, + autoSelectRange: this._data.autoSelectRange, + }); + + // 3 ways to render: + // Limit to range + no id = show everything + // Limit to range + id = show everything in context + // No limit to range = show everything + // No limit -> Limit (+ range) = show just range + + // - Range id + limitToRange + // - Range id + // - nothing + + if (this.limitToRange && this.currentRange) { + Logger.log("Selecting plan...", this.currentRange); + this.timePlanPlayer.selectPlan({ rangeId: this.currentRange }); + } else { + Logger.log("Resetting..."); + this.timePlanPlayer.selectPlan({ reset: true }); + } + + const ratio = + (this._$canvasTimelineContainer.width() as number) / + this.timePlanPlayer.getDuration(); + this._$durationHighlight.show(); + + const { start, duration } = this.timePlanPlayer.getCurrentRange(); + + this._$canvasTimelineContainer.slider({ + value: this._canvasClockTime - this.timePlanPlayer.plan.start, + max: this.timePlanPlayer.getDuration(), + }); + + // set the start position and width + this._$durationHighlight.css({ + left: start * ratio, + width: duration * ratio, + }); + + Logger.groupEnd(); + + this._updateCurrentTimeDisplay(); + this._updateDurationDisplay(); + this.createWaveformPanel(); + } + + // Hide/show UI elements regardless of visibility. + if (this._data.limitToRange && this._data.range) { + this._$canvasTimelineContainer.hide(); + this._$rangeTimelineContainer.show(); + } else { + this._$canvasTimelineContainer.show(); + this._$rangeTimelineContainer.hide(); + } + + if (!this.currentRange) { + this._$durationHighlight.hide(); + } + + // Return early if the current CanvasInstance isn't visible + if (!this.isVisible()) { + return; + } + if (!this.isOnlyCanvasInstance && !this.isVirtual()) { + return; + } + + // Render otherwise. + if (this._data.range && !(this.isVirtual() && AVComponent.newRanges)) { + const duration: Duration | undefined = this._data.range.getDuration(); + + if (duration) { + // get the total length in seconds. + const totalDuration: number = this._getDuration(); + + // get the length of the timeline container + const timelineLength: number = + this._$canvasTimelineContainer.width() as number; + + // get the ratio of seconds to length + const ratio: number = timelineLength / totalDuration; + const totalLength = totalDuration * ratio; + const start: number = duration.start * ratio; + let end: number = duration.end * ratio; + + // if the end is on the next canvas + if (end > totalLength || end < start) { + end = totalLength; + } + + const width: number = end - start; + + if (this.isVirtual() || this.isOnlyCanvasInstance) { + this._$durationHighlight.show(); + // set the start position and width + this._$durationHighlight.css({ + left: start, + width: width, + }); + } else { + this._$durationHighlight.hide(); + } + + // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this; + + // try to destroy existing rangeTimelineContainer + if (this._$rangeTimelineContainer.data("ui-sortable")) { + this._$rangeTimelineContainer.slider("destroy"); + } + + this._$rangeTimelineContainer.slider({ + value: duration.start, + step: 0.01, + orientation: "horizontal", + range: "min", + min: duration.start, + max: duration.end, + animate: false, + create: function (evt: any, ui: any) { + // on create + }, + slide: function (evt: any, ui: any) { + that._setCurrentTime(ui.value); + }, + stop: function (evt: any, ui: any) { + //this._setCurrentTime(ui.value); + }, + }); + } + } + + this._updateCurrentTimeDisplay(); + this._updateDurationDisplay(); + this.createWaveformPanel(); + this.updateWaveformPanel(); + } + + public getCanvasId(): string | undefined { + if (this._data && this._data.canvas) { + return this._data.canvas.id; + } + + return undefined; + } + + private _updateHoverPreview( + e: any, + $container: JQuery, + duration: number + ): void { + const offset = $container.offset() || { left: 0 }; + + const x = e.pageX - offset.left; + + const $hoverArrow: JQuery = $container.find(".arrow"); + const $hoverHighlight: JQuery = $container.find(".hover-highlight"); + const $hoverPreview: JQuery = $container.find(".hover-preview"); + + $hoverHighlight.width(x); + + const fullWidth: number = $container.width() as number; + const ratio: number = x / fullWidth; + const seconds: number = Math.min(duration * ratio); + $hoverPreview.find(".label").text(formatTime(seconds)); + const hoverPreviewWidth: number = $hoverPreview.outerWidth() as number; + const hoverPreviewHeight: number = $hoverPreview.outerHeight() as number; + + let left: number = x - hoverPreviewWidth * 0.5; + let arrowLeft: number = hoverPreviewWidth * 0.5 - 6; + + if (left < 0) { + left = 0; + arrowLeft = x - 6; + } + + if (left + hoverPreviewWidth > fullWidth) { + left = fullWidth - hoverPreviewWidth; + arrowLeft = hoverPreviewWidth - (fullWidth - x) - 6; + } + + $hoverPreview + .css({ + left: left, + top: hoverPreviewHeight * -1 + "px", + }) + .show(); + + $hoverArrow.css({ + left: arrowLeft, + }); + } + + private _previous(isDouble: boolean): void { + if (AVComponent.newRanges && this.isVirtual()) { + if (this._data.limitToRange) { + this._setCurrentTime(this.timePlanPlayer.plan.start, false); + return; + } + + Logger.group("CanvasInstance.previous()"); + this._buffering = true; + const newTime = this.timePlanPlayer.previous(); + this._setCurrentTime(newTime); + Logger.log("CanvasInstance.previous()", newTime); + this._buffering = false; + Logger.groupEnd(); + return; + } + + if (this._data.limitToRange) { + // if only showing the range, single click rewinds, double click goes to previous range unless navigation is contrained to range + if (isDouble) { + if (this._isNavigationConstrainedToRange()) { + this._rewind(); + } else { + this.fire(CanvasInstanceEvents.PREVIOUS_RANGE); + } + } else { + this._rewind(); + } + } else { + // not limited to range. + // if there is a currentDuration, single click goes to previous range, double click clears current duration and rewinds. + // if there is no currentDuration, single and double click rewinds. + if (this._data.range) { + if (isDouble) { + this.set({ + range: undefined, + }); + this._rewind(); + } else { + this.fire(CanvasInstanceEvents.PREVIOUS_RANGE); + } + } else { + this._rewind(); + } + } + } + + private async _next(): Promise { + if (AVComponent.newRanges && this.isVirtual()) { + if (this._data.limitToRange) { + await this._setCurrentTime(this.timePlanPlayer.plan.end, false); + return; + } + + Logger.groupCollapsed("next"); + this._buffering = true; + const newTime = await this.timePlanPlayer.next(); + Logger.log("CanvasInstance.next()", newTime); + await this._setCurrentTime(newTime, false); + this._buffering = false; + Logger.groupEnd(); + return; + } + if (this._data.limitToRange) { + if (this._isNavigationConstrainedToRange()) { + this._fastforward(); + } else { + this.fire(CanvasInstanceEvents.NEXT_RANGE); + } + } else { + this.fire(CanvasInstanceEvents.NEXT_RANGE); + } + } + + public destroy(): void { + window.clearInterval(this._highPriorityInterval); + window.clearInterval(this._lowPriorityInterval); + window.clearInterval(this._canvasClockInterval); + } + + private _convertToPercentage(pixelValue: number, maxValue: number): number { + return convertToPercentage(pixelValue, maxValue); + } + + private _renderMediaElement(data: any): void { + const isProbed = this.options.data?.canvas?.externalResource?.isProbed; + let $mediaElement; + const type: string = data.type.toString().toLowerCase(); + + switch (type) { + case "video": + $mediaElement = $('