@luxonis/visualizer-protobuf 2.35.0 → 2.37.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 (63) hide show
  1. package/dist/{communicator-D49kmBTQ.js → communicator-BI9L9U0t.js} +2 -17
  2. package/dist/{deserialization.worker-DsCOJqEa.js → deserialization.worker-BPzAkWKk.js} +135 -13
  3. package/dist/{protobuf-Cr0sn6Ua.js → encoding-B5mh1ygC.js} +20 -1
  4. package/dist/{index-B1XiXp8f.js → index-BcUufSRp.js} +1 -1
  5. package/dist/{index-BVoQTy60.js → index-Bei6XSzB.js} +1 -1
  6. package/dist/{index-B3FXkEX-.js → index-BfEpEBB4.js} +1 -1
  7. package/dist/{index-CFyETGYY.js → index-BkowtwNU.js} +8 -4
  8. package/dist/{index-BMhXEexX.js → index-BxVngweg.js} +1 -1
  9. package/dist/{index-C4bu9CwP.js → index-CFFrlSkz.js} +1 -1
  10. package/dist/{index-B0STFQmU.js → index-CWm0KJ8n.js} +1 -1
  11. package/dist/{index-C-cI8dE7.js → index-C_tuHIRp.js} +1 -1
  12. package/dist/{index-DCxgBMTe.js → index-Cu0BHwFo.js} +1 -1
  13. package/dist/{index-CnqkI6yW.js → index-D5sbve0w.js} +1 -1
  14. package/dist/{index-NHuLyXtC.js → index-DNHbzEBt.js} +1 -1
  15. package/dist/{index-DXRsZeIF.js → index-Dd6AtZgq.js} +1 -1
  16. package/dist/{index-DWqG1kKL.js → index-De6APqJN.js} +1 -1
  17. package/dist/{index-B13odtD4.js → index-DlKJr7qq.js} +1 -1
  18. package/dist/{index-D1HLpOAF.js → index-MePAd5yd.js} +2 -2
  19. package/dist/{index-ByPsJjYK.js → index-PBEeiMny.js} +1 -1
  20. package/dist/{index-denIhk8V.js → index-WsHMlt9k.js} +1 -1
  21. package/dist/{index-BfRV8GM9.js → index-hJAMpER3.js} +38 -35
  22. package/dist/{index-BoI3ALeF.js → index-jz0Ae7Bm.js} +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/lib/src/connection/connection.d.ts +8 -4
  25. package/dist/lib/src/connection/connection.d.ts.map +1 -1
  26. package/dist/lib/src/connection/connection.js +7 -7
  27. package/dist/lib/src/connection/connection.js.map +1 -1
  28. package/dist/lib/src/connection/foxglove-connection.d.ts +3 -1
  29. package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
  30. package/dist/lib/src/connection/foxglove-connection.js +26 -9
  31. package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
  32. package/dist/lib/src/messaging/deserialization/video/h265.d.ts +17 -0
  33. package/dist/lib/src/messaging/deserialization/video/h265.d.ts.map +1 -0
  34. package/dist/lib/src/messaging/deserialization/video/h265.js +79 -0
  35. package/dist/lib/src/messaging/deserialization/video/h265.js.map +1 -0
  36. package/dist/lib/src/messaging/deserialization.worker.d.ts +1 -1
  37. package/dist/lib/src/messaging/deserialization.worker.d.ts.map +1 -1
  38. package/dist/lib/src/messaging/deserialization.worker.js +35 -13
  39. package/dist/lib/src/messaging/deserialization.worker.js.map +1 -1
  40. package/dist/lib/src/messaging/message-handler.d.ts +2 -1
  41. package/dist/lib/src/messaging/message-handler.d.ts.map +1 -1
  42. package/dist/lib/src/messaging/message-handler.js +2 -2
  43. package/dist/lib/src/messaging/message-handler.js.map +1 -1
  44. package/dist/lib/src/utils/encoding.d.ts +1 -0
  45. package/dist/lib/src/utils/encoding.d.ts.map +1 -1
  46. package/dist/lib/src/utils/encoding.js +4 -0
  47. package/dist/lib/src/utils/encoding.js.map +1 -1
  48. package/dist/lib/src/utils/error.d.ts +5 -0
  49. package/dist/lib/src/utils/error.d.ts.map +1 -0
  50. package/dist/lib/src/utils/error.js +8 -0
  51. package/dist/lib/src/utils/error.js.map +1 -0
  52. package/dist/packages/studio-base/src/i18n/en/threeDee.js +1 -1
  53. package/dist/packages/studio-base/src/i18n/en/threeDee.js.map +1 -1
  54. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js +1 -1
  55. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js.map +1 -1
  56. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js +6 -2
  57. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js.map +1 -1
  58. package/dist/packages/studio-base/src/players/types.d.ts +1 -0
  59. package/dist/packages/studio-base/src/players/types.d.ts.map +1 -1
  60. package/dist/packages/studio-base/src/players/types.js.map +1 -1
  61. package/dist/{worker-aVL4LGa3.js → worker--cB8IFXH.js} +2 -2
  62. package/dist/{worker-B5OJw-Fq.js → worker-CYg1hGeK.js} +2 -2
  63. package/package.json +1 -1
@@ -1,19 +1,4 @@
1
- import { p as protobufsBySchema } from './protobuf-Cr0sn6Ua.js';
2
-
3
- // This Source Code Form is subject to the terms of the Mozilla Public
4
- // License, v2.0. If a copy of the MPL was not distributed with this
5
- // file, You can obtain one at http://mozilla.org/MPL/2.0/
6
-
7
- function recordToDataView(record) {
8
- const text = JSON.stringify(record);
9
- if (!text) {
10
- throw new Error("Invalid record");
11
- }
12
- const encoder = new TextEncoder();
13
- const data = encoder.encode(text);
14
- const dataView = new DataView(data.buffer);
15
- return dataView;
16
- }
1
+ import { p as protobufsBySchema, r as recordToDataView } from './encoding-B5mh1ygC.js';
17
2
 
18
3
  // This Source Code Form is subject to the terms of the Mozilla Public
19
4
  // License, v2.0. If a copy of the MPL was not distributed with this
@@ -144,4 +129,4 @@ class FoxgloveCommunicator {
144
129
  }
145
130
  }
146
131
 
147
- export { FoxgloveCommunicator as F, recordToDataView as r };
132
+ export { FoxgloveCommunicator as F };
@@ -1,7 +1,7 @@
1
1
  import { e as expose } from './comlink-DHMAu6X7.js';
2
2
  import { t as typescript } from './useMessageReducer-jNx5e6JW.js';
3
3
  import { e as estimateObjectSize, d as dist } from './tslib.es6-C73eoP_E.js';
4
- import { T as Type, P as PointsAnnotationType, p as protobufsBySchema, a as Profile } from './protobuf-Cr0sn6Ua.js';
4
+ import { T as Type, P as PointsAnnotationType, p as protobufsBySchema, i as isCapableOfEncodedStream, a as Profile } from './encoding-B5mh1ygC.js';
5
5
  import 'react';
6
6
  import './_commonjsHelpers-E-ZsRS8r.js';
7
7
  import 'zustand';
@@ -841,7 +841,7 @@ function ensureWebCodecsSupported(target) {
841
841
  // License, v2.0. If a copy of the MPL was not distributed with this
842
842
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
843
843
 
844
- function createVideoDecoder({
844
+ function createVideoDecoder$1({
845
845
  topic,
846
846
  callback,
847
847
  topicDecoders
@@ -887,7 +887,7 @@ async function deserializeEncodedFrameH264({
887
887
  return;
888
888
  }
889
889
  if (!topicDecoders.has(topic)) {
890
- const decoder = createVideoDecoder({
890
+ const decoder = createVideoDecoder$1({
891
891
  topic,
892
892
  callback,
893
893
  topicDecoders
@@ -928,6 +928,94 @@ async function deserializeEncodedFrameH264({
928
928
  // License, v2.0. If a copy of the MPL was not distributed with this
929
929
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
930
930
 
931
+ function createVideoDecoder({
932
+ topic,
933
+ callback,
934
+ topicDecoders
935
+ }) {
936
+ return new VideoDecoder({
937
+ output: async frame => {
938
+ const buffer = new Uint8Array(frame.allocationSize());
939
+ await frame.copyTo(buffer);
940
+ const receiveTime = topicDecoders.get(topic)?.timing.get(frame.timestamp) ?? dist.fromMicros(frame.timestamp);
941
+ const [encoding, step] = parsePixelFormat(frame.format);
942
+ const foxgloveMessage = {
943
+ timestamp: receiveTime,
944
+ frame_id: `h265-${topic}-frame`,
945
+ width: frame.displayWidth,
946
+ height: frame.displayHeight,
947
+ data: buffer,
948
+ encoding,
949
+ step: frame.displayWidth * step
950
+ };
951
+ callback({
952
+ topic,
953
+ receiveTime,
954
+ message: foxgloveMessage,
955
+ sizeInBytes: estimateObjectSize(foxgloveMessage),
956
+ schemaName: "foxglove.RawImage"
957
+ });
958
+ frame.close();
959
+ },
960
+ error: console.error
961
+ });
962
+ }
963
+ async function deserializeEncodedFrameH265({
964
+ topic,
965
+ message,
966
+ topicDecoders,
967
+ callback
968
+ }) {
969
+ const {
970
+ receiveTime
971
+ } = parseMessage(message);
972
+ const supported = ensureWebCodecsSupported("VideoDecoder");
973
+ if (!supported) {
974
+ return;
975
+ }
976
+ if (!topicDecoders.has(topic)) {
977
+ const decoder = createVideoDecoder({
978
+ topic,
979
+ callback,
980
+ topicDecoders
981
+ });
982
+ console.log("creating decoder", "hev1.1.6.L93.B0");
983
+ decoder.configure({
984
+ codec: "hev1.1.6.L93.B0",
985
+ optimizeForLatency: true
986
+ });
987
+ topicDecoders.set(topic, {
988
+ decoder,
989
+ timing: new Map()
990
+ });
991
+ }
992
+ const decoderInfo = topicDecoders.get(topic);
993
+ if (!decoderInfo) {
994
+ return;
995
+ }
996
+ if (decoderInfo.decoder.decodeQueueSize > 60) {
997
+ decoderInfo.decoder.reset();
998
+ return;
999
+ }
1000
+ const microTimestamp = receiveTime.sec * 1_000_000 + Math.floor(receiveTime.nsec / 1_000);
1001
+ decoderInfo.timing.set(microTimestamp, receiveTime);
1002
+ const frame = {
1003
+ type: 'key',
1004
+ data: message.data,
1005
+ timestamp: microTimestamp
1006
+ };
1007
+ try {
1008
+ const chunk = new EncodedVideoChunk(frame);
1009
+ decoderInfo.decoder.decode(chunk);
1010
+ } catch {
1011
+ topicDecoders.delete(topic);
1012
+ }
1013
+ }
1014
+
1015
+ // This Source Code Form is subject to the terms of the Mozilla Public
1016
+ // License, v2.0. If a copy of the MPL was not distributed with this
1017
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
1018
+
931
1019
  async function deserializeMJPEGFrame({
932
1020
  topic,
933
1021
  message,
@@ -969,6 +1057,13 @@ async function deserializeMJPEGFrame({
969
1057
  });
970
1058
  }
971
1059
 
1060
+ class EncodedStreamNotSupportedError extends Error {
1061
+ constructor(topicName) {
1062
+ super("Encoded stream not supported on this platform");
1063
+ this.topicName = topicName;
1064
+ }
1065
+ }
1066
+
972
1067
  // This Source Code Form is subject to the terms of the Mozilla Public
973
1068
  // License, v2.0. If a copy of the MPL was not distributed with this
974
1069
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
@@ -982,22 +1077,35 @@ function handleMessageToDecode({
982
1077
  schema,
983
1078
  buffer,
984
1079
  topic
985
- }) {
1080
+ }, errorCallback) {
1081
+ const handleDecodingError = error => {
1082
+ // TODO: Enable this log once we fix topic unsubscription not working
1083
+ // console.error("An error occurred during DAI message decoding.", error);
1084
+
1085
+ errorCallback?.(error);
1086
+ };
986
1087
  const protobufSchema = protobufsBySchema[schema];
987
1088
  if (!protobufSchema) {
988
1089
  console.warn(`Unsupported message schema "${schema}"`);
1090
+ handleDecodingError(new Error(`Unsupported message schema "${schema}"`));
989
1091
  return;
990
1092
  }
991
1093
  const bufferArray = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
992
- const message = protobufSchema.decoder.decode(bufferArray);
993
- void deserializeDepthAiMessage({
994
- topic,
995
- topicSizes,
996
- topicDecoders,
997
- message,
998
- callback,
999
- type: protobufSchema.type
1000
- });
1094
+ try {
1095
+ const message = protobufSchema.decoder.decode(bufferArray);
1096
+
1097
+ // Handle the promise correctly
1098
+ deserializeDepthAiMessage({
1099
+ topic,
1100
+ topicSizes,
1101
+ topicDecoders,
1102
+ message,
1103
+ callback,
1104
+ type: protobufSchema.type
1105
+ }).catch(handleDecodingError);
1106
+ } catch (error) {
1107
+ handleDecodingError(error);
1108
+ }
1001
1109
  }
1002
1110
  async function deserializeDepthAiMessage(args) {
1003
1111
  const {
@@ -1011,6 +1119,9 @@ async function deserializeDepthAiMessage(args) {
1011
1119
  switch (type) {
1012
1120
  case "encodedFrame":
1013
1121
  {
1122
+ if (!isCapableOfEncodedStream()) {
1123
+ throw new EncodedStreamNotSupportedError(topic);
1124
+ }
1014
1125
  topicSizes.set(topic, {
1015
1126
  width: message.width,
1016
1127
  height: message.height
@@ -1028,6 +1139,13 @@ async function deserializeDepthAiMessage(args) {
1028
1139
  message,
1029
1140
  callback
1030
1141
  });
1142
+ } else if (message.profile === Profile.HEVC) {
1143
+ await deserializeEncodedFrameH265({
1144
+ topic,
1145
+ message,
1146
+ topicDecoders,
1147
+ callback
1148
+ });
1031
1149
  } else ;
1032
1150
  break;
1033
1151
  }
@@ -1124,6 +1242,10 @@ async function deserializeDepthAiMessage(args) {
1124
1242
  }
1125
1243
  }
1126
1244
  }
1245
+
1246
+ // Update the exported API
1247
+
1248
+ // Expose the updated API
1127
1249
  expose({
1128
1250
  initCallback,
1129
1251
  handleMessageToDecode
@@ -5069,4 +5069,23 @@ const protobufsBySchema = Object.fromEntries(Object.entries(protobufs).map(([typ
5069
5069
  ...data
5070
5070
  }]));
5071
5071
 
5072
- export { PointsAnnotationType as P, Type as T, Profile as a, protobufsBySchema as p };
5072
+ // This Source Code Form is subject to the terms of the Mozilla Public
5073
+ // License, v2.0. If a copy of the MPL was not distributed with this
5074
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
5075
+
5076
+ // Function decides if the current browser is capable of working with encoded streams
5077
+ function isCapableOfEncodedStream() {
5078
+ return !!navigator?.userAgent?.includes('Chrome');
5079
+ }
5080
+ function recordToDataView(record) {
5081
+ const text = JSON.stringify(record);
5082
+ if (!text) {
5083
+ throw new Error("Invalid record");
5084
+ }
5085
+ const encoder = new TextEncoder();
5086
+ const data = encoder.encode(text);
5087
+ const dataView = new DataView(data.buffer);
5088
+ return dataView;
5089
+ }
5090
+
5091
+ export { PointsAnnotationType as P, Type as T, Profile as a, isCapableOfEncodedStream as i, protobufsBySchema as p, recordToDataView as r };
@@ -1,4 +1,4 @@
1
- import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, N as foldNodeProp, a2 as foldInside, K as indentNodeProp, M as continuedIndent, a8 as defineCSSCompletionSource, U as LanguageSupport } from './index-BfRV8GM9.js';
1
+ import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, N as foldNodeProp, a2 as foldInside, K as indentNodeProp, M as continuedIndent, a8 as defineCSSCompletionSource, U as LanguageSupport } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, $ as syntaxTree, Y as ifNotIn, T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, a6 as IterMode, Z as completeFromList, a7 as NodeWeakMap, a5 as snippetCompletion } from './index-BfRV8GM9.js';
1
+ import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, $ as syntaxTree, Y as ifNotIn, T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, a6 as IterMode, Z as completeFromList, a7 as NodeWeakMap, a5 as snippetCompletion } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { K as indentNodeProp, M as continuedIndent, N as foldNodeProp, O as styleTags, Q as tags, T as LRLanguage, U as LanguageSupport, V as ExternalTokenizer, X as LRParser, Y as ifNotIn, Z as completeFromList, $ as syntaxTree } from './index-BfRV8GM9.js';
1
+ import { K as indentNodeProp, M as continuedIndent, N as foldNodeProp, O as styleTags, Q as tags, T as LRLanguage, U as LanguageSupport, V as ExternalTokenizer, X as LRParser, Y as ifNotIn, Z as completeFromList, $ as syntaxTree } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -3,7 +3,7 @@ import React__default, { useReducer, useRef, useCallback, useLayoutEffect, Compo
3
3
  import ReactDOM__default from 'react-dom';
4
4
  import { S as isSymbol, U as toString, V as keys, W as getSymbols$1, X as stubArray, Y as arrayPush, Z as baseGetAllKeys, g as getTag, $ as getAllKeys, k as baseGet, c as baseIteratee, j as castPath, t as toKey, a0 as arrayMap$1, a1 as baseUniq, b as baseFlatten, a2 as useMustNotChange, a3 as useCurrentLayoutActions, a4 as useCurrentLayoutSelector, r as reportError, A as AppError, L as Logger, u as useGuaranteedContext, a5 as usePanelMosaicId, a6 as useSelectedPanels, a7 as PANEL_TITLE_CONFIG_KEY, a8 as noop$4, o as getPanelTypeFromId, M as useShallowMemo, T as TAB_PANEL_TYPE, J as filterMap, d as dist$3, a9 as useAppConfiguration, aa as useValueChangedDebugLog, ab as useJsonTreeTheme } from './tslib.es6-C73eoP_E.js';
5
5
  import { createStore, useStore } from 'zustand';
6
- import { g as generateUtilityClass, c as createAggregator, f as flatRest, b as baseSet, A as AnalyticsContext, P as PropTypes, E as ErrorDisplay, S as Stack$1, m as makeStyles$1, _ as _extends$1, W as WorkspaceContext, u as useAnalytics, a as AppEvent, L as LeftSidebarItemKeys, R as RightSidebarItemKeys, d as useTranslation, e as usePanelCatalog, h as EmptyState, i as isEmpty, j as PanelContext, k as PanelCatalogContext, l as usePanelStateStore, n as useDefaultPanelTitle, o as useWorkspaceStore, p as WorkspaceStoreSelectors, q as difference, r as usePanelContext, s as useMessagePipeline, v as v4, t as useHoverValue, w as useSetHoverValue, x as useClearHoverValue, y as useMessagePipelineGetter, z as usePanelSettingsTreeUpdate, B as PlayerCapabilities, C as assertNever, D as PlayerPresence, F as isEqual, G as isDesktopApp, H as createTheme, I as propTypesExports, J as DEFAULT_CAMERA_STATE$1 } from './index-BfRV8GM9.js';
6
+ import { g as generateUtilityClass, c as createAggregator, f as flatRest, b as baseSet, A as AnalyticsContext, P as PropTypes, E as ErrorDisplay, S as Stack$1, m as makeStyles$1, _ as _extends$1, W as WorkspaceContext, u as useAnalytics, a as AppEvent, L as LeftSidebarItemKeys, R as RightSidebarItemKeys, d as useTranslation, e as usePanelCatalog, h as EmptyState, i as isEmpty, j as PanelContext, k as PanelCatalogContext, l as usePanelStateStore, n as useDefaultPanelTitle, o as useWorkspaceStore, p as WorkspaceStoreSelectors, q as difference, r as usePanelContext, s as useMessagePipeline, v as v4, t as useHoverValue, w as useSetHoverValue, x as useClearHoverValue, y as useMessagePipelineGetter, z as usePanelSettingsTreeUpdate, B as PlayerCapabilities, C as assertNever, D as PlayerPresence, F as isEqual, G as isDesktopApp, H as createTheme, I as propTypesExports, J as DEFAULT_CAMERA_STATE$1 } from './index-hJAMpER3.js';
7
7
  import { MosaicDragType, MosaicContext, MosaicWindowContext, getOtherBranch, getNodeAtPath } from 'react-mosaic-component';
8
8
  import { t as typescript } from './useMessageReducer-jNx5e6JW.js';
9
9
  import { g as getDefaultExportFromCjs, c as commonjsGlobal, a as getAugmentedNamespace } from './_commonjsHelpers-E-ZsRS8r.js';
@@ -33637,7 +33637,11 @@ class MessageHandler {
33637
33637
  };
33638
33638
  const ghostTimeMs = annoationsFpsToGhostTimeMs(this.#averageAnnotationsFps);
33639
33639
  if (result.found && [...result.messages.annotationsByTopic.values()].length === 0 && this.#ghostAnnotation && now - this.#ghostAnnotation.createdAtMs < ghostTimeMs) {
33640
- console.warn(`No annotations found for this frame but still in ghost period (diff = ${now - this.#ghostAnnotation.createdAtMs} ms, ghostTimeMs = ${ghostTimeMs} ms) - returning ghost annotation`);
33640
+ //console.warn(
33641
+ // `No annotations found for this frame but still in ghost period (diff = ${
33642
+ // now - this.#ghostAnnotation.createdAtMs
33643
+ // } ms, ghostTimeMs = ${ghostTimeMs} ms) - returning ghost annotation`,
33644
+ //);
33641
33645
  renderState.annotationsByTopic = this.#ghostAnnotation.annotations;
33642
33646
  }
33643
33647
  return renderState;
@@ -33703,7 +33707,7 @@ function findSynchronizedSetAndRemoveOlderItems(tree, visibleAnnotations) {
33703
33707
  }
33704
33708
  if (validEntry) {
33705
33709
  if (validEntry[1].annotationsByTopic.size === 0 && lastAnnotationsOrphanEntry) {
33706
- console.warn("Using annotationsByTopic from lastAnnotationsEntry orphan");
33710
+ // console.warn("Using annotationsByTopic from lastAnnotationsEntry orphan");
33707
33711
  validEntry[1].annotationsByTopic = lastAnnotationsOrphanEntry[1].annotationsByTopic;
33708
33712
  }
33709
33713
 
@@ -74080,7 +74084,7 @@ class CameraStateSettings extends SceneExtension {
74080
74084
  if (deltaX === 0 && deltaY === 0) {
74081
74085
  return;
74082
74086
  }
74083
- const deltaAzimuth = -deltaX * AZIMUTH_SENSITIVITY;
74087
+ const deltaAzimuth = deltaX * AZIMUTH_SENSITIVITY;
74084
74088
  const deltaPolar = -deltaY * POLAR_SENSITIVITY;
74085
74089
  const previousState = cloneDeep(this.renderer.config.cameraState);
74086
74090
  this.renderer.updateConfig(draft => {
@@ -1,4 +1,4 @@
1
- import { O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-BfRV8GM9.js';
1
+ import { O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { a3 as ContextTracker, V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, N as foldNodeProp, ad as bracketMatchingHandle, U as LanguageSupport, a9 as EditorView, $ as syntaxTree, aa as EditorSelection } from './index-BfRV8GM9.js';
1
+ import { a3 as ContextTracker, V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, N as foldNodeProp, ad as bracketMatchingHandle, U as LanguageSupport, a9 as EditorView, $ as syntaxTree, aa as EditorSelection } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { a3 as ContextTracker, V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, ac as parseMixed } from './index-BfRV8GM9.js';
1
+ import { a3 as ContextTracker, V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, ac as parseMixed } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, ab as html, U as LanguageSupport, ac as parseMixed } from './index-BfRV8GM9.js';
1
+ import { V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, ab as html, U as LanguageSupport, ac as parseMixed } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, a4 as LocalTokenGroup, a5 as snippetCompletion, $ as syntaxTree, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a0 as flatIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, Y as ifNotIn, Z as completeFromList, a6 as IterMode, a7 as NodeWeakMap } from './index-BfRV8GM9.js';
1
+ import { V as ExternalTokenizer, a3 as ContextTracker, O as styleTags, Q as tags, X as LRParser, a4 as LocalTokenGroup, a5 as snippetCompletion, $ as syntaxTree, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a0 as flatIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport, Y as ifNotIn, Z as completeFromList, a6 as IterMode, a7 as NodeWeakMap } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { O as styleTags, Q as tags, T as LRLanguage, U as LanguageSupport, X as LRParser, a4 as LocalTokenGroup, ab as html, ac as parseMixed, ae as javascriptLanguage } from './index-BfRV8GM9.js';
1
+ import { O as styleTags, Q as tags, T as LRLanguage, U as LanguageSupport, X as LRParser, a4 as LocalTokenGroup, ab as html, ac as parseMixed, ae as javascriptLanguage } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-BfRV8GM9.js';
1
+ import { V as ExternalTokenizer, O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a0 as flatIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-BfRV8GM9.js';
1
+ import { O as styleTags, Q as tags, X as LRParser, T as LRLanguage, K as indentNodeProp, M as continuedIndent, a0 as flatIndent, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, U as LanguageSupport } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, O as styleTags, Q as tags, U as LanguageSupport, X as LRParser } from './index-BfRV8GM9.js';
1
+ import { T as LRLanguage, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, a2 as foldInside, O as styleTags, Q as tags, U as LanguageSupport, X as LRParser } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { a9 as EditorView, aa as EditorSelection, T as LRLanguage, O as styleTags, Q as tags, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, U as LanguageSupport, X as LRParser, $ as syntaxTree, ab as html, ac as parseMixed, V as ExternalTokenizer } from './index-BfRV8GM9.js';
1
+ import { a9 as EditorView, aa as EditorSelection, T as LRLanguage, O as styleTags, Q as tags, K as indentNodeProp, a1 as delimitedIndent, N as foldNodeProp, U as LanguageSupport, X as LRParser, $ as syntaxTree, ab as html, ac as parseMixed, V as ExternalTokenizer } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { ImagePanel } from './index-CFyETGYY.js';
1
+ import { ImagePanel } from './index-BkowtwNU.js';
2
2
  import 'react';
3
3
  import 'react-dom';
4
4
  import './tslib.es6-C73eoP_E.js';
@@ -7,7 +7,7 @@ import './_commonjsHelpers-E-ZsRS8r.js';
7
7
  import '@mui/material';
8
8
  import './isArrayLikeObject-Bytw9p-q.js';
9
9
  import 'zustand';
10
- import './index-BfRV8GM9.js';
10
+ import './index-hJAMpER3.js';
11
11
  import './comlink-DHMAu6X7.js';
12
12
  import './utils-Hzt3wxhG.js';
13
13
  import './FoxgloveServer-C39Uooyk.js';
@@ -1,4 +1,4 @@
1
- import { O as styleTags, Q as tags, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, a8 as defineCSSCompletionSource, U as LanguageSupport, X as LRParser, V as ExternalTokenizer } from './index-BfRV8GM9.js';
1
+ import { O as styleTags, Q as tags, T as LRLanguage, K as indentNodeProp, M as continuedIndent, N as foldNodeProp, a2 as foldInside, a8 as defineCSSCompletionSource, U as LanguageSupport, X as LRParser, V as ExternalTokenizer } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { O as styleTags, Q as tags, ae as javascriptLanguage, T as LRLanguage, U as LanguageSupport, X as LRParser, ab as html, ac as parseMixed, V as ExternalTokenizer } from './index-BfRV8GM9.js';
1
+ import { O as styleTags, Q as tags, ae as javascriptLanguage, T as LRLanguage, U as LanguageSupport, X as LRParser, ab as html, ac as parseMixed, V as ExternalTokenizer } from './index-hJAMpER3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';