@idetik/core 0.1.0 → 0.2.0

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 (42) hide show
  1. package/dist/assets/worker_kernel-BYKAkuPZ.js.map +1 -1
  2. package/dist/index.d.ts +164 -153
  3. package/dist/index.js +992 -916
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.umd.cjs +18 -18
  6. package/dist/index.umd.cjs.map +1 -1
  7. package/dist/types/examples/chunk_streaming/chunk_info_overlay.d.ts.map +1 -1
  8. package/dist/types/src/core/chunk_manager.d.ts +12 -7
  9. package/dist/types/src/core/chunk_manager.d.ts.map +1 -1
  10. package/dist/types/src/core/chunk_store.d.ts +18 -0
  11. package/dist/types/src/core/chunk_store.d.ts.map +1 -0
  12. package/dist/types/src/core/chunk_store_view.d.ts +38 -0
  13. package/dist/types/src/core/chunk_store_view.d.ts.map +1 -0
  14. package/dist/types/src/core/layer.d.ts +6 -2
  15. package/dist/types/src/core/layer.d.ts.map +1 -1
  16. package/dist/types/src/core/layer_manager.d.ts.map +1 -1
  17. package/dist/types/src/core/renderable_object.d.ts +4 -0
  18. package/dist/types/src/core/renderable_object.d.ts.map +1 -1
  19. package/dist/types/src/data/chunk.d.ts +7 -5
  20. package/dist/types/src/data/chunk.d.ts.map +1 -1
  21. package/dist/types/src/data/ome_zarr/image_source.d.ts +1 -12
  22. package/dist/types/src/data/ome_zarr/image_source.d.ts.map +1 -1
  23. package/dist/types/src/data/zarr/open.d.ts +1 -4
  24. package/dist/types/src/data/zarr/open.d.ts.map +1 -1
  25. package/dist/types/src/idetik.d.ts.map +1 -1
  26. package/dist/types/src/index.d.ts +0 -1
  27. package/dist/types/src/index.d.ts.map +1 -1
  28. package/dist/types/src/layers/chunked_image_layer.d.ts +8 -7
  29. package/dist/types/src/layers/chunked_image_layer.d.ts.map +1 -1
  30. package/dist/types/src/objects/renderable/volume_renderable.d.ts.map +1 -1
  31. package/dist/types/src/renderers/WebGLState.d.ts +4 -0
  32. package/dist/types/src/renderers/WebGLState.d.ts.map +1 -1
  33. package/dist/types/src/renderers/webgl_renderer.d.ts.map +1 -1
  34. package/dist/types/src/utilities/logger.d.ts +1 -1
  35. package/dist/types/src/utilities/logger.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/types/examples/s3_private_data/aws_auth.d.ts +0 -17
  38. package/dist/types/examples/s3_private_data/aws_auth.d.ts.map +0 -1
  39. package/dist/types/examples/s3_private_data/main.d.ts +0 -2
  40. package/dist/types/examples/s3_private_data/main.d.ts.map +0 -1
  41. package/dist/types/src/core/chunk_manager_source.d.ts +0 -49
  42. package/dist/types/src/core/chunk_manager_source.d.ts.map +0 -1
package/dist/index.d.ts CHANGED
@@ -70,14 +70,16 @@ declare class PromiseScheduler {
70
70
  declare const chunkDataTypes: readonly [Int8ArrayConstructor, Int16ArrayConstructor, Int32ArrayConstructor, Uint8ArrayConstructor, Uint16ArrayConstructor, Uint32ArrayConstructor, Float32ArrayConstructor];
71
71
  type ChunkDataConstructor = (typeof chunkDataTypes)[number];
72
72
  type ChunkData = InstanceType<ChunkDataConstructor>;
73
- type Chunk = {
74
- data?: ChunkData;
75
- state: "unloaded" | "queued" | "loading" | "loaded";
76
- lod: number;
73
+ type ChunkViewState = {
77
74
  visible: boolean;
78
75
  prefetch: boolean;
79
76
  priority: number | null;
80
77
  orderKey: number | null;
78
+ };
79
+ type Chunk = {
80
+ data?: ChunkData;
81
+ state: "unloaded" | "queued" | "loading" | "loaded";
82
+ lod: number;
81
83
  shape: {
82
84
  x: number;
83
85
  y: number;
@@ -102,7 +104,7 @@ type Chunk = {
102
104
  y: number;
103
105
  z: number;
104
106
  };
105
- };
107
+ } & ChunkViewState;
106
108
  type SourceDimensionMap = {
107
109
  x: SourceDimension;
108
110
  y: SourceDimension;
@@ -146,6 +148,23 @@ type ChunkLoader = {
146
148
  getAttributes(): ReadonlyArray<LoaderAttributes>;
147
149
  };
148
150
 
151
+ declare class ChunkStore {
152
+ private readonly chunks_;
153
+ private readonly loader_;
154
+ private readonly lowestResLOD_;
155
+ private readonly dimensions_;
156
+ constructor(loader: ChunkLoader);
157
+ getChunksAtTime(timeIndex: number): Chunk[];
158
+ getTimeIndex(sliceCoords: SliceCoordinates): number;
159
+ get lodCount(): number;
160
+ get dimensions(): SourceDimensionMap;
161
+ getLowestResLOD(): number;
162
+ loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;
163
+ private validateXYScaleRatios;
164
+ private getAndValidateTimeDimension;
165
+ private getAndValidateChannelDimension;
166
+ }
167
+
149
168
  declare class Box3 {
150
169
  min: vec3;
151
170
  max: vec3;
@@ -243,6 +262,31 @@ declare class Color {
243
262
  private toHexComponent;
244
263
  }
245
264
 
265
+ declare class Box2 {
266
+ min: vec2;
267
+ max: vec2;
268
+ /**
269
+ * Initializes as an empty box if no values are provided using the
270
+ * "empty-by-sentinel" pattern: min = +Infinity, max = -Infinity.
271
+ * This allows expansion functions to work without special-casing
272
+ * the first element, and avoids biasing toward (0,0).
273
+ */
274
+ constructor(min?: vec2, max?: vec2);
275
+ clone(): Box2;
276
+ isEmpty(): boolean;
277
+ static intersects(a: Box2, b: Box2): boolean;
278
+ static equals(a: Box2, b: Box2): boolean;
279
+ floor(): Box2;
280
+ toRect(): {
281
+ x: number;
282
+ y: number;
283
+ width: number;
284
+ height: number;
285
+ };
286
+ }
287
+
288
+ type CullingMode = "none" | "front" | "back" | "both";
289
+
246
290
  declare abstract class RenderableObject extends Node {
247
291
  wireframeEnabled: boolean;
248
292
  wireframeColor: Color;
@@ -252,6 +296,7 @@ declare abstract class RenderableObject extends Node {
252
296
  private geometry_;
253
297
  private wireframeGeometry_;
254
298
  private programName_;
299
+ private cullFaceMode_;
255
300
  setTexture(index: number, texture: Texture): void;
256
301
  popStaleTextures(): Texture[];
257
302
  get geometry(): Geometry;
@@ -262,6 +307,8 @@ declare abstract class RenderableObject extends Node {
262
307
  get programName(): Shader;
263
308
  get boundingBox(): Box3;
264
309
  protected set programName(programName: Shader);
310
+ get cullFaceMode(): CullingMode;
311
+ set cullFaceMode(mode: CullingMode);
265
312
  /**
266
313
  * Get uniforms for shader program. Override in derived classes that need custom uniforms.
267
314
  * @returns Object containing uniform name-value pairs
@@ -296,135 +343,6 @@ declare abstract class Camera extends RenderableObject {
296
343
  clipToWorld(position: vec3): vec3;
297
344
  }
298
345
 
299
- declare class Box2 {
300
- min: vec2;
301
- max: vec2;
302
- /**
303
- * Initializes as an empty box if no values are provided using the
304
- * "empty-by-sentinel" pattern: min = +Infinity, max = -Infinity.
305
- * This allows expansion functions to work without special-casing
306
- * the first element, and avoids biasing toward (0,0).
307
- */
308
- constructor(min?: vec2, max?: vec2);
309
- clone(): Box2;
310
- isEmpty(): boolean;
311
- static intersects(a: Box2, b: Box2): boolean;
312
- static equals(a: Box2, b: Box2): boolean;
313
- floor(): Box2;
314
- toRect(): {
315
- x: number;
316
- y: number;
317
- width: number;
318
- height: number;
319
- };
320
- }
321
-
322
- declare class OrthographicCamera extends Camera {
323
- private width_;
324
- private height_;
325
- private viewportAspectRatio_;
326
- private viewportSize_;
327
- constructor(left: number, right: number, top: number, bottom: number, near?: number, far?: number);
328
- get viewportSize(): [number, number];
329
- setAspectRatio(aspectRatio: number): void;
330
- setFrame(left: number, right: number, bottom: number, top: number): void;
331
- get type(): CameraType;
332
- zoom(factor: number): void;
333
- getWorldViewRect(): Box2;
334
- protected updateProjectionMatrix(): void;
335
- }
336
-
337
- declare const ALL_CATEGORIES: readonly ["fallbackVisible", "prefetchTime", "visibleCurrent", "fallbackBackground", "prefetchSpace"];
338
- type PriorityCategory = (typeof ALL_CATEGORIES)[number];
339
- type ImageSourcePolicyConfig = {
340
- profile?: string;
341
- prefetch: {
342
- x: number;
343
- y: number;
344
- z?: number;
345
- t?: number;
346
- };
347
- priorityOrder: PriorityCategory[];
348
- lod?: {
349
- min?: number;
350
- max?: number;
351
- bias?: number;
352
- };
353
- };
354
- type ImageSourcePolicy = Readonly<{
355
- profile: string;
356
- prefetch: {
357
- x: number;
358
- y: number;
359
- z: number;
360
- t: number;
361
- };
362
- priorityOrder: readonly PriorityCategory[];
363
- priorityMap: Readonly<Record<PriorityCategory, number>>;
364
- lod: {
365
- min: number;
366
- max: number;
367
- bias: number;
368
- };
369
- }>;
370
- declare function createImageSourcePolicy(config: ImageSourcePolicyConfig): ImageSourcePolicy;
371
- declare function createExplorationPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
372
- declare function createPlaybackPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
373
- declare function createNoPrefetchPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
374
-
375
- declare class ChunkManagerSource {
376
- private readonly chunks_;
377
- private readonly loader_;
378
- private readonly lowestResLOD_;
379
- private readonly sliceCoords_;
380
- private readonly dimensions_;
381
- private readonly tIndicesWithQueuedChunks_;
382
- private readonly sourceMaxSquareDistance2D_;
383
- private policy_;
384
- private policyChanged_;
385
- private currentLOD_;
386
- private lastViewBounds2D_;
387
- private lastZBounds_?;
388
- private lastTCoord_?;
389
- constructor(loader: ChunkLoader, sliceCoords: SliceCoordinates, policy: ImageSourcePolicy);
390
- getChunks(): Chunk[];
391
- getChunksAtCurrentTime(): Chunk[];
392
- private getCurrentTimeIndex;
393
- allVisibleLowestLODLoaded(): boolean;
394
- updateAndCollectChunkChanges(lodFactor: number, viewBounds2D: Box2): Chunk[];
395
- get lodCount(): number;
396
- get dimensions(): SourceDimensionMap;
397
- get currentLOD(): number;
398
- setImageSourcePolicy(newPolicy: ImageSourcePolicy, key: symbol): void;
399
- loadChunkData(chunk: Chunk, signal: AbortSignal): Promise<void>;
400
- private setLOD;
401
- private updateAndCollectChunkChangesForCurrentLod;
402
- private disposeStaleTimeChunks;
403
- private updateChunksAtTimeIndex;
404
- private markTimeChunksForPrefetch;
405
- private isChunkChannelInSlice;
406
- private shouldDispose;
407
- private disposeChunk;
408
- private computePriority;
409
- private validateXYScaleRatios;
410
- private getAndValidateTimeDimension;
411
- private getAndValidateChannelDimension;
412
- private isChunkWithinBounds;
413
- private getZBounds;
414
- private viewBounds2DChanged;
415
- private zBoundsChanged;
416
- private getPaddedBounds;
417
- private squareDistance2D;
418
- }
419
-
420
- declare class ChunkManager {
421
- private readonly sources_;
422
- private readonly pendingSources_;
423
- private readonly queue_;
424
- addSource(source: ChunkSource, sliceCoords: SliceCoordinates, policy: ImageSourcePolicy): Promise<ChunkManagerSource>;
425
- update(camera: OrthographicCamera, bufferWidth: number): void;
426
- }
427
-
428
346
  declare const eventTypes: readonly ["pointerdown", "pointermove", "pointerup", "pointercancel", "wheel"];
429
347
  type EventType = (typeof eventTypes)[number];
430
348
  declare class EventContext {
@@ -457,6 +375,9 @@ interface LayerOptions {
457
375
  opacity?: number;
458
376
  blendMode?: blendMode;
459
377
  }
378
+ type RenderContext = {
379
+ viewport: Viewport;
380
+ };
460
381
  declare abstract class Layer {
461
382
  abstract readonly type: string;
462
383
  private objects_;
@@ -468,10 +389,10 @@ declare abstract class Layer {
468
389
  constructor({ transparent, opacity, blendMode, }?: LayerOptions);
469
390
  get opacity(): number;
470
391
  set opacity(value: number);
471
- abstract update(): void;
392
+ abstract update(context?: RenderContext): void;
472
393
  onEvent(_: EventContext): void;
473
394
  onAttached(_context: IdetikContext): Promise<void>;
474
- onDetached(): void;
395
+ onDetached(_context: IdetikContext): void;
475
396
  get objects(): RenderableObject[];
476
397
  get state(): LayerState;
477
398
  addStateChangeCallback(callback: StateChangeCallback): void;
@@ -501,6 +422,21 @@ declare class LayerManager {
501
422
  removeLayersChangeCallback(callback: () => void): void;
502
423
  }
503
424
 
425
+ declare class OrthographicCamera extends Camera {
426
+ private width_;
427
+ private height_;
428
+ private viewportAspectRatio_;
429
+ private viewportSize_;
430
+ constructor(left: number, right: number, top: number, bottom: number, near?: number, far?: number);
431
+ get viewportSize(): [number, number];
432
+ setAspectRatio(aspectRatio: number): void;
433
+ setFrame(left: number, right: number, bottom: number, top: number): void;
434
+ get type(): CameraType;
435
+ zoom(factor: number): void;
436
+ getWorldViewRect(): Box2;
437
+ protected updateProjectionMatrix(): void;
438
+ }
439
+
504
440
  interface CameraControls {
505
441
  onEvent(event: EventContext): void;
506
442
  }
@@ -545,6 +481,91 @@ declare class Viewport {
545
481
  }
546
482
  declare function parseViewportConfigs(viewportConfigs: ViewportConfig[], canvas: HTMLCanvasElement, context: IdetikContext): Viewport[];
547
483
 
484
+ declare const ALL_CATEGORIES: readonly ["fallbackVisible", "prefetchTime", "visibleCurrent", "fallbackBackground", "prefetchSpace"];
485
+ type PriorityCategory = (typeof ALL_CATEGORIES)[number];
486
+ type ImageSourcePolicyConfig = {
487
+ profile?: string;
488
+ prefetch: {
489
+ x: number;
490
+ y: number;
491
+ z?: number;
492
+ t?: number;
493
+ };
494
+ priorityOrder: PriorityCategory[];
495
+ lod?: {
496
+ min?: number;
497
+ max?: number;
498
+ bias?: number;
499
+ };
500
+ };
501
+ type ImageSourcePolicy = Readonly<{
502
+ profile: string;
503
+ prefetch: {
504
+ x: number;
505
+ y: number;
506
+ z: number;
507
+ t: number;
508
+ };
509
+ priorityOrder: readonly PriorityCategory[];
510
+ priorityMap: Readonly<Record<PriorityCategory, number>>;
511
+ lod: {
512
+ min: number;
513
+ max: number;
514
+ bias: number;
515
+ };
516
+ }>;
517
+ declare function createImageSourcePolicy(config: ImageSourcePolicyConfig): ImageSourcePolicy;
518
+ declare function createExplorationPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
519
+ declare function createPlaybackPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
520
+ declare function createNoPrefetchPolicy(overrides?: Partial<ImageSourcePolicyConfig>): ImageSourcePolicy;
521
+
522
+ declare class ChunkStoreView {
523
+ private readonly store_;
524
+ private policy_;
525
+ private policyChanged_;
526
+ private currentLOD_;
527
+ private lastViewBounds2D_;
528
+ private lastZBounds_?;
529
+ private lastTCoord_?;
530
+ private sourceMaxSquareDistance2D_;
531
+ private readonly chunkViewStates_;
532
+ constructor(store: ChunkStore, policy: ImageSourcePolicy);
533
+ get store(): ChunkStore;
534
+ get chunkViewStates(): ReadonlyMap<Chunk, ChunkViewState>;
535
+ getChunksToRender(sliceCoords: SliceCoordinates): Chunk[];
536
+ updateChunkStates(sliceCoords: SliceCoordinates, viewport: Viewport): void;
537
+ allVisibleLowestLODLoaded(sliceCoords: SliceCoordinates): boolean;
538
+ get currentLOD(): number;
539
+ maybeForgetChunk(chunk: Chunk): void;
540
+ setImageSourcePolicy(newPolicy: ImageSourcePolicy, key: symbol): void;
541
+ private setLOD;
542
+ private updateChunkViewStates;
543
+ private isChunkChannelInSlice;
544
+ private updateChunksAtTimeIndex;
545
+ private markTimeChunksForPrefetch;
546
+ private computePriority;
547
+ private isChunkWithinBounds;
548
+ private getZBounds;
549
+ private viewBounds2DChanged;
550
+ private zBoundsChanged;
551
+ private getPaddedBounds;
552
+ private squareDistance2D;
553
+ }
554
+
555
+ declare class ChunkManager {
556
+ private readonly stores_;
557
+ private readonly pendingStores_;
558
+ private readonly views_;
559
+ private readonly queue_;
560
+ addView(source: ChunkSource, policy: ImageSourcePolicy): Promise<ChunkStoreView>;
561
+ removeView(view: ChunkStoreView): void;
562
+ private addSource;
563
+ private getSourceForStore;
564
+ update(): void;
565
+ private updateAndCollectChunkChanges;
566
+ private aggregateChunkViewStates;
567
+ }
568
+
548
569
  type Overlay = {
549
570
  update(idetik: Idetik, timestamp?: DOMHighResTimeStamp): void;
550
571
  };
@@ -788,7 +809,7 @@ declare class ChunkedImageLayer extends Layer implements ChannelsEnabled {
788
809
  private readonly channelChangeCallbacks_;
789
810
  private policy_;
790
811
  private channelProps_?;
791
- private chunkManagerSource_?;
812
+ private chunkStoreView_?;
792
813
  private pointerDownPos_;
793
814
  private zPrevPointWorld_?;
794
815
  private debugMode_;
@@ -798,14 +819,15 @@ declare class ChunkedImageLayer extends Layer implements ChannelsEnabled {
798
819
  private readonly wireframeColors_;
799
820
  constructor({ source, sliceCoords, policy, channelProps, onPickValue, ...layerOptions }: ChunkedImageLayerProps);
800
821
  onAttached(context: IdetikContext): Promise<void>;
801
- onDetached(): void;
802
- update(): void;
822
+ onDetached(context: IdetikContext): void;
823
+ update(context?: RenderContext): void;
803
824
  private updateChunks;
804
825
  get lastPresentationTimeCoord(): number | undefined;
805
826
  private isPresentationStale;
806
827
  private resliceIfZChanged;
807
828
  onEvent(event: EventContext): void;
808
- get chunkManagerSource(): ChunkManagerSource | undefined;
829
+ get chunkStoreView(): ChunkStoreView | undefined;
830
+ get sliceCoords(): SliceCoordinates;
809
831
  get source(): ChunkSource;
810
832
  get imageSourcePolicy(): Readonly<ImageSourcePolicy>;
811
833
  set imageSourcePolicy(newPolicy: ImageSourcePolicy);
@@ -1570,28 +1592,17 @@ type OmeroChannel = OmeroMetadata["channels"][number];
1570
1592
  declare function loadOmeroChannels(source: OmeZarrImageSource): Promise<OmeroChannel[]>;
1571
1593
  declare function loadOmeroDefaults(source: OmeZarrImageSource): Promise<OmeroMetadata["rdefs"]>;
1572
1594
 
1573
- /** Options for customizing fetch requests, such as adding authentication headers for private S3 data */
1574
- type FetchOptions = {
1575
- /** RequestInit overrides to customize fetch behavior (e.g., custom headers for S3 authentication) */
1576
- overrides?: RequestInit;
1577
- /** Whether to use suffix requests for range queries */
1578
- useSuffixRequest?: boolean;
1579
- };
1580
1595
  /** Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory. */
1581
1596
  declare class OmeZarrImageSource {
1582
1597
  readonly location: Location<Readable>;
1583
1598
  readonly version?: Version;
1584
- readonly fetchOptions?: FetchOptions;
1585
1599
  /**
1586
1600
  * @param url URL of Zarr root
1587
- * @param version OME-Zarr version
1588
- * @param fetchOptions Optional fetch configuration (e.g., authentication headers for private S3 data)
1589
1601
  */
1590
- constructor(url: string, version?: Version, fetchOptions?: FetchOptions);
1602
+ constructor(url: string, version?: Version);
1591
1603
  /**
1592
1604
  * @param directory return value of `window.showDirectoryPicker()` which gives the browser
1593
1605
  * permission to access a directory (only works in Chrome/Edge)
1594
- * @param version OME-Zarr version
1595
1606
  * @param path path to image, beginning with "/". This argument allows the application to only
1596
1607
  * ask the user once for permission to the root directory
1597
1608
  */
@@ -1862,4 +1873,4 @@ declare class Texture3D extends Texture {
1862
1873
  static createWithChunk(chunk: Chunk): Texture3D;
1863
1874
  }
1864
1875
 
1865
- export { AxesLayer, Box2, Box3, type CameraControls, type ChannelProps, type ChannelsEnabled, type Chunk, type ChunkLoader, ChunkedImageLayer, Color, type ColorLike, EventContext, type FetchOptions, Frustum, Idetik, ImageLayer, ImageSeriesLayer, type ImageSourcePolicy, type ImageSourcePolicyConfig, LabelImageLayer, Layer, LayerManager, type LayerState, Image as OmeZarrImage, OmeZarrImageSource, type OmeroChannel, type OmeroMetadata, OrthographicCamera, PanZoomControls, PerspectiveCamera, Plane, type PointPickingResult, Points, type PriorityCategory, ProjectedLineLayer, type Region, type SliceCoordinates, Spherical, Texture2DArray, Texture3D, TracksLayer, Viewport, type ViewportConfig, VolumeLayer, WebGLRenderer, createExplorationPolicy, createImageSourcePolicy, createNoPrefetchPolicy, createPlaybackPolicy, loadOmeZarrPlate, loadOmeZarrWell, loadOmeroChannels, loadOmeroDefaults, parseViewportConfigs };
1876
+ export { AxesLayer, Box2, Box3, type CameraControls, type ChannelProps, type ChannelsEnabled, type Chunk, type ChunkLoader, ChunkedImageLayer, Color, type ColorLike, EventContext, Frustum, Idetik, ImageLayer, ImageSeriesLayer, type ImageSourcePolicy, type ImageSourcePolicyConfig, LabelImageLayer, Layer, LayerManager, type LayerState, Image as OmeZarrImage, OmeZarrImageSource, type OmeroChannel, type OmeroMetadata, OrthographicCamera, PanZoomControls, PerspectiveCamera, Plane, type PointPickingResult, Points, type PriorityCategory, ProjectedLineLayer, type Region, type SliceCoordinates, Spherical, Texture2DArray, Texture3D, TracksLayer, Viewport, type ViewportConfig, VolumeLayer, WebGLRenderer, createExplorationPolicy, createImageSourcePolicy, createNoPrefetchPolicy, createPlaybackPolicy, loadOmeZarrPlate, loadOmeZarrWell, loadOmeroChannels, loadOmeroDefaults, parseViewportConfigs };