@omnimedia/omnitool 1.1.0-10 → 1.1.0-11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +1 -1
  2. package/s/context.ts +0 -7
  3. package/s/demo/demo.bundle.ts +30 -5
  4. package/s/demo/routines/waveform-test.ts +3 -2
  5. package/s/driver/driver.ts +2 -2
  6. package/s/timeline/parts/compositor/export.ts +5 -5
  7. package/s/timeline/parts/compositor/playback.ts +6 -7
  8. package/s/timeline/parts/compositor/samplers/webcodecs.ts +5 -4
  9. package/s/timeline/parts/waveform.ts +2 -3
  10. package/s/timeline/sugar/omni-test.ts +3 -1
  11. package/s/timeline/sugar/omni.ts +6 -1
  12. package/x/context.d.ts +1 -4
  13. package/x/context.js +1 -5
  14. package/x/context.js.map +1 -1
  15. package/x/demo/demo.bundle.js +18 -6
  16. package/x/demo/demo.bundle.js.map +1 -1
  17. package/x/demo/demo.bundle.min.js +577 -9
  18. package/x/demo/demo.bundle.min.js.map +4 -4
  19. package/x/demo/routines/waveform-test.d.ts +2 -1
  20. package/x/demo/routines/waveform-test.js +2 -2
  21. package/x/demo/routines/waveform-test.js.map +1 -1
  22. package/x/driver/driver.d.ts +1 -1
  23. package/x/driver/driver.js +1 -1
  24. package/x/driver/driver.js.map +1 -1
  25. package/x/index.html +2 -2
  26. package/x/timeline/parts/compositor/export.d.ts +3 -1
  27. package/x/timeline/parts/compositor/export.js +6 -6
  28. package/x/timeline/parts/compositor/export.js.map +1 -1
  29. package/x/timeline/parts/compositor/playback.d.ts +4 -2
  30. package/x/timeline/parts/compositor/playback.js +7 -8
  31. package/x/timeline/parts/compositor/playback.js.map +1 -1
  32. package/x/timeline/parts/compositor/samplers/webcodecs.d.ts +2 -1
  33. package/x/timeline/parts/compositor/samplers/webcodecs.js +1 -4
  34. package/x/timeline/parts/compositor/samplers/webcodecs.js.map +1 -1
  35. package/x/timeline/parts/waveform.d.ts +2 -1
  36. package/x/timeline/parts/waveform.js +1 -3
  37. package/x/timeline/parts/waveform.js.map +1 -1
  38. package/x/timeline/sugar/omni-test.js +3 -1
  39. package/x/timeline/sugar/omni-test.js.map +1 -1
  40. package/x/timeline/sugar/omni.d.ts +3 -0
  41. package/x/timeline/sugar/omni.js +6 -1
  42. package/x/timeline/sugar/omni.js.map +1 -1
  43. package/s/tools/common/loader.ts +0 -26
  44. package/s/tools/common/transformer-pipeline.ts +0 -26
  45. package/s/tools/speech-recognition/common/model.ts +0 -26
  46. package/s/tools/speech-recognition/whisper/fns/host.ts +0 -25
  47. package/s/tools/speech-recognition/whisper/fns/schematic.ts +0 -23
  48. package/s/tools/speech-recognition/whisper/fns/work.ts +0 -91
  49. package/s/tools/speech-recognition/whisper/parts/types.ts +0 -38
  50. package/s/tools/speech-recognition/whisper/parts/worker.bundle.ts +0 -7
  51. package/s/tools/speech-recognition/whisper/tool.ts +0 -70
  52. package/x/tools/common/loader.d.ts +0 -19
  53. package/x/tools/common/loader.js +0 -18
  54. package/x/tools/common/loader.js.map +0 -1
  55. package/x/tools/common/transformer-pipeline.d.ts +0 -8
  56. package/x/tools/common/transformer-pipeline.js +0 -24
  57. package/x/tools/common/transformer-pipeline.js.map +0 -1
  58. package/x/tools/speech-recognition/common/model.d.ts +0 -14
  59. package/x/tools/speech-recognition/common/model.js +0 -16
  60. package/x/tools/speech-recognition/common/model.js.map +0 -1
  61. package/x/tools/speech-recognition/whisper/fns/host.d.ts +0 -13
  62. package/x/tools/speech-recognition/whisper/fns/host.js +0 -19
  63. package/x/tools/speech-recognition/whisper/fns/host.js.map +0 -1
  64. package/x/tools/speech-recognition/whisper/fns/schematic.d.ts +0 -19
  65. package/x/tools/speech-recognition/whisper/fns/schematic.js +0 -2
  66. package/x/tools/speech-recognition/whisper/fns/schematic.js.map +0 -1
  67. package/x/tools/speech-recognition/whisper/fns/work.d.ts +0 -12
  68. package/x/tools/speech-recognition/whisper/fns/work.js +0 -74
  69. package/x/tools/speech-recognition/whisper/fns/work.js.map +0 -1
  70. package/x/tools/speech-recognition/whisper/parts/types.d.ts +0 -31
  71. package/x/tools/speech-recognition/whisper/parts/types.js +0 -2
  72. package/x/tools/speech-recognition/whisper/parts/types.js.map +0 -1
  73. package/x/tools/speech-recognition/whisper/parts/worker.bundle.d.ts +0 -1
  74. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js +0 -4
  75. package/x/tools/speech-recognition/whisper/parts/worker.bundle.js.map +0 -1
  76. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js +0 -8
  77. package/x/tools/speech-recognition/whisper/parts/worker.bundle.min.js.map +0 -7
  78. package/x/tools/speech-recognition/whisper/tool.d.ts +0 -12
  79. package/x/tools/speech-recognition/whisper/tool.js +0 -63
  80. package/x/tools/speech-recognition/whisper/tool.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnimedia/omnitool",
3
- "version": "1.1.0-10",
3
+ "version": "1.1.0-11",
4
4
  "description": "open source video processing tools",
5
5
  "license": "MIT",
6
6
  "author": "Przemysław Gałęzki",
package/s/context.ts CHANGED
@@ -1,7 +0,0 @@
1
- import {Driver} from "./driver/driver.js"
2
-
3
- const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url)
4
-
5
- export const context = {
6
- driver: Driver.setup({workerUrl})
7
- }
@@ -1,21 +1,46 @@
1
1
 
2
- import {context} from "../context.js"
2
+ import {Driver} from "../driver/driver.js"
3
3
  import {waveformTest} from "./routines/waveform-test.js"
4
4
  import {filmstripTest} from "./routines/filmstrip-test.js"
5
5
  import {transcriberTest} from "./routines/transcriber-test.js"
6
6
  import {setupTranscodeTest} from "./routines/transcode-test.js"
7
+ import {Datafile, Omni, VideoPlayer} from "../timeline/index.js"
7
8
 
8
- const driver = await context.driver
9
+ const driver = await Driver.setup()
9
10
  const results = document.querySelector(".results")!
10
11
 
11
12
  const fetchButton = document.querySelector(".fetch")
12
13
  const importButton = document.querySelector(".import") as HTMLButtonElement
13
14
 
15
+ const playButton = document.querySelector(".play") as HTMLButtonElement
16
+ const stopButton = document.querySelector(".stop") as HTMLButtonElement
17
+
14
18
  fetchButton?.addEventListener("click", startDemoFetch)
15
19
  importButton?.addEventListener("click", startDemoImport)
16
20
 
17
- waveformTest()
18
- const transcriber = await transcriberTest(driver)
21
+ const omni = new Omni(driver)
22
+ const file = await fetch("/assets/temp/gl.mp4")
23
+ const buffer = await file.arrayBuffer()
24
+ const uint = new Uint8Array(buffer)
25
+
26
+ const {videoA} = await omni.load({videoA: Datafile.make(uint)})
27
+ const timeline = omni.timeline(o =>
28
+ o.sequence(
29
+ o.stack(
30
+ o.video(videoA, {duration: 5000}),
31
+ o.audio(videoA, {duration: 8000})
32
+ ),
33
+ o.video(videoA, {duration: 7000})
34
+ ))
35
+
36
+ const player = await VideoPlayer.create(driver, timeline)
37
+ document.body.appendChild(player.canvas)
38
+
39
+ playButton.addEventListener("click", () => player.play())
40
+ stopButton.addEventListener("click", () => player.pause())
41
+
42
+ waveformTest(driver)
43
+ // const transcriber = await transcriberTest(driver)
19
44
 
20
45
  // hello world test
21
46
  {
@@ -32,7 +57,7 @@ async function startDemoImport()
32
57
  const transcode = setupTranscodeTest(driver, file)
33
58
  await filmstripTest(file)
34
59
  run(transcode, fileHandle.name)
35
- await transcriber.transcribe(file)
60
+ // await transcriber.transcribe(file)
36
61
  }
37
62
 
38
63
  async function startDemoFetch()
@@ -1,9 +1,10 @@
1
+ import {Driver} from "../../driver/driver.js"
1
2
  import {Waveform} from "../../timeline/parts/waveform.js"
2
3
 
3
- export async function waveformTest() {
4
+ export async function waveformTest(driver: Driver) {
4
5
  const container = document.querySelector(".waveform-demo") as HTMLElement
5
6
  const widthSlider = document.querySelector(".width") as HTMLInputElement
6
- const waveform = await Waveform.init("/assets/temp/gl.mp4", container)
7
+ const waveform = await Waveform.init(driver, "/assets/temp/gl.mp4", container)
7
8
 
8
9
  widthSlider.addEventListener("change", () => {
9
10
  const width = +widthSlider.value
@@ -11,11 +11,11 @@ export type DriverOptions = {
11
11
  }
12
12
 
13
13
  export class Driver {
14
- static async setup(options: DriverOptions) {
14
+ static async setup(options?: DriverOptions) {
15
15
  const machina = new Machina()
16
16
  const thread = await Comrade.thread<DriverSchematic>({
17
17
  label: "OmnitoolDriver",
18
- workerUrl: options.workerUrl,
18
+ workerUrl: options?.workerUrl ?? "/node_modules/@omnimedia/omnitool/x/driver/driver.bundle.min.js",
19
19
  setupHost: setupDriverHost(machina),
20
20
  })
21
21
  return new this(machina, thread)
@@ -1,6 +1,6 @@
1
1
  import {TimelineFile} from "../basics.js"
2
- import {context} from "../../../context.js"
3
2
  import {fixedStep} from "./parts/schedulers.js"
3
+ import {Driver} from "../../../driver/driver.js"
4
4
  import {makeWebCodecsSampler} from "./samplers/webcodecs.js"
5
5
  import {DecoderSource} from "../../../driver/fns/schematic.js"
6
6
  import {buildWebCodecsNodeTree} from "./parts/webcodecs-tree.js"
@@ -8,10 +8,11 @@ import {buildWebCodecsNodeTree} from "./parts/webcodecs-tree.js"
8
8
  export class Export {
9
9
  #sampler
10
10
  constructor(
11
+ private driver: Driver,
11
12
  private framerate = 30,
12
13
  private resolveMedia: (hash: string) => DecoderSource = _hash => "/assets/temp/gl.mp4"
13
14
  ) {
14
- this.#sampler = makeWebCodecsSampler(this.resolveMedia)
15
+ this.#sampler = makeWebCodecsSampler(this.driver, this.resolveMedia)
15
16
  }
16
17
 
17
18
  async #build(timeline: TimelineFile) {
@@ -23,11 +24,10 @@ export class Export {
23
24
  async render(timeline: TimelineFile) {
24
25
  const root = await this.#build(timeline)
25
26
 
26
- const driver = await context.driver
27
27
  const videoStream = new TransformStream<VideoFrame, VideoFrame>()
28
28
  const audioStream = new TransformStream<AudioData, AudioData>()
29
29
 
30
- const encodePromise = driver.encode({
30
+ const encodePromise = this.driver.encode({
31
31
  video: videoStream.readable,
32
32
  audio: audioStream.readable,
33
33
  config: {
@@ -56,7 +56,7 @@ export class Export {
56
56
  {fps: this.framerate, duration: root.duration ?? 0},
57
57
  async t => {
58
58
  const layers = await root.visuals?.sampleAt(t) ?? []
59
- const composed = await driver.composite(layers)
59
+ const composed = await this.driver.composite(layers)
60
60
  const vf = new VideoFrame(composed, {
61
61
  timestamp: Math.round(i * dt * 1_000_000),
62
62
  duration: Math.round(dt * 1_000_000),
@@ -1,6 +1,6 @@
1
1
  import {TimelineFile} from "../basics.js"
2
- import {context} from "../../../context.js"
3
2
  import {realtime} from "./parts/schedulers.js"
3
+ import {Driver} from "../../../driver/driver.js"
4
4
  import {makeHtmlSampler} from "./samplers/html.js"
5
5
  import {buildHTMLNodeTree} from "./parts/html-tree.js"
6
6
  import {DecoderSource} from "../../../driver/fns/schematic.js"
@@ -12,6 +12,7 @@ export class VideoPlayer {
12
12
  #controller = realtime(t => this.#tick(t))
13
13
 
14
14
  constructor(
15
+ private driver: Driver,
15
16
  public canvas: HTMLCanvasElement,
16
17
  private root: Node<AudioPlaybackComponent>,
17
18
  private sampler: HTMLSampler,
@@ -24,7 +25,7 @@ export class VideoPlayer {
24
25
  return this.canvas.getContext("2d")!
25
26
  }
26
27
 
27
- static async create(timeline: TimelineFile) {
28
+ static async create(driver: Driver, timeline: TimelineFile) {
28
29
  const rootItem = new Map(timeline.items.map(i => [i.id, i])).get(timeline.rootId)!
29
30
  const items = new Map(timeline.items.map(i => [i.id, i]))
30
31
  const sampler = makeHtmlSampler(() => "/assets/temp/gl.mp4")
@@ -32,16 +33,15 @@ export class VideoPlayer {
32
33
  const canvas = document.createElement("canvas")
33
34
  canvas.width = 1920
34
35
  canvas.height = 1080
35
- return new this(canvas, root, sampler)
36
+ return new this(driver, canvas, root, sampler)
36
37
  }
37
38
 
38
39
  async #tick(t: number) {
39
- const driver = await context.driver
40
40
  const dur = this.root.duration
41
41
  const tt = t > dur ? dur : t
42
42
  this.root.audio?.onTimeUpdate(tt)
43
43
  for (const layer of await this.root.visuals?.sampleAt(tt) ?? []) {
44
- const frame = await driver.composite(layer)
44
+ const frame = await this.driver.composite(layer)
45
45
  this.context.drawImage(frame, 0, 0)
46
46
  frame.close()
47
47
  }
@@ -63,12 +63,11 @@ export class VideoPlayer {
63
63
  }
64
64
 
65
65
  async seek(time: number) {
66
- const driver = await context.driver
67
66
  this.pause()
68
67
  this.#controller.seek(time)
69
68
  this.root.audio?.onTimeUpdate(time)
70
69
  for (const draw of await this.root.visuals?.sampleAt(time) ?? []) {
71
- const frame = await driver.composite(draw)
70
+ const frame = await this.driver.composite(draw)
72
71
  this.context.drawImage(frame, 0, 0)
73
72
  frame.close()
74
73
  }
@@ -1,18 +1,20 @@
1
1
  import {Item} from "../../item.js"
2
- import {context} from "../../../../context.js"
2
+ import {Driver} from "../../../../driver/driver.js"
3
3
  import {WebcodecsSampler} from "../parts/tree-builder.js"
4
4
  import {VideoCursor} from "../../../utils/video-cursor.js"
5
5
  import {AudioStream} from "../../../utils/audio-stream.js"
6
6
 
7
7
  const toUs = (seconds: number) => Math.round(seconds * 1_000_000)
8
8
 
9
- export function makeWebCodecsSampler(resolveMedia: (hash: string) => any): WebcodecsSampler {
9
+ export function makeWebCodecsSampler(
10
+ driver: Driver,
11
+ resolveMedia: (hash: string) => any
12
+ ): WebcodecsSampler {
10
13
  const videoCursors = new Map<number, VideoCursor>()
11
14
 
12
15
  async function getCursorForVideo(videoItem: Item.Video): Promise<VideoCursor> {
13
16
  const existing = videoCursors.get(videoItem.id)
14
17
  if (existing) return existing
15
- const driver = await context.driver
16
18
  const source = resolveMedia(videoItem.mediaHash)
17
19
  const video = driver.decodeVideo({source})
18
20
  const cursor = new VideoCursor(video.getReader())
@@ -39,7 +41,6 @@ export function makeWebCodecsSampler(resolveMedia: (hash: string) => any): Webco
39
41
  duration: item.duration,
40
42
  audio: {
41
43
  getStream: async function*() {
42
- const driver = await context.driver
43
44
  const source = resolveMedia(item.mediaHash)
44
45
  const startUs = item.start
45
46
  const endUs = (item.start + item.duration)
@@ -1,6 +1,6 @@
1
1
  import WaveSurfer from "wavesurfer.js"
2
2
 
3
- import {context} from "../../context.js"
3
+ import {Driver} from "../../driver/driver.js"
4
4
  import {DecoderSource} from "../../driver/fns/schematic.js"
5
5
 
6
6
  export class Waveform {
@@ -19,8 +19,7 @@ export class Waveform {
19
19
  })
20
20
  }
21
21
 
22
- static async init(source: DecoderSource, container: HTMLElement) {
23
- const driver = await context.driver
22
+ static async init(driver: Driver, source: DecoderSource, container: HTMLElement) {
24
23
  const reader = driver.decodeAudio({source}).getReader()
25
24
 
26
25
  const peaks: number[] = []
@@ -1,12 +1,14 @@
1
1
 
2
2
  import {Omni} from "./omni.js"
3
+ import {Driver} from "../../driver/driver.js"
3
4
  import {dummyData} from "../utils/dummy-data.js"
4
5
 
6
+ const driver = await Driver.setup()
5
7
  //
6
8
  // create an omni context
7
9
  //
8
10
 
9
- const omni = new Omni()
11
+ const omni = new Omni(driver)
10
12
 
11
13
  //
12
14
  // load in some media resources
@@ -2,6 +2,7 @@
2
2
  import {O} from "./o.js"
3
3
  import {Item} from "../parts/item.js"
4
4
  import {Media} from "../parts/media.js"
5
+ import {Driver} from "../../driver/driver.js"
5
6
  import {Datafile} from "../utils/datafile.js"
6
7
  import {TimelineFile} from "../parts/basics.js"
7
8
  import {Export} from "../parts/compositor/export.js"
@@ -10,7 +11,11 @@ import {RenderConfig} from "../../driver/fns/schematic.js"
10
11
 
11
12
  export class Omni {
12
13
  resources = new ResourcePool()
13
- #export = new Export()
14
+ #export: Export
15
+
16
+ constructor(private driver: Driver) {
17
+ this.#export = new Export(driver)
18
+ }
14
19
 
15
20
  load = async<S extends Record<string, Promise<Datafile>>>(spec: S) => {
16
21
  return Object.fromEntries(await Promise.all(Object.entries(spec).map(
package/x/context.d.ts CHANGED
@@ -1,4 +1 @@
1
- import { Driver } from "./driver/driver.js";
2
- export declare const context: {
3
- driver: Promise<Driver>;
4
- };
1
+ export {};
package/x/context.js CHANGED
@@ -1,6 +1,2 @@
1
- import { Driver } from "./driver/driver.js";
2
- const workerUrl = new URL("../driver/driver.worker.bundle.min.js", import.meta.url);
3
- export const context = {
4
- driver: Driver.setup({ workerUrl })
5
- };
1
+ export {};
6
2
  //# sourceMappingURL=context.js.map
package/x/context.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../s/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,oBAAoB,CAAA;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,uCAAuC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEnF,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAC,SAAS,EAAC,CAAC;CACjC,CAAA"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../s/context.ts"],"names":[],"mappings":""}
@@ -1,16 +1,28 @@
1
- import { context } from "../context.js";
1
+ import { Driver } from "../driver/driver.js";
2
2
  import { waveformTest } from "./routines/waveform-test.js";
3
3
  import { filmstripTest } from "./routines/filmstrip-test.js";
4
- import { transcriberTest } from "./routines/transcriber-test.js";
5
4
  import { setupTranscodeTest } from "./routines/transcode-test.js";
6
- const driver = await context.driver;
5
+ import { Datafile, Omni, VideoPlayer } from "../timeline/index.js";
6
+ const driver = await Driver.setup();
7
7
  const results = document.querySelector(".results");
8
8
  const fetchButton = document.querySelector(".fetch");
9
9
  const importButton = document.querySelector(".import");
10
+ const playButton = document.querySelector(".play");
11
+ const stopButton = document.querySelector(".stop");
10
12
  fetchButton?.addEventListener("click", startDemoFetch);
11
13
  importButton?.addEventListener("click", startDemoImport);
12
- waveformTest();
13
- const transcriber = await transcriberTest(driver);
14
+ const omni = new Omni(driver);
15
+ const file = await fetch("/assets/temp/gl.mp4");
16
+ const buffer = await file.arrayBuffer();
17
+ const uint = new Uint8Array(buffer);
18
+ const { videoA } = await omni.load({ videoA: Datafile.make(uint) });
19
+ const timeline = omni.timeline(o => o.sequence(o.stack(o.video(videoA, { duration: 5000 }), o.audio(videoA, { duration: 8000 })), o.video(videoA, { duration: 7000 })));
20
+ const player = await VideoPlayer.create(driver, timeline);
21
+ document.body.appendChild(player.canvas);
22
+ playButton.addEventListener("click", () => player.play());
23
+ stopButton.addEventListener("click", () => player.pause());
24
+ waveformTest(driver);
25
+ // const transcriber = await transcriberTest(driver)
14
26
  // hello world test
15
27
  {
16
28
  await driver.thread.work.hello();
@@ -26,7 +38,7 @@ async function startDemoImport() {
26
38
  const transcode = setupTranscodeTest(driver, file);
27
39
  await filmstripTest(file);
28
40
  run(transcode, fileHandle.name);
29
- await transcriber.transcribe(file);
41
+ // await transcriber.transcribe(file)
30
42
  }
31
43
  async function startDemoFetch() {
32
44
  // which videos to run tests on
@@ -1 +1 @@
1
- {"version":3,"file":"demo.bundle.js","sourceRoot":"","sources":["../../s/demo/demo.bundle.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAC,kBAAkB,EAAC,MAAM,8BAA8B,CAAA;AAE/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAA;AACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAE,CAAA;AAEnD,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;AACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAsB,CAAA;AAE3E,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;AACtD,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;AAExD,YAAY,EAAE,CAAA;AACd,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;AAEjD,mBAAmB;AACnB,CAAC;IACA,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;IAChC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;;QACxD,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;AACrD,CAAC;AAED,oBAAoB;AACpB,KAAK,UAAU,eAAe;IAE7B,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAA;IACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;IACvC,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IACzB,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,KAAK,UAAU,cAAc;IAG5B,+BAA+B;IAC/B,MAAM,MAAM,GAAG;QACd,qBAAqB;KACrB,CAAA;IAED,gCAAgC;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACpB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,SAAgD,EAAE,KAAa;IACjF,oBAAoB;IACpB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IACzC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAEnB,kBAAkB;IAClB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACrC,CAAC,CAAC,WAAW,GAAG,KAAK,CAAA;IACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAEb,wBAAwB;IACxB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAE5B,eAAe;IACf,MAAM,SAAS,CAAC,GAAG,EAAE,CAAA;AACtB,CAAC"}
1
+ {"version":3,"file":"demo.bundle.js","sourceRoot":"","sources":["../../s/demo/demo.bundle.ts"],"names":[],"mappings":"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"}