Full Code of nasa/openmct for AI

master 46ab69fb250c cached
1234 files
6.7 MB
1.8M tokens
2924 symbols
1 requests
Download .txt
Showing preview only (7,218K chars total). Download the full file or copy to clipboard to get everything.
Repository: nasa/openmct
Branch: master
Commit: 46ab69fb250c
Files: 1234
Total size: 6.7 MB

Directory structure:
gitextract_zhykc3s0/

├── .cspell.json
├── .eslintrc.cjs
├── .git-blame-ignore-revs
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── enhancement-request.md
│   │   └── maintenance-type.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql/
│   │   └── codeql-config.yml
│   ├── dependabot.yml
│   ├── release.yml
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── e2e-couchdb.yml
│       ├── e2e-full.yml
│       ├── e2e-perf.yml
│       ├── npm-prerelease.yml
│       ├── pr-platform.yml
│       ├── pr.yml
│       ├── prcop-config.json
│       └── prcop.yml
├── .gitignore
├── .npmignore
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│   └── extensions.json
├── .webpack/
│   ├── webpack.common.mjs
│   ├── webpack.coverage.mjs
│   ├── webpack.dev.mjs
│   └── webpack.prod.mjs
├── API.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── TESTING.md
├── build-docs.sh
├── codecov.yml
├── copyright-notice.html
├── copyright-notice.js
├── docs/
│   └── src/
│       ├── guide/
│       │   └── security.md
│       ├── index.md
│       └── process/
│           ├── cycle.md
│           ├── index.md
│           ├── release.md
│           ├── testing/
│           │   └── plan.md
│           └── version.md
├── e2e/
│   ├── .eslintrc.cjs
│   ├── .npmignore
│   ├── .percy.ci.yml
│   ├── .percy.nightly.yml
│   ├── README.md
│   ├── appActions.js
│   ├── avpFixtures.js
│   ├── baseFixtures.js
│   ├── constants.js
│   ├── helper/
│   │   ├── addInitDataVisualization.js
│   │   ├── addInitDerivedTelemetryPlugin.js
│   │   ├── addInitExampleFaultProvider.js
│   │   ├── addInitExampleFaultProviderStatic.js
│   │   ├── addInitExampleStalenessProvider.js
│   │   ├── addInitExampleUser.js
│   │   ├── addInitFaultManagementPlugin.js
│   │   ├── addInitFileInputObject.js
│   │   ├── addInitNotebookWithUrls.js
│   │   ├── addInitOperatorStatus.js
│   │   ├── addInitRestrictedNotebook.js
│   │   ├── addNoneditableObject.js
│   │   ├── faultUtils.js
│   │   ├── hotkeys/
│   │   │   ├── clipboard.js
│   │   │   └── hotkeys.js
│   │   ├── imageryUtils.js
│   │   ├── notebookUtils.js
│   │   ├── planningUtils.js
│   │   ├── plotTagsUtils.js
│   │   ├── stylingUtils.js
│   │   ├── useDarkmatterTheme.js
│   │   └── useSnowTheme.js
│   ├── index.js
│   ├── package.json
│   ├── playwright-ci.config.js
│   ├── playwright-local.config.js
│   ├── playwright-mobile.config.js
│   ├── playwright-performance-dev.config.js
│   ├── playwright-performance-prod.config.js
│   ├── playwright-visual-a11y.config.js
│   ├── playwright-watch.config.js
│   ├── pluginFixtures.js
│   ├── test-data/
│   │   ├── ExampleLayouts.json
│   │   ├── PerformanceDisplayLayout.json
│   │   ├── PerformanceNotebook.json
│   │   ├── blank.html
│   │   ├── condition_set_storage.json
│   │   ├── display_layout_with_child_layouts.json
│   │   ├── display_layout_with_child_overlay_plot.json
│   │   ├── examplePlans/
│   │   │   ├── ExamplePlanWithOrderedLanes.json
│   │   │   ├── ExamplePlan_Large.json
│   │   │   ├── ExamplePlan_Small1.json
│   │   │   ├── ExamplePlan_Small2.json
│   │   │   └── ExamplePlan_Small3.json
│   │   ├── flexible_layout_with_child_layouts.json
│   │   ├── memory-leak-detection.json
│   │   ├── overlay_plot_storage.json
│   │   ├── overlay_plot_with_delay_storage.json
│   │   └── recycled_local_storage.json
│   └── tests/
│       ├── framework/
│       │   ├── appActions.e2e.spec.js
│       │   ├── baseFixtures.e2e.spec.js
│       │   ├── exampleTemplate.e2e.spec.js
│       │   ├── generateLocalStorageData.e2e.spec.js
│       │   └── pluginFixtures.e2e.spec.js
│       ├── functional/
│       │   ├── MCT.e2e.spec.js
│       │   ├── branding.e2e.spec.js
│       │   ├── clearDataAction.e2e.spec.js
│       │   ├── couchdb.e2e.spec.js
│       │   ├── example/
│       │   │   ├── eventGenerator.e2e.spec.js
│       │   │   ├── eventWithAcknowledgeGenerator.e2e.spec.js
│       │   │   └── generator/
│       │   │       ├── sineWaveLimitProvider.e2e.spec.js
│       │   │       └── sineWaveStalenessProvider.e2e.spec.js
│       │   ├── forms.e2e.spec.js
│       │   ├── menu.e2e.spec.js
│       │   ├── missionStatus.e2e.spec.js
│       │   ├── moveAndLinkObjects.e2e.spec.js
│       │   ├── notification.e2e.spec.js
│       │   ├── planning/
│       │   │   ├── ganttChart.e2e.spec.js
│       │   │   ├── plan.e2e.spec.js
│       │   │   ├── timelist.e2e.spec.js
│       │   │   ├── timelistControlledClock.e2e.spec.js
│       │   │   └── timestrip.e2e.spec.js
│       │   ├── plugins/
│       │   │   ├── clocks/
│       │   │   │   ├── clock.e2e.spec.js
│       │   │   │   └── remoteClock.e2e.spec.js
│       │   │   ├── comps/
│       │   │   │   └── comps.e2e.spec.js
│       │   │   ├── conditionSet/
│       │   │   │   ├── conditionSet.e2e.spec.js
│       │   │   │   └── conditionSetOperations.e2e.spec.js
│       │   │   ├── correlationTelemetry/
│       │   │   │   └── correlationTelemetry.e2e.spec.js
│       │   │   ├── displayLayout/
│       │   │   │   └── displayLayout.e2e.spec.js
│       │   │   ├── event/
│       │   │   │   └── eventTimelineView.e2e.spec.js
│       │   │   ├── faultManagement/
│       │   │   │   └── faultManagement.e2e.spec.js
│       │   │   ├── flexibleLayout/
│       │   │   │   └── flexibleLayout.e2e.spec.js
│       │   │   ├── folders/
│       │   │   │   └── viewPersist.e2e.spec.js
│       │   │   ├── gauge/
│       │   │   │   └── gauge.e2e.spec.js
│       │   │   ├── imagery/
│       │   │   │   ├── exampleImagery.e2e.spec.js
│       │   │   │   ├── exampleImageryControlledClock.e2e.spec.js
│       │   │   │   └── exampleImageryFile.e2e.spec.js
│       │   │   ├── importAndExportAsJSON/
│       │   │   │   ├── exportAsJson.e2e.spec.js
│       │   │   │   └── importAsJson.e2e.spec.js
│       │   │   ├── inspectorDataVisualization/
│       │   │   │   └── numericData.e2e.spec.js
│       │   │   ├── lad/
│       │   │   │   ├── lad.e2e.spec.js
│       │   │   │   ├── ladSet.e2e.spec.js
│       │   │   │   └── ladTable.e2e.spec.js
│       │   │   ├── notebook/
│       │   │   │   ├── notebook.e2e.spec.js
│       │   │   │   ├── notebookSnapshotImage.e2e.spec.js
│       │   │   │   ├── notebookSnapshots.e2e.spec.js
│       │   │   │   ├── notebookTags.e2e.spec.js
│       │   │   │   ├── notebookWithCouchDB.e2e.spec.js
│       │   │   │   └── restrictedNotebook.e2e.spec.js
│       │   │   ├── operatorStatus/
│       │   │   │   └── operatorStatus.e2e.spec.js
│       │   │   ├── performanceIndicator/
│       │   │   │   └── performanceIndicator.e2e.spec.js
│       │   │   ├── plot/
│       │   │   │   ├── autoscale.e2e.spec.js
│       │   │   │   ├── logPlot.e2e.spec.js
│       │   │   │   ├── missingPlotObj.e2e.spec.js
│       │   │   │   ├── overlayPlot.e2e.spec.js
│       │   │   │   ├── plotControls.e2e.spec.js
│       │   │   │   ├── plotControlsCompactMode.e2e.spec.js
│       │   │   │   ├── plotRendering.e2e.spec.js
│       │   │   │   ├── plotViewActions.e2e.spec.js
│       │   │   │   ├── previews.e2e.spec.js
│       │   │   │   ├── scatterPlot.e2e.spec.js
│       │   │   │   ├── stackedPlot.e2e.spec.js
│       │   │   │   ├── tagging.e2e.spec.js
│       │   │   │   └── timeTicks.e2e.spec.js
│       │   │   ├── reloadAction/
│       │   │   │   └── reloadAction.e2e.spec.js
│       │   │   ├── styling/
│       │   │   │   ├── conditionSetStyling.e2e.spec.js
│       │   │   │   ├── conditional/
│       │   │   │   │   └── displayLayoutConditionalStyling.e2e.spec.js
│       │   │   │   ├── conditionalStyling.e2e.spec.js
│       │   │   │   ├── flexLayoutStyling.e2e.spec.js
│       │   │   │   ├── stackedPlotStyling.e2e.spec.js
│       │   │   │   └── styleInspectorOptions.e2e.spec.js
│       │   │   ├── tabs/
│       │   │   │   └── tabs.e2e.spec.js
│       │   │   ├── telemetryTable/
│       │   │   │   ├── preview.e2e.spec.js
│       │   │   │   └── telemetryTable.e2e.spec.js
│       │   │   ├── timeConductor/
│       │   │   │   ├── datepicker.e2e.spec.js
│       │   │   │   └── timeConductor.e2e.spec.js
│       │   │   └── timer/
│       │   │       └── timer.e2e.spec.js
│       │   ├── recentObjects.e2e.spec.js
│       │   ├── renaming.e2e.spec.js
│       │   ├── search.e2e.spec.js
│       │   ├── smoke.e2e.spec.js
│       │   ├── staleness.e2e.spec.js
│       │   ├── tooltips.e2e.spec.js
│       │   ├── tree.e2e.spec.js
│       │   ├── ui/
│       │   │   ├── inspector.e2e.spec.js
│       │   │   └── statusArea.e2e.spec.js
│       │   └── userRoles.e2e.spec.js
│       ├── mobile/
│       │   └── smoke.e2e.spec.js
│       ├── performance/
│       │   ├── contract/
│       │   │   ├── imagery.contract.perf.spec.js
│       │   │   └── notebook.contract.perf.spec.js
│       │   ├── memory/
│       │   │   └── navigation.memory.perf.spec.js
│       │   ├── tabs.perf.spec.js
│       │   └── tagging.perf.spec.js
│       └── visual-a11y/
│           ├── a11y.visual.spec.js
│           ├── components/
│           │   ├── about.visual.spec.js
│           │   ├── header.visual.spec.js
│           │   ├── inspector.visual.spec.js
│           │   ├── timeConductor.visual.spec.js
│           │   └── tree.visual.spec.js
│           ├── controlledClock.visual.spec.js
│           ├── defaultPlugins.visual.spec.js
│           ├── displayLayout.visual.spec.js
│           ├── faultManagement.visual.spec.js
│           ├── gauge.visual.spec.js
│           ├── imagery.visual.spec.js
│           ├── ladTable.visual.spec.js
│           ├── missionStatus.visual.spec.js
│           ├── notebook.visual.spec.js
│           ├── notification.visual.spec.js
│           ├── planning-gantt.visual.spec.js
│           ├── planning-timestrip.visual.spec.js
│           ├── planning-view.visual.spec.js
│           ├── search.visual.spec.js
│           ├── styling.visual.spec.js
│           └── telemetryViews.visual.spec.js
├── example/
│   ├── README.md
│   ├── dataVisualization/
│   │   ├── ExampleDataVisualizationSourceViewProvider.js
│   │   ├── components/
│   │   │   └── ExampleDataVisualizationSource.vue
│   │   └── plugin.js
│   ├── eventGenerator/
│   │   ├── EventLimitProvider.js
│   │   ├── EventMetadataProvider.js
│   │   ├── EventTelemetryProvider.js
│   │   ├── EventWithAcknowledgeTelemetryProvider.js
│   │   ├── plugin.js
│   │   ├── pluginSpec.js
│   │   └── transcript.json
│   ├── exampleStalenessProvider/
│   │   ├── ExampleStalenessProvider.js
│   │   └── plugin.js
│   ├── exampleTags/
│   │   ├── plugin.js
│   │   └── tags.json
│   ├── exampleUser/
│   │   ├── ExampleUserProvider.js
│   │   ├── exampleUserCreator.js
│   │   ├── plugin.js
│   │   └── pluginSpec.js
│   ├── faultManagement/
│   │   ├── exampleFaultSource.js
│   │   ├── pluginSpec.js
│   │   └── utils.js
│   ├── generator/
│   │   ├── GeneratorMetadataProvider.js
│   │   ├── GeneratorProvider.js
│   │   ├── SinewaveLimitProvider.js
│   │   ├── SinewaveStalenessProvider.js
│   │   ├── StateGeneratorProvider.js
│   │   ├── WorkerInterface.js
│   │   ├── generatorWorker.js
│   │   └── plugin.js
│   └── imagery/
│       └── plugin.js
├── index-test.cjs
├── index.html
├── karma.conf.cjs
├── openmct.js
├── package.json
├── src/
│   ├── MCT.js
│   ├── MCTSpec.js
│   ├── api/
│   │   ├── Branding.js
│   │   ├── Editor.js
│   │   ├── EditorSpec.js
│   │   ├── actions/
│   │   │   ├── ActionCollection.js
│   │   │   ├── ActionCollectionSpec.js
│   │   │   ├── ActionsAPI.js
│   │   │   └── ActionsAPISpec.js
│   │   ├── annotation/
│   │   │   ├── AnnotationAPI.js
│   │   │   └── AnnotationAPISpec.js
│   │   ├── api.js
│   │   ├── composition/
│   │   │   ├── CompositionAPI.js
│   │   │   ├── CompositionAPISpec.js
│   │   │   ├── CompositionCollection.js
│   │   │   ├── CompositionProvider.js
│   │   │   └── DefaultCompositionProvider.js
│   │   ├── faultmanagement/
│   │   │   ├── FaultManagementAPI.js
│   │   │   └── FaultManagementAPISpec.js
│   │   ├── forms/
│   │   │   ├── FormController.js
│   │   │   ├── FormsAPI.js
│   │   │   ├── FormsAPISpec.js
│   │   │   ├── components/
│   │   │   │   ├── FormProperties.vue
│   │   │   │   ├── FormRow.vue
│   │   │   │   └── controls/
│   │   │   │       ├── AutoCompleteField.vue
│   │   │   │       ├── CheckBoxField.vue
│   │   │   │       ├── ClockDisplayFormatField.vue
│   │   │   │       ├── CompositeContainer.vue
│   │   │   │       ├── CompositeItem.vue
│   │   │   │       ├── DatetimeField.vue
│   │   │   │       ├── FileInput.vue
│   │   │   │       ├── LocatorField.vue
│   │   │   │       ├── NumberField.vue
│   │   │   │       ├── SelectField.vue
│   │   │   │       ├── TextAreaField.vue
│   │   │   │       ├── TextField.vue
│   │   │   │       └── ToggleSwitchField.vue
│   │   │   └── toggle-check-box-mixin.js
│   │   ├── indicators/
│   │   │   ├── IndicatorAPI.js
│   │   │   ├── IndicatorAPISpec.js
│   │   │   ├── SimpleIndicator.js
│   │   │   └── res/
│   │   │       └── indicator-template.html
│   │   ├── menu/
│   │   │   ├── MenuAPI.js
│   │   │   ├── MenuAPISpec.js
│   │   │   ├── components/
│   │   │   │   ├── MenuComponent.vue
│   │   │   │   └── SuperMenu.vue
│   │   │   ├── menu.js
│   │   │   └── mixins/
│   │   │       └── popupMenuMixin.js
│   │   ├── notifications/
│   │   │   ├── NotificationAPI.js
│   │   │   └── NotificationAPISpec.js
│   │   ├── objects/
│   │   │   ├── ConflictError.js
│   │   │   ├── InMemorySearchProvider.js
│   │   │   ├── InMemorySearchWorker.js
│   │   │   ├── InterceptorRegistry.js
│   │   │   ├── InterceptorRegistrySpec.js
│   │   │   ├── MutableDomainObject.js
│   │   │   ├── NamespaceProvider.js
│   │   │   ├── ObjectAPI.js
│   │   │   ├── ObjectAPISearchSpec.js
│   │   │   ├── ObjectAPISpec.js
│   │   │   ├── RootObjectCompositionProvider.js
│   │   │   ├── RootObjectProvider.js
│   │   │   ├── RootRegistry.js
│   │   │   ├── Transaction.js
│   │   │   ├── TransactionSpec.js
│   │   │   ├── object-utils.js
│   │   │   └── test/
│   │   │       └── object-utilsSpec.js
│   │   ├── overlays/
│   │   │   ├── Dialog.js
│   │   │   ├── Overlay.js
│   │   │   ├── OverlayAPI.js
│   │   │   ├── ProgressDialog.js
│   │   │   ├── Selection.js
│   │   │   └── components/
│   │   │       ├── DialogComponent.vue
│   │   │       ├── OverlayComponent.vue
│   │   │       ├── ProgressDialogComponent.vue
│   │   │       ├── SelectionComponent.vue
│   │   │       ├── dialog-component.scss
│   │   │       └── overlay-component.scss
│   │   ├── priority/
│   │   │   └── PriorityAPI.js
│   │   ├── status/
│   │   │   ├── StatusAPI.js
│   │   │   └── StatusAPISpec.js
│   │   ├── telemetry/
│   │   │   ├── BatchingWebSocket.js
│   │   │   ├── DefaultMetadataProvider.js
│   │   │   ├── TelemetryAPI.js
│   │   │   ├── TelemetryAPISpec.js
│   │   │   ├── TelemetryCollection.js
│   │   │   ├── TelemetryCollectionSpec.js
│   │   │   ├── TelemetryMetadataManager.js
│   │   │   ├── TelemetryRequestInterceptor.js
│   │   │   ├── TelemetryValueFormatter.js
│   │   │   ├── WebSocketWorker.js
│   │   │   └── constants.js
│   │   ├── time/
│   │   │   ├── GlobalTimeContext.js
│   │   │   ├── IndependentTimeContext.js
│   │   │   ├── TimeAPI.js
│   │   │   ├── TimeAPISpec.js
│   │   │   ├── TimeContext.js
│   │   │   ├── constants.js
│   │   │   └── independentTimeAPISpec.js
│   │   ├── tooltips/
│   │   │   ├── ToolTip.js
│   │   │   ├── ToolTipAPI.js
│   │   │   ├── components/
│   │   │   │   ├── TooltipComponent.vue
│   │   │   │   └── tooltip-component.scss
│   │   │   └── tooltipMixins.js
│   │   ├── types/
│   │   │   ├── Type.js
│   │   │   ├── TypeRegistry.js
│   │   │   └── TypeRegistrySpec.js
│   │   └── user/
│   │       ├── ActiveRoleSynchronizer.js
│   │       ├── StatusAPI.js
│   │       ├── StatusUserProvider.js
│   │       ├── StoragePersistence.js
│   │       ├── User.js
│   │       ├── UserAPI.js
│   │       ├── UserAPISpec.js
│   │       ├── UserProvider.js
│   │       ├── UserStatusAPISpec.js
│   │       └── constants.js
│   ├── exporters/
│   │   ├── CSVExporter.js
│   │   ├── ImageExporter.js
│   │   ├── ImageExporterSpec.js
│   │   └── JSONExporter.js
│   ├── plugins/
│   │   ├── CouchDBSearchFolder/
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── DeviceClassifier/
│   │   │   ├── plugin.js
│   │   │   └── src/
│   │   │       ├── DeviceClassifier.js
│   │   │       ├── DeviceClassifierSpec.js
│   │   │       ├── DeviceMatchers.js
│   │   │       └── DeviceMatchersSpec.js
│   │   ├── ISOTimeFormat/
│   │   │   ├── ISOTimeFormat.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── LADTable/
│   │   │   ├── LADTableCompositionPolicy.js
│   │   │   ├── LADTableConfiguration.js
│   │   │   ├── LADTableConfigurationViewProvider.js
│   │   │   ├── LADTableSetViewProvider.js
│   │   │   ├── LADTableView.js
│   │   │   ├── LADTableViewProvider.js
│   │   │   ├── LadTableSetView.js
│   │   │   ├── ViewActions.js
│   │   │   ├── components/
│   │   │   │   ├── LadRow.vue
│   │   │   │   ├── LadTable.vue
│   │   │   │   ├── LadTableConfiguration.vue
│   │   │   │   └── LadTableSet.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── URLIndicatorPlugin/
│   │   │   ├── README.md
│   │   │   ├── URLIndicator.js
│   │   │   ├── URLIndicatorPlugin.js
│   │   │   └── URLIndicatorSpec.js
│   │   ├── URLTimeSettingsSynchronizer/
│   │   │   ├── URLTimeSettingsSynchronizer.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── activityStates/
│   │   │   ├── activityStatesInterceptor.js
│   │   │   ├── createActivityStatesIdentifier.js
│   │   │   └── pluginSpec.js
│   │   ├── autoflow/
│   │   │   ├── AutoflowTabularConstants.js
│   │   │   ├── AutoflowTabularController.js
│   │   │   ├── AutoflowTabularPlugin.js
│   │   │   ├── AutoflowTabularPluginSpec.js
│   │   │   ├── AutoflowTabularRowController.js
│   │   │   ├── AutoflowTabularView.js
│   │   │   ├── README.md
│   │   │   ├── VueView.js
│   │   │   ├── autoflow-tabular.html
│   │   │   └── dom-observer.js
│   │   ├── charts/
│   │   │   ├── bar/
│   │   │   │   ├── BarGraphCompositionPolicy.js
│   │   │   │   ├── BarGraphConstants.js
│   │   │   │   ├── BarGraphPlot.vue
│   │   │   │   ├── BarGraphView.vue
│   │   │   │   ├── BarGraphViewProvider.js
│   │   │   │   ├── inspector/
│   │   │   │   │   ├── BarGraphInspectorViewProvider.js
│   │   │   │   │   ├── BarGraphOptions.vue
│   │   │   │   │   └── SeriesOptions.vue
│   │   │   │   ├── plugin.js
│   │   │   │   └── pluginSpec.js
│   │   │   └── scatter/
│   │   │       ├── ScatterPlotCompositionPolicy.js
│   │   │       ├── ScatterPlotForm.vue
│   │   │       ├── ScatterPlotView.vue
│   │   │       ├── ScatterPlotViewProvider.js
│   │   │       ├── ScatterPlotWithUnderlay.vue
│   │   │       ├── inspector/
│   │   │       │   ├── PlotOptions.vue
│   │   │       │   ├── PlotOptionsBrowse.vue
│   │   │       │   ├── PlotOptionsEdit.vue
│   │   │       │   └── ScatterPlotInspectorViewProvider.js
│   │   │       ├── plugin.js
│   │   │       ├── pluginSpec.js
│   │   │       └── scatterPlotConstants.js
│   │   ├── clearData/
│   │   │   ├── ClearDataAction.js
│   │   │   ├── components/
│   │   │   │   └── GlobalClearIndicator.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── clock/
│   │   │   ├── ClockViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── ClockComponent.vue
│   │   │   │   └── ClockIndicator.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── comps/
│   │   │   ├── CompsCompositionPolicy.js
│   │   │   ├── CompsInspectorViewProvider.js
│   │   │   ├── CompsManager.js
│   │   │   ├── CompsMathWorker.js
│   │   │   ├── CompsMetadataProvider.js
│   │   │   ├── CompsTelemetryProvider.js
│   │   │   ├── CompsViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── CompsInspectorView.vue
│   │   │   │   ├── CompsView.vue
│   │   │   │   └── comps.scss
│   │   │   └── plugin.js
│   │   ├── condition/
│   │   │   ├── Condition.js
│   │   │   ├── ConditionManager.js
│   │   │   ├── ConditionManagerSpec.js
│   │   │   ├── ConditionSetCompositionPolicy.js
│   │   │   ├── ConditionSetCompositionPolicySpec.js
│   │   │   ├── ConditionSetMetadataProvider.js
│   │   │   ├── ConditionSetTelemetryProvider.js
│   │   │   ├── ConditionSetViewProvider.js
│   │   │   ├── ConditionSpec.js
│   │   │   ├── StyleRuleManager.js
│   │   │   ├── components/
│   │   │   │   ├── ConditionCollection.vue
│   │   │   │   ├── ConditionDescription.vue
│   │   │   │   ├── ConditionError.vue
│   │   │   │   ├── ConditionItem.vue
│   │   │   │   ├── ConditionSet.vue
│   │   │   │   ├── CriterionItem.vue
│   │   │   │   ├── CurrentOutput.vue
│   │   │   │   ├── TestData.vue
│   │   │   │   ├── conditionals.scss
│   │   │   │   └── inspector/
│   │   │   │       ├── ConditionalStylesView.vue
│   │   │   │       ├── StyleEditor.vue
│   │   │   │       ├── StylesView.vue
│   │   │   │       └── conditional-styles.scss
│   │   │   ├── criterion/
│   │   │   │   ├── AllTelemetryCriterion.js
│   │   │   │   ├── TelemetryCriterion.js
│   │   │   │   └── TelemetryCriterionSpec.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── utils/
│   │   │       ├── constants.js
│   │   │       ├── evaluator.js
│   │   │       ├── evaluatorSpec.js
│   │   │       ├── operations.js
│   │   │       ├── operationsSpec.js
│   │   │       ├── styleUtils.js
│   │   │       ├── time.js
│   │   │       └── timeSpec.js
│   │   ├── conditionWidget/
│   │   │   ├── ConditionWidgetViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── ConditionWidget.vue
│   │   │   │   └── condition-widget.scss
│   │   │   ├── conditionWidgetStylesInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── correlationTelemetryPlugin/
│   │   │   └── plugin.js
│   │   ├── defaultRootName/
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── displayLayout/
│   │   │   ├── AlphanumericFormatViewProvider.js
│   │   │   ├── CustomStringFormatter.js
│   │   │   ├── CustomStringFormatterSpec.js
│   │   │   ├── DisplayLayoutToolbar.js
│   │   │   ├── DisplayLayoutType.js
│   │   │   ├── DrawingObjectTypes.js
│   │   │   ├── LayoutDrag.js
│   │   │   ├── actions/
│   │   │   │   └── CopyToClipboardAction.js
│   │   │   ├── components/
│   │   │   │   ├── AlphanumericFormat.vue
│   │   │   │   ├── BoxView.vue
│   │   │   │   ├── DisplayLayout.vue
│   │   │   │   ├── DisplayLayoutGrid.vue
│   │   │   │   ├── EditMarquee.vue
│   │   │   │   ├── EllipseView.vue
│   │   │   │   ├── ImageView.vue
│   │   │   │   ├── LayoutFrame.vue
│   │   │   │   ├── LineView.vue
│   │   │   │   ├── SubobjectView.vue
│   │   │   │   ├── TelemetryView.vue
│   │   │   │   ├── TextView.vue
│   │   │   │   ├── box-and-line-views.scss
│   │   │   │   ├── display-layout.scss
│   │   │   │   ├── edit-marquee.scss
│   │   │   │   ├── image-view.scss
│   │   │   │   ├── layout-frame.scss
│   │   │   │   ├── telemetry-view.scss
│   │   │   │   └── text-view.scss
│   │   │   ├── displayLayoutStylesInterceptor.js
│   │   │   ├── mixins/
│   │   │   │   └── objectStyles-mixin.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── duplicate/
│   │   │   ├── DuplicateAction.js
│   │   │   ├── DuplicateTask.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── events/
│   │   │   ├── EventInspectorViewProvider.js
│   │   │   ├── EventTimelineViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── EventInspectorView.vue
│   │   │   │   ├── EventTimelineView.vue
│   │   │   │   └── events-view.scss
│   │   │   ├── mixins/
│   │   │   │   └── eventData.js
│   │   │   └── plugin.js
│   │   ├── exportAsJSONAction/
│   │   │   ├── ExportAsJSONAction.js
│   │   │   ├── ExportAsJSONActionSpec.js
│   │   │   └── plugin.js
│   │   ├── faultManagement/
│   │   │   ├── FaultManagementInspector.vue
│   │   │   ├── FaultManagementInspectorViewProvider.js
│   │   │   ├── FaultManagementListHeader.vue
│   │   │   ├── FaultManagementListItem.vue
│   │   │   ├── FaultManagementObjectProvider.js
│   │   │   ├── FaultManagementPlugin.js
│   │   │   ├── FaultManagementSearch.vue
│   │   │   ├── FaultManagementToolbar.vue
│   │   │   ├── FaultManagementView.vue
│   │   │   ├── FaultManagementViewProvider.js
│   │   │   ├── constants.js
│   │   │   ├── fault-manager.scss
│   │   │   └── pluginSpec.js
│   │   ├── filters/
│   │   │   ├── FiltersInspectorViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── FilterField.vue
│   │   │   │   ├── FilterObject.vue
│   │   │   │   ├── FiltersView.vue
│   │   │   │   ├── GlobalFilters.vue
│   │   │   │   ├── filters-view.scss
│   │   │   │   └── global-filters.scss
│   │   │   └── plugin.js
│   │   ├── flexibleLayout/
│   │   │   ├── components/
│   │   │   │   ├── ContainerComponent.vue
│   │   │   │   ├── DropHint.vue
│   │   │   │   ├── FlexibleLayout.vue
│   │   │   │   ├── FrameComponent.vue
│   │   │   │   └── flexible-layout.scss
│   │   │   ├── flexibleLayoutStylesInterceptor.js
│   │   │   ├── flexibleLayoutViewProvider.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── toolbarProvider.js
│   │   ├── folderView/
│   │   │   ├── FolderGridView.js
│   │   │   ├── FolderListView.js
│   │   │   ├── components/
│   │   │   │   ├── GridItem.vue
│   │   │   │   ├── GridView.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── ListView.vue
│   │   │   │   ├── composition-loader.js
│   │   │   │   ├── grid-view.scss
│   │   │   │   ├── list-item.scss
│   │   │   │   └── status-listener.js
│   │   │   ├── constants.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── formActions/
│   │   │   ├── CreateAction.js
│   │   │   ├── CreateActionSpec.js
│   │   │   ├── CreateWizard.js
│   │   │   ├── EditPropertiesAction.js
│   │   │   ├── PropertiesAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── gauge/
│   │   │   ├── GaugeCompositionPolicy.js
│   │   │   ├── GaugePlugin.js
│   │   │   ├── GaugePluginSpec.js
│   │   │   ├── GaugeViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── GaugeComponent.vue
│   │   │   │   └── GaugeFormController.vue
│   │   │   ├── gauge-limit-util.js
│   │   │   ├── gauge.scss
│   │   │   └── gaugeStylesInterceptor.js
│   │   ├── goToOriginalAction/
│   │   │   ├── goToOriginalAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── hyperlink/
│   │   │   ├── HyperlinkLayout.vue
│   │   │   ├── HyperlinkProvider.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── imagery/
│   │   │   ├── ImageryTimestripViewProvider.js
│   │   │   ├── ImageryView.js
│   │   │   ├── ImageryViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── OpenImageInNewTabAction.js
│   │   │   │   └── SaveImageAsAction.js
│   │   │   ├── components/
│   │   │   │   ├── AnnotationsCanvas.vue
│   │   │   │   ├── Compass/
│   │   │   │   │   ├── CompassComponent.vue
│   │   │   │   │   ├── CompassHud.vue
│   │   │   │   │   ├── CompassRose.vue
│   │   │   │   │   ├── compass.scss
│   │   │   │   │   ├── pluginSpec.js
│   │   │   │   │   └── utils.js
│   │   │   │   ├── FilterSettings.vue
│   │   │   │   ├── ImageControls.vue
│   │   │   │   ├── ImageThumbnail.vue
│   │   │   │   ├── ImageryTimeView.vue
│   │   │   │   ├── ImageryView.vue
│   │   │   │   ├── ImageryViewMenuSwitcher.vue
│   │   │   │   ├── LayerSettings.vue
│   │   │   │   ├── RelatedTelemetry/
│   │   │   │   │   └── RelatedTelemetry.js
│   │   │   │   ├── ZoomSettings.vue
│   │   │   │   └── imagery-view.scss
│   │   │   ├── lib/
│   │   │   │   └── eventHelpers.js
│   │   │   ├── mixins/
│   │   │   │   └── imageryData.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── importFromJSONAction/
│   │   │   ├── ImportFromJSONAction.js
│   │   │   ├── ImportFromJSONActionSpec.js
│   │   │   └── plugin.js
│   │   ├── inspectorDataVisualization/
│   │   │   ├── DataVisualization.vue
│   │   │   ├── ImageryInspectorView.vue
│   │   │   ├── InspectorDataVisualizationComponent.vue
│   │   │   ├── InspectorDataVisualizationViewProvider.js
│   │   │   ├── NumericDataInspectorView.vue
│   │   │   ├── TelemetryFrame.vue
│   │   │   ├── inspector-data-visualization.scss
│   │   │   └── plugin.js
│   │   ├── inspectorViews/
│   │   │   ├── annotations/
│   │   │   │   ├── AnnotationsInspectorView.vue
│   │   │   │   ├── AnnotationsViewProvider.js
│   │   │   │   └── tags/
│   │   │   │       ├── TagEditor.vue
│   │   │   │       ├── TagEditorClassNames.js
│   │   │   │       ├── TagSelection.vue
│   │   │   │       └── tags.scss
│   │   │   ├── elements/
│   │   │   │   ├── ElementItem.vue
│   │   │   │   ├── ElementItemGroup.vue
│   │   │   │   ├── ElementsPool.vue
│   │   │   │   ├── ElementsViewProvider.js
│   │   │   │   ├── PlotElementsPool.vue
│   │   │   │   ├── PlotElementsViewProvider.js
│   │   │   │   └── elements.scss
│   │   │   ├── plugin.js
│   │   │   ├── properties/
│   │   │   │   ├── DetailText.vue
│   │   │   │   ├── LocationComponent.vue
│   │   │   │   ├── PropertiesComponent.vue
│   │   │   │   ├── PropertiesViewProvider.js
│   │   │   │   └── location.scss
│   │   │   └── styles/
│   │   │       ├── FontStyleEditor.vue
│   │   │       ├── SavedStyleSelector.vue
│   │   │       ├── SavedStylesInspectorView.vue
│   │   │       ├── SavedStylesView.vue
│   │   │       ├── StylesInspectorView.vue
│   │   │       ├── StylesInspectorViewProvider.js
│   │   │       ├── StylesManager.js
│   │   │       └── constants.js
│   │   ├── interceptors/
│   │   │   ├── missingObjectInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── latestDataClock/
│   │   │   ├── LADClock.js
│   │   │   └── plugin.js
│   │   ├── licenses/
│   │   │   ├── LicensesComponent.vue
│   │   │   ├── plugin.js
│   │   │   └── third-party-licenses.json
│   │   ├── linkAction/
│   │   │   ├── LinkAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── localStorage/
│   │   │   ├── LocalStorageObjectProvider.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── localTimeSystem/
│   │   │   ├── LocalTimeFormat.js
│   │   │   ├── LocalTimeSystem.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── move/
│   │   │   ├── MoveAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── myItems/
│   │   │   ├── README.md
│   │   │   ├── createMyItemsIdentifier.js
│   │   │   ├── myItemsInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── newFolderAction/
│   │   │   ├── newFolderAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── notebook/
│   │   │   ├── NotebookType.js
│   │   │   ├── NotebookViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── CopyToNotebookAction.js
│   │   │   │   └── ExportNotebookAsTextAction.js
│   │   │   ├── components/
│   │   │   │   ├── NotebookComponent.vue
│   │   │   │   ├── NotebookEmbed.vue
│   │   │   │   ├── NotebookEntry.vue
│   │   │   │   ├── NotebookMenuSwitcher.vue
│   │   │   │   ├── NotebookSnapshotContainer.vue
│   │   │   │   ├── NotebookSnapshotIndicator.vue
│   │   │   │   ├── PageCollection.vue
│   │   │   │   ├── PageComponent.vue
│   │   │   │   ├── PopupMenu.vue
│   │   │   │   ├── SearchResults.vue
│   │   │   │   ├── SectionCollection.vue
│   │   │   │   ├── SectionComponent.vue
│   │   │   │   ├── SidebarComponent.vue
│   │   │   │   ├── sidebar.scss
│   │   │   │   └── snapshot-template.html
│   │   │   ├── monkeyPatchObjectAPIForNotebooks.js
│   │   │   ├── notebook-constants.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── snapshot-container.js
│   │   │   ├── snapshot.js
│   │   │   └── utils/
│   │   │       ├── notebook-entries.js
│   │   │       ├── notebook-entriesSpec.js
│   │   │       ├── notebook-image.js
│   │   │       ├── notebook-key-code.js
│   │   │       ├── notebook-migration.js
│   │   │       ├── notebook-snapshot-menu.js
│   │   │       ├── notebook-storage.js
│   │   │       ├── notebook-storageSpec.js
│   │   │       ├── painterroInstance.js
│   │   │       └── removeDialog.js
│   │   ├── notificationIndicator/
│   │   │   ├── components/
│   │   │   │   ├── NotificationIndicator.vue
│   │   │   │   ├── NotificationMessage.vue
│   │   │   │   └── NotificationsList.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── objectMigration/
│   │   │   ├── Migrations.js
│   │   │   └── plugin.js
│   │   ├── openInNewTabAction/
│   │   │   ├── openInNewTabAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── operatorStatus/
│   │   │   ├── AbstractStatusIndicator.js
│   │   │   ├── operator-status.scss
│   │   │   ├── operatorStatus/
│   │   │   │   ├── OperatorStatus.vue
│   │   │   │   └── OperatorStatusIndicator.js
│   │   │   ├── plugin.js
│   │   │   └── pollQuestion/
│   │   │       ├── PollQuestion.vue
│   │   │       └── PollQuestionIndicator.js
│   │   ├── performanceIndicator/
│   │   │   ├── README.md
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── persistence/
│   │   │   └── couch/
│   │   │       ├── CouchChangesFeed.js
│   │   │       ├── CouchDocument.js
│   │   │       ├── CouchObjectProvider.js
│   │   │       ├── CouchObjectQueue.js
│   │   │       ├── CouchSearchProvider.js
│   │   │       ├── CouchStatusIndicator.js
│   │   │       ├── README.md
│   │   │       ├── couchdb-compose.yaml
│   │   │       ├── package.json
│   │   │       ├── plugin.js
│   │   │       ├── pluginSpec.js
│   │   │       ├── replace-localstorage-with-couchdb-indexhtml.sh
│   │   │       ├── scripts/
│   │   │       │   ├── deleteAnnotations.js
│   │   │       │   └── lockObjects.mjs
│   │   │       └── setup-couchdb.sh
│   │   ├── plan/
│   │   │   ├── GanttChartCompositionPolicy.js
│   │   │   ├── PlanViewConfiguration.js
│   │   │   ├── PlanViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── ActivityTimeline.vue
│   │   │   │   └── PlanView.vue
│   │   │   ├── inspector/
│   │   │   │   ├── ActivityInspectorViewProvider.js
│   │   │   │   ├── GanttChartInspectorViewProvider.js
│   │   │   │   ├── PlanInspectorViewProvider.js
│   │   │   │   └── components/
│   │   │   │       ├── ActivityProperty.vue
│   │   │   │       ├── PlanActivitiesView.vue
│   │   │   │       ├── PlanActivityPropertiesView.vue
│   │   │   │       ├── PlanActivityStatusView.vue
│   │   │   │       ├── PlanActivityTimeView.vue
│   │   │   │       ├── PlanExecutionMonitoringView.vue
│   │   │   │       └── PlanViewConfiguration.vue
│   │   │   ├── plan.scss
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── util.js
│   │   ├── planExecutionMonitoring/
│   │   │   ├── planExecutionMonitoringIdentifier.js
│   │   │   ├── planExecutionMonitoringInterceptor.js
│   │   │   └── pluginSpec.js
│   │   ├── plot/
│   │   │   ├── LinearScale.js
│   │   │   ├── MctPlot.vue
│   │   │   ├── MctTicks.vue
│   │   │   ├── PlotView.vue
│   │   │   ├── PlotViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── actions/
│   │   │   │   ├── ViewActions.js
│   │   │   │   └── utils.js
│   │   │   ├── axis/
│   │   │   │   ├── XAxis.vue
│   │   │   │   └── YAxis.vue
│   │   │   ├── chart/
│   │   │   │   ├── LimitLabel.vue
│   │   │   │   ├── LimitLine.vue
│   │   │   │   ├── MCTChartAlarmLineSet.js
│   │   │   │   ├── MCTChartAlarmPointSet.js
│   │   │   │   ├── MCTChartLineLinear.js
│   │   │   │   ├── MCTChartLineStepAfter.js
│   │   │   │   ├── MCTChartPointSet.js
│   │   │   │   ├── MCTChartSeriesElement.js
│   │   │   │   ├── MctChart.vue
│   │   │   │   └── limitUtil.js
│   │   │   ├── configuration/
│   │   │   │   ├── Collection.js
│   │   │   │   ├── ConfigStore.js
│   │   │   │   ├── LegendModel.js
│   │   │   │   ├── Model.js
│   │   │   │   ├── PlotConfigurationModel.js
│   │   │   │   ├── PlotSeries.js
│   │   │   │   ├── SeriesCollection.js
│   │   │   │   ├── XAxisModel.js
│   │   │   │   └── YAxisModel.js
│   │   │   ├── draw/
│   │   │   │   ├── Draw2D.js
│   │   │   │   ├── DrawLoader.js
│   │   │   │   ├── DrawWebGL.js
│   │   │   │   └── MarkerShapes.js
│   │   │   ├── inspector/
│   │   │   │   ├── PlotOptions.vue
│   │   │   │   ├── PlotOptionsBrowse.vue
│   │   │   │   ├── PlotOptionsEdit.vue
│   │   │   │   ├── PlotOptionsItem.vue
│   │   │   │   ├── PlotsInspectorViewProvider.js
│   │   │   │   ├── StackedPlotsInspectorViewProvider.js
│   │   │   │   └── forms/
│   │   │   │       ├── LegendForm.vue
│   │   │   │       ├── SeriesForm.vue
│   │   │   │       ├── YAxisForm.vue
│   │   │   │       └── formUtil.js
│   │   │   ├── legend/
│   │   │   │   ├── PlotLegend.vue
│   │   │   │   ├── PlotLegendItemCollapsed.vue
│   │   │   │   └── PlotLegendItemExpanded.vue
│   │   │   ├── lib/
│   │   │   │   └── eventHelpers.js
│   │   │   ├── mathUtils.js
│   │   │   ├── overlayPlot/
│   │   │   │   ├── OverlayPlotCompositionPolicy.js
│   │   │   │   ├── OverlayPlotViewProvider.js
│   │   │   │   ├── overlayPlotStylesInterceptor.js
│   │   │   │   └── pluginSpec.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── stackedPlot/
│   │   │   │   ├── StackedPlot.vue
│   │   │   │   ├── StackedPlotCompositionPolicy.js
│   │   │   │   ├── StackedPlotItem.vue
│   │   │   │   ├── StackedPlotViewProvider.js
│   │   │   │   ├── mixins/
│   │   │   │   │   └── objectStyles-mixin.js
│   │   │   │   ├── pluginSpec.js
│   │   │   │   └── stackedPlotConfigurationInterceptor.js
│   │   │   └── tickUtils.js
│   │   ├── plugins.js
│   │   ├── reloadAction/
│   │   │   ├── ReloadAction.js
│   │   │   └── plugin.js
│   │   ├── remoteClock/
│   │   │   ├── RemoteClock.js
│   │   │   ├── RemoteClockSpec.js
│   │   │   ├── plugin.js
│   │   │   └── requestInterceptor.js
│   │   ├── remove/
│   │   │   ├── RemoveAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── staticRootPlugin/
│   │   │   ├── README.md
│   │   │   ├── StaticModelProvider.js
│   │   │   ├── StaticModelProviderSpec.js
│   │   │   ├── plugin.js
│   │   │   └── test-data/
│   │   │       ├── static-provider-test-empty-namespace.json
│   │   │       └── static-provider-test-foo-namespace.json
│   │   ├── summaryWidget/
│   │   │   ├── README.md
│   │   │   ├── SummaryWidgetViewPolicy.js
│   │   │   ├── SummaryWidgetsCompositionPolicy.js
│   │   │   ├── plugin.js
│   │   │   ├── res/
│   │   │   │   ├── conditionTemplate.html
│   │   │   │   ├── input/
│   │   │   │   │   ├── paletteTemplate.html
│   │   │   │   │   └── selectTemplate.html
│   │   │   │   ├── ruleImageTemplate.html
│   │   │   │   ├── ruleTemplate.html
│   │   │   │   ├── testDataItemTemplate.html
│   │   │   │   ├── testDataTemplate.html
│   │   │   │   └── widgetTemplate.html
│   │   │   ├── src/
│   │   │   │   ├── Condition.js
│   │   │   │   ├── ConditionEvaluator.js
│   │   │   │   ├── ConditionManager.js
│   │   │   │   ├── Rule.js
│   │   │   │   ├── SummaryWidget.js
│   │   │   │   ├── TestDataItem.js
│   │   │   │   ├── TestDataManager.js
│   │   │   │   ├── WidgetDnD.js
│   │   │   │   ├── eventHelpers.js
│   │   │   │   ├── input/
│   │   │   │   │   ├── ColorPalette.js
│   │   │   │   │   ├── IconPalette.js
│   │   │   │   │   ├── KeySelect.js
│   │   │   │   │   ├── ObjectSelect.js
│   │   │   │   │   ├── OperationSelect.js
│   │   │   │   │   ├── Palette.js
│   │   │   │   │   └── Select.js
│   │   │   │   ├── telemetry/
│   │   │   │   │   ├── EvaluatorPool.js
│   │   │   │   │   ├── EvaluatorPoolSpec.js
│   │   │   │   │   ├── SummaryWidgetCondition.js
│   │   │   │   │   ├── SummaryWidgetConditionSpec.js
│   │   │   │   │   ├── SummaryWidgetEvaluator.js
│   │   │   │   │   ├── SummaryWidgetMetadataProvider.js
│   │   │   │   │   ├── SummaryWidgetRule.js
│   │   │   │   │   ├── SummaryWidgetRuleSpec.js
│   │   │   │   │   ├── SummaryWidgetTelemetryProvider.js
│   │   │   │   │   ├── SummaryWidgetTelemetryProviderSpec.js
│   │   │   │   │   └── operations.js
│   │   │   │   └── views/
│   │   │   │       ├── SummaryWidgetView.js
│   │   │   │       └── SummaryWidgetViewProvider.js
│   │   │   └── test/
│   │   │       ├── ConditionEvaluatorSpec.js
│   │   │       ├── ConditionManagerSpec.js
│   │   │       ├── ConditionSpec.js
│   │   │       ├── RuleSpec.js
│   │   │       ├── SummaryWidgetSpec.js
│   │   │       ├── SummaryWidgetViewPolicySpec.js
│   │   │       ├── TestDataItemSpec.js
│   │   │       ├── TestDataManagerSpec.js
│   │   │       ├── WidgetDnDSpec.js
│   │   │       └── input/
│   │   │           ├── ColorPaletteSpec.js
│   │   │           ├── IconPaletteSpec.js
│   │   │           ├── KeySelectSpec.js
│   │   │           ├── ObjectSelectSpec.js
│   │   │           ├── OperationSelectSpec.js
│   │   │           ├── PaletteSpec.js
│   │   │           └── SelectSpec.js
│   │   ├── tabs/
│   │   │   ├── components/
│   │   │   │   ├── TabsComponent.vue
│   │   │   │   └── tabs.scss
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── tabs.js
│   │   ├── telemetryMean/
│   │   │   ├── plugin.js
│   │   │   └── src/
│   │   │       ├── MeanTelemetryProvider.js
│   │   │       ├── MeanTelemetryProviderSpec.js
│   │   │       ├── MockTelemetryApi.js
│   │   │       └── TelemetryAverager.js
│   │   ├── telemetryTable/
│   │   │   ├── TableConfigurationViewProvider.js
│   │   │   ├── TelemetryTable.js
│   │   │   ├── TelemetryTableColumn.js
│   │   │   ├── TelemetryTableConfiguration.js
│   │   │   ├── TelemetryTableNameColumn.js
│   │   │   ├── TelemetryTableRow.js
│   │   │   ├── TelemetryTableType.js
│   │   │   ├── TelemetryTableUnitColumn.js
│   │   │   ├── TelemetryTableView.js
│   │   │   ├── TelemetryTableViewProvider.js
│   │   │   ├── ViewActions.js
│   │   │   ├── collections/
│   │   │   │   └── TableRowCollection.js
│   │   │   ├── components/
│   │   │   │   ├── SizingRow.vue
│   │   │   │   ├── TableCell.vue
│   │   │   │   ├── TableColumnHeader.vue
│   │   │   │   ├── TableComponent.vue
│   │   │   │   ├── TableConfiguration.vue
│   │   │   │   ├── TableFooterIndicator.vue
│   │   │   │   ├── TableRow.vue
│   │   │   │   ├── table-footer-indicator.scss
│   │   │   │   ├── table-row.scss
│   │   │   │   └── table.scss
│   │   │   ├── constants.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── telemetryTableStylesInterceptor.js
│   │   ├── themes/
│   │   │   ├── darkmatter-theme.scss
│   │   │   ├── darkmatter.js
│   │   │   ├── espresso-theme.scss
│   │   │   ├── espresso.js
│   │   │   ├── installTheme.js
│   │   │   ├── snow-theme.scss
│   │   │   └── snow.js
│   │   ├── timeConductor/
│   │   │   ├── ConductorAxis.vue
│   │   │   ├── ConductorClock.vue
│   │   │   ├── ConductorComponent.vue
│   │   │   ├── ConductorHistory.vue
│   │   │   ├── ConductorInputsFixed.vue
│   │   │   ├── ConductorInputsRealtime.vue
│   │   │   ├── ConductorMode.vue
│   │   │   ├── ConductorModeIcon.vue
│   │   │   ├── ConductorPopUp.vue
│   │   │   ├── ConductorTimeSystem.vue
│   │   │   ├── DatePicker.vue
│   │   │   ├── DateTimePopupFixed.vue
│   │   │   ├── TimePopupFixed.vue
│   │   │   ├── TimePopupRealtime.vue
│   │   │   ├── clock-mixin.js
│   │   │   ├── conductor-axis.scss
│   │   │   ├── conductor-mode-icon.scss
│   │   │   ├── conductor.scss
│   │   │   ├── conductorPopUpManager.js
│   │   │   ├── date-picker.scss
│   │   │   ├── independent/
│   │   │   │   ├── IndependentClock.vue
│   │   │   │   ├── IndependentMode.vue
│   │   │   │   ├── IndependentTimeConductor.vue
│   │   │   │   └── useIndependentTimeConductorPopUp.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── useClock.js
│   │   │   ├── useClockOffsets.js
│   │   │   ├── useTick.js
│   │   │   ├── useTime.js
│   │   │   ├── useTimeBounds.js
│   │   │   ├── useTimeContext.js
│   │   │   ├── useTimeMode.js
│   │   │   ├── useTimeSystem.js
│   │   │   └── utcMultiTimeFormat.js
│   │   ├── timeline/
│   │   │   ├── Container.js
│   │   │   ├── ExtendedLinesBus.js
│   │   │   ├── ExtendedLinesOverlay.vue
│   │   │   ├── TimelineCompositionPolicy.js
│   │   │   ├── TimelineElementsContent.vue
│   │   │   ├── TimelineElementsPool.vue
│   │   │   ├── TimelineElementsViewProvider.js
│   │   │   ├── TimelineObjectView.vue
│   │   │   ├── TimelineViewLayout.vue
│   │   │   ├── TimelineViewProvider.js
│   │   │   ├── configuration.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── timeline.scss
│   │   │   └── timelineInterceptor.js
│   │   ├── timelist/
│   │   │   ├── ExpandedViewItem.vue
│   │   │   ├── TimelistComponent.vue
│   │   │   ├── TimelistCompositionPolicy.js
│   │   │   ├── TimelistViewProvider.js
│   │   │   ├── constants.js
│   │   │   ├── inspector/
│   │   │   │   ├── EventProperties.vue
│   │   │   │   ├── FilteringComponent.vue
│   │   │   │   ├── TimeListInspectorViewProvider.js
│   │   │   │   └── TimelistPropertiesView.vue
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── svg-progress.js
│   │   │   └── timelist.scss
│   │   ├── timer/
│   │   │   ├── TimerViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── PauseTimerAction.js
│   │   │   │   ├── RestartTimerAction.js
│   │   │   │   ├── StartTimerAction.js
│   │   │   │   └── StopTimerAction.js
│   │   │   ├── components/
│   │   │   │   └── TimerComponent.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── userIndicator/
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── MissionStatusPopup.vue
│   │   │   │   └── UserIndicator.vue
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── user-indicator.scss
│   │   ├── utcTimeSystem/
│   │   │   ├── DurationFormat.js
│   │   │   ├── LocalClock.js
│   │   │   ├── UTCTimeFormat.js
│   │   │   ├── UTCTimeSystem.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── viewDatumAction/
│   │   │   ├── ViewDatumAction.js
│   │   │   ├── components/
│   │   │   │   ├── MetadataList.vue
│   │   │   │   └── metadata-list.scss
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── viewLargeAction/
│   │   │   ├── plugin.js
│   │   │   └── viewLargeAction.js
│   │   └── webPage/
│   │       ├── WebPageViewProvider.js
│   │       ├── components/
│   │       │   └── WebPage.vue
│   │       ├── plugin.js
│   │       └── pluginSpec.js
│   ├── selection/
│   │   └── Selection.js
│   ├── styles/
│   │   ├── _about.scss
│   │   ├── _animations.scss
│   │   ├── _constants-darkmatter.scss
│   │   ├── _constants-espresso.scss
│   │   ├── _constants-maelstrom.scss
│   │   ├── _constants-mobile.scss
│   │   ├── _constants-snow.scss
│   │   ├── _constants.scss
│   │   ├── _controls.scss
│   │   ├── _forms.scss
│   │   ├── _global.scss
│   │   ├── _glyphs.scss
│   │   ├── _legacy-messages.scss
│   │   ├── _legacy-plots.scss
│   │   ├── _legacy.scss
│   │   ├── _limits.scss
│   │   ├── _mixins.scss
│   │   ├── _status.scss
│   │   ├── _table.scss
│   │   ├── fonts/
│   │   │   ├── Open MCT Symbols 12px.json
│   │   │   └── Open MCT Symbols 16px.json
│   │   ├── notebook.scss
│   │   ├── plotly.scss
│   │   ├── vendor/
│   │   │   └── normalize-min.scss
│   │   └── vue-styles.scss
│   ├── tools/
│   │   ├── url.js
│   │   └── urlSpec.js
│   ├── ui/
│   │   ├── color/
│   │   │   ├── Color.js
│   │   │   ├── ColorHelper.js
│   │   │   ├── ColorPalette.js
│   │   │   └── ColorSwatch.vue
│   │   ├── components/
│   │   │   ├── COMPONENTS.md
│   │   │   ├── ContextMenuDropDown.vue
│   │   │   ├── List/
│   │   │   │   ├── ListHeader.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── ListView.vue
│   │   │   │   └── list-view.scss
│   │   │   ├── ObjectFrame.vue
│   │   │   ├── ObjectLabel.vue
│   │   │   ├── ObjectPath.vue
│   │   │   ├── ObjectPathString.vue
│   │   │   ├── ObjectView.vue
│   │   │   ├── ProgressBar.vue
│   │   │   ├── SearchComponent.vue
│   │   │   ├── TimeSystemAxis.vue
│   │   │   ├── ToggleSwitch.vue
│   │   │   ├── ViewControl.vue
│   │   │   ├── object-frame.scss
│   │   │   ├── object-label.scss
│   │   │   ├── progress-bar.scss
│   │   │   ├── search.scss
│   │   │   ├── swim-lane/
│   │   │   │   ├── SwimLane.vue
│   │   │   │   └── swimlane.scss
│   │   │   ├── timesystem-axis.scss
│   │   │   └── toggle-switch.scss
│   │   ├── composables/
│   │   │   ├── alignmentContext.js
│   │   │   ├── edit.js
│   │   │   ├── event.js
│   │   │   └── resize.js
│   │   ├── inspector/
│   │   │   ├── InspectorDetailsSpec.js
│   │   │   ├── InspectorPanel.vue
│   │   │   ├── InspectorStylesSpec.js
│   │   │   ├── InspectorStylesSpecMocks.js
│   │   │   ├── InspectorTabs.vue
│   │   │   ├── InspectorViews.vue
│   │   │   ├── ObjectName.vue
│   │   │   └── inspector.scss
│   │   ├── layout/
│   │   │   ├── AboutDialog.vue
│   │   │   ├── AppLayout.vue
│   │   │   ├── AppLogo.vue
│   │   │   ├── BrowseBar.vue
│   │   │   ├── Container.js
│   │   │   ├── CreateButton.vue
│   │   │   ├── Frame.js
│   │   │   ├── LayoutSpec.js
│   │   │   ├── MctTree.vue
│   │   │   ├── MultipaneContainer.vue
│   │   │   ├── PaneContainer.vue
│   │   │   ├── RecentObjectsList.vue
│   │   │   ├── RecentObjectsListItem.vue
│   │   │   ├── ResizeHandle/
│   │   │   │   └── ResizeHandle.vue
│   │   │   ├── TreeItem.vue
│   │   │   ├── ViewSwitcher.vue
│   │   │   ├── app-logo.scss
│   │   │   ├── create-button.scss
│   │   │   ├── layout.scss
│   │   │   ├── mct-tree.scss
│   │   │   ├── pane.scss
│   │   │   ├── recent-objects.scss
│   │   │   ├── search/
│   │   │   │   ├── AnnotationSearchResult.vue
│   │   │   │   ├── GrandSearch.vue
│   │   │   │   ├── GrandSearchSpec.js
│   │   │   │   ├── ObjectSearchResult.vue
│   │   │   │   ├── SearchResultsDropDown.vue
│   │   │   │   └── search.scss
│   │   │   └── status-bar/
│   │   │       ├── NotificationBanner.vue
│   │   │       ├── StatusIndicators.vue
│   │   │       ├── indicators.scss
│   │   │       └── notification-banner.scss
│   │   ├── mixins/
│   │   │   ├── context-menu-gesture.js
│   │   │   ├── object-link.js
│   │   │   ├── staleness-mixin.js
│   │   │   └── toggle-mixin.js
│   │   ├── preview/
│   │   │   ├── PreviewAction.js
│   │   │   ├── PreviewContainer.vue
│   │   │   ├── PreviewHeader.vue
│   │   │   ├── ViewHistoricalDataAction.js
│   │   │   ├── plugin.js
│   │   │   └── preview.scss
│   │   ├── registries/
│   │   │   ├── InspectorViewRegistry.js
│   │   │   ├── ToolbarRegistry.js
│   │   │   └── ViewRegistry.js
│   │   ├── router/
│   │   │   ├── ApplicationRouter.js
│   │   │   ├── ApplicationRouterSpec.js
│   │   │   └── Browse.js
│   │   └── toolbar/
│   │       ├── ToolbarContainer.vue
│   │       └── components/
│   │           ├── ToolbarButton.vue
│   │           ├── ToolbarCheckbox.vue
│   │           ├── ToolbarColorPicker.vue
│   │           ├── ToolbarInput.vue
│   │           ├── ToolbarMenu.vue
│   │           ├── ToolbarSelectMenu.vue
│   │           ├── ToolbarSeparator.vue
│   │           ├── ToolbarToggleButton.vue
│   │           └── toolbar-checkbox.scss
│   └── utils/
│       ├── agent/
│       │   ├── Agent.js
│       │   └── AgentSpec.js
│       ├── clipboard.js
│       ├── clock/
│       │   └── DefaultClock.js
│       ├── constants.js
│       ├── debounce.js
│       ├── duration.js
│       ├── encoding.js
│       ├── mount.js
│       ├── raf.js
│       ├── rafSpec.js
│       ├── random.js
│       ├── sanitization.js
│       ├── staleness.js
│       ├── template/
│       │   ├── templateHelpers.js
│       │   └── templateHelpersSpec.js
│       ├── testing/
│       │   └── mockLocalStorage.js
│       ├── testing.js
│       ├── textHighlight/
│       │   └── TextHighlight.vue
│       ├── throttle.js
│       ├── useEventBus.js
│       ├── visibility/
│       │   └── VisibilityObserver.js
│       ├── vue/
│       │   ├── useDragResizer.js
│       │   ├── useFlexContainers.js
│       │   └── useIsEditing.js
│       └── vueWrapHtmlElement.js
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .cspell.json
================================================
{
  "version": "0.2",
  "language": "en,en-us",
  "words": [
    "gress",
    "doctoc",
    "minmax",
    "openmct",
    "datasources",
    "Sinewave",
    "deregistration",
    "unregisters",
    "codecov",
    "carryforward",
    "Chacon",
    "Straub",
    "OWASP",
    "Testathon",
    "Testathons",
    "testathon",
    "npmjs",
    "treeitem",
    "timespan",
    "Timespan",
    "spinbutton",
    "popout",
    "textbox",
    "tablist",
    "Telem",
    "codecoverage",
    "browserless",
    "networkidle",
    "nums",
    "mgmt",
    "faultname",
    "gantt",
    "sharded",
    "MMOC",
    "codegen",
    "viewports",
    "updatesnapshots",
    "browsercontexts",
    "miminum",
    "testcase",
    "testsuite",
    "domcontentloaded",
    "Tracefile",
    "lcov",
    "linecov",
    "Browserless",
    "webserver",
    "yamcs",
    "quickstart",
    "subobject",
    "autosize",
    "Horz",
    "vehicula",
    "Praesent",
    "pharetra",
    "Duis",
    "eget",
    "arcu",
    "elementum",
    "mauris",
    "Donec",
    "nunc",
    "quis",
    "Proin",
    "elit",
    "Nunc",
    "Aenean",
    "mollis",
    "hendrerit",
    "Vestibulum",
    "placerat",
    "velit",
    "augue",
    "Quisque",
    "mattis",
    "lectus",
    "rutrum",
    "Fusce",
    "tincidunt",
    "nibh",
    "blandit",
    "urna",
    "Nullam",
    "congue",
    "enim",
    "Morbi",
    "bibendum",
    "Vivamus",
    "imperdiet",
    "Pellentesque",
    "cursus",
    "Aliquam",
    "orci",
    "Suspendisse",
    "amet",
    "justo",
    "Etiam",
    "vestibulum",
    "ullamcorper",
    "Cras",
    "aliquet",
    "Mauris",
    "Nulla",
    "scelerisque",
    "viverra",
    "metus",
    "condimentum",
    "varius",
    "nulla",
    "sapien",
    "Curabitur",
    "tristique",
    "Nonsectetur",
    "convallis",
    "accumsan",
    "lacus",
    "posuere",
    "turpis",
    "egestas",
    "feugiat",
    "tortor",
    "faucibus",
    "euismod",
    "pathing",
    "testcases",
    "Noneditable",
    "listitem",
    "Gantt",
    "timelist",
    "timestrip",
    "networkevents",
    "fetchpriority",
    "persistable",
    "Persistable",
    "persistability",
    "Persistability",
    "testdata",
    "Testdata",
    "metdata",
    "timeconductor",
    "contenteditable",
    "autoscale",
    "Autoscale",
    "prepan",
    "sinewave",
    "cyanish",
    "driv",
    "searchbox",
    "datetime",
    "timeframe",
    "recents",
    "recentobjects",
    "gsearch",
    "Disp",
    "Cloc",
    "noselect",
    "requestfailed",
    "viewlarge",
    "Imageurl",
    "thumbstrip",
    "checkmark",
    "Unshelve",
    "autosized",
    "chacskaylo",
    "numberfield",
    "OPENMCT",
    "Autoflow",
    "Timelist",
    "faultmanagement",
    "GEOSPATIAL",
    "geospatial",
    "plotspatial",
    "annnotation",
    "keystrings",
    "undelete",
    "sometag",
    "containee",
    "composability",
    "mutables",
    "Mutables",
    "composee",
    "handleoutsideclick",
    "Datetime",
    "Perc",
    "autodismiss",
    "filetree",
    "deeptailor",
    "keystring",
    "reindex",
    "unlisten",
    "symbolsfont",
    "ellipsize",
    "TIMESYSTEM",
    "Metadatas",
    "unsub",
    "callbacktwo",
    "unsubscribetwo",
    "telem",
    "unemitted",
    "granually",
    "timesystem",
    "metadatas",
    "iteratees",
    "metadatum",
    "printj",
    "sprintf",
    "unlisteners",
    "amts",
    "reregistered",
    "hudsonfoo",
    "onclone",
    "autoflow",
    "xdescribe",
    "mockmct",
    "Autoflowed",
    "plotly",
    "relayout",
    "Plotly",
    "Yaxis",
    "showlegend",
    "textposition",
    "xaxis",
    "automargin",
    "fixedrange",
    "yaxis",
    "Axistype",
    "showline",
    "bglayer",
    "autorange",
    "hoverinfo",
    "dotful",
    "Dotful",
    "cartesianlayer",
    "scatterlayer",
    "textfont",
    "ampm",
    "cdef",
    "horz",
    "STYLEABLE",
    "styleable",
    "afff",
    "shdw",
    "braintree",
    "vals",
    "Subobject",
    "Shdw",
    "Movebar",
    "inspectable",
    "Stringformatter",
    "sclk",
    "Objectpath",
    "Keystring",
    "duplicatable",
    "composees",
    "Composees",
    "Composee",
    "callthrough",
    "objectpath",
    "createable",
    "noneditable",
    "Classname",
    "classname",
    "selectedfaults",
    "accum",
    "newpersisted",
    "Metadatum",
    "MCWS",
    "YAMCS",
    "frameid",
    "containerid",
    "mmgis",
    "PERC",
    "curval",
    "viewbox",
    "mutablegauge",
    "Flatbush",
    "flatbush",
    "Indicies",
    "Marqueed",
    "NSEW",
    "nsew",
    "vrover",
    "gimbled",
    "Pannable",
    "unsynced",
    "Unsynced",
    "pannable",
    "autoscroll",
    "TIMESTRIP",
    "TWENTYFOUR",
    "FULLSIZE",
    "intialize",
    "Timestrip",
    "spyon",
    "Unlistener",
    "multipane",
    "DATESTRING",
    "akhenry",
    "Niklas",
    "Hertzen",
    "Kash",
    "Nouroozi",
    "Bostock",
    "BOSTOCK",
    "Arnout",
    "Kazemier",
    "Karolis",
    "Narkevicius",
    "Ashkenas",
    "Madhavan",
    "Iskren",
    "Ivov",
    "Chernev",
    "Borshchov",
    "painterro",
    "sheetjs",
    "Yuxi",
    "ACITON",
    "localstorage",
    "Linkto",
    "Painterro",
    "Editability",
    "filteredsnapshots",
    "Fromimage",
    "muliple",
    "notebookstorage",
    "Andpage",
    "pixelize",
    "Quickstart",
    "indexhtml",
    "youradminpassword",
    "chttpd",
    "sourcefiles",
    "USERPASS",
    "XPUT",
    "adipiscing",
    "eiusmod",
    "tempor",
    "incididunt",
    "labore",
    "dolore",
    "aliqua",
    "perspiciatis",
    "iteree",
    "submodels",
    "symlog",
    "Plottable",
    "antisymlog",
    "docstrings",
    "webglcontextlost",
    "gridlines",
    "Xaxis",
    "Crosshairs",
    "telemetrylimit",
    "xscale",
    "yscale",
    "untracks",
    "swatched",
    "NULLVALUE",
    "unobserver",
    "unsubscriber",
    "drap",
    "Averager",
    "averager",
    "movecolumnfromindex",
    "callout",
    "Konqueror",
    "unmark",
    "hitarea",
    "Hitarea",
    "Unmark",
    "controlbar",
    "reactified",
    "perc",
    "DHMS",
    "timespans",
    "timeframes",
    "Timesystems",
    "Hilite",
    "datetimes",
    "momentified",
    "ucontents",
    "TIMELIST",
    "Timeframe",
    "Guirk",
    "resizeable",
    "iframing",
    "Btns",
    "Ctrls",
    "Chakra",
    "Petch",
    "propor",
    "phoneandtablet",
    "desktopandtablet",
    "Imgs",
    "UNICODES",
    "datatable",
    "csvg",
    "cpath",
    "cellipse",
    "xlink",
    "cstyle",
    "bfill",
    "ctitle",
    "eicon",
    "interactability",
    "AFFORDANCES",
    "affordance",
    "scrollcontainer",
    "Icomoon",
    "icomoon",
    "configurability",
    "btns",
    "AUTOFLOW",
    "DATETIME",
    "infobubble",
    "thumbsbubble",
    "codehilite",
    "vscroll",
    "bgsize",
    "togglebutton",
    "Hacskaylo",
    "noie",
    "fullscreen",
    "horiz",
    "menubutton",
    "SNAPSHOTTING",
    "snapshotting",
    "PAINTERRO",
    "ptro",
    "PLOTLY",
    "gridlayer",
    "xtick",
    "ytick",
    "subobjects",
    "Ucontents",
    "Userand",
    "Userbefore",
    "brdr",
    "ALPH",
    "Recents",
    "Qbert",
    "Infobubble",
    "haslink",
    "VPID",
    "vpid",
    "updatedtest",
    "KHTML",
    "Chromezilla",
    "Safarifox",
    "deregistering",
    "hundredtized",
    "dhms",
    "unthrottled",
    "Codecov",
    "dont",
    "mediump",
    "sinonjs",
    "generatedata",
    "grandsearch",
    "websockets",
    "swgs",
    "memlab",
    "devmode",
    "blockquote",
    "blockquotes",
    "Blockquote",
    "Blockquotes",
    "oger",
    "lcovonly",
    "gcov",
    "WCAG",
    "stackedplot",
    "Andale",
    "unnormalized",
    "checksnapshots",
    "specced",
    "composables",
    "countup",
    "darkmatter",
    "Undeletes",
    "SSSZ",
    "pageerror",
    "annotatable",
    "requestfinished",
    "LOCF",
    "Unack"
  ],
  "dictionaries": ["npm", "softwareTerms", "node", "html", "css", "bash", "en_US", "en-gb", "misc"],
  "ignorePaths": [
    "package.json",
    "dist/**",
    "package-lock.json",
    "node_modules",
    "coverage",
    "*.log",
    "html-test-results",
    "test-results"
  ]
}


================================================
FILE: .eslintrc.cjs
================================================
const LEGACY_FILES = ['example/**'];
/** @type {import('eslint').Linter.Config} */
const config = {
  env: {
    browser: true,
    es2024: true,
    jasmine: true,
    amd: true,
    node: true
  },
  globals: {
    _: 'readonly',
    __webpack_public_path__: 'writeable',
    __OPENMCT_VERSION__: 'readonly',
    __OPENMCT_BUILD_DATE__: 'readonly',
    __OPENMCT_REVISION__: 'readonly',
    __OPENMCT_BUILD_BRANCH__: 'readonly',
    __OPENMCT_ROOT_RELATIVE__: 'readonly'
  },
  plugins: ['prettier', 'unicorn', 'simple-import-sort'],
  extends: [
    'eslint:recommended',
    'plugin:compat/recommended',
    'plugin:vue/vue3-recommended',
    'plugin:you-dont-need-lodash-underscore/compatible',
    'plugin:prettier/recommended',
    'plugin:no-unsanitized/DOM'
  ],
  parser: 'vue-eslint-parser',
  parserOptions: {
    parser: '@babel/eslint-parser',
    requireConfigFile: false,
    allowImportExportEverywhere: true,
    ecmaVersion: 'latest',
    ecmaFeatures: {
      impliedStrict: true
    },
    sourceType: 'module'
  },
  rules: {
    'simple-import-sort/imports': 'warn',
    'simple-import-sort/exports': 'warn',
    'vue/no-deprecated-dollar-listeners-api': 'warn',
    'vue/no-deprecated-events-api': 'warn',
    'vue/no-v-for-template-key': 'off',
    'vue/no-v-for-template-key-on-child': 'error',
    'vue/component-name-in-template-casing': ['error', 'PascalCase'],
    'prettier/prettier': 'error',
    'you-dont-need-lodash-underscore/omit': 'off',
    'you-dont-need-lodash-underscore/throttle': 'off',
    'you-dont-need-lodash-underscore/flatten': 'off',
    'you-dont-need-lodash-underscore/get': 'off',
    'no-bitwise': 'error',
    curly: 'error',
    eqeqeq: 'error',
    'guard-for-in': 'error',
    'no-extend-native': 'error',
    'no-inner-declarations': 'off',
    'no-use-before-define': ['error', 'nofunc'],
    'no-caller': 'error',
    'no-irregular-whitespace': 'error',
    'no-new': 'error',
    'no-shadow': 'error',
    'no-undef': 'error',
    'no-unused-vars': [
      'error',
      {
        vars: 'all',
        args: 'none'
      }
    ],
    'no-console': 'off',
    'new-cap': [
      'error',
      {
        capIsNew: false,
        properties: false
      }
    ],
    'dot-notation': 'error',

    // https://eslint.org/docs/rules/no-case-declarations
    'no-case-declarations': 'error',
    // https://eslint.org/docs/rules/max-classes-per-file
    'max-classes-per-file': ['error', 1],
    // https://eslint.org/docs/rules/no-eq-null
    'no-eq-null': 'error',
    // https://eslint.org/docs/rules/no-eval
    'no-eval': 'error',
    // https://eslint.org/docs/rules/no-implicit-globals
    'no-implicit-globals': 'error',
    // https://eslint.org/docs/rules/no-implied-eval
    'no-implied-eval': 'error',
    // https://eslint.org/docs/rules/no-lone-blocks
    'no-lone-blocks': 'error',
    // https://eslint.org/docs/rules/no-loop-func
    'no-loop-func': 'error',
    // https://eslint.org/docs/rules/no-new-func
    'no-new-func': 'error',
    // https://eslint.org/docs/rules/no-new-wrappers
    'no-new-wrappers': 'error',
    // https://eslint.org/docs/rules/no-octal-escape
    'no-octal-escape': 'error',
    // https://eslint.org/docs/rules/no-proto
    'no-proto': 'error',
    // https://eslint.org/docs/rules/no-return-await
    'no-return-await': 'error',
    // https://eslint.org/docs/rules/no-script-url
    'no-script-url': 'error',
    // https://eslint.org/docs/rules/no-self-compare
    'no-self-compare': 'error',
    // https://eslint.org/docs/rules/no-sequences
    'no-sequences': 'error',
    // https://eslint.org/docs/rules/no-unmodified-loop-condition
    'no-unmodified-loop-condition': 'error',
    // https://eslint.org/docs/rules/no-useless-call
    'no-useless-call': 'error',
    // https://eslint.org/docs/rules/no-nested-ternary
    'no-nested-ternary': 'error',
    // https://eslint.org/docs/rules/no-useless-computed-key
    'no-useless-computed-key': 'error',
    // https://eslint.org/docs/rules/no-var
    'no-var': 'error',
    // https://eslint.org/docs/rules/one-var
    'one-var': ['error', 'never'],
    // https://eslint.org/docs/rules/default-case-last
    'default-case-last': 'error',
    // https://eslint.org/docs/rules/default-param-last
    'default-param-last': 'error',
    // https://eslint.org/docs/rules/grouped-accessor-pairs
    'grouped-accessor-pairs': 'error',
    // https://eslint.org/docs/rules/no-constructor-return
    'no-constructor-return': 'error',
    // https://eslint.org/docs/rules/array-callback-return
    'array-callback-return': 'error',
    // https://eslint.org/docs/rules/no-invalid-this
    'no-invalid-this': 'error', // Believe this one actually surfaces some bugs
    // https://eslint.org/docs/rules/func-style
    'func-style': ['error', 'declaration'],
    // https://eslint.org/docs/rules/no-unused-expressions
    'no-unused-expressions': 'error',
    // https://eslint.org/docs/rules/no-useless-concat
    'no-useless-concat': 'error',
    // https://eslint.org/docs/rules/radix
    radix: 'error',
    // https://eslint.org/docs/rules/require-await
    'require-await': 'error',
    // https://eslint.org/docs/rules/no-alert
    'no-alert': 'error',
    // https://eslint.org/docs/rules/no-useless-constructor
    'no-useless-constructor': 'error',
    // https://eslint.org/docs/rules/no-duplicate-imports
    'no-duplicate-imports': 'error',

    // https://eslint.org/docs/rules/no-implicit-coercion
    'no-implicit-coercion': 'error',
    //https://eslint.org/docs/rules/no-unneeded-ternary
    'no-unneeded-ternary': 'error',
    'unicorn/filename-case': [
      'error',
      {
        cases: {
          pascalCase: true
        },
        ignore: ['^.*\\.(js|cjs|mjs)$']
      }
    ],
    'vue/first-attribute-linebreak': 'error',
    'vue/multiline-html-element-content-newline': 'off',
    'vue/singleline-html-element-content-newline': 'off',
    'vue/no-mutating-props': 'off' // TODO: Remove this rule and fix resulting errors
  },
  overrides: [
    {
      files: LEGACY_FILES,
      rules: {
        'no-unused-vars': [
          'error',
          {
            vars: 'all',
            args: 'none',
            varsIgnorePattern: 'controller'
          }
        ],
        'no-nested-ternary': 'off',
        'no-var': 'off',
        'one-var': 'off'
      }
    }
  ]
};

module.exports = config;


================================================
FILE: .git-blame-ignore-revs
================================================
# git-blame ignored revisions
# To configure, run:
#   git config blame.ignoreRevsFile .git-blame-ignore-revs
# Requires Git > 2.23
# See https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt

# vue-eslint update 2019
14a0f84c1bcd56886d7c9e4e6afa8f7d292734e5
# eslint changes 2022
d80b6923541704ab925abf0047cbbc58735c27e2
# Copyright year update 2022
4a9744e916d24122a81092f6b7950054048ba860
# Copyright year update 2023
8040b275fcf2ba71b42cd72d4daa64bb25c19c2d
# Apply `prettier` formatting
caa7bc6faebc204f67aedae3e35fb0d0d3ce27a7


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: File a Bug !
title: ''
labels: type:bug
assignees: ''

---

<!--- Focus on user impact in the title. Use the Summary Field to -->
<!--- describe the problem technically. -->

#### Summary
<!--- A description of the issue encountered. When possible, a description -->
<!--- of the impact of the issue. What use case does it impede?-->

#### Expected vs Current Behavior
<!--- Tell us what should have happened -->

#### Steps to Reproduce
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
<!--- reproduce this bug. Include code to reproduce, if relevant -->
1.
2.
3.
4.

#### Environment
<!--- If encountered on local machine, execute the following:
<!--- npx envinfo --system --browsers --npmPackages --binaries --markdown -->
* Open MCT Version: <!--- date of build, version, or SHA -->
* Deployment Type: <!--- npm dev? VIPER Dev? openmct-yamcs? -->
* OS:
* Browser:

#### Impact Check List
<!--- Please select from the following options -->
- [ ] Data loss or misrepresented data?
- [ ] Regression? Did this used to work or has it always been broken?
- [ ] Is there a workaround available?
- [ ] Does this impact a critical component?
- [ ] Is this just a visual bug with no functional impact?
- [ ] Does this block the execution of e2e tests?
- [ ] Does this have an impact on Performance?

#### Additional Information
<!--- Include any screenshots, gifs, or logs which will expedite triage -->


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Discussions
    url: https://github.com/nasa/openmct/discussions
    about: Have a question about the project?


================================================
FILE: .github/ISSUE_TEMPLATE/enhancement-request.md
================================================
---
name: Enhancement request
about: Suggest an enhancement or new improvement for this project
title: ''
labels: type:enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/maintenance-type.md
================================================
---
name: Maintenance
about: Add, update or remove documentation, tests, or dependencies.
title: ''
labels: type:maintenance
assignees: ''

---

#### Summary
<!--- Generally describe the purpose of the change. -->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--- Note: Please open the PR in draft form until you are ready for active review. -->
Closes <!--- Insert Issue Number(s) this PR addresses. Start by typing # will open a dropdown of recent issues. Note: this does not work on PRs which target release branches -->

### Describe your changes:
<!--- Describe your changes and add any comments about your approach either here or inline if code comments aren't added -->

### All Submissions:

* [ ] Have you followed the guidelines in our [Contributing document](https://github.com/nasa/openmct/blob/master/CONTRIBUTING.md)?
* [ ] Have you checked to ensure there aren't other open [Pull Requests](https://github.com/nasa/openmct/pulls) for the same update/change?
* [ ] Is this a [notable change](../docs/src/process/release.md) that will require a special callout in the release notes? For example, will this break compatibility with existing APIs or projects that consume these plugins?

### Author Checklist

* [ ] Changes address original issue?
* [ ] Tests included and/or updated with changes?
* [ ] Has this been smoke tested?
* [ ] Have you associated this PR with a `type:` label? Note: this is not necessarily the same as the original issue.
* [ ] Have you associated a milestone with this PR? Note: leave blank if unsure.
* [ ] Testing instructions included in associated issue OR is this a dependency/testcase change?

### Reviewer Checklist

* [ ] Changes appear to address issue?
* [ ] Reviewer has tested changes by following the provided instructions?
* [ ] Changes appear not to be breaking changes?
* [ ] Appropriate automated tests included?
* [ ] Code style and in-line documentation are appropriate?


================================================
FILE: .github/codeql/codeql-config.yml
================================================
name: 'Custom CodeQL config'

paths-ignore:
  # Ignore e2e tests and framework
  - e2e


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: 'npm'
    directory: '/'
    schedule:
      interval: 'weekly'
    open-pull-requests-limit: 10
    rebase-strategy: 'disabled'
    labels:
      - 'pr:daveit'
      - 'pr:e2e'
      - 'type:maintenance'
      - 'dependencies'
      - 'pr:platform'
    ignore:
      #We have to source the playwright container which is not detected by Dependabot
      - dependency-name: '@playwright/test'
      - dependency-name: 'playwright-core'
      #Lots of noise in these type patch releases.
      - dependency-name: '@babel/eslint-parser'
        update-types: ['version-update:semver-patch']
      - dependency-name: 'eslint-plugin-vue'
        update-types: ['version-update:semver-patch']
      - dependency-name: 'babel-loader'
        update-types: ['version-update:semver-patch']
      - dependency-name: 'sinon'
        update-types: ['version-update:semver-patch']
      - dependency-name: 'moment-timezone'
        update-types: ['version-update:semver-patch']
      - dependency-name: '@types/lodash'
        update-types: ['version-update:semver-patch']
      - dependency-name: 'marked'
        update-types: ['version-update:semver-patch']
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'daily'
    rebase-strategy: 'disabled'
    labels:
      - 'pr:daveit'
      - 'type:maintenance'
      - 'dependencies'


================================================
FILE: .github/release.yml
================================================
changelog:
  categories:
    - title: 💥 Notable Changes
      labels:
        - notable_change
    - title: 🏕 Features
      labels:
        - type:feature
    - title: 🎉 Enhancements
      labels:
        - type:enhancement
      exclude:
        labels:
          - type:feature
    - title: 🔧 Maintenance
      labels:
        - type:maintenance
    - title: ⚡ Performance
      labels:
        - performance
    - title: 👒 Dependencies
      labels:
        - dependencies
    - title: 🐛 Bug Fixes
      labels:
        - "*"


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: 'CodeQL'

on:
  push:
    branches: [master, 'release/*']
  pull_request:
    branches: [master, 'release/*']
    paths-ignore:
      - '**/*Spec.js'
      - '**/*.md'
      - '**/*.txt'
      - '**/*.yml'
      - '**/*.yaml'
      - '**/*.spec.js'
      - '**/*.config.js'
  schedule:
    - cron: '28 21 * * 3'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          config-file: ./.github/codeql/codeql-config.yml
          languages: javascript
          queries: security-and-quality

      - name: Autobuild
        uses: github/codeql-action/autobuild@v3

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/e2e-couchdb.yml
================================================
name: 'e2e-couchdb'
on:
  push:
  pull_request:
    types:
      - opened
jobs:
  e2e-couchdb:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/hydrogen'

      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - run: npm ci --no-audit --progress=false

      - name: Login to DockerHub
        uses: docker/login-action@v3
        continue-on-error: true
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - run: npx playwright@1.57.0 install

      - name: Start CouchDB Docker Container and Init with Setup Scripts
        run: |
          export $(cat src/plugins/persistence/couch/.env.ci | xargs)
          docker compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach
          sleep 3
          bash src/plugins/persistence/couch/setup-couchdb.sh
          bash src/plugins/persistence/couch/replace-localstorage-with-couchdb-indexhtml.sh

      - name: Run CouchDB Tests
        env:
          COMMIT_INFO_SHA: ${{github.event.pull_request.head.sha }}
        run: npm run test:e2e:couchdb

      - name: Generate Code Coverage Report
        run: npm run cov:e2e:report

      - name: Publish Results to Codecov.io
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./coverage/e2e/lcov.info
          flags: e2e-full
          fail_ci_if_error: true
          verbose: true

      - name: Archive test results
        if: success() || failure()
        uses: actions/upload-artifact@v4
        with:
          name: e2e-couchdb-test-results
          path: test-results
          overwrite: true

      - name: Archive html test results
        if: success() || failure()
        uses: actions/upload-artifact@v4
        with:
          name: e2e-couchdb-html-test-results
          path: html-test-results
          overwrite: true

      - name: Remove pr:e2e:couchdb label (if present)
        if: always()
        uses: actions/github-script@v6
        with:
          script: |
            const { owner, repo, number } = context.issue;
            const labelToRemove = 'pr:e2e:couchdb';
            try {
              await github.rest.issues.removeLabel({
                owner,
                repo,
                issue_number: number,
                name: labelToRemove
              });
            } catch (error) {
              core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`);
            }


================================================
FILE: .github/workflows/e2e-full.yml
================================================
name: 'e2e-full'
on:
  push:
    branches:
      - master
  workflow_dispatch:
  pull_request:
    types:
      - labeled
      - opened
  schedule:
    - cron: '0 0 * * *'
jobs:
  e2e-full:
    if: contains(github.event.pull_request.labels.*.name, 'pr:e2e') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ matrix.os }}
    timeout-minutes: 60
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/hydrogen'

      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - run: npx playwright@1.57.0 install
      - run: npx playwright install chrome-beta
      - run: npm ci --no-audit --progress=false
      - run: npm run test:e2e:full -- --max-failures=40
      - run: npm run cov:e2e:report || true
      - shell: bash
        env:
          SUPER_SECRET: ${{ secrets.CODECOV_TOKEN }}
        run: |
          npm run cov:e2e:full:publish
      - name: Archive test results
        if: success() || failure()
        uses: actions/upload-artifact@v4
        with:
          name: e2e-pr-test-results
          path: test-results
          overwrite: true

      - name: Remove pr:e2e label (if present)
        if: always()
        uses: actions/github-script@v6
        with:
          script: |
            const { owner, repo, number } = context.issue;
            const labelToRemove = 'pr:e2e';
            try {
              await github.rest.issues.removeLabel({
                owner,
                repo,
                issue_number: number,
                name: labelToRemove
              });
            } catch (error) {
              core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`);
            }


================================================
FILE: .github/workflows/e2e-perf.yml
================================================
name: 'e2e-perf'
on:
  push:
    branches:
      - master
  workflow_dispatch:
  pull_request:
    types:
      - labeled
      - opened
  schedule:
    - cron: '0 0 * * *'
jobs:
  e2e-full:
    if: contains(github.event.pull_request.labels.*.name, 'pr:e2e:perf') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 'lts/hydrogen'

      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - run: npx playwright@1.57.0 install
      - run: npm ci --no-audit --progress=false
      - run: npm run test:perf:localhost
      - run: npm run test:perf:contract
      - run: npm run test:perf:memory
      - name: Archive test results
        if: success() || failure()
        uses: actions/upload-artifact@v4
        with:
          name: e2e-perf-test-results
          path: test-results
          overwrite: true

      - name: Remove pr:e2e:perf label (if present)
        if: always()
        uses: actions/github-script@v6
        with:
          script: |
            const { owner, repo, number } = context.issue;
            const labelToRemove = 'pr:e2e:perf';
            try {
              await github.rest.issues.removeLabel({
                owner,
                repo,
                issue_number: number,
                name: labelToRemove
              });
            } catch (error) {
              core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`);
            }


================================================
FILE: .github/workflows/npm-prerelease.yml
================================================
# This workflow will run tests using node and then publish a package to npmjs when a prerelease is created
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages

name: npm_prerelease

on:
  release:
    types: [prereleased]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: lts/hydrogen
      - run: npm ci
      - run: |
          echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" >> ~/.npmrc
          npm whoami
          npm publish --access=public --tag unstable openmct
      # - run: npm test

  publish-npm-prerelease:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: lts/hydrogen
          registry-url: https://registry.npmjs.org/
      - run: npm ci
      - run: npm publish --access=public --tag unstable
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}


================================================
FILE: .github/workflows/pr-platform.yml
================================================
name: 'pr-platform'
on:
  push:
    branches:
      - master
  workflow_dispatch:
  pull_request:
    types:
      - labeled
      - opened
  schedule:
    - cron: '0 0 * * *'
jobs:
  pr-platform:
    if: contains(github.event.pull_request.labels.*.name, 'pr:platform') || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ matrix.os }}
    timeout-minutes: 60
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
        node_version:
          - lts/iron
          - lts/hydrogen
        architecture:
          - x64

    name: Node ${{ matrix.node_version }} - ${{ matrix.architecture }} on ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4

      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node_version }}
          architecture: ${{ matrix.architecture }}

      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: ~/.npm
          key: ${{ runner.os }}-${{ matrix.node_version }}-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-${{ matrix.node_version }}-

      - run: npm ci --no-audit --progress=false

      - run: npm test

      - run: npm run lint -- --quiet

      - name: Remove pr:platform label (if present)
        if: always()
        uses: actions/github-script@v6
        with:
          script: |
            const { owner, repo, number } = context.issue;
            const labelToRemove = 'pr:platform';
            try {
              await github.rest.issues.removeLabel({
                owner,
                repo,
                issue_number: number,
                name: labelToRemove
              });
            } catch (error) {
              core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`);
            }


================================================
FILE: .github/workflows/pr.yml
================================================
name: PR

on:
  push:
  pull_request:
    types:
      - opened
      - labeled

env:
  NODE_ENV: development
  NODE_VERSION: 22
  PERCY_POSTINSTALL_BROWSER: "true"
  PERCY_LOGLEVEL: "debug"
  PERCY_PARALLEL_TOTAL: 2
  PERCY_TOKEN: "${{ secrets.PERCY_TOKEN }}"

jobs:
    generate_cache_key:
        runs-on: ubuntu-latest
        container: mcr.microsoft.com/playwright:v1.57.0-jammy 
        steps:
          - uses: actions/checkout@v4
          - id: generate_cache_key
            run: |
                lock_hash="$(sha256sum package-lock.json | awk '{print $1}')"
                echo "cache_key=node${NODE_VERSION}-deps-${lock_hash}" >> "$GITHUB_OUTPUT"
        outputs:
            cache_key: ${{ steps.generate_cache_key.outputs.cache_key }}
    build_and_cache_dependencies_if_needed:
        needs: generate_cache_key
        runs-on: ubuntu-latest
        container: mcr.microsoft.com/playwright:v1.57.0-jammy 
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
                node-version: ${{ env.NODE_VERSION }}
                cache: npm
          - uses: actions/cache/restore@v4
            id: node_deps_restore_cache
            with:
              path: |
                node_modules
                e2e/node_modules
                dist
              key: ${{ needs.generate_cache_key.outputs.cache_key }}
          - run: npm ci
            if: steps.node_deps_restore_cache.outputs.cache-hit != 'true' || contains(github.event.pull_request.labels.*.name, 'build:clean')
          - name: Remove build:clean label (if present)
            if: contains(github.event.pull_request.labels.*.name, 'build:clean')
            uses: actions/github-script@v6
            with:
              script: |
                const { owner, repo, number } = context.issue;
                const labelToRemove = 'build:clean';
                try {
                  await github.rest.issues.removeLabel({
                    owner,
                    repo,
                    issue_number: number,
                    name: labelToRemove
                  });
                } catch (error) {
                  core.warning(`Failed to remove ' + labelToRemove + ' label: ${error.message}`);
                }
          - uses: actions/cache/save@v4
            id: node_deps_save_cache
            if: steps.node_deps_restore_cache.outputs.cache-hit != 'true' || contains(github.event.pull_request.labels.*.name, 'build:clean')
            with:
              path: |
                node_modules
                e2e/node_modules
                dist
              key: ${{ needs.generate_cache_key.outputs.cache_key }}
        outputs:
            cache_key: ${{ needs.generate_cache_key.outputs.cache_key }}
    lint:
        needs: 
            - build_and_cache_dependencies_if_needed
        runs-on: ubuntu-latest
        container: mcr.microsoft.com/playwright:v1.57.0-jammy 
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
                node-version: ${{ env.NODE_VERSION }}
                cache: npm
          - uses: actions/cache/restore@v4
            with:
              path: |
                node_modules
                e2e/node_modules
                dist
              key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
          - run: npm run lint
    unit-test:
        needs: 
            - build_and_cache_dependencies_if_needed
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
                node-version: ${{ env.NODE_VERSION }}
                cache: npm
          - uses: actions/cache/restore@v4
            with:
              path: |
                node_modules
                e2e/node_modules
                dist
              key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
          - run: |
              mkdir -p dist/reports/tests/
              npm ci
              npm run test
          - uses: codecov/codecov-action@v4
            if: always()
            with:
              token: ${{ secrets.CODECOV_TOKEN }}
              files: ./coverage/unit/lcov.info
              flags: unit
              name: unit-test-${{ github.run_id }}
              fail_ci_if_error: false
          - uses: actions/upload-artifact@v4
            if: always()
            with:
              name: unit-test-results
              path: dist/reports/tests/
              if-no-files-found: warn
          - uses: actions/upload-artifact@v4
            if: always()
            with:
              name: unit-test-coverage
              path: coverage
              if-no-files-found: warn
          - name: Collect version artifacts
            if: always()
            run: |
              mkdir -p /tmp/artifacts
              printenv NODE_ENV > /tmp/artifacts/NODE_ENV.txt || true
              npm -v > /tmp/artifacts/npm-version.txt
              node -v > /tmp/artifacts/node-version.txt
              ls -latR > /tmp/artifacts/dir.txt
          - uses: actions/upload-artifact@v4
            if: always()
            with:
              name: unit-test-artifacts
              path: /tmp/artifacts
              if-no-files-found: warn
    e2e-test:
      name: e2e-ci (shard ${{ matrix.shard }}/4)
      runs-on: ubuntu-latest
      container: mcr.microsoft.com/playwright:v1.57.0-jammy 
      strategy:
        fail-fast: false
        matrix:
          shard: [1, 2, 3, 4]
      needs: 
        - build_and_cache_dependencies_if_needed
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: ${{ env.NODE_VERSION }}
            cache: npm
        - uses: actions/cache/restore@v4
          with:
            path: |
              node_modules
              e2e/node_modules
              dist
            key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
        - run: |
            mkdir -p test-results
            npm run test:e2e:ci -- --shard=${{ matrix.shard }}/4
        - run: npm run cov:e2e:report || true
        - uses: codecov/codecov-action@v4
          with:
            token: ${{ secrets.CODECOV_TOKEN }}
            files: ./coverage/e2e/lcov.info
            flags: e2e-ci
            name: e2e-ci-${{ github.run_id }}-shard-${{ matrix.shard }}
            fail_ci_if_error: false
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: e2e-ci-test-results-shard-${{ matrix.shard }}
            path: test-results
            if-no-files-found: warn
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: e2e-ci-coverage-shard-${{ matrix.shard }}
            path: coverage
            if-no-files-found: warn
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: e2e-ci-html-results-shard-${{ matrix.shard }}
            path: html-test-results
            if-no-files-found: warn
        - name: Collect version artifacts
          if: always()
          run: |
            mkdir -p /tmp/artifacts
            printenv NODE_ENV > /tmp/artifacts/NODE_ENV.txt || true
            npm -v > /tmp/artifacts/npm-version.txt
            node -v > /tmp/artifacts/node-version.txt
            ls -latR > /tmp/artifacts/dir.txt
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: e2e-ci-artifacts-shard-${{ matrix.shard }}
            path: /tmp/artifacts
            if-no-files-found: warn
    visual-a11y:
      name: visual-a11y-ci
      runs-on: ubuntu-latest
      container: mcr.microsoft.com/playwright:v1.57.0-jammy 
      needs: 
          - build_and_cache_dependencies_if_needed
      strategy:
        fail-fast: false
        matrix:
          shard: [1, 2]
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: ${{ env.NODE_VERSION }}
            cache: npm
        - uses: actions/cache/restore@v4
          with:
            path: |
              node_modules
              e2e/node_modules
              dist
            key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
        - run: npm run test:e2e:visual:ci -- --shard=${{ matrix.shard }}/2
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: visual-a11y-ci-test-results-shard-${{ matrix.shard }}
            path: test-results
            if-no-files-found: warn
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: visual-a11y-ci-html-results-shard-${{ matrix.shard }}
            path: html-test-results
            if-no-files-found: warn
        - name: Collect version artifacts
          if: always()
          run: |
            mkdir -p /tmp/artifacts
            printenv NODE_ENV > /tmp/artifacts/NODE_ENV.txt || true
            npm -v > /tmp/artifacts/npm-version.txt
            node -v > /tmp/artifacts/node-version.txt
            ls -latR > /tmp/artifacts/dir.txt
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: visual-a11y-ci-artifacts-shard-${{ matrix.shard }}
            path: /tmp/artifacts
            if-no-files-found: warn
    perf-test:
      runs-on: ubuntu-latest
      container: mcr.microsoft.com/playwright:v1.57.0-jammy 
      needs: 
          - build_and_cache_dependencies_if_needed
      if: ${{ always() }}
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: ${{ env.NODE_VERSION }}
            cache: npm
        - uses: actions/cache/restore@v4
          with:
            path: |
              node_modules
              e2e/node_modules
              dist
            key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
        - run: npm run test:perf:localhost
        - run: npm run test:perf:contract
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: perf-test-results
            path: test-results
            if-no-files-found: warn
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: perf-html-results
            path: html-test-results
            if-no-files-found: warn
        - name: Collect version artifacts
          if: always()
          run: |
            mkdir -p /tmp/artifacts
            printenv NODE_ENV > /tmp/artifacts/NODE_ENV.txt || true
            npm -v > /tmp/artifacts/npm-version.txt
            node -v > /tmp/artifacts/node-version.txt
            ls -latR > /tmp/artifacts/dir.txt
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: perf-test-artifacts
            path: /tmp/artifacts
            if-no-files-found: warn
    mem-test:
      runs-on: ubuntu-latest
      container: mcr.microsoft.com/playwright:v1.57.0-jammy 
      needs: 
          - build_and_cache_dependencies_if_needed
      if: ${{ always() }}
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: ${{ env.NODE_VERSION }}
            cache: npm
        - uses: actions/cache/restore@v4
          with:
            path: |
              node_modules
              e2e/node_modules
              dist
            key: ${{ needs.build_and_cache_dependencies_if_needed.outputs.cache_key }}
        - run: npm run test:perf:memory
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: mem-test-results
            path: test-results
            if-no-files-found: warn
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: mem-html-results
            path: html-test-results
            if-no-files-found: warn
        - name: Collect version artifacts
          if: always()
          run: |
            mkdir -p /tmp/artifacts
            printenv NODE_ENV > /tmp/artifacts/NODE_ENV.txt || true
            npm -v > /tmp/artifacts/npm-version.txt
            node -v > /tmp/artifacts/node-version.txt
            ls -latR > /tmp/artifacts/dir.txt
        - uses: actions/upload-artifact@v4
          if: always()
          with:
            name: mem-test-artifacts
            path: /tmp/artifacts
            if-no-files-found: warn


================================================
FILE: .github/workflows/prcop-config.json
================================================
{
  "linters": [
    {
      "name": "descriptionRegexp",
      "config": {
        "regexp": "[x|X]] Testing instructions",
        "errorMessage": ":police_officer: PR Description does not confirm that associated issue(s) contain Testing instructions"
      }
    },
    {
      "name": "descriptionMinWords",
      "config": {
        "minWordsCount": 160,
        "errorMessage": ":police_officer: Please, be sure to use existing PR template."
      }
    }
  ],
  "disableWord": "pr:daveit"
}


================================================
FILE: .github/workflows/prcop.yml
================================================
name: PRCop

on:
  pull_request:
    types:
      - labeled
      - unlabeled
      - milestoned
      - demilestoned
      - opened
      - reopened
      - synchronize
      - edited
  pull_request_review_comment:
    types:
      - created
env:
  LABELS: ${{ join( github.event.pull_request.labels.*.name, ' ' ) }}
jobs:
  prcop:
    runs-on: ubuntu-latest
    name: Template Check
    steps:
      - name: Linting Pull Request
        uses: makaroni4/prcop@v1.0.35
        with:
          config-file: '.github/workflows/prcop-config.json'
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  check-type-label:
    name: Check type Label
    runs-on: ubuntu-latest
    steps:
      - if: contains( env.LABELS, 'type:' ) == false
        run: exit 1
  check-milestone:
    name: Check Milestone
    runs-on: ubuntu-latest
    steps:
      - if: github.event.pull_request.milestone == null && contains( env.LABELS, 'no milestone' ) == false
        run: exit 1


================================================
FILE: .gitignore
================================================
*.scssc
*.zip
*.gzip
*.tgz
*.DS_Store
*.swp

# Compiled CSS, unless directly added
*.sass-cache
*COMPILE.css
*.css
*.css.map

# Intellij project configuration files
*.idea
*.iml

# VSCode
.vscode/settings.json

# Build output
target
dist

# Mac OS X Finder
.DS_Store

# Node, Bower dependencies
node_modules
bower_components

# npm-debug log
npm-debug.log

# karma reports
report.*.json

# e2e test artifacts
test-results
html-test-results

# couchdb scripting artifacts
src/plugins/persistence/couch/.env.local
index.html.bak

# codecov artifacts
.nyc_output
coverage
codecov

# Don't commit MacOS screenshots
*-darwin.png
/.run/All Tests.run.xml


================================================
FILE: .npmignore
================================================
# Ignore everything first (will not ignore special files like LICENSE.md,
# README.md, and package.json)...
/**/*

# ...but include these folders...
!/dist/**/*
!/src/**/*

# We might be able to remove this if it is not imported by any project directly.
# https://github.com/nasa/openmct/issues/4992
!/example/**/*

# ...except for these files in the above folders.
/src/**/*Spec.js
/src/**/test/
# TODO move test utils into test/ folders
/src/utils/testing.js

# Also include these special top-level files.
!copyright-notice.js
!copyright-notice.html
!index.html
!openmct.js
!SECURITY.md

# Dont include the example html
dist/index.html

================================================
FILE: .npmrc
================================================
loglevel=warn

#Prevent folks from ignoring an important error when building from source
engine-strict=true


================================================
FILE: .nvmrc
================================================
lts/*

================================================
FILE: .prettierignore
================================================
# Docs
*.md

# Build output
target
dist

# Mac OS X Finder
.DS_Store

# Node dependencies
node_modules

# npm-debug log
npm-debug.log

# karma reports
report.*.json

# e2e test artifacts
test-results
html-test-results

# codecov artifacts
.nyc_output
coverage
codecov


================================================
FILE: .prettierrc
================================================
{
  "trailingComma": "none",
  "singleQuote": true,
  "printWidth": 100,
  "endOfLine": "auto"
}


================================================
FILE: .vscode/extensions.json
================================================
{
  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
  // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp

  // List of extensions which should be recommended for users of this workspace.
  "recommendations": [
    "Vue.volar",
    "dbaeumer.vscode-eslint",
    "rvest.vs-code-prettier-eslint"
  ],
  // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
  "unwantedRecommendations": ["octref.vetur"]
}


================================================
FILE: .webpack/webpack.common.mjs
================================================
/*
This is the OpenMCT common webpack file. It is imported by the other three webpack configurations:
 - webpack.prod.mjs - the production configuration for OpenMCT (default)
 - webpack.dev.mjs - the development configuration for OpenMCT
 - webpack.coverage.mjs - imports webpack.dev.js and adds code coverage
There are separate npm scripts to use these configurations, though simply running `npm install`
will use the default production configuration.
*/
import { execSync } from 'node:child_process';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

import CopyWebpackPlugin from 'copy-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import { VueLoaderPlugin } from 'vue-loader';
import webpack from 'webpack';
import { merge } from 'webpack-merge';
let gitRevision = 'error-retrieving-revision';
let gitBranch = 'error-retrieving-branch';

const { version } = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url)));

try {
  //Caching of GitHub actions causes git directory ownership issues.
  execSync('git config --global --add safe.directory /__w/openmct/openmct');
  gitRevision = execSync('git rev-parse HEAD').toString().trim();
  gitBranch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();
} catch (err) {
  console.warn(err);
}

const projectRootDir = fileURLToPath(new URL('../', import.meta.url));

/** @type {import('webpack').Configuration} */
const config = {
  context: projectRootDir,
  devServer: {
    client: {
      progress: true,
      overlay: {
        // Disable overlay for runtime errors.
        // See: https://github.com/webpack/webpack-dev-server/issues/4771
        runtimeErrors: false
      }
    }
  },
  entry: {
    openmct: './openmct.js',
    generatorWorker: './example/generator/generatorWorker.js',
    couchDBChangesFeed: './src/plugins/persistence/couch/CouchChangesFeed.js',
    inMemorySearchWorker: './src/api/objects/InMemorySearchWorker.js',
    compsMathWorker: './src/plugins/comps/CompsMathWorker.js',
    espressoTheme: './src/plugins/themes/espresso-theme.scss',
    snowTheme: './src/plugins/themes/snow-theme.scss',
    darkmatterTheme: './src/plugins/themes/darkmatter-theme.scss'
  },
  output: {
    globalObject: 'this',
    filename: '[name].js',
    path: path.resolve(projectRootDir, 'dist'),
    library: {
      name: 'openmct',
      type: 'umd',
      export: 'default'
    },
    publicPath: '',
    hashFunction: 'xxhash64',
    clean: true
  },
  resolve: {
    alias: {
      '@': path.join(projectRootDir, 'src'),
      legacyRegistry: path.join(projectRootDir, 'src/legacyRegistry'),
      csv: 'comma-separated-values',
      bourbon: 'bourbon.scss',
      'plotly-basic': 'plotly.js-basic-dist-min',
      'plotly-gl2d': 'plotly.js-gl2d-dist-min',
      printj: 'printj/printj.mjs',
      styles: path.join(projectRootDir, 'src/styles'),
      MCT: path.join(projectRootDir, 'src/MCT'),
      testUtils: path.join(projectRootDir, 'src/utils/testUtils.js'),
      objectUtils: path.join(projectRootDir, 'src/api/objects/object-utils.js'),
      utils: path.join(projectRootDir, 'src/utils'),
      vue: 'vue/dist/vue.esm-bundler'
    }
  },
  plugins: [
    new webpack.DefinePlugin({
      __OPENMCT_VERSION__: `'${version}'`,
      __OPENMCT_BUILD_DATE__: `'${new Date()}'`,
      __OPENMCT_REVISION__: `'${gitRevision}'`,
      __OPENMCT_BUILD_BRANCH__: `'${gitBranch}'`,
      __VUE_OPTIONS_API__: true, // enable/disable Options API support, default: true
      __VUE_PROD_DEVTOOLS__: false, // enable/disable devtools support in production, default: false
      __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false, // enable/disable hydration mismatch details in production, default: false
    }),
    new VueLoaderPlugin(),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: 'src/images/favicons',
          to: 'favicons'
        },
        {
          from: './index.html',
          transform: function (content) {
            return content.toString().replace(/dist\//g, '');
          }
        },
        {
          from: 'src/plugins/imagery/layers',
          to: 'imagery'
        }
      ]
    }),
    new MiniCssExtractPlugin({
      filename: '[name].css',
      chunkFilename: '[name].css'
    }),
    // Add a UTF-8 BOM to CSS output to avoid random mojibake
    new webpack.BannerPlugin({
      test: /.*Theme\.css$/,
      raw: true,
      banner: '@charset "UTF-8";'
    })
  ],
  module: {
    rules: [
      {
        test: /\.(sc|sa|c)ss$/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader'
          },
          {
            loader: 'resolve-url-loader'
          },
          {
            loader: 'sass-loader',
            options: { sourceMap: true }
          }
        ]
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          compilerOptions: {
            hoistStatic: false,
            whitespace: 'preserve'
          }
        }
      },
      {
        test: /\.html$/,
        type: 'asset/source'
      },
      {
        test: /\.(jpg|jpeg|png|svg)$/,
        type: 'asset/resource',
        generator: {
          filename: 'images/[name][ext]'
        }
      },
      {
        test: /\.ico$/,
        type: 'asset/resource',
        generator: {
          filename: 'icons/[name][ext]'
        }
      },
      {
        test: /\.(woff|woff2?|eot|ttf)$/,
        type: 'asset/resource',
        generator: {
          filename: 'fonts/[name][ext]'
        }
      }
    ]
  },
  stats: 'errors-warnings',
  performance: {
    // We should eventually consider chunking to decrease
    // these values
    maxEntrypointSize: 27000000,
    maxAssetSize: 27000000
  }
};

export default config;


================================================
FILE: .webpack/webpack.coverage.mjs
================================================
/*
This file extends the webpack.dev.mjs config to add babel istanbul coverage.
OpenMCT Continuous Integration servers use this configuration to add code coverage
information to pull requests.
*/

import config from './webpack.dev.mjs';

config.devtool = 'inline-source-map';
config.devServer.hot = false;

config.module.rules.push({
  test: /\.js$/,
  exclude: /(Spec\.js$)|(node_modules)/,
  use: {
    loader: 'babel-loader',
    options: {
      retainLines: true,
      plugins: [
        [
          'babel-plugin-istanbul',
          {
            extension: ['.js', '.vue']
          }
        ]
      ]
    }
  }
});

export default config;


================================================
FILE: .webpack/webpack.dev.mjs
================================================
/*
This configuration should be used for development purposes. It contains full source map, a
devServer (which be invoked using by `npm start`), and a non-minified Vue.js distribution.
If OpenMCT is to be used for a production server, use webpack.prod.mjs instead.
*/
import { fileURLToPath } from 'node:url';

import path from 'path';
import webpack from 'webpack';
import { merge } from 'webpack-merge';

import common from './webpack.common.mjs';

export default merge(common, {
  mode: 'development',
  watchOptions: {
    // Since we use require.context, webpack is watching the entire directory.
    // We need to exclude any files we don't want webpack to watch.
    // See: https://webpack.js.org/configuration/watch/#watchoptions-exclude
    ignored: [
      '**/{node_modules,dist,docs,e2e}', // All files in node_modules, dist, docs, e2e,
      '**/{*.yml,Procfile,webpack*.js,babel*.js,package*.json,tsconfig.json}', // Config files
      '**/*.{sh,md,png,ttf,woff,svg}', // Non source files
      '**/.*' // dotfiles and dotfolders
    ]
  },
  plugins: [
    new webpack.DefinePlugin({
      __OPENMCT_ROOT_RELATIVE__: '"dist/"'
    })
  ],
  devtool: 'eval-source-map',
  devServer: {
    devMiddleware: {
      writeToDisk: (filePathString) => {
        const filePath = path.parse(filePathString);
        const shouldWrite = !filePath.base.includes('hot-update');

        return shouldWrite;
      }
    },
    watchFiles: ['src/**/*.css', 'example/**/*.css'],
    static: [{
      directory: fileURLToPath(new URL('../dist', import.meta.url)),
      publicPath: '/dist',
      watch: false
    }, {
      directory: fileURLToPath(new URL('../e2e/test-data', import.meta.url)),
      publicPath: '/test-data',
      watch: false
    }]
  }
});


================================================
FILE: .webpack/webpack.prod.mjs
================================================
/*
This configuration should be used for production installs.
It is the default webpack configuration.
*/

import webpack from 'webpack';
import { merge } from 'webpack-merge';

import common from './webpack.common.mjs';

export default merge(common, {
  mode: 'production',
  plugins: [
    new webpack.DefinePlugin({
      __OPENMCT_ROOT_RELATIVE__: '""'
    })
  ],
  devtool: 'source-map'
});


================================================
FILE: API.md
================================================
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents**

- [Developing Applications With Open MCT](#developing-applications-with-open-mct)
  - [Scope and purpose of this document](#scope-and-purpose-of-this-document)
  - [Building From Source](#building-from-source)
  - [Starting an Open MCT application](#starting-an-open-mct-application)
  - [Types](#types)
    - [Using Types](#using-types)
    - [Limitations](#limitations)
  - [Plugins](#plugins)
    - [Defining and Installing a New Plugin](#defining-and-installing-a-new-plugin)
  - [Domain Objects and Identifiers](#domain-objects-and-identifiers)
    - [Object Attributes](#object-attributes)
    - [Domain Object Types](#domain-object-types)
  - [Root Objects](#root-objects)
  - [Object Providers](#object-providers)
  - [Composition Providers](#composition-providers)
    - [Adding Composition Providers](#adding-composition-providers)
    - [Default Composition Provider](#default-composition-provider)
  - [Telemetry API](#telemetry-api)
    - [Integrating Telemetry Sources](#integrating-telemetry-sources)
      - [Telemetry Metadata](#telemetry-metadata)
        - [Values](#values)
          - [Value Hints](#value-hints)
        - [The Time Conductor and Telemetry](#the-time-conductor-and-telemetry)
      - [Telemetry Providers](#telemetry-providers)
      - [Telemetry Requests and Responses](#telemetry-requests-and-responses)
      - [Request Strategies **draft**](#request-strategies-draft)
        - [`latest` request strategy](#latest-request-strategy)
        - [`minmax` request strategy](#minmax-request-strategy)
      - [Telemetry Formats](#telemetry-formats)
        - [Built-in Formats](#built-in-formats)
          - [**Number Format (default):**](#number-format-default)
          - [**String Format**](#string-format)
          - [**Enum Format**](#enum-format)
        - [Registering Formats](#registering-formats)
      - [Telemetry Data](#telemetry-data)
        - [Telemetry Datums](#telemetry-datums)
      - [Limit Evaluators **draft**](#limit-evaluators-draft)
    - [Telemetry Consumer APIs **draft**](#telemetry-consumer-apis-draft)
  - [Time API](#time-api)
    - [Time Systems and Bounds](#time-systems-and-bounds)
      - [Defining and Registering Time Systems](#defining-and-registering-time-systems)
      - [Getting and Setting the Active Time System](#getting-and-setting-the-active-time-system)
      - [Time Bounds](#time-bounds)
    - [Clocks](#clocks)
      - [Defining and registering clocks](#defining-and-registering-clocks)
      - [Getting and setting active clock](#getting-and-setting-active-clock)
      - [⚠️ \[DEPRECATED\] Stopping an active clock](#️-deprecated-stopping-an-active-clock)
      - [Clock Offsets](#clock-offsets)
    - [Time Modes](#time-modes)
      - [Time Mode Helper Methods](#time-mode-helper-methods)
    - [Time Events](#time-events)
      - [List of Time Events](#list-of-time-events)
    - [The Time Conductor](#the-time-conductor)
      - [Time Conductor Configuration](#time-conductor-configuration)
      - [Example conductor configuration](#example-conductor-configuration)
  - [Indicators](#indicators)
    - [The URL Status Indicator](#the-url-status-indicator)
    - [Creating a Simple Indicator](#creating-a-simple-indicator)
    - [Custom Indicators](#custom-indicators)
  - [Priority API](#priority-api)
    - [Priority Types](#priority-types)
  - [User API](#user-api)
    - [Example](#example)
  - [Visibility-Based Rendering in View Providers](#visibility-based-rendering-in-view-providers)
    - [Overview](#overview)
    - [Implementing Visibility-Based Rendering](#implementing-visibility-based-rendering)
    - [Example](#example-1)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

# Developing Applications With Open MCT

## Scope and purpose of this document

This document is intended to serve as a reference for developing an application
based on Open MCT. It will provide details of the API functions necessary to
extend the Open MCT platform meet common use cases such as integrating with a telemetry source.

The best place to start is with the [Open MCT Tutorials](https://github.com/nasa/openmct-tutorial).
These will walk you through the process of getting up and running with Open
MCT, as well as addressing some common developer use cases.

## Building From Source

The latest version of Open MCT is available from [our GitHub repository](https://github.com/nasa/openmct).
If you have `git`, and `node` installed, you can build Open MCT with the commands

```bash
git clone https://github.com/nasa/openmct.git
cd openmct
npm install
```

These commands will fetch the Open MCT source from our GitHub repository, and
build a minified version that can be included in your application. The output
of the build process is placed in a `dist` folder under the openmct source
directory, which can be copied out to another location as needed. The contents
of this folder will include a minified javascript file named `openmct.js` as
well as assets such as html, css, and images necessary for the UI.

## Starting an Open MCT application

> [!WARNING]
> Open MCT provides a development server via `webpack-dev-server` (`npm start`). **This should be used for development purposes only and should never be deployed to a production environment**.

To start a minimally functional Open MCT application, it is necessary to
include the Open MCT distributable, enable some basic plugins, and bootstrap
the application. The tutorials walk through the process of getting Open MCT up
and running from scratch, but provided below is a minimal HTML template that
includes Open MCT, installs some basic plugins, and bootstraps the application.
It assumes that Open MCT is installed under an `openmct` subdirectory, as
described in [Building From Source](#building-from-source).

This approach includes openmct using a simple script tag, resulting in a global
variable named `openmct`. This `openmct` object is used subsequently to make
API calls.

Open MCT is packaged as a UMD (Universal Module Definition) module, so common
script loaders are also supported.

```html
<!DOCTYPE html>
<html>
<head>
  <title>Open MCT</title>
  <script src="dist/openmct.js"></script>
  <script>
    openmct.install(openmct.plugins.LocalStorage());
    openmct.install(openmct.plugins.MyItems());
    openmct.install(openmct.plugins.UTCTimeSystem());
    openmct.time.setTimeSystem('utc');
    openmct.install(openmct.plugins.Espresso());

    openmct.start();
  </script>
</head>
<body>
</body>
</html>

```

Calling `openmct.start()` will start Open MCT and mount it into the 
specified element once the DOM is ready. An element or a selector 
string may be provided for this purposes. A selector string is 
supported to obviate the need for boilerplate code to wait for the 
body to load. If no argument is provided, Open MCT will create a 
div element as a child of the body, and bootstrap into it.

The Open MCT library included above requires certain assets such as html
templates, images, and css. If you installed Open MCT from GitHub as described
in the section on [Building from Source](#building-from-source) then these
assets will have been downloaded along with the Open MCT javascript library.

There are some plugins bundled with the application that provide UI,
persistence, and other default configuration which are necessary to be able to
do anything with the application initially. Any of these plugins can, in
principle, be replaced with a custom plugin. The included plugins are
documented in the [Included Plugins](#plugins) section.  

## Types

The Open MCT library includes its own TypeScript declaration files which can be
used to provide code hints and typechecking in your own Open MCT application.

Open MCT's type declarations are generated via `tsc` from JSDoc-style comment
blocks. For more information on this, [check out TypeScript's documentation](https://www.typescriptlang.org/docs/handbook/declaration-files/dts-from-js.html).

### Using Types

In order to use Open MCT's provided types in your own application, create a
`jsconfig.js` at the root of your project with this minimal configuration:

```json
{
  "compilerOptions": {
    "baseUrl": "./",
      "target": "es6",
      "checkJs": true,
      "moduleResolution": "node",
      "paths": {
        "openmct": ["node_modules/openmct/dist/openmct.d.ts"]
      }
  }
}
```

Then, simply import and use `openmct` in your application:

```js
import openmct from "openmct";
```

### Limitations

The effort to add types for Open MCT's public API is ongoing, and the provided
type declarations may be incomplete.

If you would like to contribute types to Open MCT, please check out
[TypeScript's documentation](https://www.typescriptlang.org/docs/handbook/declaration-files/dts-from-js.html) on generating type declarations from JSDoc-style comment blocks.
Then read through our [contributing guide](https://github.com/nasa/openmct/blob/f7cf3f72c2efd46da7ce5719c5e52c8806d166f0/CONTRIBUTING.md) and open a PR!

## Plugins

### Defining and Installing a New Plugin

```javascript
openmct.install(function install(openmctAPI) {
    // Do things here
    // ...
});
```

New plugins are installed in Open MCT by calling `openmct.install`, and
providing a plugin installation function. This function will be invoked on
application startup with one parameter - the openmct API object. A common
approach used in the Open MCT codebase is to define a plugin as a function that
returns this installation function. This allows configuration to be specified
when the plugin is included.

eg.

```javascript
openmct.install(openmct.plugins.Elasticsearch("http://localhost:8002/openmct"));
```

This approach can be seen in all of the [plugins provided with Open MCT](https://github.com/nasa/openmct/blob/master/src/plugins/plugins.js).

## Domain Objects and Identifiers

_Domain Objects_ are the basic entities that represent domain knowledge in Open
MCT.  The temperature sensor on a solar panel, an overlay plot comparing the
results of all temperature sensors, the command dictionary for a spacecraft,
the individual commands in that dictionary, the "My Items" folder: All of these
things are domain objects.

A _Domain Object_ is simply a javascript object with some standard attributes.  
An example of a _Domain Object_ is the "My Items" object which is a folder in
which a user can persist any objects that they create. The My Items object
looks like this:

```javascript
{
    identifier: {
        namespace: ""
        key: "mine"
    }
    name:"My Items",
    type:"folder",
    location:"ROOT",
    composition: []
}
```

### Object Attributes

The main attributes to note are the `identifier`, and `type` attributes.

- `identifier`: A composite key that provides a universally unique identifier
  for this object. The `namespace` and `key` are used to identify the object.
  The `key` must be unique within the namespace.
- `type`: All objects in Open MCT have a type. Types allow you to form an
  ontology of knowledge and provide an abstraction for grouping, visualizing,
  and interpreting data. Details on how to define a new object type are
  provided below.

Open MCT uses a number of builtin types. Typically you are going to want to
define your own when extending Open MCT.

### Domain Object Types

Custom types may be registered via the `addType` function on the Open MCT Type
registry.

eg.

```javascript
openmct.types.addType('example.my-type', {
    name: "My Type",
    description: "This is a type that I added!",
    creatable: true
});
```

The `addType` function accepts two arguments:

- A `string` key identifying the type. This key is used when specifying a type
for an object.  We recommend prefixing your types with a namespace to avoid
conflicts with other plugins.
- An object type specification. An object type definition supports the following
attributes
  - `name`: a `string` naming this object type
  - `description`: a `string` specifying a longer-form description of this type
  - `initialize`: a `function` which initializes the model for new domain objects
    of this type. This can be used for setting default values on an object when
    it is instantiated.
  - `creatable`: A `boolean` indicating whether users should be allowed to create
    this type (default: `false`). This will determine whether the type appears
    in the `Create` menu.
  - `cssClass`: A `string` specifying a CSS class to apply to each representation
    of this object. This is used for specifying an icon to appear next to each
    object of this type.

The [Open MCT Tutorials](https://github.com/nasa/openmct-tutorial) provide a
step-by-step examples of writing code for Open MCT that includes a [section on
defining a new object type](https://github.com/nasa/openmct-tutorial#step-3---providing-objects).

## Root Objects

In many cases, you'd like a certain object (or a certain hierarchy of objects)
to be accessible from the top level of the application (the tree on the left-hand
side of Open MCT.) For example, it is typical to expose a telemetry dictionary
as a hierarchy of telemetry-providing domain objects in this fashion.

To do so, use the `addRoot` method of the object API.

eg.

```javascript
openmct.objects.addRoot({
    namespace: "example.namespace",
    key: "my-key"
},
openmct.priority.HIGH);
```

The `addRoot` function takes a two arguments, the first can be an [object identifier](#domain-objects-and-identifiers) for a root level object, or an array of identifiers for root
level objects, or a function that returns a promise for an identifier or an array of root level objects, the second is a [priority](#priority-api) or numeric value.

When using the `getAll` method of the object API, they will be returned in order of priority.

eg.

```javascript
openmct.objects.addRoot(identifier, openmct.priority.LOW); // low = -1000, will appear last in composition or tree
openmct.objects.addRoot(otherIdentifier, openmct.priority.HIGH); // high = 1000, will appear first in composition or tree
```

Root objects are loaded just like any other objects, i.e. via an object provider.

## Object Providers

An Object Provider is used to build _Domain Objects_, typically retrieved from
some source such as a persistence store or telemetry dictionary. In order to
integrate telemetry from a new source an object provider will need to be created
that can build objects representing telemetry points exposed by the telemetry
source. The API call to define a new object provider is fairly straightforward.
Here's a very simple example:

```javascript
openmct.objects.addProvider('example.namespace', {
    get: function (identifier) {
        return Promise.resolve({
            identifier: identifier,
            name: 'Example Object',
            type: 'example-object-type'
        });
    }
});
```

The `addProvider` function takes two arguments:

- `namespace`: A `string` representing the namespace that this object provider
will provide objects for.
- `provider`: An `object` with a single function, `get`. This function accepts an
[Identifier](#domain-objects-and-identifiers) for the object to be provided.
It is expected that the `get` function will return a
[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
that resolves with the object being requested.

In future, object providers will support other methods to enable other operations with persistence stores, such as creating, updating, and deleting objects.

## Composition Providers

The _composition_ of a domain object is the list of objects it contains, as
shown (for example) in the tree for browsing. Open MCT provides a
[default solution](#default-composition-provider) for composition, but there
may be cases where you want to provide the composition of a certain object
(or type of object) dynamically.

### Adding Composition Providers

You may want to populate a hierarchy under a custom root-level object based on
the contents of a telemetry dictionary. To do this, you can add a new
Composition Provider:

```javascript
openmct.composition.addProvider({
    appliesTo: function (domainObject) {
        return domainObject.type === 'example.my-type';
    },
    load: function (domainObject) {
        return Promise.resolve(myDomainObjects);
    }
});
```

The `addProvider` function accepts a Composition Provider object as its sole
argument. A Composition Provider is a javascript object exposing two functions:

- `appliesTo`: A `function` that accepts a `domainObject` argument, and returns
a `boolean` value indicating whether this composition provider applies to the
given object.
- `load`: A `function` that accepts a `domainObject` as an argument, and returns
a `Promise` that resolves with an array of [Identifier](#domain-objects-and-identifiers).
These identifiers will be used to fetch Domain Objects from an [Object Provider](#object-provider)

### Default Composition Provider

The default composition provider applies to any domain object with a
`composition` property. The value of `composition` should be an array of
identifiers, e.g.:

```javascript
var domainObject = {
    name: "My Object",
    type: 'folder',
    composition: [
        {
            id: '412229c3-922c-444b-8624-736d85516247',
            namespace: 'foo'
        },
        {
            key: 'd6e0ce02-5b85-4e55-8006-a8a505b64c75',
            namespace: 'foo'
        }
    ]
};
```

## Telemetry API

The Open MCT telemetry API provides two main sets of interfaces 
1. For integrating telemetry data into Open MCT, and 
2. For developing Open MCT visualization plugins utilizing the telemetry API.  

The APIs for integrating telemetry metadata into Open MCT are stable and documentation is included below. However, the APIs for visualization plugins are still a work in progress and docs may change at any time.

### Integrating Telemetry Sources

There are two main tasks for integrating telemetry sources 
* Describing telemetry objects with relevant metadata. You'll use an [Object Provider](#object-providers) to provide objects with the necessary [Telemetry Metadata](#telemetry-metadata). Alternatively, you can register a telemetry metadata provider to provide the necessary telemetry metadata.
* Providing telemetry data for those objects.  You'll register a [Telemetry Provider](#telemetry-providers) to retrieve telemetry data for those objects.

For a step-by-step guide to building a telemetry adapter, please see the
[Open MCT Tutorials](https://github.com/nasa/openmct-tutorial).

#### Telemetry Metadata

A telemetry object is a domain object with a `telemetry` property.  To take an example from the tutorial, here is the telemetry object for the "fuel" measurement of the spacecraft:

```json
{
    "identifier": {
        "namespace": "example.taxonomy",
        "key": "prop.fuel"
    },
    "name": "Fuel",
    "type": "example.telemetry",
    "telemetry": {
        "values": [
            {
                "key": "value",
                "name": "Value",
                "unit": "kilograms",
                "format": "float",
                "min": 0,
                "max": 100,
                "hints": {
                    "range": 1
                }
            },
            {
                "key": "utc",
                "source": "timestamp",
                "name": "Timestamp",
                "format": "utc",
                "hints": {
                    "domain": 1
                }
            }
        ]
    }
}
```

The most important part of the telemetry metadata is the `values` property. This describes the attributes of telemetry datums (objects) that a telemetry provider returns.  These descriptions must be provided for telemetry views to work properly.

##### Values

`telemetry.values` is an array of value description objects, which have the following fields:

attribute      | type    | flags    | notes
---            |---------|----------| ---
`key`          | string  | required | unique identifier for this field.  
`hints`        | object  | required | Hints allow views to intelligently select relevant attributes for display, and are required for most views to function.  See section on "Value Hints" below.
`name`         | string  | optional | a human readable label for this field.  If omitted, defaults to `key`.
`source`       | string  | optional | identifies the property of a datum where this value is stored.  If omitted, defaults to `key`.
`format`       | string  | optional | a specific format identifier, mapping to a formatter.  If omitted, uses a default formatter.  For enumerations, use `enum`.  For timestamps, use `utc` if you are using utc dates, otherwise use a key mapping to your custom date format. For arrays use `number[]` or `string[]` See arrays below in the this table.  
`unit`        | string  | optional | the unit of this value, e.g. `km`, `seconds`, `parsecs`
`min`          | number  | optional | the minimum possible value of this measurement.  Will be used by plots, gauges, etc to automatically set a min value.
`max`          | number  | optional | the maximum possible value of this measurement.  Will be used by plots, gauges, etc to automatically set a max value.
`enumerations` | array   | optional | for objects where `format` is `"enum"`, this array tracks all possible enumerations of the value.  Each entry in this array is an object, with a `value` property that is the numerical value of the enumeration, and a `string` property that is the text value of the enumeration.  ex: `{"value": 0, "string": "OFF"}`.  If you use an enumerations array, `min` and `max` will be set automatically for you.
`arrays` | string  | optional | for objects where `format` is `"number[]" or "string[]"`. Will be used by plots, gauges, etc to automatically interpret values as arrays.

###### Value Hints

Each telemetry value description has an object defining hints.  Keys in this object represent the hint itself, and the value represents the weight of that hint.  A lower weight means the hint has a higher priority.  For example, multiple values could be hinted for use as the y-axis of a plot (raw, engineering), but the highest priority would be the default choice.  Likewise, a table will use hints to determine the default order of columns.

Known hints:

- `domain`: Values with a `domain` hint will be used for the x-axis of a plot, and tables will render columns for these values first.
- `range`: Values with a `range` hint will be used as the y-axis on a plot, and tables will render columns for these values after the `domain` values.
- `image`: Indicates that the value may be interpreted as the URL to an image file, in which case appropriate views will be made available.
- `imageDownloadName`: Indicates that the value may be interpreted as the name of the image file.

##### The Time Conductor and Telemetry

Open MCT provides a number of ways to pivot through data and link data via time.  The Time Conductor helps synchronize multiple views around the same time.

In order for the time conductor to work, there will always be an active "time system".  All telemetry metadata _must_ have a telemetry value with a `key` that matches the `key` of the active time system.  You can use the `source` attribute on the value metadata to remap this to a different field in the telemetry datum-- especially useful if you are working with disparate datasources that have different field mappings.

#### Telemetry Providers

Telemetry providers are responsible for providing historical and real-time telemetry data for telemetry objects.  Each telemetry provider determines which objects it can provide telemetry for, and then must implement methods to provide telemetry for those objects.

A telemetry provider is a javascript object with up to four methods:

- `supportsSubscribe(domainObject, callback, options)` optional.  Must be implemented to provide realtime telemetry.  Should return `true` if the provider supports subscriptions for the given domain object (and request options).
- `subscribe(domainObject, callback, options)` required if `supportsSubscribe` is implemented.  Establish a subscription for realtime data for the given domain object.  Should invoke `callback` with a single telemetry datum every time data is received.  Must return an unsubscribe function.  Multiple views can subscribe to the same telemetry object, so it should always return a new unsubscribe function.
- `supportsRequest(domainObject, options)` optional.  Must be implemented to provide historical telemetry.  Should return `true` if the provider supports historical requests for the given domain object.
- `request(domainObject, options)` required if `supportsRequest` is implemented.  Must return a promise for an array of telemetry datums that fulfills the request.  The `options` argument will include a `start`, `end`, and `domain` attribute representing the query bounds.  See [Telemetry Requests and Responses](#telemetry-requests-and-responses) for more info on how to respond to requests.
- `supportsMetadata(domainObject)` optional.  Implement and return `true` for objects that you want to provide dynamic metadata for.
- `getMetadata(domainObject)` required if `supportsMetadata` is implemented.  Must return a valid telemetry metadata definition that includes at least one valueMetadata definition.
- `supportsLimits(domainObject)` optional.  Implement and return `true` for domain objects that you want to provide a limit evaluator for.
- `getLimitEvaluator(domainObject)` required if `supportsLimits` is implemented.  Must return a valid LimitEvaluator for a given domain object.

Telemetry providers are registered by calling `openmct.telemetry.addProvider(provider)`, e.g.

```javascript
openmct.telemetry.addProvider({
    supportsRequest: function (domainObject, options) { /*...*/ },
    request: function (domainObject, options) { /*...*/ },
})
```

Note: it is not required to implement all of the methods on every provider.  Depending on the complexity of your implementation, it may be helpful to instantiate and register your realtime, historical, and metadata providers separately.

#### Telemetry Requests and Responses

Telemetry requests support time bounded queries. A call to a _Telemetry Provider_'s `request` function will include an `options` argument. These are simply javascript objects with attributes for the request parameters. An example of a telemetry request object with a start and end time is included below:

```javascript
{
    start: 1487981997240,
    end: 1487982897240,
    domain: 'utc'
}
```

In this case, the `domain` is the currently selected time-system, and the start and end dates are valid dates in that time system.

A telemetry provider's `request` method should return a promise for an array of telemetry datums.  These datums must be sorted by `domain` in ascending order.

The telemetry provider's `request` method will also return an object `signal` with an `aborted` property with a value `true` if the request has been aborted by user navigation. This can be used to trigger actions when a request has been aborted.

#### Request Strategies **draft**

To improve performance views may request a certain strategy for data reduction.  These are intended to improve visualization performance by reducing the amount of data needed to be sent to the client.  These strategies will be indicated by additional parameters in the request options.  You may choose to handle them or ignore them.  

Note: these strategies are currently being tested in core plugins and may change based on developer feedback.

##### `latest` request strategy

This request is a "depth based" strategy.  When a view is only capable of
displaying a single value (or perhaps the last ten values), then it can
use the `latest` request strategy with a `size` parameter that specifies
the number of results it desires.  The `size` parameter is a hint; views
must not assume the response will have the exact number of results requested.

example:

```javascript
{
    start: 1487981997240,
    end: 1487982897240,
    domain: 'utc',
    strategy: 'latest',
    size: 1
}
```

This strategy says "I want the latest data point in this time range".  A provider which recognizes this request should return only one value-- the latest-- in the requested time range.  Depending on your back-end implementation, performing these queries in bulk can be a large performance increase.  These are generally issued by views that are only capable of displaying a single value and only need to show the latest value.

##### `minmax` request strategy

example:

```javascript
{
    start: 1487981997240,
    end: 1487982897240,
    domain: 'utc',
    strategy: 'minmax',
    size: 720
}
```

MinMax queries are issued by plots, and may be issued by other types as well.  The aim is to reduce the amount of data returned but still faithfully represent the full extent of the data.  In order to do this, the view calculates the maximum data resolution it can display (i.e. the number of horizontal pixels in a plot) and sends that as the `size`.  The response should include at least one minimum and one maximum value per point of resolution.

#### Telemetry Formats

Telemetry format objects define how to interpret and display telemetry data.
They have a simple structure, provided here as a TypeScript interface:

```ts
interface Formatter {
    key: string; // A string that uniquely identifies this formatter.

    format: (
        value: any, // The raw telemetry value in its native type.
        minValue?: number, // An optional argument specifying the minimum displayed value.
        maxValue?: number, // An optional argument specifying the maximum displayed value.
        count?: number // An optional argument specifying the number of displayed values.
    ) => string; // Returns a human-readable string representation of the provided value.

    parse: (
        value: string | any // A string representation of a telemetry value or an already-parsed value.
    ) => any; // Returns the value in its native type. This function should be idempotent.

    validate: (value: string) => boolean; // Takes a string representation of a telemetry value and returns a boolean indicating whether the provided string can be parsed.
}
```

##### Built-in Formats

Open MCT on its own defines a handful of built-in formats:

###### **Number Format (default):**

Applied to data with `format: 'number'`

```js
valueMetadata = {
    format: 'number'
    // ...
};
```

```ts
interface NumberFormatter extends Formatter {
    parse: (x: any) => number;
    format: (x: number) => string;
    validate: (value: any) => boolean;
}
```

###### **String Format**

Applied to data with `format: 'string'`

```js
valueMetadata = {
    format: 'string'
    // ...
};
```

```ts
interface StringFormatter extends Formatter {
    parse: (value: any) => string;
    format: (value: string) => string;
    validate: (value: any) => boolean;
}
```

###### **Enum Format**

Applied to data with `format: 'enum'`

```js
valueMetadata = {
    format: 'enum',
    enumerations: [
    {
        value: 1,
        string: 'APPLE'
    }, 
    {
        value: 2,
        string: 'PEAR',
    },
    {
        value: 3,
        string: 'ORANGE'
    }]
    // ...
};
```

Creates a two-way mapping between enum string and value to be used in the `parse` and `format` methods.
Ex:

- `formatter.parse('APPLE') === 1;`
- `formatter.format(1) === 'APPLE';`

```ts
interface EnumFormatter extends Formatter {
    parse: (value: string) => string;
    format: (value: number) => string;
    validate: (value: any) => boolean;
}
```
##### Time Formats

Time formatters are used to format and parse datetime values. See as an example the UTC time formatter provided in src/plugins/utcTimeSystem/UTCTimeFormat.js.

If a formatDate method is provided, it will be used in conjunction with a duration formatter to provide split date and time inputs for the time conductor.

```ts
interface TimeFormatter extends Formatter {
    parse: (value: string) => number;
    format: (value: number) => string;
    formatDate?: (value: number) => string;
    validate: (value: any) => boolean;
}
```

##### Registering Formats

Formats implement the following interface (provided here as TypeScript for simplicity):

Formats are registered with the Telemetry API using the `addFormat` function. eg.

```javascript
openmct.telemetry.addFormat({
    key: 'number-to-string',
    format: function (number) {
        return number + '';
    },
    parse: function (text) {
        return Number(text);
    },
    validate: function (text) {
        return !isNaN(text);
    }
});
```

#### Telemetry Data

A single telemetry point is considered a Datum, and is represented by a standard
javascript object.  Realtime subscriptions (obtained via **subscribe**) will
invoke the supplied callback once for each telemetry datum received.  Telemetry
requests (obtained via **request**) will return a promise for an array of
telemetry datums.

##### Telemetry Datums

A telemetry datum is a simple javascript object, e.g.:

```json
{
    "timestamp": 1491267051538,
    "value": 77,
    "id": "prop.fuel"
}
```

The key-value pairs of this object are described by the telemetry metadata of
a domain object, as discussed in the [Telemetry Metadata](#telemetry-metadata)
section.

#### Limit Evaluators **draft**

Limit evaluators allow a telemetry integrator to define which limits exist for a
telemetry endpoint and how limits should be applied to telemetry from a given domain object.

A limit evaluator can implement the `evaluate` method which is used to define how limits
should be applied to telemetry and the `getLimits` method which is used to specify
what the limit values are for different limit levels.

Limit levels can be mapped to one of 5 colors for visualization:
`purple`, `red`, `orange`, `yellow` and `cyan`.

For an example of a limit evaluator, take a look at `examples/generator/SinewaveLimitProvider.js`.

### Telemetry Consumer APIs **draft**

The APIs for requesting telemetry from Open MCT -- e.g. for use in custom views -- are currently in draft state and are being revised.  If you'd like to experiment with them before they are finalized, please contact the team via the contact-us link on our website.

## Time API

Open MCT provides API for managing the temporal state of the application.
Central to this is the concept of "time bounds". Views in Open MCT will
typically show telemetry data for some prescribed date range, and the Time API
provides a way to centrally manage these bounds.

The Time API exposes a number of methods for querying and setting the temporal
state of the application, and emits events to inform listeners when the state changes.

Because the data displayed tends to be time domain data, Open MCT must always
have at least one time system installed and activated. When you download Open
MCT, it will be pre-configured to use the UTC time system, which is installed and activated,
along with other default plugins, in `index.html`. Installing and activating a time system
is simple, and is covered [in the next section](#defining-and-registering-time-systems).

### Time Systems and Bounds

#### Defining and Registering Time Systems

The time bounds of an Open MCT application are defined as numbers, and a Time
System gives meaning and context to these numbers so that they can be correctly
interpreted. Time Systems are JavaScript objects that provide some information
about the current time reference frame. An example of defining and registering
a new time system is given below:

``` javascript
openmct.time.addTimeSystem({
    key: 'utc',
    name: 'UTC Time',
    cssClass = 'icon-clock',
    timeFormat = 'utc',
    durationFormat = 'duration',
    isUTCBased = true
});
```

The example above defines a new utc based time system. In fact, this time system
is configured and activated by default from `index.html` in the default
installation of Open MCT if you download the source from GitHub. Some details of
each of the required properties is provided below.

- `key`: A `string` that uniquely identifies this time system.
- `name`: A `string` providing a brief human readable label. If the [Time Conductor](#the-time-conductor)
plugin is enabled, this name will identify the time system in a dropdown menu.
- `cssClass`: A class name `string` that will be applied to the time system when
it appears in the UI. This will be used to represent the time system with an icon.
There are a number of built-in icon classes [available in Open MCT](https://github.com/nasa/openmct/blob/master/platform/commonUI/general/res/sass/_glyphs.scss),
or a custom class can be used here.
- `timeFormat`: A `string` corresponding to the key of a registered
[telemetry time format](#telemetry-formats). The format will be used for
displaying discrete timestamps from telemetry streams when this time system is
activated. If the [UTCTimeSystem](#included-plugins) is enabled, then the `utc`
format can be used if this is a utc-based time system
- `durationFormat`: A `string` corresponding to the key of a registered
[telemetry time format](#telemetry-formats). The format will be used for
displaying time ranges, for example `00:15:00` might be used to represent a time
period of fifteen minutes. These are used by the Time Conductor plugin to specify
relative time offsets. If the [UTCTimeSystem](#included-plugins) is enabled,
then the `duration` format can be used if this is a utc-based time system
- `isUTCBased`: A `boolean` that defines whether this time system represents
numbers in UTC terrestrial time.

#### Getting and Setting the Active Time System

Once registered, a time system can be activated by calling `setTimeSystem` with
the timeSystem `key` or an instance of the time system.  You can also specify
valid [bounds](#time-bounds) for the timeSystem.

```javascript
openmct.time.setTimeSystem('utc', bounds);
```

The current time system can be retrieved as well by calling `getTimeSystem`.

```javascript
openmct.time.getTimeSystem();
```

A time system can be immediately activated after registration:

```javascript
openmct.time.addTimeSystem(utcTimeSystem);
openmct.time.setTimeSystem(utcTimeSystem, bounds);
```

Setting the active time system will trigger a [`'timeSystemChanged'`](#time-events)
event.  If you supplied bounds, a [`'boundsChanged'`](#time-events) event will be triggered afterwards with your newly supplied bounds.

> ⚠️ **Deprecated**
>
> - The method `timeSystem()` is deprecated. Please use `getTimeSystem()` and `setTimeSystem()` as a replacement.

#### Time Bounds

The TimeAPI provides a getter and setter for querying and setting time bounds. Time
bounds are simply an object with a `start` and an end `end` attribute.

- `start`: A `number` representing a moment in time in the active [Time System](#defining-and-registering-time-systems).
This will be used as the beginning of the time period displayed by time-responsive
telemetry views.
- `end`: A `number` representing a moment in time in the active [Time System](#defining-and-registering-time-systems).
This will be used as the end of the time period displayed by time-responsive
telemetry views.

New bounds can be set system wide by calling `setBounds` with [bounds](#time-bounds).

``` javascript
const ONE_HOUR = 60 * 60 * 1000;
let now = Date.now();
openmct.time.setBounds({start: now - ONE_HOUR, now);
```

Calling `getBounds` will return the current application-wide time bounds.

``` javascript
openmct.time.getBounds();
```

To respond to bounds change events, listen for the [`'boundsChanged'`](#time-events)
event.

> ⚠️ **Deprecated**
>
> - The method `bounds()` is deprecated and will be removed in a future release. Please use `getBounds()` and `setBounds()` as a replacement.

### Clocks

The Time API requires a clock source which will cause the bounds to be updated
automatically whenever the clock source "ticks". A clock is simply an object that
supports registration of listeners and periodically invokes its listeners with a
number. Open MCT supports registration of new clock sources that tick on almost
anything. A tick occurs when the clock invokes callback functions registered by its
listeners with a new time value.

An example of a clock source is the [LocalClock](https://github.com/nasa/openmct/blob/master/src/plugins/utcTimeSystem/LocalClock.js)
which emits the current time in UTC every 100ms. Clocks can tick on anything. For
example, a clock could be defined to provide the timestamp of any new data
received via a telemetry subscription. This would have the effect of advancing
the bounds of views automatically whenever data is received. A clock could also
be defined to tick on some remote timing source.

The values provided by clocks are simple `number`s, which are interpreted in the
context of the active [Time System](#defining-and-registering-time-systems).

#### Defining and registering clocks

A clock is an object that defines certain required metadata and functions:

- `key`: A `string` uniquely identifying this clock. This can be used later to
reference the clock in places such as the [Time Conductor configuration](#time-conductor-configuration)
- `cssClass`: A `string` identifying a CSS class to apply to this clock when it's
displayed in the UI. This will be used to represent the time system with an icon.
There are a number of built-in icon classes [available in Open MCT](https://github.com/nasa/openmct/blob/master/platform/commonUI/general/res/sass/_glyphs.scss),
or a custom class can be used here.
- `name`: A `string` providing a human-readable identifier for the clock source.
This will be displayed in the clock selector menu in the Time Conductor UI
component, if active.
- `description`: An **optional** `string` providing a longer description of the
clock. The description will be visible in the clock selection menu in the Time
Conductor plugin.
- `on`: A `function` supporting registration of a new callback that will be
invoked when the clock next ticks. It will be invoked with two arguments:
  - `eventName`: A `string` specifying the event to listen on. For now, clocks
    support one event - `tick`.
  - `callback`: A `function` that will be invoked when this clock ticks. The
    function must be invoked with one parameter - a `number` representing a valid
    time in the current time system.
- `off`: A `function` that allows deregistration of a tick listener. It accepts
the same arguments as `on`.
- `currentValue`: A `function` that returns a `number` representing a point in
time in the active time system. It should be the last value provided by a tick,
or some default value if no ticking has yet occurred.

A new clock can be registered using the `addClock` function exposed by the Time
API:

```javascript
var someClock = {
    key: 'someClock',
    cssClass: 'icon-clock',
    name: 'Some clock',
    description: "Presumably does something useful",
    on: function (event, callback) {
        // Some function that registers listeners, and updates them on a tick
    },
    off: function (event, callback) {
        // Some function that unregisters listeners.
    },
    currentValue: function () {
        // A function that returns the last ticked value for the clock
    }
}

openmct.time.addClock(someClock);
```

An example clock implementation is provided in the form of the [LocalClock](https://github.com/nasa/openmct/blob/master/src/plugins/utcTimeSystem/LocalClock.js)

#### Getting and setting active clock

Once registered a clock can be activated by calling the `setClock` function on the
Time API passing in the key or instance of a registered clock. Only one clock
may be active at once, so activating a clock will deactivate any currently
active clock and start the new clock. [`clockOffsets`](#clock-offsets) must be specified when changing a clock.

Setting the clock triggers a [`'clockChanged'`](#time-events) event, followed by a [`'clockOffsetsChanged'`](#time-events) event, and then a [`'boundsChanged'`](#time-events) event as the offsets are applied to the clock's currentValue().

```
openmct.time.setClock(someClock, clockOffsets);
```

Upon being activated, the time API will listen for tick events on the clock by calling `clock.on`.

The currently active clock can be retrieved by calling `getClock`.

```
openmct.time.getClock();
```

> ⚠️ **Deprecated**
>
> - The method `clock()` is deprecated and will be removed in a future release. Please use `getClock()` and `setClock()` as a replacement.

#### ⚠️ [DEPRECATED] Stopping an active clock

_As of July 2023, this method will be deprecated. Open MCT will always have a ticking clock._

The `stopClock` method can be used to stop an active clock, and to clear it. It
will stop the clock from ticking, and set the active clock to `undefined`.

``` javascript
openmct.time.stopClock();
```

> ⚠️ **Deprecated**
>
> - The method `stopClock()` is deprecated and will be removed in a future release.

#### Clock Offsets

When in Real-time [mode](#time-modes), the time bounds of the application will be updated automatically each time the
clock "ticks". The bounds are calculated based on the current value provided by
the active clock (via its `tick` event, or its `currentValue()` method).

Unlike bounds, which represent absolute time values, clock offsets represent
relative time spans. Offsets are defined as an object with two properties:

- `start`: A `number` that must be < 0 and which is used to calculate the start
bounds on each clock tick. The start offset will be calculated relative to the
value provided by a clock's tick callback, or its `currentValue()` function.
- `end`: A `number` that must be >= 0 and which is used to calculate the end
bounds on each clock tick.

The `setClockOffsets` function can be used to get or set clock offsets. For example,
to show the last fifteen minutes in a ms-based time system:

```javascript
var FIFTEEN_MINUTES = 15 * 60 * 1000;

openmct.time.setClockOffsets({
    start: -FIFTEEN_MINUTES,
    end: 0
})
```

The `getClockOffsets` method will return the currently set clock offsets.

```javascript
openmct.time.getClockOffsets()
```

**Note:** Setting the clock offsets will trigger an immediate bounds change, as
new bounds will be calculated based on the `currentValue()` of the active clock.
Clock offsets are only relevant when in Real-time [mode](#time-modes).

> ⚠️ **Deprecated**
>
> - The method `clockOffsets()` is deprecated and will be removed in a future release. Please use `getClockOffsets()` and `setClockOffsets()` as a replacement.

### Time Modes

There are two time modes in Open MCT, "Fixed" and "Real-time". In Real-time mode the
time bounds of the application will be updated automatically each time the clock "ticks".
The bounds are calculated based on the current value provided by the active clock. In
Fixed mode, the time bounds are set for a specified time range. When Open MCT is first
initialized, it will be in Real-time mode.

The `setMode` method can be used to set the current time mode. It accepts a mode argument,
`'realtime'` or `'fixed'` and it also accepts an optional [offsets](#clock-offsets)/[bounds](#time-bounds) argument dependent
on the current mode.

``` javascript
openmct.time.setMode('fixed');
openmct.time.setMode('fixed', bounds); // with optional bounds
```

or

``` javascript
openmct.time.setMode('realtime');
openmct.time.setMode('realtime', offsets); // with optional offsets
```

The `getMode` method will return the current time mode, either `'realtime'` or `'fixed'`.

``` javascript
openmct.time.getMode();
```

#### Time Mode Helper Methods

There are two methods available to determine the current time mode in Open MCT programmatically,
`isRealTime` and `isFixed`. Each one will return a boolean value based on the current mode.

``` javascript
if (openmct.time.isRealTime()) {
  // do real-time stuff
}
```

``` javascript
if (openmct.time.isFixed()) {
  // do fixed-time stuff
}
```

### Time Events

The Time API is a standard event emitter; you can register callbacks for events using the `on` method and remove callbacks for events with the `off` method.

For example:

``` javascript
openmct.time.on('boundsChanged', function callback (newBounds, tick) {
    // Do something with new bounds
});
```

#### List of Time Events

The events emitted by the Time API are:

- `boundsChanged`: emitted whenever the bounds change.  The callback will be invoked
  with two arguments:
  - `bounds`: A [bounds](#getting-and-setting-bounds) bounds object
    representing a new time period bound by the specified start and send times.
  - `tick`: A `boolean` indicating whether or not this bounds change is due to
    a "tick" from a [clock source](#clocks). This information can be useful
    when determining a strategy for fetching telemetry data in response to a
    bounds change event. For example, if the bounds change was automatic, and
    is due to a tick then it's unlikely that you would need to perform a
    historical data query. It should be sufficient to just show any new
    telemetry received via subscription since the last tick, and optionally to
    discard any older data that now falls outside of the currently set bounds.
    If `tick` is false,then the bounds change was not due to an automatic tick,
    and a query for historical data may be necessary, depending on your data
    caching strategy, and how significantly the start bound has changed.
- `timeSystemChanged`: emitted whenever the active time system changes.  The callback will be invoked with a single argument:
  - `timeSystem`: The newly active [time system](#defining-and-registering-time-systems).
- `clockChanged`: emitted whenever the clock changes.  The callback will be invoked
  with a single argument:
  - `clock`: The newly active [clock](#clocks), or `undefined` if an active
    clock has been deactivated.
- `clockOffsetsChanged`: emitted whenever the active clock offsets change.  The
  callback will be invoked with a single argument:
  - `clockOffsets`: The new [clock offsets](#clock-offsets).
- `modeChanged`: emitted whenever the time [mode](#time-modes) changed. The callback will
  be invoked with one argument:
  - `mode`: A string representation of the current time mode, either `'realtime'` or `'fixed'`.

> ⚠️ **Deprecated Events** (These will be removed in a future release):
>
> - `bounds` → `boundsChanged`
> - `timeSystem` → `timeSystemChanged`
> - `clock` → `clockChanged`
> - `clockOffsets` → `clockOffsetsChanged`

### The Time Conductor

The Time Conductor provides a user interface for managing time bounds in Open
MCT. It allows a user to select from configured time systems and clocks, and to set bounds and clock offsets.

If activated, the time conductor must be provided with configuration options,
detailed below.

#### Time Conductor Configuration

The time conductor is configured by specifying the options that will be
available to the user from the menus in the time conductor. These will determine
the clocks available from the conductor, the time systems available for each
clock, and some default bounds and clock offsets for each combination of clock
and time system. By default, the conductor always supports a `fixed` mode where
no clock is active. To specify configuration for fixed mode, simply leave out a
`clock` attribute in the configuration entry object.

Configuration is provided as an `array` of menu options. Each entry of the
array is an object with some properties specifying configuration. The configuration
options specified are slightly different depending on whether or not it is for
an active clock mode.

**Configuration for Fixed Time Mode (no active clock)**

- `timeSystem`: A `string`, the key for the time system that this configuration
relates to.
- `bounds`: A [`Time Bounds`](#time-bounds) object. These bounds will be applied
when the user selects the time system specified in the previous `timeSystem`
property.
- `zoomOutLimit`: An **optional** `number` specifying the longest period of time
that can be represented by the conductor when zooming. If a `zoomOutLimit` is
provided, then a `zoomInLimit` must also be provided. If provided, the zoom
slider will automatically become available in the Time Conductor UI.
- `zoomInLimit`: An **optional** `number` specifying the shortest period of time
that can be represented by the conductor when zooming. If a `zoomInLimit` is
provided, then a `zoomOutLimit` must also be provided. If provided, the zoom
slider will automatically become available in the Time Conductor UI.

**Configuration for Active Clock**

- `clock`: A `string`, the `key` of the clock that this configuration applies to.
- `timeSystem`: A `string`, the key for the time system that this configuration
relates to. Separate configuration must be provided for each time system that you
wish to be available to users when they select the specified clock.
- `clockOffsets`: A [`clockOffsets`](#clock-offsets) object that will be
automatically applied when the combination of clock and time system specified in
this configuration is selected from the UI.

#### Example conductor configuration

An example time conductor configuration is provided below. It sets up some
default options for the [UTCTimeSystem](https://github.com/nasa/openmct/blob/master/src/plugins/utcTimeSystem/UTCTimeSystem.js)
and [LocalTimeSystem](https://github.com/nasa/openmct/blob/master/src/plugins/localTimeSystem/LocalTimeSystem.js),
in both fixed mode, and for the [LocalClock](https://github.com/nasa/openmct/blob/master/src/plugins/utcTimeSystem/LocalClock.js)
source. In this configuration, the local clock supports both the UTCTimeSystem
and LocalTimeSystem. Configuration for fixed bounds mode is specified by omitting
a clock key.

``` javascript
const ONE_YEAR = 365 * 24 * 60 * 60 * 1000;
const ONE_MINUTE = 60 * 1000;

openmct.install(openmct.plugins.Conductor({
    menuOptions: [
        // 'Fixed' bounds mode configuration for the UTCTimeSystem
        {
            timeSystem: 'utc',
            bounds: {start: Date.now() - 30 * ONE_MINUTE, end: Date.now()},
            zoomOutLimit: ONE_YEAR,
            zoomInLimit: ONE_MINUTE
        },
        // Configuration for the LocalClock in the UTC time system
        {
            clock: 'local',
            timeSystem: 'utc',
            clockOffsets: {start: - 30 * ONE_MINUTE, end: 0},
            zoomOutLimit: ONE_YEAR,
            zoomInLimit: ONE_MINUTE
        },
        //Configuration for the LocaLClock in the Local time system
        {
            clock: 'local',
            timeSystem: 'local',
            clockOffsets: {start: - 15 * ONE_MINUTE, end: 0}
        }
    ]
}));
```

## Indicators

Indicators are small widgets that reside at the bottom of the screen and are visible from
every screen in Open MCT. They can be used to convey system state using an icon and text.
Typically an indicator will display an icon (customizable with a CSS class) that will
reveal additional information when the mouse cursor is hovered over it.

### The URL Status Indicator

A common use case for indicators is to convey the state of some external system such as a
persistence backend or HTTP server. So long as this system is accessible via HTTP request,
Open MCT provides a general purpose indicator to show whether the server is available and
returning a 2xx status code. The URL Status Indicator is made available as a default plugin. See
the [documentation](./src/plugins/URLIndicatorPlugin) for details on how to install and configure the
URL Status Indicator.

### Creating a Simple Indicator

A simple indicator with an icon and some text can be created and added with minimal code. An indicator
of this type exposes functions for customizing the text, icon, and style of the indicator.

eg.

``` javascript
var myIndicator = openmct.indicators.simpleIndicator();
myIndicator.text("Hello World!");
openmct.indicators.add(myIndicator);
```

This will create a new indicator and add it to the bottom of the screen in Open MCT.
By default, the indicator will appear as an information icon. Hovering over the icon will
reveal the text set via the call to `.text()`. The Indicator object returned by the API
call exposes a number of functions for customizing the content and appearance of the indicator:

- `.text([text])`: Gets or sets the text shown when the user hovers over the indicator.
Accepts an **optional** `string` argument that, if provided, will be used to set the text.
Hovering over the indicator will expand it to its full size, revealing this text alongside
the icon. Returns the currently set text as a `string`.
- `.description([description])`: Gets or sets the indicator's description. Accepts an
**optional** `string` argument that, if provided, will be used to set the text. The description
allows for more detail to be provided in a tooltip when the user hovers over the indicator.
Returns the currently set text as a `string`.
- `.iconClass([className])`: Gets or sets the CSS class used to define the icon. Accepts an **optional**
`string` parameter to be used to set the class applied to the indicator. Any of
[the built-in glyphs](https://nasa.github.io/openmct/style-guide/#/browse/styleguide:home/glyphs?view=styleguide.glyphs)
may be used here, or a custom CSS class can be provided. Returns the currently defined CSS
class as a `string`.
- `.statusClass([className])`: Gets or sets the CSS class used to determine status. Accepts an **optional**
`string` parameter to be used to set a status class applied to the indicator. May be used to apply
different colors to indicate status.

### Custom Indicators

A completely custom indicator can be added by simply providing a DOM element to place alongside other indicators.

``` javascript
    var domNode = document.createElement('div');
    domNode.innerText = new Date().toString();
    setInterval(function () {
        domNode.innerText = new Date().toString();
    }, 1000);

    openmct.indicators.add({
        element: domNode
    });
```

## Priority API

Open MCT provides some built-in priority values that can be used in the application for view providers, indicators, root object order, and more.

### Priority Types

Currently, the Open MCT Priority API provides (type: numeric value):

- HIGHEST: Infinity
- HIGH: 1000
- Default: 0
- LOW: -1000
- LOWEST: -Infinity

View provider Example:

``` javascript
  class ViewProvider {
    ...
    priority() {
        return openmct.priority.HIGH;
    }
}
```

## User API

Open MCT provides a User API which can be used to define providers for user information. The API
can be used to manage user information and roles.

### Example

Open MCT provides an example [user](example/exampleUser/exampleUserCreator.js) and [user provider](example/exampleUser/ExampleUserProvider.js) which
can be used as a starting point for creating a custom user provider.

## Visibility-Based Rendering in View Providers

To enhance performance and resource efficiency in OpenMCT, a visibility-based rendering feature has been added. This feature is designed to defer the execution of rendering logic for views that are not currently visible. It ensures that views are only updated when they are in the viewport, similar to how modern browsers handle rendering of inactive tabs but optimized for the OpenMCT tabbed display. It also works when views are scrolled outside the viewport (e.g., in a Display Layout).

### Overview

The show function is responsible for the rendering of a view. An [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) is used internally to determine whether the view is visible. This observer drives the visibility-based rendering feature, accessed via the `renderWhenVisible` function provided in the `viewOptions` parameter.

### Implementing Visibility-Based Rendering

The `renderWhenVisible` function is passed to the show function as part of the `viewOptions` object. This function can be used for all rendering logic that would otherwise be executed within a `requestAnimationFrame` call. When called, `renderWhenVisible` will either execute the provided function immediately (via `requestAnimationFrame`) if the view is currently visible, or defer its execution until the view becomes visible.

Additionally, `renderWhenVisible` returns a boolean value indicating whether the provided function was executed immediately (`true`) or deferred (`false`).

Monitoring of visibility begins after the first call to `renderWhenVisible` is made.

Here’s the signature for the show function:

`show(element, isEditing, viewOptions)`

- `element` (HTMLElement) - The DOM element where the view should be rendered.
- `isEditing` (boolean) - Indicates whether the view is in editing mode.
- `viewOptions` (Object) - An object with configuration options for the view, including:
  - `renderWhenVisible` (Function) - This function wraps the `requestAnimationFrame` and only triggers the provided render logic when the view is visible in the viewport.

### Example

An OpenMCT view provider might implement the show function as follows:

```js
// Define your view provider
const myViewProvider = {
  // ... other properties and methods ...
  show: function (element, isEditing, viewOptions) {
    // Callback for rendering view content
    const renderCallback = () => {
      // Your view rendering logic goes here
    };
    
    // Use the renderWhenVisible function to ensure rendering only happens when view is visible
    const wasRenderedImmediately = viewOptions.renderWhenVisible(renderCallback);

    // Optionally handle the immediate rendering return value
    if (wasRenderedImmediately) {
      console.debug('🪞 Rendering triggered immediately as the view is visible.');
    } else {
      console.debug('🛑 Rendering has been deferred until the view becomes visible.');
    }
  }
};
```

Note that `renderWhenVisible` defers rendering while the view is not visible and caters to the latest execution call. This provides responsiveness for dynamic content while ensuring performance optimizations.

Ensure your view logic is prepared to handle potentially multiple deferrals if using this API, as only the last call to renderWhenVisible will be queued for execution upon the view becoming visible.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Open MCT

This document describes the process of contributing to Open MCT as well as the standards that will be applied when evaluating contributions.

In order for external contributions to be merged, contributors must have on record a signed [Contributor License Agreement (CLA)](https://nasa.github.io/openmct/static/files/ind-cla-open-mct.pdf). More information on this process can be found [in this discussion](https://github.com/nasa/openmct/discussions/3821).

## Summary

The short version:

1. Write your contribution or describe your idea in the form of a [GitHub issue](https://github.com/nasa/openmct/issues/new/choose) or [start a GitHub discussion](https://github.com/nasa/openmct/discussions).
2. Make sure your contribution meets code, test, and commit message standards as described below.
3. Submit a pull request from a topic branch back to `master`. Include a check list, as described below. (Optionally, assign this to a specific member for review.)
4. Respond to any discussion. When the reviewer decides it's ready, they will merge back `master` and fill out their own check list.
5. If you are a first-time contributor, please see [this discussion](https://github.com/nasa/openmct/discussions/3821) for further information.

## Contribution Process

Open MCT uses git for software version control, and for branching and merging. The central repository is at <https://github.com/nasa/openmct.git>.

### Roles

References to roles are made throughout this document. These are not intended to reflect titles or long-term job assignments; rather, these are used as descriptors to refer to members of the development team performing tasks in the check-in process.

These roles are:

* _Author_: The individual who has made changes to files in the software repository, and wishes to check these in.
* _Reviewer_: The individual who reviews changes to files before they are checked in.
* _Integrator_: The individual who performs the task of merging these files. Usually the reviewer.

### Branching

Three basic types of branches may be included in the above repository:

1. Master branch
2. Topic branches
3. Developer branches

Branches which do not fit into the above categories may be created and used during the course of development for various reasons, such as large-scale refactoring of code or implementation of complex features which may cause instability. In these exceptional cases it is the responsibility of the developer who initiates the task which motivated this branching to communicate to the team the role of these branches and any associated procedures for the duration of their use.

#### Master Branch

The role of the `master` branches is to represent the latest "ready for test" version of the software. Source code on the master branch has undergone peer review, and will undergo regular automated testing with notification on failure. Master branches may be unstable (particularly for recent features), but the intent is for the stability of any features on master branches to be non-decreasing. It is the shared responsibility of authors, reviewers, and integrators to ensure this.

#### Topic Branches

Topic branches are used by developers to perform and record work on issues.

Topic branches need not necessarily be stable, even when pushed to the central repository; in fact, the practice of making incremental commits while working on an issue and pushing these to the central repository is encouraged, to avoid lost work and to share work-in-progress. (Small commits also help isolate changes, which can help in identifying which change introduced a defect, particularly when that defect went unnoticed for some time, e.g. using `git bisect`.)

Topic branches should be named according to their corresponding issue identifiers, all lower case, without hyphens. (e.g. branch mct9 would refer to issue #9.)

In some cases, work on an issue may warrant the use of multiple divergent branches; for instance, when a developer wants to try more than one solution and compare them, or when a "dead end" is reached and an initial approach to resolving an issue needs to be abandoned. In these cases, a short suffix should be added to the additional branches; this may be simply a single character (e.g. wtd481b) or, where useful, a descriptive term for what distinguishes the branches (e.g. wtd481verbose). It is the responsibility of the author to communicate which branch is intended to be merged to both the reviewer and the integrator.

#### Developer Branches

Developer branches are any branches used for purposes outside of the scope of the above; e.g. to try things out, or maintain a "my latest stuff" branch that is not delayed by the review and integration process. These may be pushed to the central repository, and may follow any naming convention desired so long as the owner of the branch is identifiable, and so long as the name chosen could not be mistaken for a topic or master branch.

### Merging

When development is complete on an issue, the first step toward merging it back into the master branch is to file a Pull Request (PR). The contributions should meet code, test, and commit message standards as described below, and the pull request should include a completed author checklist, also as described below. Pull requests may be assigned to specific team members when appropriate (e.g. to draw to a specific person's attention).

Code review should take place using discussion features within the pull request. When the reviewer is satisfied, they should add a comment to the pull request containing the reviewer checklist (from below) and complete the merge back to the master branch.

Additionally:

* Every pull request must link to the issue that it addresses. Eg. “Addresses #1234” or “Closes #1234”. This is the responsibility of the pull request’s __author__. If no issue exists, [create one](https://github.com/nasa/openmct/issues/new/choose).
* Every __author__ must include testing instructions. These instructions should identify the areas of code affected, and some minimal test steps. If addressing a bug, reproduction steps should be included, if they were not included in the original issue. If reproduction steps were included on the original issue, and are sufficient, refer to them.
* A pull request that closes an issue should say so in the description. Including the text “Closes #1234” will cause the linked issue to be automatically closed when the pull request is merged. This is the responsibility of the pull request’s __author__.
* When a pull request is merged, and the corresponding issue closed, the __reviewer__ must add the tag “unverified” to the original issue. This will indicate that although the issue is closed, it has not been tested yet.
* Every PR must have two reviewers assigned, though only one approval is necessary for merge.
* Changes to API require approval by a senior developer.
* When creating a PR, it is the author's responsibility to apply any priority label from the issue to the PR as well. This helps with prioritization.

## Standards

Contributions to Open MCT are expected to meet the following standards. In addition, reviewers should use general discretion before accepting changes.

### Code Standards

JavaScript sources in Open MCT must satisfy the [ESLint](https://eslint.org/) rules defined in this repository. [Prettier](https://prettier.io/) is used in conjunction with ESLint to enforce code style via automated formatting. These are verified by the command line build.

#### Code Guidelines

The following guidelines are provided for anyone contributing source code to the Open MCT project:

1. Write clean code. Here’s a good summary - <https://github.com/ryanmcdermott/clean-code-javascript>.
1. Include JSDoc for any exposed API (e.g. public methods, classes).
1. Include non-JSDoc comments as-needed for explaining private variables, methods, or algorithms when they are non-obvious. Otherwise code should be self-documenting.
1. Classes and Vue components should use camel case, first letter capitalized (e.g. SomeClassName).
1. Methods, variables, fields, events, and function names should use camelCase, first letter lower-case (e.g. someVariableName).
1. Source files that export functions should use camelCase, first letter lower-case (eg. testTools.js)
1. Constants (variables or fields which are meant to be declared and initialized statically, and never changed) should use only capital letters, with underscores between words (e.g. SOME_CONSTANT). They should always be declared as `const`s
1. File names should be the name of the exported class, plus a .js extension (e.g. SomeClassName.js).
1. Avoid anonymous functions, except when functions are short (one or two lines) and their inclusion makes sense within the flow of the code (e.g. as arguments to a forEach call). Anonymous functions should always be arrow functions.
1. Named functions are preferred over functions assigned to variables.
   eg.

   ```JavaScript
   function renameObject(object, newName) {
       Object.name = newName;
   }
   ```

   is preferable to

   ```JavaScript
   const rename = (object, newName) => {
       Object.name = newName;
   }
   ```

1. Avoid deep nesting (especially of functions), except where necessary (e.g. due to closure scope).
1. End with a single new-line character.
1. Always use ES6 `Class`es and inheritance rather than the pre-ES6 prototypal pattern.
1. Within a given function's scope, do not mix declarations and imperative code, and  present these in the following order:
   * First, variable declarations and initialization.
   * Secondly, imperative statements.
   * Finally, the returned value. A single return statement at the end of the function should be used, except where an early return would improve code clarity.
1. Avoid the use of "magic" values.
   eg.

   ```JavaScript
   const UNAUTHORIZED = 401;
   if (responseCode === UNAUTHORIZED)
   ```

   is preferable to

   ```JavaScript
   if (responseCode === 401)
   ```

1. Use the ternary operator only for simple cases such as variable assignment. Nested ternaries should be avoided in all cases.
1. Unit Test specs should reside alongside the source code they test, not in a separate directory.
1. Organize code by feature, not by type.
   eg.

   ```txt
   - telemetryTable
       - row
           TableRow.js
           TableRowCollection.js
           TableRow.vue
       - column
           TableColumn.js
           TableColumn.vue
       plugin.js
       pluginSpec.js
   ```

   is preferable to

   ```txt
   - telemetryTable
       - components
           TableRow.vue
           TableColumn.vue
       - collections
           TableRowCollection.js
       TableColumn.js
       TableRow.js
       plugin.js
       pluginSpec.js
   ```

Deviations from Open MCT code style guidelines require two-party agreement, typically from the author of the change and its reviewer.

### Commit Message Standards

Commit messages should:

* Contain a one-line subject, followed by one line of white space, followed by one or more descriptive paragraphs, each separated by one line of white space.
* Contain a short (usually one word) reference to the feature or subsystem the commit effects, in square brackets, at the start of the subject line (e.g. `[Documentation] Draft of check-in process`).
* Contain a reference to a relevant issue number in the body of the commit.
  * This is important for traceability; while branch names also provide this, you cannot tell from looking at a commit what branch it was authored on.
  * This may be omitted if the relevant issue is otherwise obvious from the commit history (that is, if using `git log` from the relevant commit directly leads to a similar issue reference) to minimize clutter.
* Describe the change that was made, and any useful rationale therefore.
  * Comments in code should explain what things do, commit messages describe how they came to be done that way.
* Provide sufficient information for a reviewer to understand the changes made and their relationship to previous code.

Commit messages should not:

* Exceed 54 characters in length on the subject line.
* Exceed 72 characters in length in the body of the commit,
  * Except where necessary to maintain the structure of machine-readable or machine-generated text (e.g. error messages).

See [Contributing to a Project](http://git-scm.com/book/ch5-2.html) from Pro Git by Shawn Chacon and Ben Straub for a bit of the rationale behind these standards.

## Issue Reporting

Issues are tracked at <https://github.com/nasa/openmct/issues>.

Issue severity is categorized as follows (in ascending order):

* _Trivial_: Minimal impact on the usefulness and functionality of the software; a "nice-to-have." Visual impact without functional impact,
* _Medium_: Some impairment of use, but simple workarounds exist
* _Critical_: Significant loss of functionality or impairment of use. Display of telemetry data is not affected though. Complex workarounds exist.
* _Blocker_: Major functionality is impaired or lost, threatening mission success. Display of telemetry data is impaired or blocked by the bug, which could lead to loss of situational awareness.

## Check Lists

The following check lists should be completed and attached to pull requests when they are filed (author checklist) and when they are merged (reviewer checklist).

[Within PR Template](.github/PULL_REQUEST_TEMPLATE.md)


================================================
FILE: LICENSE.md
================================================
# Open MCT License

Open MCT, Copyright (c) 2014-2024, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.

Open MCT is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.  You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


================================================
FILE: README.md
================================================
# Open MCT [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) [![codecov](https://codecov.io/gh/nasa/openmct/branch/master/graph/badge.svg?token=7DQIipp3ej)](https://codecov.io/gh/nasa/openmct) [![This project is using Percy.io for visual regression testing.](https://percy.io/static/images/percy-badge.svg)](https://percy.io/b2e34b17/openmct) [![npm version](https://img.shields.io/npm/v/openmct.svg)](https://www.npmjs.com/package/openmct) ![CodeQL](https://github.com/nasa/openmct/workflows/CodeQL/badge.svg)

Open MCT (Open Mission Control Technologies) is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data.

> [!NOTE]
> Please visit our [Official Site](https://nasa.github.io/openmct/) and [Getting Started Guide](https://nasa.github.io/openmct/getting-started/)

Once you've created something amazing with Open MCT, showcase your work in our GitHub Discussions [Show and Tell](https://github.com/nasa/openmct/discussions/categories/show-and-tell) section. We love seeing unique and wonderful implementations of Open MCT!

![Screen Shot 2022-11-23 at 9 51 36 AM](https://user-images.githubusercontent.com/4215777/203617422-4d912bfc-766f-4074-8324-409d9bbe7c05.png)

## Building and Running Open MCT Locally

Building and running Open MCT in your local dev environment is very easy. Be sure you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed, then follow the directions below. Need additional information? Check out the [Getting Started](https://nasa.github.io/openmct/getting-started/) page on our website.
(These instructions assume you are installing as a non-root user; developers have [reported issues](https://github.com/nasa/openmct/issues/1151) running these steps with root privileges.)

1. Clone the source code:

```sh
git clone https://github.com/nasa/openmct.git
```

2. (Optional) Install the correct node version using [nvm](https://github.com/nvm-sh/nvm):

```sh
nvm install
```

3. Install development dependencies (Note: Check the `package.json` engine for our tested and supported node versions):

```sh
npm install
```

4. Run a local development server:

```
npm start
```

> [!IMPORTANT]
> Open MCT is now running, and can be accessed by pointing a web browser at [http://localhost:8080/](http://localhost:8080/)

Open MCT is built using [`npm`](http://npmjs.com/) and [`webpack`](https://webpack.js.org/).

## Documentation

Documentation is available on the [Open MCT website](https://nasa.github.io/openmct/documentation/).

### Examples

The clearest examples for developing Open MCT plugins are in the
[tutorials](https://github.com/nasa/openmct-tutorial) provided in
our documentation.

> [!NOTE]
> We want Open MCT to be as easy to use, install, run, and develop for as
> possible, and your feedback will help us get there!
> Feedback can be provided via [GitHub issues](https://github.com/nasa/openmct/issues/new/choose),
> [Starting a GitHub Discussion](https://github.com/nasa/openmct/discussions),
> or by emailing us at [arc-dl-openmct@mail.nasa.gov](mailto:arc-dl-openmct@mail.nasa.gov).

## Developing Applications With Open MCT

For more on developing with Open MCT, see our documentation for a guide on [Developing Applications with Open MCT](./API.md#starting-an-open-mct-application).

## Compatibility

This is a fast moving project and we do our best to test and support the widest possible range of browsers, operating systems, and NodeJS APIs. We have a published list of support available in our package.json's `browserslist` key.

The project utilizes `nvm` to maintain consistent node and npm versions across all projects. For UNIX, MacOS, Windows WSL, and other POSIX-compliant shell environments, click [here](https://github.com/nvm-sh/nvm). For Windows, check out [nvm-windows](https://github.com/coreybutler/nvm-windows).

If you encounter an issue with a particular browser, OS, or NodeJS API, please [file an issue](https://github.com/nasa/openmct/issues/new/choose).

## Plugins

Open MCT can be extended via plugins that make calls to the Open MCT API. A plugin is a group
of software components (including source code and resources such as images and HTML templates)
that is intended to be added or removed as a single unit.

As well as providing an extension mechanism, most of the core Open MCT codebase is also
written as plugins.

For information on writing plugins, please see [our API documentation](./API.md#plugins).

## Tests

Our automated test coverage comes in the form of unit, e2e, visual, performance, and security tests.

### Unit Tests

Unit Tests are written for [Jasmine](https://jasmine.github.io/api/edge/global)
and run by [Karma](http://karma-runner.github.io). To run:

`npm test`

The test suite is configured to load any scripts ending with `Spec.js` found
in the `src` hierarchy. Full configuration details are found in
`karma.conf.js`. By convention, unit test scripts should be located
alongside the units that they test; for example, `src/foo/Bar.js` would be
tested by `src/foo/BarSpec.js`.

### e2e, Visual, and Performance Testing

Our e2e (end-to-end), Visual, and Performance tests leverage the Playwright framework and are executed using Playwright's test runner, [@playwright/test](https://playwright.dev/).

#### How to Run Tests

- **e2e Tests**: These tests are run on every commit. To run the tests locally, use:

  ```sh
  npm run test:e2e:ci
  ```

- **Visual Tests**: For running the visual test suite, use:

  ```sh
  npm run test:e2e:visual
  ```

- **Performance Tests**: To initiate the performance tests, enter:

  ```sh
  npm run test:perf
  ```

All tests are located within the `e2e/tests/` directory and are identified by the `*.e2e.spec.js` filename pattern. For more information about the e2e test suite, refer to the [README](./e2e/README.md).

### Security Tests

Each commit is analyzed for known security vulnerabilities using [CodeQL](https://codeql.github.com/docs/codeql-language-guides/codeql-library-for-javascript/). The list of CWE coverage items is available in the [CodeQL docs](https://codeql.github.com/codeql-query-help/javascript-cwe/). The CodeQL workflow is specified in the [CodeQL analysis file](./.github/workflows/codeql-analysis.yml) and the custom [CodeQL config](./.github/codeql/codeql-config.yml).

### Test Reporting and Code Coverage

Each test suite generates a report in CircleCI. For a complete overview of testing functionality, please see our [Circle CI Test Insights Dashboard](https://app.circleci.com/insights/github/nasa/openmct/workflows/the-nightly/overview?branch=master&reporting-window=last-30-days)

Our code coverage is generated during the runtime of our unit, e2e, and visual tests. The combination of those reports is published to [codecov.io](https://app.codecov.io/gh/nasa/openmct/)

For more on the specifics of our code coverage setup, [see](TESTING.md#code-coverage)

## Glossary

Certain terms are used throughout Open MCT with consistent meanings
or conventions. Any deviations from the below are issues and should be
addressed (either by updating this glossary or changing code to reflect
correct usage.) Other developer documentation, particularly in-line
documentation, may presume an understanding of these terms.
| Term          | Definition                                                                                                                                                                                                                                                                                                                                                   |
|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| _plugin_      | A removable, reusable grouping of software elements. The application is composed of plugins.                                                                                                                                                                                                                                                                  |
| _composition_ | In the context of a domain object, this term refers to the set of other domain objects that compose or are contained by that object. A domain object's composition is the set of domain objects that should appear immediately beneath it in a tree hierarchy. It is described in its model as an array of ids, providing a means to asynchronously retrieve the actual domain object instances associated with these identifiers. |
| _description_ | When used as an object property, this term refers to the human-readable description of a thing, usually a single sentence or short paragraph. It is most often used in the context of extensions, domain object models, or other similar application-specific objects.                                                                                           |
| _domain object_ | A meaningful object to the user and a distinct thing in the work supported by Open MCT. Anything that appears in the left-hand tree is a domain object.                                                                                                                                                                                                       |
| _identifier_  | A tuple consisting of a namespace and a key, which together uniquely identifies a domain object.                                                                                                                                                                                                                                                              |
| _model_       | The persistent state associated with a domain object. A domain object's model is a JavaScript object that can be converted to JSON without losing information, meaning it contains no methods.                                                                                                                                                                 |
| _name_        | When used as an object property, this term refers to the human-readable name for a thing. It is most often used in the context of extensions, domain object models, or other similar application-specific objects.                                                                                                                                             |
| _navigation_  | This term refers to the current state of the application with respect to the user's expressed interest in a specific domain object. For example, when a user clicks on a domain object in the tree, they are navigating to it, and it is thereafter considered the navigated object until the user makes another such choice.                                    |
| _namespace_   | A name used to identify a persistence store. A running Open MCT application could potentially use multiple persistence stores.                                                                                                                                                                                                                                 |

## Open MCT v2.0.0

Support for our legacy bundle-based API, and the libraries that it was built on (like Angular 1.x), have now been removed entirely from this repository.

For now if you have an Open MCT application that makes use of the legacy API, [a plugin](https://github.com/nasa/openmct-legacy-plugin) is provided that bootstraps the legacy bundling mechanism and API. This plugin will not be maintained over the long term however, and the legacy support plugin will not be tested for compatibility with future versions of Open MCT. It is provided for convenience only.

### How do I know if I am using legacy API?

You might still be using legacy API if your source code

- Contains files named bundle.js, or bundle.json,
- Makes calls to `openmct.$injector()`, or `openmct.$angular`,
- Makes calls to `openmct.legacyRegistry`, `openmct.legacyExtension`, or `openmct.legacyBundle`.

### What should I do if I am using legacy API?

Please refer to [the modern Open MCT API](https://nasa.github.io/openmct/documentation/). Post any questions to the [Discussions section](https://github.com/nasa/openmct/discussions) of the Open MCT GitHub repository.

## Related Repos

> [!NOTE]
> Although Open MCT functions as a standalone project, it is primarily an extensible framework intended to be used as a dependency with users' own plugins and packaging. Furthermore, Open MCT is intended to be used with an HTTP server such as Apache or Nginx. A great example of hosting Open MCT with Apache is `openmct-quickstart` and can be found in the table below.

| Repository | Description |
| --- | --- |
| [openmct-tutorial](https://github.com/nasa/openmct-tutorial) | A great place for beginners to learn how to use and extend Open MCT. |
| [openmct-quickstart](https://github.com/scottbell/openmct-quickstart) | A working example of Open MCT integrated with Apache HTTP server, YAMCS telemetry, and Couch DB for persistence.
| [Open MCT YAMCS Plugin](https://github.com/akhenry/openmct-yamcs) | Plugin for integrating YAMCS telemetry and command server with Open MCT. |
| [openmct-performance](https://github.com/unlikelyzero/openmct-performance) | Resources for performance testing Open MCT. |
| [openmct-as-a-dependency](https://github.com/unlikelyzero/openmct-as-a-dependency) | An advanced guide for users on how to build, develop, and test Open MCT when it's used as a dependency. |



================================================
FILE: SECURITY.md
================================================
# Security Policy

Open MCT is an open source project and may contain externally provided code. External contributions must follow the guidelines in [CONTRIBUTING.md](CONTRIBUTING.md).

The Open MCT team secures our code base using a combination of code review, dependency review, and periodic security reviews. Static analysis performed during automated verification additionally safeguards against common coding errors which may result in vulnerabilities.

### Reporting a Vulnerability

For general defects, please for a [Bug Report](https://github.com/nasa/openmct/issues/new/choose)

To report a vulnerability for Open MCT please send a detailed report to [arc-dl-openmct](mailto:arc-dl-openmct@mail.nasa.gov). 

See our [top-level security policy](https://github.com/nasa/openmct/security/policy) for additional information.

### CodeQL and LGTM

The [CodeQL GitHub Actions workflow](https://github.com/nasa/openmct/blob/master/.github/workflows/codeql-analysis.yml) is available to the public. To review the results, fork the repository and run the CodeQL workflow. 

CodeQL is run for every pull-request in GitHub Actions.

### ESLint

Static analysis is run for every push on the master branch and every pull request on all branches in Github Actions. 

For more information about ESLint, visit https://eslint.org/.

### General Support

For additional support, please open a [Github Discussion](https://github.com/nasa/openmct/discussions). 

If you wish to report a cybersecurity incident or concern, please contact the NASA Security Operations Center either by phone at 1-877-627-2732 or via email address soc@nasa.gov.


================================================
FILE: TESTING.md
================================================
# Testing
Open MCT Testing is iterating and improving at a rapid pace. This document serves to capture and index existing testing documentation and house documentation which no other obvious location as our testing evolves.

## General Testing Process
Documentation located [here](./docs/src/process/testing/plan.md)

## Unit Testing
Unit testing is essential part of our test strategy and complements our e2e testing strategy.

#### Unit Test Guidelines
* Unit Test specs should reside alongside the source code they test, not in a separate directory.
* Unit test specs for plugins should be defined at the plugin level. Start with one test spec per plugin named pluginSpec.js, and as this test spec grows too big, break it up into multiple test specs that logically group related tests.
* Unit tests for API or for utility functions and classes may be defined at a per-source file level.
* Wherever possible only use and mock public API, builtin functions, and UI in your test specs. Do not directly invoke any private functions. ie. only call or mock functions and objects exposed by openmct.* (eg. openmct.telemetry, openmct.objectView, etc.), and builtin browser functions (fetch, requestAnimationFrame, setTimeout, etc.).
* Where builtin functions have been mocked, be sure to clear them between tests.
* Test at an appropriate level of isolation. Eg. 
    * If you’re testing a view, you do not need to test the whole application UI, you can just fetch the view provider using the public API and render the view into an element that you have created. 
    * You do not need to test that the view switcher works, there should be separate tests for that. 
    * You do not need to test that telemetry providers work, you can mock openmct.telemetry.request() to feed test data to the view.
    * Use your best judgement when deciding on appropriate scope.
* Automated tests for plugins should start by actually installing the plugin being tested, and then test that installing the plugin adds the desired features and behavior to Open MCT, observing the above rules.
* All variables used in a test spec, including any instances of the Open MCT API should be declared inside of an appropriate block scope (not at the root level of the source file), and should be initialized in the relevant beforeEach block. `beforeEach` is preferable to `beforeAll` to avoid leaking of state between tests.
* A `afterEach` or `afterAll` should be used to do any clean up necessary to prevent leakage of state between test specs. This can happen when functions on `window` are wrapped, or when the URL is changed. [A convenience function](https://github.com/nasa/openmct/blob/master/src/utils/testing.js#L59) is provided for resetting the URL and clearing builtin spies between tests.

#### Unit Test Examples
* [Example of an automated test spec for an object view plugin](https://github.com/nasa/openmct/blob/master/src/plugins/telemetryTable/pluginSpec.js)
* [Example of an automated test spec for API](https://github.com/nasa/openmct/blob/master/src/api/time/TimeAPISpec.js)

#### Unit Testing Execution

The unit tests can be executed in one of two ways:
`npm run test` which runs the entire suite against headless chrome
`npm run test:debug` for debugging the tests in realtime in an active chrome session.

## e2e, performance, and visual testing
Documentation located [here](./e2e/README.md)

## Code Coverage

It's up to the individual developer as to whether they want to add line coverage in the form of a unit test or e2e test.

Line Code Coverage is generated by our unit tests and e2e tests, then combined by ([Codecov.io Flags](https://docs.codecov.com/docs/flags)), and finally reported in GitHub PRs by Codecov.io's PR Bot. This workflow gives a comprehensive (if flawed) view of line coverage.

### Karma-istanbul

Line coverage is generated by our `karma-coverage-istanbul-reporter` package as defined in our `karma.conf.js` file:

```js
    coverageIstanbulReporter: {
      fixWebpackSourcePaths: true,
      skipFilesWithNoCoverage: true,
      dir: 'coverage/unit', //Sets coverage file to be consumed by codecov.io
      reports: ['lcovonly']
    },
```

Once the file is generated, it can be published to codecov with

```json
    "cov:unit:publish": "codecov --disable=gcov -f ./coverage/unit/lcov.info -F unit",
```

### e2e
The e2e line coverage is a bit more complex than the karma implementation. This is the general sequence of events:

1. Each e2e suite will start webpack with the ```npm run start:coverage``` command with config `webpack.coverage.mjs` and the `babel-plugin-istanbul` plugin to generate code coverage during e2e test execution using our custom [baseFixture](./baseFixtures.js). 
1. During testcase execution, each e2e shard will generate its piece of the larger coverage suite. **This coverage file is not merged**. The raw coverage file is stored in a `.nyc_report` directory.
1. [nyc](https://github.com/istanbuljs/nyc) converts this directory into a `lcov` file with the following command `npm run cov:e2e:report`
1. Most of the tests focus on chrome/ubuntu at a single resolution. This coverage is published to codecov with `npm run cov:e2e:ci:publish`.
1. The rest of our coverage only appears when run against persistent datastore (couchdb), non-ubuntu machines, and non-chrome browsers with the `npm run cov:e2e:full:publish` flag. Since this happens about once a day, we have leveraged codecov.io's carryforward flag to report on lines covered outside of each commit on an individual PR.


### Limitations in our code coverage reporting
Our code coverage implementation has some known limitations:
- [Variability](https://github.com/nasa/openmct/issues/5811)
- [Accuracy](https://github.com/nasa/openmct/issues/7015)
- [Vue instrumentation gaps](https://github.com/nasa/openmct/issues/4973)

## Troubleshooting CI
The following is an evolving guide to troubleshoot CI and PR issues.

### Github Checks failing
There are a few reasons that your GitHub PR could be failing beyond simple failed tests.
* Required Checks. We're leveraging required checks in GitHub so that we can quickly and precisely control what becomes and informational failure vs a hard requirement. The only way to determine the difference between a required vs information check is check for the `(Required)` emblem next to the step details in GitHub Checks.
* Not all required checks are run per commit. You may need to manually trigger addition GitHub checks with a `pr:<label>` label added to your PR.

### Flaky tests

(CircleCI's test insights feature)[https://circleci.com/blog/introducing-test-insights-with-flaky-test-detection/] collects historical data about the individual test results for both unit and e2e tests. Note: only a 14 day window of flake is available.

### Local=Pass and CI=Fail
Although rare, it is possible that your test can pass locally but fail in CI.

### Reset your workspace
It's possible that you're running with dependencies or a local environment which is out of sync with the branch you're working on. Make sure to execute the following:

```sh
nvm use
npm run clean
npm install
```

#### Run tests in the same container as CI

In extreme cases, tests can fail due to the constraints of running within a container. To execute tests in exactly the same way as run in CircleCI. 

```sh
// Replace {X.X.X} with the current Playwright version 
// from our package.json or circleCI configuration file
docker run --rm --network host --cpus="2" -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v{X.X.X}-focal /bin/bash
npm install
```

At this point, you're running inside the same container and with 2 cpu cores. You can specify the unit tests:
```sh
npm run test
```
or e2e tests:

```sh
npx playwright test --config=e2e/playwright-ci.config.js --project=chrome --grep <the testcase name>
```

================================================
FILE: build-docs.sh
================================================
#!/bin/bash

#*****************************************************************************
#* Open MCT, Copyright (c) 2014-2024, United States Government
#* as represented by the Administrator of the National Aeronautics and Space
#* Administration. All rights reserved.
#*
#* Open MCT is licensed under the Apache License, Version 2.0 (the
#* "License"); you may not use this file except in compliance with the License.
#* You may obtain a copy of the License at
#* http://www.apache.org/licenses/LICENSE-2.0.
#*
#* Unless required by applicable law or agreed to in writing, software
#* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#* License for the specific language governing permissions and limitations
#* under the License.
#*
#* Open MCT includes source code licensed under additional open source
#* licenses. See the Open Source Licenses file (LICENSES.md) included with
#* this source code distribution or the Licensing information page available
#* at runtime from the About dialog for additional information.
#*****************************************************************************

# Script to build and deploy docs.

OUTPUT_DIRECTORY="dist/docs"
# Docs, once built, are pushed to the private website repo
REPOSITORY_URL="git@github.com:nasa/openmct-website.git"
WEBSITE_DIRECTORY="website"

BUILD_SHA=`git rev-parse HEAD`

# A remote will be created for the git repository we are pushing to.
# Don't worry, as this entire directory will get trashed in between builds.
REMOTE_NAME="documentation"
WEBSITE_BRANCH="master"

# Clean output directory, JSDOC will recreate
if [ -d $OUTPUT_DIRECTORY ]; then
    rm -rf $OUTPUT_DIRECTORY || exit 1
fi

npm run docs

echo "git clone $REPOSITORY_URL website"
git clone $REPOSITORY_URL website || exit 1
echo "cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY"
cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY
echo "cd $WEBSITE_DIRECTORY"
cd $WEBSITE_DIRECTORY || exit 1

# Configure github for CircleCI user.
git config user.email "buildbot@circleci.com"
git config user.name "BuildBot"

echo "git add ."
git add .
echo "git commit -m \"Docs updated from build $BUILD_SHA\""
git commit -m "Docs updated from build $BUILD_SHA"
# Push to the website repo
git push


================================================
FILE: codecov.yml
================================================
codecov:
  require_ci_to_pass: false #This setting will update the bot regardless of whether or not tests pass

# Disabling annotations for now. They are incorrectly labelling lines as lacking coverage when they are in fact covered by tests.
github_checks:
  annotations: false

coverage:
  status:
    project:
      default:
        informational: true
    patch:
      default:
        informational: true
  precision: 2
  round: down
  range: "66...100"

flags:
  unit:
    carryforward: false
  e2e-ci:
    carryforward: false
  e2e-full:
    carryforward: true

comment:
  layout: "diff,flags,files,footer"
  behavior: default
  require_changes: false
  show_carryforward_flags: true


================================================
FILE: copyright-notice.html
================================================
<!--
 Open MCT, Copyright (c) 2014-2024, United States Government
 as represented by the Administrator of the National Aeronautics and Space
 Administration. All rights reserved.

 Open MCT is licensed under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 http://www.apache.org/licenses/LICENSE-2.0.

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 License for the specific language governing permissions and limitations
 under the License.

 Open MCT includes source code licensed under additional open source
 licenses. See the Open Source Licenses file (LICENSES.md) included with
 this source code distribution or the Licensing information page available
 at runtime from the About dialog for additional information.
-->


================================================
FILE: copyright-notice.js
================================================
/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2024, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/


================================================
FILE: docs/src/guide/security.md
================================================
# Security Guide

Open MCT is a rich client with plugin support that executes as a single page
web application in a browser environment. Security concerns and
vulnerabilities associated with the web as a platform should be considered
before deploying Open MCT (or any other web application) for mission or
production usage.

This document describes several important points to consider when developing
for or deploying Open MCT securely. Other resources such as
[Open Web Application Security Project (OWASP)](https://www.owasp.org)
provide a deeper and more general overview of security for web applications.


## Security Model

Open MCT has been architected assuming the following deployment pattern:

* A tagged, tested Open MCT version will be used.
* Externally authored plugins will be installed.
* A server will provide persistent storage, telemetry, and other shared data.
* Authorization, authentication, and auditing will be handled by a server.


## Security Procedures

The Open MCT team secures our code base using a combination of code review,
dependency review, and periodic security reviews. Static analysis performed 
during automated verification additionally safeguards against common 
coding errors which may result in vulnerabilities.


### Code Review

All contributions are reviewed by internal team members. External
contributors receive increased scrutiny for security and quality,
and must sign a licensing agreement.

### Dependency Review

Before integrating third-party dependencies, they are reviewed for security
and quality, with consideration given to authors and users of these
dependencies, as well as review of open source code.

### Periodic Security Reviews

Open MCT's code, design, and architecture are periodically reviewed
(approximately annually) for common security issues, such as the
[OWASP Top Ten](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project).


## Security Concerns

Certain security concerns deserve special attention when deploying Open MCT,
or when authoring plugins.

### Identity Spoofing

Open MCT issues calls to web services with the privileges of a logged in user.
Compromised sources (either for Open MCT itself or a plugin) could
therefore allow malicious code to execute with those privileges.

To avoid this:

* Serve Open MCT and other scripts over SSL (https rather than http)
  to prevent man-in-the-middle attacks.
* Exercise precautions such as security reviews for any plugins or
  applications built for or with Open MCT to reject malicious changes.

### Information Disclosure

If Open MCT is used to handle or display sensitive data, any components
(such as adapter plugins) must take care to avoid leaking or disclosing
this information. For example, avoid sending sensitive data to third-party
servers or insecure APIs.

### Data Tampering

The web application architecture leaves open the possibility that direct
calls will be made to back-end services, circumventing Open MCT entirely.
As such, Open MCT assumes that server components will perform any necessary
data validation during calls issues to the server.

Additionally, plugins which serialize and write data to the server must
escape that data to avoid database injection attacks, and similar.

### Repudiation

Open MCT assumes that servers log any relevant interactions and associates
these with a user identity; the specific user actions taken within the
application are assumed not to be of concern for auditing.

In the absence of server-side logging, users may disclaim (maliciously,
mistakenly, or otherwise) actions taken within the system without any
way to prove otherwise.

If keeping client-level interactions is important, this will need to be
implemented via a plugin.

### Denial-of-service

Open MCT assumes that server-side components will be insulated against
denial-of-service attacks. Services should only permit resource-intensive
tasks to be initiated by known or trusted users.

### Elevation of Privilege

Corollary to the assumption that servers guide against identity spoofing,
Open MCT assumes that services do not allow a user to act with
inappropriately escalated privileges. Open MCT cannot protect against
such escalation; in the clearest case, a malicious actor could interact
with web services directly to exploit such a vulnerability.

## Additional Reading

The following resources have been used as a basis for identifying potential
security threats to Open MCT deployments in preparation of this document:

* [STRIDE model](https://www.owasp.org/index.php/Threat_Risk_Modeling#STRIDE)
* [Attack Surface Analysis Cheat Sheet](https://www.owasp.org/index.php/Attack_Surface_Analysis_Cheat_Sheet)
* [XSS Prevention Cheat Sheet](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet)


================================================
FILE: docs/src/index.md
================================================
# Open MCT Documentation

## Overview

 Documentation is provided to support the use and development of
 Open MCT. It's recommended that before doing
 any development with Open MCT you take some time to familiarize yourself
 with the documentation below.

 Open MCT provides functionality out of the box, but it's also a platform for
 building rich mission operations applications based on modern web technology. 
 The platform is configured by plugins which extend the platform at a variety
 of extension points. The details of how to
 extend the platform are provided in the following documentation.

## Sections

* The [API](api/) uses inline documentation.
 using [TypeScript](https://www.typescriptlang.org) and some legacy [JSDoc](https://jsdoc.app/). It describes the JavaScript objects and
 functions that make up the software platform.

* The [Development Process](process/) document describes the
 Open MCT software development cycle.

* The [tutorial](https://github.com/nasa/openmct-tutorial) and [plugin template](https://github.com/nasa/openmct-hello) give examples of extending the platform to add
 functionality and integrate with data sources.


================================================
FILE: docs/src/process/cycle.md
================================================
# Development Cycle

Development of Open MCT occurs on an iterative cycle of
sprints and releases.

* A _sprint_ is three weeks in duration, and represents a
  set of improvements that can be completed and tested by the
  development team. Software at the end of the sprint is
  "semi-stable"; it will have undergone reduced testing and may carry
  defects or usability issues of lower severity, particularly if
  there are workarounds.
* A _release_ occurs every four sprints. Releases are stable, and
  will have undergone full acceptance testing to ensure that the
  software behaves correctly and usably.

## Roles

The sprint process assumes the presence of a __project manager.__
The project manager is responsible for
making tactical decisions about what development work will be
performed, and for coordinating with stakeholders to arrive at
higher-level strategic decisions about desired functionality
and characteristics of the software, major external milestones,
and so forth.

In the absence of a dedicated project manager, this role may be rotated
among members of the development team on a per-sprint basis.

Responsibilities of the project manager including:

* Maintaining (with agreement of stakeholders) a "road map" of work
  planned for future releases/sprints; this should be higher-level,
  usually expressed as "themes",
  with just enough specificity to gauge feasibility of plans,
  relate work back to milestones, and identify longer-term
  dependencies.
* Determining (with assistance from the rest of the team) which
  issues to work on in a given sprint and how they shall be
  assigned.
* Pre-planning subsequent sprints to ensure that all members of the
  team always have a clear direction.
* Scheduling and/or ensuring adherence to
  [process points](#process-points).
* Responding to changes within the sprint (shifting priorities,
  new issues) and re-allocating work for the sprint as needed.

## Sprint Calendar

Certain [process points](#process-points) are regularly scheduled in
the sprint cycle.

### Sprints by Release

Allocation of work among sprints should be planned relative to release
goals and milestones. As a general guideline, higher-risk work (large
new features which may carry new defects, major refactoring, design
changes with uncertain effects on usability) should be allocated to
earlier sprints, allowing for time in later sprints to ensure stability.

| Sprint | Focus                                                   |
|:------:|:--------------------------------------------------------|
| __1__  | Prototyping, design, experimentation.                   |
| __2__  | New features, refinements, enhancements.                |
| __3__  | Feature completion, low-risk enhancements, bug fixing.  |
| __4__  | Stability & quality assurance.                          |

### Sprints 1-3

The first three sprints of a release are primarily centered around
development work, with regular acceptance testing in the third
week. During this third week, the top priority should be passing
acceptance testing (e.g. by resolving any blockers found); any
resources not needed for this effort should be used to begin work
for the subsequent sprint.

| Week  | Mon                       | Tue    | Wed | Thu                          | Fri                                   |
|:-----:|:-------------------------:|:------:|:---:|:----------------------------:|:-------------------------------------:|
| __1__ | Sprint plan               | Tag-up |     |                              |                                       |
| __2__ |                           | Tag-up |     |                              | Code freeze  and sprint branch        |
| __3__ | Per-sprint testing        | Triage |     | _Per-sprint testing*_        | Ship and merge sprint branch to master|

&ast; If necessary.

### Sprint 4

The software must be stable at the end of the fourth sprint; because of
this, the fourth sprint is scheduled differently, with a heightened
emphasis on testing.

| Week   | Mon                       | Tue    | Wed | Thu                          | Fri         |
|-------:|:-------------------------:|:------:|:---:|:----------------------------:|:-----------:|
| __1__  | Sprint plan               | Tag-up |     |                              | Code freeze |
| __2__  | Per-release testing       | Triage |     |                              |             |
| __3__  | _Per-release testing*_    | Triage |     | _Per-release testing*_       | Ship        |

&ast; If necessary.

## Process Points

* __Sprint plan.__ Project manager allocates issues based on
  theme(s) for sprint, then reviews with team. Each team member
  should have roughly two weeks of work allocated (to allow time
  in the third week for testing of work completed.)
  * Project manager should also sketch out subsequent sprint so
    that team may begin work for that sprint during the
    third week, since testing and blocker resolution is unlikely
    to require all available resources.
  * Testing success criteria identified per issue (where necessary). This could be in the form of acceptance tests on the issue or detailing performance tests, for example.
* __Tag-up.__ Check in and status update among development team.
  May amend plan for sprint as-needed.
* __Code freeze.__ Any new work from this sprint
  (features, bug fixes, enhancements) must be integrated by the
  end of the second week of the sprint. After code freeze, a sprint
  branch will be created (and until the end of the sprint) the only 
  changes that should be merged into the sprint branch should 
  directly address issues needed to pass acceptance testing.
  During this time, any other feature development will continue to
  be merged into the master branch for the next sprint.
* __Sprint branch merge to master.__ After acceptance testing, the sprint branch
  will be merged back to the master branch. Any code conflicts that 
  arise will be resolved by the team.
* [__Per-release Testing.__](testing/plan.md#per-release-testing)
  Structured testing with predefined
  success criteria. No release should ship without passing
  acceptance tests. Time is allocated in each sprint for subsequent
  rounds of acceptance testing if issues are identified during a
  prior round. Specific details of acceptance testing need to be
  agreed-upon with relevant stakeholders and delivery recipients,
  and should be flexible enough to allow changes to plans
  (e.g. deferring delivery of some feature in order to ensure
  stability of other features.) Baseline testing includes:
  * [__Testathon.__](testing/plan.md#user-testing)
    Multi-user testing, involving as many users as
    is feasible, plus development team. Open-ended; should verify
    completed work from this sprint using the sprint branch, test 
    exploratory for regressions, et cetera.
  * [__Long-Duration Test.__](testing/plan.md#long-duration-testing) A
    test to verify that the software remains
    stable after running for longer durations. May include some
    combination of automated testing and user verification (e.g.
    checking to verify that software remains subjectively
    responsive at conclusion of test.)
  * [__Unit Testing.__](testing/plan.md#unit-testing)
    Automated testing integrated into the
    build. (These tests are verified to pass more often than once
    per sprint, as they run before any merge to master, but still
    play an important role in per-release testing.)
* [__Per-sprint Testing.__](testing/plan.md#per-sprint-testing)
  Subset of Pre-release Testing
  which should be performed before shipping at the end of any
  sprint. Time is allocated for a second round of
  Pre-release Testing if the first round is not passed. Smoke tests collected from issues/PRs
* __Triage.__ Team reviews issues from acceptance testing and uses
  success criteria to determine whether or not they should block
  release, then formulates a plan to address these issues before
  the next round of acceptance testing. Focus here should be on
  ensuring software passes that testing in order to ship on time;
  may prefer to disable malfunctioning components and fix them
  in a subsequent sprint, for example.
* [__Ship.__](version.md) Tag a code snapshot that has passed release/sprint
  testing and deploy that version. (Only true if relevant
  testing has passed by this point; if testing has not
  been passed, will need to make ad hoc decisions with stakeholders,
  e.g. "extend the sprint" or "defer shipment until end of next
  sprint.")


================================================
FILE: docs/src/process/index.md
================================================
# Development Process

The process used to develop Open MCT is described in the following
documents:

* The [Development Cycle](cycle.md) describes how and when specific
  process points are repeated during development.
* The [Version Guide](version.md) describes version numbering for
  Open MCT (both semantics and process.)
* The [Test Plan](testing/plan.md) summarizes the approaches used
  to test Open MCT.


================================================
FILE: docs/src/process/release.md
================================================

# Release of NASA Open MCT NPM Package

This document outlines the process and key considerations for releasing a new version of the NASA Open MCT project as an NPM (Node Package Manager) package.

## 1. Pre-requisites

Before releasing a new version of the NASA Open MCT NPM package, ensure all dependencies are updated, and comprehensive tests are performed. This ensures compatibility and performance of the Open MCT within the Node.js ecosystem.

## 2. Versioning

Versioning is a critical step for package release. The Open MCT team follows [Semantic Versioning (SemVer)](https://semver.org) that consists of three major components: MAJOR.MINOR.PATCH. These ensure a structured process for updating, bug fixes, backward compatibility, and software progress.

## 3. Changelog Maintenance

A comprehensive changelog file, `CHANGELOG.md`, documents any changes, adding a high level of transparencies for anyone desiring to look into the status of new and past progress. It includes the summation of any major new enhancements, changes, bug fixes, and the credits to the users responsible for each unique progress.

## 4. Notable Changes Labels on GitHub PRs

For the Open MCT package, we leverage GitHub's Pull Request (PR) mechanisms extensively, with three important PR labels dedicated to signifying 'notable_changes':

- **Breaking Change** Highlights the integration of changes that are suspected to break, or without a doubt will break, backward compatibility. These should signal to users the upgrade might be seamless only if dependency and integration factors are properly managed, if not, one should expect to manage atypical technical snags.
- **API change** Signifies when a contribution makes any complete or under layer changes to the communication or its supporting access processes. This label flags required see-through insight on how the web-based control panel sees and manipulates any value and or network logs.
- **Default Behavior Change:** In the incident an update either adjusts a form to or integrates a not previously kept setting or plugin. i.e. autoscale is enabled by default when working with plots.

## 6. Community & Contributions

A flat community and the rounded center are kept in continuous celebration, with the given station open for two open-specifying dialogues, research, and all-for development probing. State the ownership for a handed looped, a welcome for even structure-core and architectural draft and impend.

Thank you for your collaboration and commitment to moving the project onto a text big club. 


================================================
FILE: docs/src/process/testing/plan.md
================================================
# Test Plan

## Test Levels

Testing for Open MCT includes:

* _Smoke testing_: Brief, informal testing to verify that no major issues
  or regressions are present in the software, or in specific features of
  the software.
* _Unit testing_: Automated verification of the performance of individual
  software components.
* _User testing_: Testing with a representative user base to verify
  that application behaves usably and as specified.
* _Long-duration testing_: Testing which takes place over a long period
  of time to detect issues which are not readily noticeable during
  shorter test periods.

### Smoke Testing

Manual, non-rigorous testing of the software and/or specific features
of interest. Verifies that the software runs and that basic functionality
is present. The outcome of Smoke Testing should be a simplified list of Acceptance Tests which could be executed by another team member with sufficient context.

### Unit Testing

Unit tests are automated tests which exercise individual software
components. Tests are subject to code review along with the actual
implementation, to ensure that tests are applicable and useful.

Unit tests should meet
[test standards](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#test-standards)
as described in the contributing guide.

### User Testing

User testing is performed at scheduled times involving target users
of the software or reasonable representatives, along with members of
the development team exercising known use cases. Users test the
software directly; the software should be configured as similarly to
its planned production configuration as is feasible without introducing
other risks (e.g. damage to data in a production instance.)

User testing will focus on the following activities:

* Verifying issues resolved since the last test session.
* Checking for regressions in areas related to recent changes.
* Using major or important features of the software,
  as determined by the user.
* General "trying to break things."

During user testing, users will
[report issues](https://github.com/nasa/openmct/issues/new/choose)
as they are encountered.

Desired outcomes of user testing are:

* Identified software defects.
* Areas for usability improvement.
* Feature requests (particularly missed requirements.)
* Recorded issue verification.

### Long-duration Testing

Long-duration testing occurs over a twenty-four hour period. The
software is run in one or more stressing cases representative of expected
usage. After twenty-four hours, the software is evaluated for:

* Performance metrics: Have memory usage or CPU utilization increased
  during this time period in unexpected or undesirable ways?
* Subjective usability: Does the software behave in the same way it did
  at the start of the test? Is it as responsive?

Any defects or unexpected behavior identified during testing should be
[reported as issues](https://github.com/nasa/openmct/issues/new/choose)
and reviewed for severity.

## Test Performance

Tests are performed at various levels of frequency.

* _Per-merge_: Performed before any new changes are integrated into
  the software.
* _Per-sprint_: Performed at the end of every [sprint](../cycle.md).
* _Per-release_: Performed at the end of every [release](../cycle.md).

### Per-merge Testing

Before changes are merged, the author of the changes must perform:

* _Smoke testing_ (both generally, and for areas which interact with
  the new changes.)
* _Unit testing_ (as part of the automated build step.)

Changes are not merged until the author has affirmed that both
forms of testing have been performed successfully; this is documented
by the [Author Checklist](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#author-checklist).

### Per-sprint Testing

Before a sprint is closed, the development team must additionally
perform:

* A relevant subset of [_user testing_](procedures.md#user-test-procedures)
  identified by the acting [project manager](../cycle.md#roles).
* [_Long-duration testing_](procedures.md#long-duration-testing)
  (specifically, for 24 hours.)

Issues are reported as a product of both forms of testing.

A sprint is not closed until both categories have been performed on
the latest snapshot of the software, _and_ no issues labelled as
["blocker"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
remain open.

### Per-release Testing

As [per-sprint testing](#per-sprint-testing), except that _user testing_
should cover all test cases, with less focus on changes from the specific
sprint or release.

Per-release testing should also include any acceptance testing steps
agreed upon with recipients of the software.

A release is not closed until both categories have been performed on
the latest snapshot of the software, _and_ no issues labelled as
["blocker" or "critical"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
remain open.

### Testathons
Testathons can be used as a means of performing per-sprint and per-release testing. 

#### Timing
For per-sprint testing, a testathon is typically performed at the beginning of the third week of a sprint, and again later that week to verify any fixes. For per-release testing, a testathon is typically performed prior to any formal testing processes that are applicable to that release.

#### Process

1. Prior to the scheduled testathon, a list will be compiled of all issues that are closed and unverified.
2. For each issue, testers should review the associated PR for testing instructions. See the contributing guide for instructions on [pull requests](https://github.com/nasa/openmct/blob/master/CONTRIBUTING.md#merging).
3. As each issue is verified via testing, any team members testing it should leave a comment on that issue indicating that it has been verified fixed.
4. If a bug is found that relates to an issue being tested, notes should be included on the associated issue, and the issue should be reopened. Bug notes should include reproduction steps.
5. For any bugs that are not obviously related to any of the issues under test, a new issue should be created with details about the bug, including reproduction steps. If unsure about whether a bug relates to an issue being tested, just create a new issue.
6. At the end of the testathon, triage will take place, where all tested issues will be reviewed.
7. If verified fixed, an issue will remain closed, and will have the “unverified” label removed.
8. For any bugs found, a severity will be assigned.
9. A second testathon will be scheduled for later in the week that will aim to address all issues identified as blockers, as well as any other issues scoped by the team during triage.
10. Any issues that were not tested will remain "unverified" and will be picked up in the next testathon.


================================================
FILE: docs/src/process/version.md
================================================
# Version Guide

This document describes semantics and processes for providing version
numbers for Open MCT, and additionally provides guidelines for dependent
projects developed by the same team.

Versions are incremented at specific points in Open MCT's
[Development Cycle](cycle.md); see that document for a description of
sprints and releases.

## Audience

Individuals interested in consuming version numbers can be categorized as
follows:

* _Users_: Generally disinterested, occasionally wish to identify version
  to cross-reference against documentation, or to report issues.
* _Testers_: Want to identify which version of the software they are
  testing, e.g. to file issues for defects.
* _Internal developers_: Often, inverse of testers; want to identify which
  version of software was/is in use when certain behavior is observed. Want
  to be able to correlate versions in use with “streams” of development
  (e.g. dev vs. prod), when possible.
* _External developers_: Need to understand which version of software is
  in use when developing/maintaining plug-ins, in order to ensure
  compatibility of their software.

## Version Reporting

Software versions should be reflected in the user interface of the
application in three ways:

* _Version number_: A semantic version (see below) which serves both to
  uniquely identify releases, as well as to inform plug-in developers
  about compatibility with previous releases.
* _Revision identifier_: While using git, the commit hash. Supports
  internal developers and testers by uniquely identifying client
  software snapshots.
* _Branding_: Identifies which variant is in use. (Typically, Open MCT
  is re-branded when deployed for a specific mission or center.)

## Version Numbering

Open MCT shall provide version numbers consistent with
[Semantic Versioning 2.0.0](http://semver.org/). In summary, versions
are expressed in a "major.minor.patch" form, and incremented based on
nature of changes to external API. Breaking changes require a "major"
version increment; backwards-compatible changes require a "minor"
version increment; neutral changes (such as bug fixes) require a "patch"
version increment. A hyphen-separated suffix indicates a pre-release
version, which may be unstable or may not fully meet compatibility
requirements.

Additionally, the following project-specific standards will be used:

* During development, a "-next" suffix shall be appended to the
  version number. The version number before the suffix shall reflect
  the next expected version number for release.
* Prior to a 1.0.0 release, the _minor_ version will be incremented
  on a per-release basis; the _patch_ version will be incremented on a
  per-sprint basis.
* Starting at version 1.0.0, version numbers will be updated with each
  completed sprint. The version number for the sprint shall be
  determined relative to the previous released version; the decision
  to increment the _major_, _minor_, or _patch_ version should be
  made based on the nature of changes during that release. (It is
  recommended that these numbers are incremented as changes are
  introduced, such that at end of release the version number may
  be chosen by simply removing the suffix.)
* The first three sprints in a release may be unstable; in these cases, a
  unique version identifier should still be generated, but a suffix
  should be included to indicate that the version is not necessarily
  production-ready. Recommended suffixes are:

 Sprint |  Suffix
:------:|:--------:
   1    | `-alpha`
   2    | `-beta`
   3    | `-rc`

### Scope of External API

"External API" refers to the API exposed to, documented for, and used by
plug-in developers. Changes to interfaces used internally by Open MCT
(or otherwise not documented for use externally) require only a _patch_
version bump.

## Incrementing Versions

At the end of a sprint, the [project manager](cycle.md#roles)
should update (or delegate the task of updating) Open MCT version
numbers by the following process:

1. Update version number in `package.json`
  1. Checkout branch created for the last sprint that has been successfully tested.
  2. Remove a `-next` suffix from the version in `package.json`.
  3. Verify that resulting version number meets semantic versioning
     requirements relative to previous stable version. Increment the 
     version number if necessary.
  4. If version is considered unstable (which may be the case during
     the first three sprints of a release), apply a new suffix per
     [Version Numbering](#version-numbering) guidance above.
2. Tag the release.
  1. Commit changes to `package.json` on the new branch created in 
     the previous step.
     The commit message should reference the sprint being closed,
     preferably by a URL reference to the associated Milestone in
     GitHub.
  2. Verify that build still completes, that application passes
     smoke-testing, and that only differences from tested versions
     are the changes to version number above.
  3. Push the new branch.
  4. Tag this commit with the version number, prepending the letter "v".
     (e.g. `git tag v0.9.3-alpha`)
  5. Push the tag to GitHub. (e.g. `git push origin v0.9.3-alpha`).
3. Upload a release archive.
  1. Use the [GitHub release interface](https://github.com/nasa/openmct/releases)
     to draft a new release.
  2. Choose the existing tag for the new version (created and pushed above.)
     Enter the tag name as the release name as well; see existing releases
     for examples. (e.g. `Open MCT v0.9.3-alpha`)
  3. Designate the release as a "pre-release" as appropriate (for instance,
     when the version number has been suffixed as unstable, or when
     the version number is below 1.0.0.)
  4. Add release notes including any breaking changes, enhancements, 
     bug fixes with solutions in brief.
  5. Publish the release.
4. Publish the release to npm
  1. Login to npm
  2. Checkout the tag created in the previous step.
  3. In `package.json` change package to be public (private: false)
  4. Test the package before publishing by doing `npm publish --dry-run` 
     if necessary.
  5. Publish the package to the npmjs registry (e.g. `npm publish --access public`) 
     NOTE: Use the `--tag unstable` flag to the npm publish if this is a prerelease.
  6. Confirm the package has been published (e.g. `https://www.npmjs.com/package/openmct`)
5. Update snapshot status in `package.json`
  1. Create a new branch off the `master` branch.
  2. Remove any suffix from the version number, 
     or increment the _patch_ version if there is no suffix.
  3. Append a `-next` suffix.
  4. Commit changes to `package.json` on the `master` branch.
     The commit message should reference the s
Download .txt
gitextract_zhykc3s0/

├── .cspell.json
├── .eslintrc.cjs
├── .git-blame-ignore-revs
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── enhancement-request.md
│   │   └── maintenance-type.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── codeql/
│   │   └── codeql-config.yml
│   ├── dependabot.yml
│   ├── release.yml
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── e2e-couchdb.yml
│       ├── e2e-full.yml
│       ├── e2e-perf.yml
│       ├── npm-prerelease.yml
│       ├── pr-platform.yml
│       ├── pr.yml
│       ├── prcop-config.json
│       └── prcop.yml
├── .gitignore
├── .npmignore
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .vscode/
│   └── extensions.json
├── .webpack/
│   ├── webpack.common.mjs
│   ├── webpack.coverage.mjs
│   ├── webpack.dev.mjs
│   └── webpack.prod.mjs
├── API.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── TESTING.md
├── build-docs.sh
├── codecov.yml
├── copyright-notice.html
├── copyright-notice.js
├── docs/
│   └── src/
│       ├── guide/
│       │   └── security.md
│       ├── index.md
│       └── process/
│           ├── cycle.md
│           ├── index.md
│           ├── release.md
│           ├── testing/
│           │   └── plan.md
│           └── version.md
├── e2e/
│   ├── .eslintrc.cjs
│   ├── .npmignore
│   ├── .percy.ci.yml
│   ├── .percy.nightly.yml
│   ├── README.md
│   ├── appActions.js
│   ├── avpFixtures.js
│   ├── baseFixtures.js
│   ├── constants.js
│   ├── helper/
│   │   ├── addInitDataVisualization.js
│   │   ├── addInitDerivedTelemetryPlugin.js
│   │   ├── addInitExampleFaultProvider.js
│   │   ├── addInitExampleFaultProviderStatic.js
│   │   ├── addInitExampleStalenessProvider.js
│   │   ├── addInitExampleUser.js
│   │   ├── addInitFaultManagementPlugin.js
│   │   ├── addInitFileInputObject.js
│   │   ├── addInitNotebookWithUrls.js
│   │   ├── addInitOperatorStatus.js
│   │   ├── addInitRestrictedNotebook.js
│   │   ├── addNoneditableObject.js
│   │   ├── faultUtils.js
│   │   ├── hotkeys/
│   │   │   ├── clipboard.js
│   │   │   └── hotkeys.js
│   │   ├── imageryUtils.js
│   │   ├── notebookUtils.js
│   │   ├── planningUtils.js
│   │   ├── plotTagsUtils.js
│   │   ├── stylingUtils.js
│   │   ├── useDarkmatterTheme.js
│   │   └── useSnowTheme.js
│   ├── index.js
│   ├── package.json
│   ├── playwright-ci.config.js
│   ├── playwright-local.config.js
│   ├── playwright-mobile.config.js
│   ├── playwright-performance-dev.config.js
│   ├── playwright-performance-prod.config.js
│   ├── playwright-visual-a11y.config.js
│   ├── playwright-watch.config.js
│   ├── pluginFixtures.js
│   ├── test-data/
│   │   ├── ExampleLayouts.json
│   │   ├── PerformanceDisplayLayout.json
│   │   ├── PerformanceNotebook.json
│   │   ├── blank.html
│   │   ├── condition_set_storage.json
│   │   ├── display_layout_with_child_layouts.json
│   │   ├── display_layout_with_child_overlay_plot.json
│   │   ├── examplePlans/
│   │   │   ├── ExamplePlanWithOrderedLanes.json
│   │   │   ├── ExamplePlan_Large.json
│   │   │   ├── ExamplePlan_Small1.json
│   │   │   ├── ExamplePlan_Small2.json
│   │   │   └── ExamplePlan_Small3.json
│   │   ├── flexible_layout_with_child_layouts.json
│   │   ├── memory-leak-detection.json
│   │   ├── overlay_plot_storage.json
│   │   ├── overlay_plot_with_delay_storage.json
│   │   └── recycled_local_storage.json
│   └── tests/
│       ├── framework/
│       │   ├── appActions.e2e.spec.js
│       │   ├── baseFixtures.e2e.spec.js
│       │   ├── exampleTemplate.e2e.spec.js
│       │   ├── generateLocalStorageData.e2e.spec.js
│       │   └── pluginFixtures.e2e.spec.js
│       ├── functional/
│       │   ├── MCT.e2e.spec.js
│       │   ├── branding.e2e.spec.js
│       │   ├── clearDataAction.e2e.spec.js
│       │   ├── couchdb.e2e.spec.js
│       │   ├── example/
│       │   │   ├── eventGenerator.e2e.spec.js
│       │   │   ├── eventWithAcknowledgeGenerator.e2e.spec.js
│       │   │   └── generator/
│       │   │       ├── sineWaveLimitProvider.e2e.spec.js
│       │   │       └── sineWaveStalenessProvider.e2e.spec.js
│       │   ├── forms.e2e.spec.js
│       │   ├── menu.e2e.spec.js
│       │   ├── missionStatus.e2e.spec.js
│       │   ├── moveAndLinkObjects.e2e.spec.js
│       │   ├── notification.e2e.spec.js
│       │   ├── planning/
│       │   │   ├── ganttChart.e2e.spec.js
│       │   │   ├── plan.e2e.spec.js
│       │   │   ├── timelist.e2e.spec.js
│       │   │   ├── timelistControlledClock.e2e.spec.js
│       │   │   └── timestrip.e2e.spec.js
│       │   ├── plugins/
│       │   │   ├── clocks/
│       │   │   │   ├── clock.e2e.spec.js
│       │   │   │   └── remoteClock.e2e.spec.js
│       │   │   ├── comps/
│       │   │   │   └── comps.e2e.spec.js
│       │   │   ├── conditionSet/
│       │   │   │   ├── conditionSet.e2e.spec.js
│       │   │   │   └── conditionSetOperations.e2e.spec.js
│       │   │   ├── correlationTelemetry/
│       │   │   │   └── correlationTelemetry.e2e.spec.js
│       │   │   ├── displayLayout/
│       │   │   │   └── displayLayout.e2e.spec.js
│       │   │   ├── event/
│       │   │   │   └── eventTimelineView.e2e.spec.js
│       │   │   ├── faultManagement/
│       │   │   │   └── faultManagement.e2e.spec.js
│       │   │   ├── flexibleLayout/
│       │   │   │   └── flexibleLayout.e2e.spec.js
│       │   │   ├── folders/
│       │   │   │   └── viewPersist.e2e.spec.js
│       │   │   ├── gauge/
│       │   │   │   └── gauge.e2e.spec.js
│       │   │   ├── imagery/
│       │   │   │   ├── exampleImagery.e2e.spec.js
│       │   │   │   ├── exampleImageryControlledClock.e2e.spec.js
│       │   │   │   └── exampleImageryFile.e2e.spec.js
│       │   │   ├── importAndExportAsJSON/
│       │   │   │   ├── exportAsJson.e2e.spec.js
│       │   │   │   └── importAsJson.e2e.spec.js
│       │   │   ├── inspectorDataVisualization/
│       │   │   │   └── numericData.e2e.spec.js
│       │   │   ├── lad/
│       │   │   │   ├── lad.e2e.spec.js
│       │   │   │   ├── ladSet.e2e.spec.js
│       │   │   │   └── ladTable.e2e.spec.js
│       │   │   ├── notebook/
│       │   │   │   ├── notebook.e2e.spec.js
│       │   │   │   ├── notebookSnapshotImage.e2e.spec.js
│       │   │   │   ├── notebookSnapshots.e2e.spec.js
│       │   │   │   ├── notebookTags.e2e.spec.js
│       │   │   │   ├── notebookWithCouchDB.e2e.spec.js
│       │   │   │   └── restrictedNotebook.e2e.spec.js
│       │   │   ├── operatorStatus/
│       │   │   │   └── operatorStatus.e2e.spec.js
│       │   │   ├── performanceIndicator/
│       │   │   │   └── performanceIndicator.e2e.spec.js
│       │   │   ├── plot/
│       │   │   │   ├── autoscale.e2e.spec.js
│       │   │   │   ├── logPlot.e2e.spec.js
│       │   │   │   ├── missingPlotObj.e2e.spec.js
│       │   │   │   ├── overlayPlot.e2e.spec.js
│       │   │   │   ├── plotControls.e2e.spec.js
│       │   │   │   ├── plotControlsCompactMode.e2e.spec.js
│       │   │   │   ├── plotRendering.e2e.spec.js
│       │   │   │   ├── plotViewActions.e2e.spec.js
│       │   │   │   ├── previews.e2e.spec.js
│       │   │   │   ├── scatterPlot.e2e.spec.js
│       │   │   │   ├── stackedPlot.e2e.spec.js
│       │   │   │   ├── tagging.e2e.spec.js
│       │   │   │   └── timeTicks.e2e.spec.js
│       │   │   ├── reloadAction/
│       │   │   │   └── reloadAction.e2e.spec.js
│       │   │   ├── styling/
│       │   │   │   ├── conditionSetStyling.e2e.spec.js
│       │   │   │   ├── conditional/
│       │   │   │   │   └── displayLayoutConditionalStyling.e2e.spec.js
│       │   │   │   ├── conditionalStyling.e2e.spec.js
│       │   │   │   ├── flexLayoutStyling.e2e.spec.js
│       │   │   │   ├── stackedPlotStyling.e2e.spec.js
│       │   │   │   └── styleInspectorOptions.e2e.spec.js
│       │   │   ├── tabs/
│       │   │   │   └── tabs.e2e.spec.js
│       │   │   ├── telemetryTable/
│       │   │   │   ├── preview.e2e.spec.js
│       │   │   │   └── telemetryTable.e2e.spec.js
│       │   │   ├── timeConductor/
│       │   │   │   ├── datepicker.e2e.spec.js
│       │   │   │   └── timeConductor.e2e.spec.js
│       │   │   └── timer/
│       │   │       └── timer.e2e.spec.js
│       │   ├── recentObjects.e2e.spec.js
│       │   ├── renaming.e2e.spec.js
│       │   ├── search.e2e.spec.js
│       │   ├── smoke.e2e.spec.js
│       │   ├── staleness.e2e.spec.js
│       │   ├── tooltips.e2e.spec.js
│       │   ├── tree.e2e.spec.js
│       │   ├── ui/
│       │   │   ├── inspector.e2e.spec.js
│       │   │   └── statusArea.e2e.spec.js
│       │   └── userRoles.e2e.spec.js
│       ├── mobile/
│       │   └── smoke.e2e.spec.js
│       ├── performance/
│       │   ├── contract/
│       │   │   ├── imagery.contract.perf.spec.js
│       │   │   └── notebook.contract.perf.spec.js
│       │   ├── memory/
│       │   │   └── navigation.memory.perf.spec.js
│       │   ├── tabs.perf.spec.js
│       │   └── tagging.perf.spec.js
│       └── visual-a11y/
│           ├── a11y.visual.spec.js
│           ├── components/
│           │   ├── about.visual.spec.js
│           │   ├── header.visual.spec.js
│           │   ├── inspector.visual.spec.js
│           │   ├── timeConductor.visual.spec.js
│           │   └── tree.visual.spec.js
│           ├── controlledClock.visual.spec.js
│           ├── defaultPlugins.visual.spec.js
│           ├── displayLayout.visual.spec.js
│           ├── faultManagement.visual.spec.js
│           ├── gauge.visual.spec.js
│           ├── imagery.visual.spec.js
│           ├── ladTable.visual.spec.js
│           ├── missionStatus.visual.spec.js
│           ├── notebook.visual.spec.js
│           ├── notification.visual.spec.js
│           ├── planning-gantt.visual.spec.js
│           ├── planning-timestrip.visual.spec.js
│           ├── planning-view.visual.spec.js
│           ├── search.visual.spec.js
│           ├── styling.visual.spec.js
│           └── telemetryViews.visual.spec.js
├── example/
│   ├── README.md
│   ├── dataVisualization/
│   │   ├── ExampleDataVisualizationSourceViewProvider.js
│   │   ├── components/
│   │   │   └── ExampleDataVisualizationSource.vue
│   │   └── plugin.js
│   ├── eventGenerator/
│   │   ├── EventLimitProvider.js
│   │   ├── EventMetadataProvider.js
│   │   ├── EventTelemetryProvider.js
│   │   ├── EventWithAcknowledgeTelemetryProvider.js
│   │   ├── plugin.js
│   │   ├── pluginSpec.js
│   │   └── transcript.json
│   ├── exampleStalenessProvider/
│   │   ├── ExampleStalenessProvider.js
│   │   └── plugin.js
│   ├── exampleTags/
│   │   ├── plugin.js
│   │   └── tags.json
│   ├── exampleUser/
│   │   ├── ExampleUserProvider.js
│   │   ├── exampleUserCreator.js
│   │   ├── plugin.js
│   │   └── pluginSpec.js
│   ├── faultManagement/
│   │   ├── exampleFaultSource.js
│   │   ├── pluginSpec.js
│   │   └── utils.js
│   ├── generator/
│   │   ├── GeneratorMetadataProvider.js
│   │   ├── GeneratorProvider.js
│   │   ├── SinewaveLimitProvider.js
│   │   ├── SinewaveStalenessProvider.js
│   │   ├── StateGeneratorProvider.js
│   │   ├── WorkerInterface.js
│   │   ├── generatorWorker.js
│   │   └── plugin.js
│   └── imagery/
│       └── plugin.js
├── index-test.cjs
├── index.html
├── karma.conf.cjs
├── openmct.js
├── package.json
├── src/
│   ├── MCT.js
│   ├── MCTSpec.js
│   ├── api/
│   │   ├── Branding.js
│   │   ├── Editor.js
│   │   ├── EditorSpec.js
│   │   ├── actions/
│   │   │   ├── ActionCollection.js
│   │   │   ├── ActionCollectionSpec.js
│   │   │   ├── ActionsAPI.js
│   │   │   └── ActionsAPISpec.js
│   │   ├── annotation/
│   │   │   ├── AnnotationAPI.js
│   │   │   └── AnnotationAPISpec.js
│   │   ├── api.js
│   │   ├── composition/
│   │   │   ├── CompositionAPI.js
│   │   │   ├── CompositionAPISpec.js
│   │   │   ├── CompositionCollection.js
│   │   │   ├── CompositionProvider.js
│   │   │   └── DefaultCompositionProvider.js
│   │   ├── faultmanagement/
│   │   │   ├── FaultManagementAPI.js
│   │   │   └── FaultManagementAPISpec.js
│   │   ├── forms/
│   │   │   ├── FormController.js
│   │   │   ├── FormsAPI.js
│   │   │   ├── FormsAPISpec.js
│   │   │   ├── components/
│   │   │   │   ├── FormProperties.vue
│   │   │   │   ├── FormRow.vue
│   │   │   │   └── controls/
│   │   │   │       ├── AutoCompleteField.vue
│   │   │   │       ├── CheckBoxField.vue
│   │   │   │       ├── ClockDisplayFormatField.vue
│   │   │   │       ├── CompositeContainer.vue
│   │   │   │       ├── CompositeItem.vue
│   │   │   │       ├── DatetimeField.vue
│   │   │   │       ├── FileInput.vue
│   │   │   │       ├── LocatorField.vue
│   │   │   │       ├── NumberField.vue
│   │   │   │       ├── SelectField.vue
│   │   │   │       ├── TextAreaField.vue
│   │   │   │       ├── TextField.vue
│   │   │   │       └── ToggleSwitchField.vue
│   │   │   └── toggle-check-box-mixin.js
│   │   ├── indicators/
│   │   │   ├── IndicatorAPI.js
│   │   │   ├── IndicatorAPISpec.js
│   │   │   ├── SimpleIndicator.js
│   │   │   └── res/
│   │   │       └── indicator-template.html
│   │   ├── menu/
│   │   │   ├── MenuAPI.js
│   │   │   ├── MenuAPISpec.js
│   │   │   ├── components/
│   │   │   │   ├── MenuComponent.vue
│   │   │   │   └── SuperMenu.vue
│   │   │   ├── menu.js
│   │   │   └── mixins/
│   │   │       └── popupMenuMixin.js
│   │   ├── notifications/
│   │   │   ├── NotificationAPI.js
│   │   │   └── NotificationAPISpec.js
│   │   ├── objects/
│   │   │   ├── ConflictError.js
│   │   │   ├── InMemorySearchProvider.js
│   │   │   ├── InMemorySearchWorker.js
│   │   │   ├── InterceptorRegistry.js
│   │   │   ├── InterceptorRegistrySpec.js
│   │   │   ├── MutableDomainObject.js
│   │   │   ├── NamespaceProvider.js
│   │   │   ├── ObjectAPI.js
│   │   │   ├── ObjectAPISearchSpec.js
│   │   │   ├── ObjectAPISpec.js
│   │   │   ├── RootObjectCompositionProvider.js
│   │   │   ├── RootObjectProvider.js
│   │   │   ├── RootRegistry.js
│   │   │   ├── Transaction.js
│   │   │   ├── TransactionSpec.js
│   │   │   ├── object-utils.js
│   │   │   └── test/
│   │   │       └── object-utilsSpec.js
│   │   ├── overlays/
│   │   │   ├── Dialog.js
│   │   │   ├── Overlay.js
│   │   │   ├── OverlayAPI.js
│   │   │   ├── ProgressDialog.js
│   │   │   ├── Selection.js
│   │   │   └── components/
│   │   │       ├── DialogComponent.vue
│   │   │       ├── OverlayComponent.vue
│   │   │       ├── ProgressDialogComponent.vue
│   │   │       ├── SelectionComponent.vue
│   │   │       ├── dialog-component.scss
│   │   │       └── overlay-component.scss
│   │   ├── priority/
│   │   │   └── PriorityAPI.js
│   │   ├── status/
│   │   │   ├── StatusAPI.js
│   │   │   └── StatusAPISpec.js
│   │   ├── telemetry/
│   │   │   ├── BatchingWebSocket.js
│   │   │   ├── DefaultMetadataProvider.js
│   │   │   ├── TelemetryAPI.js
│   │   │   ├── TelemetryAPISpec.js
│   │   │   ├── TelemetryCollection.js
│   │   │   ├── TelemetryCollectionSpec.js
│   │   │   ├── TelemetryMetadataManager.js
│   │   │   ├── TelemetryRequestInterceptor.js
│   │   │   ├── TelemetryValueFormatter.js
│   │   │   ├── WebSocketWorker.js
│   │   │   └── constants.js
│   │   ├── time/
│   │   │   ├── GlobalTimeContext.js
│   │   │   ├── IndependentTimeContext.js
│   │   │   ├── TimeAPI.js
│   │   │   ├── TimeAPISpec.js
│   │   │   ├── TimeContext.js
│   │   │   ├── constants.js
│   │   │   └── independentTimeAPISpec.js
│   │   ├── tooltips/
│   │   │   ├── ToolTip.js
│   │   │   ├── ToolTipAPI.js
│   │   │   ├── components/
│   │   │   │   ├── TooltipComponent.vue
│   │   │   │   └── tooltip-component.scss
│   │   │   └── tooltipMixins.js
│   │   ├── types/
│   │   │   ├── Type.js
│   │   │   ├── TypeRegistry.js
│   │   │   └── TypeRegistrySpec.js
│   │   └── user/
│   │       ├── ActiveRoleSynchronizer.js
│   │       ├── StatusAPI.js
│   │       ├── StatusUserProvider.js
│   │       ├── StoragePersistence.js
│   │       ├── User.js
│   │       ├── UserAPI.js
│   │       ├── UserAPISpec.js
│   │       ├── UserProvider.js
│   │       ├── UserStatusAPISpec.js
│   │       └── constants.js
│   ├── exporters/
│   │   ├── CSVExporter.js
│   │   ├── ImageExporter.js
│   │   ├── ImageExporterSpec.js
│   │   └── JSONExporter.js
│   ├── plugins/
│   │   ├── CouchDBSearchFolder/
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── DeviceClassifier/
│   │   │   ├── plugin.js
│   │   │   └── src/
│   │   │       ├── DeviceClassifier.js
│   │   │       ├── DeviceClassifierSpec.js
│   │   │       ├── DeviceMatchers.js
│   │   │       └── DeviceMatchersSpec.js
│   │   ├── ISOTimeFormat/
│   │   │   ├── ISOTimeFormat.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── LADTable/
│   │   │   ├── LADTableCompositionPolicy.js
│   │   │   ├── LADTableConfiguration.js
│   │   │   ├── LADTableConfigurationViewProvider.js
│   │   │   ├── LADTableSetViewProvider.js
│   │   │   ├── LADTableView.js
│   │   │   ├── LADTableViewProvider.js
│   │   │   ├── LadTableSetView.js
│   │   │   ├── ViewActions.js
│   │   │   ├── components/
│   │   │   │   ├── LadRow.vue
│   │   │   │   ├── LadTable.vue
│   │   │   │   ├── LadTableConfiguration.vue
│   │   │   │   └── LadTableSet.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── URLIndicatorPlugin/
│   │   │   ├── README.md
│   │   │   ├── URLIndicator.js
│   │   │   ├── URLIndicatorPlugin.js
│   │   │   └── URLIndicatorSpec.js
│   │   ├── URLTimeSettingsSynchronizer/
│   │   │   ├── URLTimeSettingsSynchronizer.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── activityStates/
│   │   │   ├── activityStatesInterceptor.js
│   │   │   ├── createActivityStatesIdentifier.js
│   │   │   └── pluginSpec.js
│   │   ├── autoflow/
│   │   │   ├── AutoflowTabularConstants.js
│   │   │   ├── AutoflowTabularController.js
│   │   │   ├── AutoflowTabularPlugin.js
│   │   │   ├── AutoflowTabularPluginSpec.js
│   │   │   ├── AutoflowTabularRowController.js
│   │   │   ├── AutoflowTabularView.js
│   │   │   ├── README.md
│   │   │   ├── VueView.js
│   │   │   ├── autoflow-tabular.html
│   │   │   └── dom-observer.js
│   │   ├── charts/
│   │   │   ├── bar/
│   │   │   │   ├── BarGraphCompositionPolicy.js
│   │   │   │   ├── BarGraphConstants.js
│   │   │   │   ├── BarGraphPlot.vue
│   │   │   │   ├── BarGraphView.vue
│   │   │   │   ├── BarGraphViewProvider.js
│   │   │   │   ├── inspector/
│   │   │   │   │   ├── BarGraphInspectorViewProvider.js
│   │   │   │   │   ├── BarGraphOptions.vue
│   │   │   │   │   └── SeriesOptions.vue
│   │   │   │   ├── plugin.js
│   │   │   │   └── pluginSpec.js
│   │   │   └── scatter/
│   │   │       ├── ScatterPlotCompositionPolicy.js
│   │   │       ├── ScatterPlotForm.vue
│   │   │       ├── ScatterPlotView.vue
│   │   │       ├── ScatterPlotViewProvider.js
│   │   │       ├── ScatterPlotWithUnderlay.vue
│   │   │       ├── inspector/
│   │   │       │   ├── PlotOptions.vue
│   │   │       │   ├── PlotOptionsBrowse.vue
│   │   │       │   ├── PlotOptionsEdit.vue
│   │   │       │   └── ScatterPlotInspectorViewProvider.js
│   │   │       ├── plugin.js
│   │   │       ├── pluginSpec.js
│   │   │       └── scatterPlotConstants.js
│   │   ├── clearData/
│   │   │   ├── ClearDataAction.js
│   │   │   ├── components/
│   │   │   │   └── GlobalClearIndicator.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── clock/
│   │   │   ├── ClockViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── ClockComponent.vue
│   │   │   │   └── ClockIndicator.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── comps/
│   │   │   ├── CompsCompositionPolicy.js
│   │   │   ├── CompsInspectorViewProvider.js
│   │   │   ├── CompsManager.js
│   │   │   ├── CompsMathWorker.js
│   │   │   ├── CompsMetadataProvider.js
│   │   │   ├── CompsTelemetryProvider.js
│   │   │   ├── CompsViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── CompsInspectorView.vue
│   │   │   │   ├── CompsView.vue
│   │   │   │   └── comps.scss
│   │   │   └── plugin.js
│   │   ├── condition/
│   │   │   ├── Condition.js
│   │   │   ├── ConditionManager.js
│   │   │   ├── ConditionManagerSpec.js
│   │   │   ├── ConditionSetCompositionPolicy.js
│   │   │   ├── ConditionSetCompositionPolicySpec.js
│   │   │   ├── ConditionSetMetadataProvider.js
│   │   │   ├── ConditionSetTelemetryProvider.js
│   │   │   ├── ConditionSetViewProvider.js
│   │   │   ├── ConditionSpec.js
│   │   │   ├── StyleRuleManager.js
│   │   │   ├── components/
│   │   │   │   ├── ConditionCollection.vue
│   │   │   │   ├── ConditionDescription.vue
│   │   │   │   ├── ConditionError.vue
│   │   │   │   ├── ConditionItem.vue
│   │   │   │   ├── ConditionSet.vue
│   │   │   │   ├── CriterionItem.vue
│   │   │   │   ├── CurrentOutput.vue
│   │   │   │   ├── TestData.vue
│   │   │   │   ├── conditionals.scss
│   │   │   │   └── inspector/
│   │   │   │       ├── ConditionalStylesView.vue
│   │   │   │       ├── StyleEditor.vue
│   │   │   │       ├── StylesView.vue
│   │   │   │       └── conditional-styles.scss
│   │   │   ├── criterion/
│   │   │   │   ├── AllTelemetryCriterion.js
│   │   │   │   ├── TelemetryCriterion.js
│   │   │   │   └── TelemetryCriterionSpec.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── utils/
│   │   │       ├── constants.js
│   │   │       ├── evaluator.js
│   │   │       ├── evaluatorSpec.js
│   │   │       ├── operations.js
│   │   │       ├── operationsSpec.js
│   │   │       ├── styleUtils.js
│   │   │       ├── time.js
│   │   │       └── timeSpec.js
│   │   ├── conditionWidget/
│   │   │   ├── ConditionWidgetViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── ConditionWidget.vue
│   │   │   │   └── condition-widget.scss
│   │   │   ├── conditionWidgetStylesInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── correlationTelemetryPlugin/
│   │   │   └── plugin.js
│   │   ├── defaultRootName/
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── displayLayout/
│   │   │   ├── AlphanumericFormatViewProvider.js
│   │   │   ├── CustomStringFormatter.js
│   │   │   ├── CustomStringFormatterSpec.js
│   │   │   ├── DisplayLayoutToolbar.js
│   │   │   ├── DisplayLayoutType.js
│   │   │   ├── DrawingObjectTypes.js
│   │   │   ├── LayoutDrag.js
│   │   │   ├── actions/
│   │   │   │   └── CopyToClipboardAction.js
│   │   │   ├── components/
│   │   │   │   ├── AlphanumericFormat.vue
│   │   │   │   ├── BoxView.vue
│   │   │   │   ├── DisplayLayout.vue
│   │   │   │   ├── DisplayLayoutGrid.vue
│   │   │   │   ├── EditMarquee.vue
│   │   │   │   ├── EllipseView.vue
│   │   │   │   ├── ImageView.vue
│   │   │   │   ├── LayoutFrame.vue
│   │   │   │   ├── LineView.vue
│   │   │   │   ├── SubobjectView.vue
│   │   │   │   ├── TelemetryView.vue
│   │   │   │   ├── TextView.vue
│   │   │   │   ├── box-and-line-views.scss
│   │   │   │   ├── display-layout.scss
│   │   │   │   ├── edit-marquee.scss
│   │   │   │   ├── image-view.scss
│   │   │   │   ├── layout-frame.scss
│   │   │   │   ├── telemetry-view.scss
│   │   │   │   └── text-view.scss
│   │   │   ├── displayLayoutStylesInterceptor.js
│   │   │   ├── mixins/
│   │   │   │   └── objectStyles-mixin.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── duplicate/
│   │   │   ├── DuplicateAction.js
│   │   │   ├── DuplicateTask.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── events/
│   │   │   ├── EventInspectorViewProvider.js
│   │   │   ├── EventTimelineViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── EventInspectorView.vue
│   │   │   │   ├── EventTimelineView.vue
│   │   │   │   └── events-view.scss
│   │   │   ├── mixins/
│   │   │   │   └── eventData.js
│   │   │   └── plugin.js
│   │   ├── exportAsJSONAction/
│   │   │   ├── ExportAsJSONAction.js
│   │   │   ├── ExportAsJSONActionSpec.js
│   │   │   └── plugin.js
│   │   ├── faultManagement/
│   │   │   ├── FaultManagementInspector.vue
│   │   │   ├── FaultManagementInspectorViewProvider.js
│   │   │   ├── FaultManagementListHeader.vue
│   │   │   ├── FaultManagementListItem.vue
│   │   │   ├── FaultManagementObjectProvider.js
│   │   │   ├── FaultManagementPlugin.js
│   │   │   ├── FaultManagementSearch.vue
│   │   │   ├── FaultManagementToolbar.vue
│   │   │   ├── FaultManagementView.vue
│   │   │   ├── FaultManagementViewProvider.js
│   │   │   ├── constants.js
│   │   │   ├── fault-manager.scss
│   │   │   └── pluginSpec.js
│   │   ├── filters/
│   │   │   ├── FiltersInspectorViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── FilterField.vue
│   │   │   │   ├── FilterObject.vue
│   │   │   │   ├── FiltersView.vue
│   │   │   │   ├── GlobalFilters.vue
│   │   │   │   ├── filters-view.scss
│   │   │   │   └── global-filters.scss
│   │   │   └── plugin.js
│   │   ├── flexibleLayout/
│   │   │   ├── components/
│   │   │   │   ├── ContainerComponent.vue
│   │   │   │   ├── DropHint.vue
│   │   │   │   ├── FlexibleLayout.vue
│   │   │   │   ├── FrameComponent.vue
│   │   │   │   └── flexible-layout.scss
│   │   │   ├── flexibleLayoutStylesInterceptor.js
│   │   │   ├── flexibleLayoutViewProvider.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── toolbarProvider.js
│   │   ├── folderView/
│   │   │   ├── FolderGridView.js
│   │   │   ├── FolderListView.js
│   │   │   ├── components/
│   │   │   │   ├── GridItem.vue
│   │   │   │   ├── GridView.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── ListView.vue
│   │   │   │   ├── composition-loader.js
│   │   │   │   ├── grid-view.scss
│   │   │   │   ├── list-item.scss
│   │   │   │   └── status-listener.js
│   │   │   ├── constants.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── formActions/
│   │   │   ├── CreateAction.js
│   │   │   ├── CreateActionSpec.js
│   │   │   ├── CreateWizard.js
│   │   │   ├── EditPropertiesAction.js
│   │   │   ├── PropertiesAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── gauge/
│   │   │   ├── GaugeCompositionPolicy.js
│   │   │   ├── GaugePlugin.js
│   │   │   ├── GaugePluginSpec.js
│   │   │   ├── GaugeViewProvider.js
│   │   │   ├── components/
│   │   │   │   ├── GaugeComponent.vue
│   │   │   │   └── GaugeFormController.vue
│   │   │   ├── gauge-limit-util.js
│   │   │   ├── gauge.scss
│   │   │   └── gaugeStylesInterceptor.js
│   │   ├── goToOriginalAction/
│   │   │   ├── goToOriginalAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── hyperlink/
│   │   │   ├── HyperlinkLayout.vue
│   │   │   ├── HyperlinkProvider.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── imagery/
│   │   │   ├── ImageryTimestripViewProvider.js
│   │   │   ├── ImageryView.js
│   │   │   ├── ImageryViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── OpenImageInNewTabAction.js
│   │   │   │   └── SaveImageAsAction.js
│   │   │   ├── components/
│   │   │   │   ├── AnnotationsCanvas.vue
│   │   │   │   ├── Compass/
│   │   │   │   │   ├── CompassComponent.vue
│   │   │   │   │   ├── CompassHud.vue
│   │   │   │   │   ├── CompassRose.vue
│   │   │   │   │   ├── compass.scss
│   │   │   │   │   ├── pluginSpec.js
│   │   │   │   │   └── utils.js
│   │   │   │   ├── FilterSettings.vue
│   │   │   │   ├── ImageControls.vue
│   │   │   │   ├── ImageThumbnail.vue
│   │   │   │   ├── ImageryTimeView.vue
│   │   │   │   ├── ImageryView.vue
│   │   │   │   ├── ImageryViewMenuSwitcher.vue
│   │   │   │   ├── LayerSettings.vue
│   │   │   │   ├── RelatedTelemetry/
│   │   │   │   │   └── RelatedTelemetry.js
│   │   │   │   ├── ZoomSettings.vue
│   │   │   │   └── imagery-view.scss
│   │   │   ├── lib/
│   │   │   │   └── eventHelpers.js
│   │   │   ├── mixins/
│   │   │   │   └── imageryData.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── importFromJSONAction/
│   │   │   ├── ImportFromJSONAction.js
│   │   │   ├── ImportFromJSONActionSpec.js
│   │   │   └── plugin.js
│   │   ├── inspectorDataVisualization/
│   │   │   ├── DataVisualization.vue
│   │   │   ├── ImageryInspectorView.vue
│   │   │   ├── InspectorDataVisualizationComponent.vue
│   │   │   ├── InspectorDataVisualizationViewProvider.js
│   │   │   ├── NumericDataInspectorView.vue
│   │   │   ├── TelemetryFrame.vue
│   │   │   ├── inspector-data-visualization.scss
│   │   │   └── plugin.js
│   │   ├── inspectorViews/
│   │   │   ├── annotations/
│   │   │   │   ├── AnnotationsInspectorView.vue
│   │   │   │   ├── AnnotationsViewProvider.js
│   │   │   │   └── tags/
│   │   │   │       ├── TagEditor.vue
│   │   │   │       ├── TagEditorClassNames.js
│   │   │   │       ├── TagSelection.vue
│   │   │   │       └── tags.scss
│   │   │   ├── elements/
│   │   │   │   ├── ElementItem.vue
│   │   │   │   ├── ElementItemGroup.vue
│   │   │   │   ├── ElementsPool.vue
│   │   │   │   ├── ElementsViewProvider.js
│   │   │   │   ├── PlotElementsPool.vue
│   │   │   │   ├── PlotElementsViewProvider.js
│   │   │   │   └── elements.scss
│   │   │   ├── plugin.js
│   │   │   ├── properties/
│   │   │   │   ├── DetailText.vue
│   │   │   │   ├── LocationComponent.vue
│   │   │   │   ├── PropertiesComponent.vue
│   │   │   │   ├── PropertiesViewProvider.js
│   │   │   │   └── location.scss
│   │   │   └── styles/
│   │   │       ├── FontStyleEditor.vue
│   │   │       ├── SavedStyleSelector.vue
│   │   │       ├── SavedStylesInspectorView.vue
│   │   │       ├── SavedStylesView.vue
│   │   │       ├── StylesInspectorView.vue
│   │   │       ├── StylesInspectorViewProvider.js
│   │   │       ├── StylesManager.js
│   │   │       └── constants.js
│   │   ├── interceptors/
│   │   │   ├── missingObjectInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── latestDataClock/
│   │   │   ├── LADClock.js
│   │   │   └── plugin.js
│   │   ├── licenses/
│   │   │   ├── LicensesComponent.vue
│   │   │   ├── plugin.js
│   │   │   └── third-party-licenses.json
│   │   ├── linkAction/
│   │   │   ├── LinkAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── localStorage/
│   │   │   ├── LocalStorageObjectProvider.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── localTimeSystem/
│   │   │   ├── LocalTimeFormat.js
│   │   │   ├── LocalTimeSystem.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── move/
│   │   │   ├── MoveAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── myItems/
│   │   │   ├── README.md
│   │   │   ├── createMyItemsIdentifier.js
│   │   │   ├── myItemsInterceptor.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── newFolderAction/
│   │   │   ├── newFolderAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── notebook/
│   │   │   ├── NotebookType.js
│   │   │   ├── NotebookViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── CopyToNotebookAction.js
│   │   │   │   └── ExportNotebookAsTextAction.js
│   │   │   ├── components/
│   │   │   │   ├── NotebookComponent.vue
│   │   │   │   ├── NotebookEmbed.vue
│   │   │   │   ├── NotebookEntry.vue
│   │   │   │   ├── NotebookMenuSwitcher.vue
│   │   │   │   ├── NotebookSnapshotContainer.vue
│   │   │   │   ├── NotebookSnapshotIndicator.vue
│   │   │   │   ├── PageCollection.vue
│   │   │   │   ├── PageComponent.vue
│   │   │   │   ├── PopupMenu.vue
│   │   │   │   ├── SearchResults.vue
│   │   │   │   ├── SectionCollection.vue
│   │   │   │   ├── SectionComponent.vue
│   │   │   │   ├── SidebarComponent.vue
│   │   │   │   ├── sidebar.scss
│   │   │   │   └── snapshot-template.html
│   │   │   ├── monkeyPatchObjectAPIForNotebooks.js
│   │   │   ├── notebook-constants.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── snapshot-container.js
│   │   │   ├── snapshot.js
│   │   │   └── utils/
│   │   │       ├── notebook-entries.js
│   │   │       ├── notebook-entriesSpec.js
│   │   │       ├── notebook-image.js
│   │   │       ├── notebook-key-code.js
│   │   │       ├── notebook-migration.js
│   │   │       ├── notebook-snapshot-menu.js
│   │   │       ├── notebook-storage.js
│   │   │       ├── notebook-storageSpec.js
│   │   │       ├── painterroInstance.js
│   │   │       └── removeDialog.js
│   │   ├── notificationIndicator/
│   │   │   ├── components/
│   │   │   │   ├── NotificationIndicator.vue
│   │   │   │   ├── NotificationMessage.vue
│   │   │   │   └── NotificationsList.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── objectMigration/
│   │   │   ├── Migrations.js
│   │   │   └── plugin.js
│   │   ├── openInNewTabAction/
│   │   │   ├── openInNewTabAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── operatorStatus/
│   │   │   ├── AbstractStatusIndicator.js
│   │   │   ├── operator-status.scss
│   │   │   ├── operatorStatus/
│   │   │   │   ├── OperatorStatus.vue
│   │   │   │   └── OperatorStatusIndicator.js
│   │   │   ├── plugin.js
│   │   │   └── pollQuestion/
│   │   │       ├── PollQuestion.vue
│   │   │       └── PollQuestionIndicator.js
│   │   ├── performanceIndicator/
│   │   │   ├── README.md
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── persistence/
│   │   │   └── couch/
│   │   │       ├── CouchChangesFeed.js
│   │   │       ├── CouchDocument.js
│   │   │       ├── CouchObjectProvider.js
│   │   │       ├── CouchObjectQueue.js
│   │   │       ├── CouchSearchProvider.js
│   │   │       ├── CouchStatusIndicator.js
│   │   │       ├── README.md
│   │   │       ├── couchdb-compose.yaml
│   │   │       ├── package.json
│   │   │       ├── plugin.js
│   │   │       ├── pluginSpec.js
│   │   │       ├── replace-localstorage-with-couchdb-indexhtml.sh
│   │   │       ├── scripts/
│   │   │       │   ├── deleteAnnotations.js
│   │   │       │   └── lockObjects.mjs
│   │   │       └── setup-couchdb.sh
│   │   ├── plan/
│   │   │   ├── GanttChartCompositionPolicy.js
│   │   │   ├── PlanViewConfiguration.js
│   │   │   ├── PlanViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── ActivityTimeline.vue
│   │   │   │   └── PlanView.vue
│   │   │   ├── inspector/
│   │   │   │   ├── ActivityInspectorViewProvider.js
│   │   │   │   ├── GanttChartInspectorViewProvider.js
│   │   │   │   ├── PlanInspectorViewProvider.js
│   │   │   │   └── components/
│   │   │   │       ├── ActivityProperty.vue
│   │   │   │       ├── PlanActivitiesView.vue
│   │   │   │       ├── PlanActivityPropertiesView.vue
│   │   │   │       ├── PlanActivityStatusView.vue
│   │   │   │       ├── PlanActivityTimeView.vue
│   │   │   │       ├── PlanExecutionMonitoringView.vue
│   │   │   │       └── PlanViewConfiguration.vue
│   │   │   ├── plan.scss
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── util.js
│   │   ├── planExecutionMonitoring/
│   │   │   ├── planExecutionMonitoringIdentifier.js
│   │   │   ├── planExecutionMonitoringInterceptor.js
│   │   │   └── pluginSpec.js
│   │   ├── plot/
│   │   │   ├── LinearScale.js
│   │   │   ├── MctPlot.vue
│   │   │   ├── MctTicks.vue
│   │   │   ├── PlotView.vue
│   │   │   ├── PlotViewProvider.js
│   │   │   ├── README.md
│   │   │   ├── actions/
│   │   │   │   ├── ViewActions.js
│   │   │   │   └── utils.js
│   │   │   ├── axis/
│   │   │   │   ├── XAxis.vue
│   │   │   │   └── YAxis.vue
│   │   │   ├── chart/
│   │   │   │   ├── LimitLabel.vue
│   │   │   │   ├── LimitLine.vue
│   │   │   │   ├── MCTChartAlarmLineSet.js
│   │   │   │   ├── MCTChartAlarmPointSet.js
│   │   │   │   ├── MCTChartLineLinear.js
│   │   │   │   ├── MCTChartLineStepAfter.js
│   │   │   │   ├── MCTChartPointSet.js
│   │   │   │   ├── MCTChartSeriesElement.js
│   │   │   │   ├── MctChart.vue
│   │   │   │   └── limitUtil.js
│   │   │   ├── configuration/
│   │   │   │   ├── Collection.js
│   │   │   │   ├── ConfigStore.js
│   │   │   │   ├── LegendModel.js
│   │   │   │   ├── Model.js
│   │   │   │   ├── PlotConfigurationModel.js
│   │   │   │   ├── PlotSeries.js
│   │   │   │   ├── SeriesCollection.js
│   │   │   │   ├── XAxisModel.js
│   │   │   │   └── YAxisModel.js
│   │   │   ├── draw/
│   │   │   │   ├── Draw2D.js
│   │   │   │   ├── DrawLoader.js
│   │   │   │   ├── DrawWebGL.js
│   │   │   │   └── MarkerShapes.js
│   │   │   ├── inspector/
│   │   │   │   ├── PlotOptions.vue
│   │   │   │   ├── PlotOptionsBrowse.vue
│   │   │   │   ├── PlotOptionsEdit.vue
│   │   │   │   ├── PlotOptionsItem.vue
│   │   │   │   ├── PlotsInspectorViewProvider.js
│   │   │   │   ├── StackedPlotsInspectorViewProvider.js
│   │   │   │   └── forms/
│   │   │   │       ├── LegendForm.vue
│   │   │   │       ├── SeriesForm.vue
│   │   │   │       ├── YAxisForm.vue
│   │   │   │       └── formUtil.js
│   │   │   ├── legend/
│   │   │   │   ├── PlotLegend.vue
│   │   │   │   ├── PlotLegendItemCollapsed.vue
│   │   │   │   └── PlotLegendItemExpanded.vue
│   │   │   ├── lib/
│   │   │   │   └── eventHelpers.js
│   │   │   ├── mathUtils.js
│   │   │   ├── overlayPlot/
│   │   │   │   ├── OverlayPlotCompositionPolicy.js
│   │   │   │   ├── OverlayPlotViewProvider.js
│   │   │   │   ├── overlayPlotStylesInterceptor.js
│   │   │   │   └── pluginSpec.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── stackedPlot/
│   │   │   │   ├── StackedPlot.vue
│   │   │   │   ├── StackedPlotCompositionPolicy.js
│   │   │   │   ├── StackedPlotItem.vue
│   │   │   │   ├── StackedPlotViewProvider.js
│   │   │   │   ├── mixins/
│   │   │   │   │   └── objectStyles-mixin.js
│   │   │   │   ├── pluginSpec.js
│   │   │   │   └── stackedPlotConfigurationInterceptor.js
│   │   │   └── tickUtils.js
│   │   ├── plugins.js
│   │   ├── reloadAction/
│   │   │   ├── ReloadAction.js
│   │   │   └── plugin.js
│   │   ├── remoteClock/
│   │   │   ├── RemoteClock.js
│   │   │   ├── RemoteClockSpec.js
│   │   │   ├── plugin.js
│   │   │   └── requestInterceptor.js
│   │   ├── remove/
│   │   │   ├── RemoveAction.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── staticRootPlugin/
│   │   │   ├── README.md
│   │   │   ├── StaticModelProvider.js
│   │   │   ├── StaticModelProviderSpec.js
│   │   │   ├── plugin.js
│   │   │   └── test-data/
│   │   │       ├── static-provider-test-empty-namespace.json
│   │   │       └── static-provider-test-foo-namespace.json
│   │   ├── summaryWidget/
│   │   │   ├── README.md
│   │   │   ├── SummaryWidgetViewPolicy.js
│   │   │   ├── SummaryWidgetsCompositionPolicy.js
│   │   │   ├── plugin.js
│   │   │   ├── res/
│   │   │   │   ├── conditionTemplate.html
│   │   │   │   ├── input/
│   │   │   │   │   ├── paletteTemplate.html
│   │   │   │   │   └── selectTemplate.html
│   │   │   │   ├── ruleImageTemplate.html
│   │   │   │   ├── ruleTemplate.html
│   │   │   │   ├── testDataItemTemplate.html
│   │   │   │   ├── testDataTemplate.html
│   │   │   │   └── widgetTemplate.html
│   │   │   ├── src/
│   │   │   │   ├── Condition.js
│   │   │   │   ├── ConditionEvaluator.js
│   │   │   │   ├── ConditionManager.js
│   │   │   │   ├── Rule.js
│   │   │   │   ├── SummaryWidget.js
│   │   │   │   ├── TestDataItem.js
│   │   │   │   ├── TestDataManager.js
│   │   │   │   ├── WidgetDnD.js
│   │   │   │   ├── eventHelpers.js
│   │   │   │   ├── input/
│   │   │   │   │   ├── ColorPalette.js
│   │   │   │   │   ├── IconPalette.js
│   │   │   │   │   ├── KeySelect.js
│   │   │   │   │   ├── ObjectSelect.js
│   │   │   │   │   ├── OperationSelect.js
│   │   │   │   │   ├── Palette.js
│   │   │   │   │   └── Select.js
│   │   │   │   ├── telemetry/
│   │   │   │   │   ├── EvaluatorPool.js
│   │   │   │   │   ├── EvaluatorPoolSpec.js
│   │   │   │   │   ├── SummaryWidgetCondition.js
│   │   │   │   │   ├── SummaryWidgetConditionSpec.js
│   │   │   │   │   ├── SummaryWidgetEvaluator.js
│   │   │   │   │   ├── SummaryWidgetMetadataProvider.js
│   │   │   │   │   ├── SummaryWidgetRule.js
│   │   │   │   │   ├── SummaryWidgetRuleSpec.js
│   │   │   │   │   ├── SummaryWidgetTelemetryProvider.js
│   │   │   │   │   ├── SummaryWidgetTelemetryProviderSpec.js
│   │   │   │   │   └── operations.js
│   │   │   │   └── views/
│   │   │   │       ├── SummaryWidgetView.js
│   │   │   │       └── SummaryWidgetViewProvider.js
│   │   │   └── test/
│   │   │       ├── ConditionEvaluatorSpec.js
│   │   │       ├── ConditionManagerSpec.js
│   │   │       ├── ConditionSpec.js
│   │   │       ├── RuleSpec.js
│   │   │       ├── SummaryWidgetSpec.js
│   │   │       ├── SummaryWidgetViewPolicySpec.js
│   │   │       ├── TestDataItemSpec.js
│   │   │       ├── TestDataManagerSpec.js
│   │   │       ├── WidgetDnDSpec.js
│   │   │       └── input/
│   │   │           ├── ColorPaletteSpec.js
│   │   │           ├── IconPaletteSpec.js
│   │   │           ├── KeySelectSpec.js
│   │   │           ├── ObjectSelectSpec.js
│   │   │           ├── OperationSelectSpec.js
│   │   │           ├── PaletteSpec.js
│   │   │           └── SelectSpec.js
│   │   ├── tabs/
│   │   │   ├── components/
│   │   │   │   ├── TabsComponent.vue
│   │   │   │   └── tabs.scss
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── tabs.js
│   │   ├── telemetryMean/
│   │   │   ├── plugin.js
│   │   │   └── src/
│   │   │       ├── MeanTelemetryProvider.js
│   │   │       ├── MeanTelemetryProviderSpec.js
│   │   │       ├── MockTelemetryApi.js
│   │   │       └── TelemetryAverager.js
│   │   ├── telemetryTable/
│   │   │   ├── TableConfigurationViewProvider.js
│   │   │   ├── TelemetryTable.js
│   │   │   ├── TelemetryTableColumn.js
│   │   │   ├── TelemetryTableConfiguration.js
│   │   │   ├── TelemetryTableNameColumn.js
│   │   │   ├── TelemetryTableRow.js
│   │   │   ├── TelemetryTableType.js
│   │   │   ├── TelemetryTableUnitColumn.js
│   │   │   ├── TelemetryTableView.js
│   │   │   ├── TelemetryTableViewProvider.js
│   │   │   ├── ViewActions.js
│   │   │   ├── collections/
│   │   │   │   └── TableRowCollection.js
│   │   │   ├── components/
│   │   │   │   ├── SizingRow.vue
│   │   │   │   ├── TableCell.vue
│   │   │   │   ├── TableColumnHeader.vue
│   │   │   │   ├── TableComponent.vue
│   │   │   │   ├── TableConfiguration.vue
│   │   │   │   ├── TableFooterIndicator.vue
│   │   │   │   ├── TableRow.vue
│   │   │   │   ├── table-footer-indicator.scss
│   │   │   │   ├── table-row.scss
│   │   │   │   └── table.scss
│   │   │   ├── constants.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── telemetryTableStylesInterceptor.js
│   │   ├── themes/
│   │   │   ├── darkmatter-theme.scss
│   │   │   ├── darkmatter.js
│   │   │   ├── espresso-theme.scss
│   │   │   ├── espresso.js
│   │   │   ├── installTheme.js
│   │   │   ├── snow-theme.scss
│   │   │   └── snow.js
│   │   ├── timeConductor/
│   │   │   ├── ConductorAxis.vue
│   │   │   ├── ConductorClock.vue
│   │   │   ├── ConductorComponent.vue
│   │   │   ├── ConductorHistory.vue
│   │   │   ├── ConductorInputsFixed.vue
│   │   │   ├── ConductorInputsRealtime.vue
│   │   │   ├── ConductorMode.vue
│   │   │   ├── ConductorModeIcon.vue
│   │   │   ├── ConductorPopUp.vue
│   │   │   ├── ConductorTimeSystem.vue
│   │   │   ├── DatePicker.vue
│   │   │   ├── DateTimePopupFixed.vue
│   │   │   ├── TimePopupFixed.vue
│   │   │   ├── TimePopupRealtime.vue
│   │   │   ├── clock-mixin.js
│   │   │   ├── conductor-axis.scss
│   │   │   ├── conductor-mode-icon.scss
│   │   │   ├── conductor.scss
│   │   │   ├── conductorPopUpManager.js
│   │   │   ├── date-picker.scss
│   │   │   ├── independent/
│   │   │   │   ├── IndependentClock.vue
│   │   │   │   ├── IndependentMode.vue
│   │   │   │   ├── IndependentTimeConductor.vue
│   │   │   │   └── useIndependentTimeConductorPopUp.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── useClock.js
│   │   │   ├── useClockOffsets.js
│   │   │   ├── useTick.js
│   │   │   ├── useTime.js
│   │   │   ├── useTimeBounds.js
│   │   │   ├── useTimeContext.js
│   │   │   ├── useTimeMode.js
│   │   │   ├── useTimeSystem.js
│   │   │   └── utcMultiTimeFormat.js
│   │   ├── timeline/
│   │   │   ├── Container.js
│   │   │   ├── ExtendedLinesBus.js
│   │   │   ├── ExtendedLinesOverlay.vue
│   │   │   ├── TimelineCompositionPolicy.js
│   │   │   ├── TimelineElementsContent.vue
│   │   │   ├── TimelineElementsPool.vue
│   │   │   ├── TimelineElementsViewProvider.js
│   │   │   ├── TimelineObjectView.vue
│   │   │   ├── TimelineViewLayout.vue
│   │   │   ├── TimelineViewProvider.js
│   │   │   ├── configuration.js
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── timeline.scss
│   │   │   └── timelineInterceptor.js
│   │   ├── timelist/
│   │   │   ├── ExpandedViewItem.vue
│   │   │   ├── TimelistComponent.vue
│   │   │   ├── TimelistCompositionPolicy.js
│   │   │   ├── TimelistViewProvider.js
│   │   │   ├── constants.js
│   │   │   ├── inspector/
│   │   │   │   ├── EventProperties.vue
│   │   │   │   ├── FilteringComponent.vue
│   │   │   │   ├── TimeListInspectorViewProvider.js
│   │   │   │   └── TimelistPropertiesView.vue
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   ├── svg-progress.js
│   │   │   └── timelist.scss
│   │   ├── timer/
│   │   │   ├── TimerViewProvider.js
│   │   │   ├── actions/
│   │   │   │   ├── PauseTimerAction.js
│   │   │   │   ├── RestartTimerAction.js
│   │   │   │   ├── StartTimerAction.js
│   │   │   │   └── StopTimerAction.js
│   │   │   ├── components/
│   │   │   │   └── TimerComponent.vue
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── userIndicator/
│   │   │   ├── README.md
│   │   │   ├── components/
│   │   │   │   ├── MissionStatusPopup.vue
│   │   │   │   └── UserIndicator.vue
│   │   │   ├── plugin.js
│   │   │   ├── pluginSpec.js
│   │   │   └── user-indicator.scss
│   │   ├── utcTimeSystem/
│   │   │   ├── DurationFormat.js
│   │   │   ├── LocalClock.js
│   │   │   ├── UTCTimeFormat.js
│   │   │   ├── UTCTimeSystem.js
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── viewDatumAction/
│   │   │   ├── ViewDatumAction.js
│   │   │   ├── components/
│   │   │   │   ├── MetadataList.vue
│   │   │   │   └── metadata-list.scss
│   │   │   ├── plugin.js
│   │   │   └── pluginSpec.js
│   │   ├── viewLargeAction/
│   │   │   ├── plugin.js
│   │   │   └── viewLargeAction.js
│   │   └── webPage/
│   │       ├── WebPageViewProvider.js
│   │       ├── components/
│   │       │   └── WebPage.vue
│   │       ├── plugin.js
│   │       └── pluginSpec.js
│   ├── selection/
│   │   └── Selection.js
│   ├── styles/
│   │   ├── _about.scss
│   │   ├── _animations.scss
│   │   ├── _constants-darkmatter.scss
│   │   ├── _constants-espresso.scss
│   │   ├── _constants-maelstrom.scss
│   │   ├── _constants-mobile.scss
│   │   ├── _constants-snow.scss
│   │   ├── _constants.scss
│   │   ├── _controls.scss
│   │   ├── _forms.scss
│   │   ├── _global.scss
│   │   ├── _glyphs.scss
│   │   ├── _legacy-messages.scss
│   │   ├── _legacy-plots.scss
│   │   ├── _legacy.scss
│   │   ├── _limits.scss
│   │   ├── _mixins.scss
│   │   ├── _status.scss
│   │   ├── _table.scss
│   │   ├── fonts/
│   │   │   ├── Open MCT Symbols 12px.json
│   │   │   └── Open MCT Symbols 16px.json
│   │   ├── notebook.scss
│   │   ├── plotly.scss
│   │   ├── vendor/
│   │   │   └── normalize-min.scss
│   │   └── vue-styles.scss
│   ├── tools/
│   │   ├── url.js
│   │   └── urlSpec.js
│   ├── ui/
│   │   ├── color/
│   │   │   ├── Color.js
│   │   │   ├── ColorHelper.js
│   │   │   ├── ColorPalette.js
│   │   │   └── ColorSwatch.vue
│   │   ├── components/
│   │   │   ├── COMPONENTS.md
│   │   │   ├── ContextMenuDropDown.vue
│   │   │   ├── List/
│   │   │   │   ├── ListHeader.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── ListView.vue
│   │   │   │   └── list-view.scss
│   │   │   ├── ObjectFrame.vue
│   │   │   ├── ObjectLabel.vue
│   │   │   ├── ObjectPath.vue
│   │   │   ├── ObjectPathString.vue
│   │   │   ├── ObjectView.vue
│   │   │   ├── ProgressBar.vue
│   │   │   ├── SearchComponent.vue
│   │   │   ├── TimeSystemAxis.vue
│   │   │   ├── ToggleSwitch.vue
│   │   │   ├── ViewControl.vue
│   │   │   ├── object-frame.scss
│   │   │   ├── object-label.scss
│   │   │   ├── progress-bar.scss
│   │   │   ├── search.scss
│   │   │   ├── swim-lane/
│   │   │   │   ├── SwimLane.vue
│   │   │   │   └── swimlane.scss
│   │   │   ├── timesystem-axis.scss
│   │   │   └── toggle-switch.scss
│   │   ├── composables/
│   │   │   ├── alignmentContext.js
│   │   │   ├── edit.js
│   │   │   ├── event.js
│   │   │   └── resize.js
│   │   ├── inspector/
│   │   │   ├── InspectorDetailsSpec.js
│   │   │   ├── InspectorPanel.vue
│   │   │   ├── InspectorStylesSpec.js
│   │   │   ├── InspectorStylesSpecMocks.js
│   │   │   ├── InspectorTabs.vue
│   │   │   ├── InspectorViews.vue
│   │   │   ├── ObjectName.vue
│   │   │   └── inspector.scss
│   │   ├── layout/
│   │   │   ├── AboutDialog.vue
│   │   │   ├── AppLayout.vue
│   │   │   ├── AppLogo.vue
│   │   │   ├── BrowseBar.vue
│   │   │   ├── Container.js
│   │   │   ├── CreateButton.vue
│   │   │   ├── Frame.js
│   │   │   ├── LayoutSpec.js
│   │   │   ├── MctTree.vue
│   │   │   ├── MultipaneContainer.vue
│   │   │   ├── PaneContainer.vue
│   │   │   ├── RecentObjectsList.vue
│   │   │   ├── RecentObjectsListItem.vue
│   │   │   ├── ResizeHandle/
│   │   │   │   └── ResizeHandle.vue
│   │   │   ├── TreeItem.vue
│   │   │   ├── ViewSwitcher.vue
│   │   │   ├── app-logo.scss
│   │   │   ├── create-button.scss
│   │   │   ├── layout.scss
│   │   │   ├── mct-tree.scss
│   │   │   ├── pane.scss
│   │   │   ├── recent-objects.scss
│   │   │   ├── search/
│   │   │   │   ├── AnnotationSearchResult.vue
│   │   │   │   ├── GrandSearch.vue
│   │   │   │   ├── GrandSearchSpec.js
│   │   │   │   ├── ObjectSearchResult.vue
│   │   │   │   ├── SearchResultsDropDown.vue
│   │   │   │   └── search.scss
│   │   │   └── status-bar/
│   │   │       ├── NotificationBanner.vue
│   │   │       ├── StatusIndicators.vue
│   │   │       ├── indicators.scss
│   │   │       └── notification-banner.scss
│   │   ├── mixins/
│   │   │   ├── context-menu-gesture.js
│   │   │   ├── object-link.js
│   │   │   ├── staleness-mixin.js
│   │   │   └── toggle-mixin.js
│   │   ├── preview/
│   │   │   ├── PreviewAction.js
│   │   │   ├── PreviewContainer.vue
│   │   │   ├── PreviewHeader.vue
│   │   │   ├── ViewHistoricalDataAction.js
│   │   │   ├── plugin.js
│   │   │   └── preview.scss
│   │   ├── registries/
│   │   │   ├── InspectorViewRegistry.js
│   │   │   ├── ToolbarRegistry.js
│   │   │   └── ViewRegistry.js
│   │   ├── router/
│   │   │   ├── ApplicationRouter.js
│   │   │   ├── ApplicationRouterSpec.js
│   │   │   └── Browse.js
│   │   └── toolbar/
│   │       ├── ToolbarContainer.vue
│   │       └── components/
│   │           ├── ToolbarButton.vue
│   │           ├── ToolbarCheckbox.vue
│   │           ├── ToolbarColorPicker.vue
│   │           ├── ToolbarInput.vue
│   │           ├── ToolbarMenu.vue
│   │           ├── ToolbarSelectMenu.vue
│   │           ├── ToolbarSeparator.vue
│   │           ├── ToolbarToggleButton.vue
│   │           └── toolbar-checkbox.scss
│   └── utils/
│       ├── agent/
│       │   ├── Agent.js
│       │   └── AgentSpec.js
│       ├── clipboard.js
│       ├── clock/
│       │   └── DefaultClock.js
│       ├── constants.js
│       ├── debounce.js
│       ├── duration.js
│       ├── encoding.js
│       ├── mount.js
│       ├── raf.js
│       ├── rafSpec.js
│       ├── random.js
│       ├── sanitization.js
│       ├── staleness.js
│       ├── template/
│       │   ├── templateHelpers.js
│       │   └── templateHelpersSpec.js
│       ├── testing/
│       │   └── mockLocalStorage.js
│       ├── testing.js
│       ├── textHighlight/
│       │   └── TextHighlight.vue
│       ├── throttle.js
│       ├── useEventBus.js
│       ├── visibility/
│       │   └── VisibilityObserver.js
│       ├── vue/
│       │   ├── useDragResizer.js
│       │   ├── useFlexContainers.js
│       │   └── useIsEditing.js
│       └── vueWrapHtmlElement.js
└── tsconfig.json
Download .txt
Showing preview only (240K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2924 symbols across 559 files)

FILE: .eslintrc.cjs
  constant LEGACY_FILES (line 1) | const LEGACY_FILES = ['example/**'];

FILE: e2e/appActions.js
  function createDomainObjectWithDefaults (line 71) | async function createDomainObjectWithDefaults(
  function createNotification (line 135) | async function createNotification(page, createNotificationOptions) {
  function createPlanFromJSON (line 159) | async function createPlanFromJSON(page, { name, json, parent = 'mine' }) {
  function createExampleTelemetryObject (line 205) | async function createExampleTelemetryObject(page, parent = 'mine') {
  function createStableStateTelemetry (line 248) | async function createStableStateTelemetry(page, parent = 'mine') {
  function createOutOfOrderStateTelemetry (line 279) | async function createOutOfOrderStateTelemetry(page, parent = 'mine', dur...
  function navigateToObjectWithFixedTimeBounds (line 311) | async function navigateToObjectWithFixedTimeBounds(page, url, start, end) {
  function navigateToObjectWithRealTime (line 326) | async function navigateToObjectWithRealTime(page, url, start = '1800000'...
  function expandEntireTree (line 340) | async function expandEntireTree(page, treeName = 'Main Tree') {
  function getFocusedObjectUuid (line 368) | async function getFocusedObjectUuid(page) {
  function getHashUrlToDomainObject (line 387) | async function getHashUrlToDomainObject(page, identifier) {
  function _isInEditMode (line 416) | async function _isInEditMode(page, identifier) {
  function _setTimeConductorMode (line 427) | async function _setTimeConductorMode(page, isFixedTimespan = true) {
  function setFixedTimeMode (line 447) | async function setFixedTimeMode(page) {
  function setRealTimeMode (line 455) | async function setRealTimeMode(page) {
  function setTimeConductorOffset (line 475) | async function setTimeConductorOffset(
  function setStartOffset (line 517) | async function setStartOffset(page, { submitChanges = true, ...offset }) {
  function setEndOffset (line 529) | async function setEndOffset(page, { submitChanges = true, ...offset }) {
  function setTimeConductorBounds (line 548) | async function setTimeConductorBounds(page, { submitChanges = true, ...b...
  function setFixedIndependentTimeConductorBounds (line 588) | async function setFixedIndependentTimeConductorBounds(page, { start, end...
  function _setTimeBounds (line 607) | async function _setTimeBounds(page, startDate, endDate) {
  function waitForPlotsToRender (line 639) | async function waitForPlotsToRender(page, { timeout } = {}) {
  function getCanvasPixels (line 663) | async function getCanvasPixels(page, canvasSelector) {
  function linkParameterToObject (line 714) | async function linkParameterToObject(page, parameterName, objectName) {
  function renameCurrentObjectFromBrowseBar (line 732) | async function renameCurrentObjectFromBrowseBar(page, newName) {
  function getNextSineValueFromSWG (line 750) | async function getNextSineValueFromSWG(page, objectIdentifier, returnOnl...
  function expandInspectorPane (line 780) | async function expandInspectorPane(page) {
  function expandTreePane (line 789) | async function expandTreePane(page) {

FILE: e2e/avpFixtures.js
  constant TEST_RESULTS_DIR (line 44) | const TEST_RESULTS_DIR = path.join(__dirname, './test-results');
  function writeAccessibilityReport (line 98) | async function writeAccessibilityReport(reportPath, accessibilityScanRes...
  function scanForA11yViolations (line 121) | async function scanForA11yViolations(page, testCaseName, options = {}) {

FILE: e2e/baseFixtures.js
  function _consoleMessageToString (line 43) | function _consoleMessageToString(msg) {
  function waitForAnimations (line 56) | function waitForAnimations(locator) {

FILE: e2e/constants.js
  constant MISSION_TIME (line 9) | const MISSION_TIME = 1732413600000;
  constant MISSION_TIME_FIXED_START (line 11) | const MISSION_TIME_FIXED_START = 1732413600000 - 1800000;
  constant MISSION_TIME_FIXED_END (line 14) | const MISSION_TIME_FIXED_END = 1732413600000 + 60000;
  constant VISUAL_FIXED_URL (line 33) | const VISUAL_FIXED_URL = `./#/browse/mine?tc.mode=fixed&tc.startBound=${...
  constant VISUAL_REALTIME_URL (line 35) | const VISUAL_REALTIME_URL =

FILE: e2e/helper/addInitFileInputObject.js
  class DomainObjectViewProvider (line 1) | class DomainObjectViewProvider {
    method constructor (line 2) | constructor(openmct) {
    method canView (line 8) | canView(domainObject) {
    method view (line 12) | view(domainObject, objectPath) {

FILE: e2e/helper/addInitNotebookWithUrls.js
  constant NOTEBOOK_NAME (line 26) | const NOTEBOOK_NAME = 'Notebook';
  constant URL_WHITELIST (line 27) | const URL_WHITELIST = ['google.com'];

FILE: e2e/helper/addNoneditableObject.js
  method get (line 12) | get(identifier) {

FILE: e2e/helper/faultUtils.js
  function navigateToFaultManagementWithExample (line 30) | async function navigateToFaultManagementWithExample(page) {
  function navigateToFaultManagementWithStaticExample (line 42) | async function navigateToFaultManagementWithStaticExample(page) {
  function navigateToFaultManagementWithoutExample (line 54) | async function navigateToFaultManagementWithoutExample(page) {
  function navigateToFaultItemInTree (line 66) | async function navigateToFaultItemInTree(page) {
  function acknowledgeFault (line 87) | async function acknowledgeFault(page, rowNumber) {
  function shelveMultipleFaults (line 98) | async function shelveMultipleFaults(page, ...nums) {
  function acknowledgeMultipleFaults (line 113) | async function acknowledgeMultipleFaults(page, ...nums) {
  function shelveFault (line 128) | async function shelveFault(page, rowNumber) {
  function sortFaultsBy (line 139) | async function sortFaultsBy(page, sort) {
  function changeViewTo (line 148) | async function changeViewTo(page, view) {
  function selectFaultItem (line 157) | async function selectFaultItem(page, rowNumber) {
  function getFault (line 174) | function getFault(page, rowNumber) {
  function getFaultByName (line 185) | function getFaultByName(page, name) {
  function getFaultName (line 198) | async function getFaultName(page, rowNumber) {
  function getFaultNamespace (line 212) | async function getFaultNamespace(page, rowNumber) {
  function getFaultTriggerTime (line 226) | async function getFaultTriggerTime(page, rowNumber) {
  function openFaultRowMenu (line 240) | async function openFaultRowMenu(page, rowNumber) {

FILE: e2e/helper/hotkeys/clipboard.js
  function selectAll (line 29) | async function selectAll(page) {
  function copy (line 36) | async function copy(page) {
  function paste (line 43) | async function paste(page) {

FILE: e2e/helper/imageryUtils.js
  constant IMAGE_LOAD_DELAY (line 4) | const IMAGE_LOAD_DELAY = 5 * 1000;
  constant FIVE_MINUTES (line 5) | const FIVE_MINUTES = 1000 * 60 * 5;
  constant THIRTY_SECONDS (line 6) | const THIRTY_SECONDS = 1000 * 30;
  constant MOUSE_WHEEL_DELTA_Y (line 7) | const MOUSE_WHEEL_DELTA_Y = 120;
  function createImageryViewWithShortDelay (line 12) | async function createImageryViewWithShortDelay(page, { name, parent }) {

FILE: e2e/helper/notebookUtils.js
  constant NOTEBOOK_DROP_AREA (line 25) | const NOTEBOOK_DROP_AREA = '.c-notebook__drag-area';
  constant CUSTOM_NAME (line 26) | const CUSTOM_NAME = 'CUSTOM_NAME';
  function enterTextEntry (line 33) | async function enterTextEntry(page, text) {
  function addNotebookEntry (line 42) | async function addNotebookEntry(page) {
  function enterTextInLastEntry (line 49) | async function enterTextInLastEntry(page, text) {
  function dragAndDropEmbed (line 56) | async function dragAndDropEmbed(page, notebookObject) {
  function commitEntry (line 74) | async function commitEntry(page) {
  function startAndAddRestrictedNotebookObject (line 82) | async function startAndAddRestrictedNotebookObject(page) {
  function lockPage (line 98) | async function lockPage(page) {
  function createNotebookAndEntry (line 110) | async function createNotebookAndEntry(page, iterations = 1) {
  function createNotebookEntryAndTags (line 125) | async function createNotebookEntryAndTags(page, iterations = 1) {

FILE: e2e/helper/planningUtils.js
  function assertPlanActivities (line 35) | async function assertPlanActivities(page, plan, planObjectUrl) {
  function activitiesWithinTimeBounds (line 75) | function activitiesWithinTimeBounds(start1, end1, start2, end2) {
  function assertPlanOrderedSwimLanes (line 91) | async function assertPlanOrderedSwimLanes(page, plan, objectUrl) {
  function setBoundsToSpanAllActivities (line 115) | async function setBoundsToSpanAllActivities(page, planJson, planObjectUr...
  function getEarliestStartTime (line 130) | function getEarliestStartTime(planJson) {
  function getLatestEndTime (line 141) | function getLatestEndTime(planJson) {
  function getFirstActivity (line 152) | function getFirstActivity(planJson) {
  function setDraftStatusForPlan (line 165) | async function setDraftStatusForPlan(page, plan) {
  function addPlanGetInterceptor (line 171) | async function addPlanGetInterceptor(page) {
  function createTimelistWithPlanAndSetActivityInProgress (line 195) | async function createTimelistWithPlanAndSetActivityInProgress(page, plan...

FILE: e2e/helper/plotTagsUtils.js
  function createTags (line 34) | async function createTags({ page, canvas, xEnd = 700, yEnd = 520 }) {
  function testTelemetryItem (line 76) | async function testTelemetryItem(page, telemetryItem) {
  function basicTagsTests (line 108) | async function basicTagsTests(page) {

FILE: e2e/helper/stylingUtils.js
  function hexToRGB (line 31) | function hexToRGB(hex) {
  function setStyles (line 47) | async function setStyles(page, borderColorHex, backgroundColorHex, textC...
  function checkStyles (line 65) | async function checkStyles(
  function checkFontStyles (line 91) | async function checkFontStyles(expectedFontSize, expectedFontWeight, exp...

FILE: e2e/playwright-ci.config.js
  constant MAX_FAILURES (line 7) | const MAX_FAILURES = 5;
  constant NUM_WORKERS (line 8) | const NUM_WORKERS = 4;

FILE: e2e/playwright-mobile.config.js
  constant MAX_FAILURES (line 5) | const MAX_FAILURES = 5;

FILE: e2e/pluginFixtures.js
  function streamToString (line 158) | async function streamToString(readable) {

FILE: e2e/tests/framework/exampleTemplate.e2e.spec.js
  function renameTimerFrom3DotMenu (line 155) | async function renameTimerFrom3DotMenu(page, timerUrl, newNameForTimer) {

FILE: e2e/tests/functional/example/eventWithAcknowledgeGenerator.e2e.spec.js
  constant TELEMETRY_RATE (line 27) | const TELEMETRY_RATE = 2500;

FILE: e2e/tests/functional/forms.e2e.spec.js
  constant TEST_FOLDER (line 33) | const TEST_FOLDER = 'test folder';

FILE: e2e/tests/functional/missionStatus.e2e.spec.js
  function setMissionStatus (line 121) | async function setMissionStatus(page, action, status) {

FILE: e2e/tests/functional/planning/ganttChart.e2e.spec.js
  constant ONE_SECOND (line 135) | const ONE_SECOND = 1000;
  constant ONE_MINUTE (line 136) | const ONE_MINUTE = 60 * ONE_SECOND;
  constant ONE_HOUR (line 137) | const ONE_HOUR = ONE_MINUTE * 60;
  constant ONE_DAY (line 138) | const ONE_DAY = ONE_HOUR * 24;
  function normalizeAge (line 140) | function normalizeAge(num) {
  function padLeadingZeros (line 147) | function padLeadingZeros(num, numOfLeadingZeros) {
  function toDoubleDigits (line 151) | function toDoubleDigits(num) {
  function toTripleDigits (line 155) | function toTripleDigits(num) {
  function getPreciseDuration (line 159) | function getPreciseDuration(value, { excludeMilliSeconds, useDayFormat }...

FILE: e2e/tests/functional/planning/timelistControlledClock.e2e.spec.js
  constant TIME_TO_FROM_COLUMN (line 54) | const TIME_TO_FROM_COLUMN = 'countdown';
  constant COUNTDOWN_REGEXP (line 66) | const COUNTDOWN_REGEXP = /(-)?(\d+D\s)?(\d{2}):(\d{2}):(\d{2})/;
  constant COUNTDOWN (line 88) | const COUNTDOWN = Object.freeze({
  constant FIRST_ACTIVITY_SMALL_1 (line 96) | const FIRST_ACTIVITY_SMALL_1 = getFirstActivity(examplePlanSmall1);
  function getTimeListCellByName (line 201) | function getTimeListCellByName(page, rowName, columnName) {
  function getTimeListCellTextByName (line 215) | async function getTimeListCellTextByName(page, rowName, columnName) {
  function getAndAssertCountdownOrUpObject (line 227) | async function getAndAssertCountdownOrUpObject(page, rowName) {

FILE: e2e/tests/functional/plugins/displayLayout/displayLayout.e2e.spec.js
  constant CHILD_LAYOUT_STORAGE_STATE_PATH (line 35) | const CHILD_LAYOUT_STORAGE_STATE_PATH = fileURLToPath(
  constant TEST_DISPLAY_LAYOUT_ID (line 38) | const TEST_DISPLAY_LAYOUT_ID = {
  constant CHILD_PLOT_STORAGE_STATE_PATH (line 42) | const CHILD_PLOT_STORAGE_STATE_PATH = fileURLToPath(
  constant TINY_IMAGE_BASE64 (line 45) | const TINY_IMAGE_BASE64 =
  function selectFilterOption (line 626) | async function selectFilterOption(page, filterOption) {
  function addAndRemoveDrawingObjectAndAssert (line 638) | async function addAndRemoveDrawingObjectAndAssert(page, layoutObject, DI...
  function removeLayoutObject (line 657) | async function removeLayoutObject(page, layoutObject) {
  function addLayoutObject (line 674) | async function addLayoutObject(page, layoutName, layoutObject) {

FILE: e2e/tests/functional/plugins/faultManagement/faultManagement.e2e.spec.js
  function getFirstAndLastUnacknowledgedAndAcknowledgedFaults (line 311) | async function getFirstAndLastUnacknowledgedAndAcknowledgedFaults(allFau...

FILE: e2e/tests/functional/plugins/flexibleLayout/flexibleLayout.e2e.spec.js
  constant LOCALSTORAGE_PATH (line 31) | const LOCALSTORAGE_PATH = fileURLToPath(

FILE: e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js
  function performImageryViewOperationsAndAssert (line 655) | async function performImageryViewOperationsAndAssert(page, layoutObject) {
  function dragBrightnessSliderAndAssertFilterValues (line 733) | async function dragBrightnessSliderAndAssertFilterValues(page) {
  function dragContrastSliderAndAssertFilterValues (line 754) | async function dragContrastSliderAndAssertFilterValues(page) {
  function assertBackgroundImageBrightness (line 777) | async function assertBackgroundImageBrightness(page, expected) {
  function panZoomAndAssertImageProperties (line 790) | async function panZoomAndAssertImageProperties(page) {
  function mouseZoomOnImageAndAssert (line 840) | async function mouseZoomOnImageAndAssert(page, factor = 2) {
  function buttonZoomOnImageAndAssert (line 871) | async function buttonZoomOnImageAndAssert(page) {
  function assertBackgroundImageContrast (line 940) | async function assertBackgroundImageContrast(page, expected) {
  function zoomIntoImageryByButton (line 955) | async function zoomIntoImageryByButton(page) {
  function zoomOutOfImageryByButton (line 969) | async function zoomOutOfImageryByButton(page) {
  function resetImageryPanAndZoom (line 982) | async function resetImageryPanAndZoom(page) {
  function waitForZoomAndPanTransitions (line 996) | async function waitForZoomAndPanTransitions(page) {

FILE: e2e/tests/functional/plugins/imagery/exampleImageryControlledClock.e2e.spec.js
  function assertBackgroundImageUrlFromBackgroundCss (line 476) | async function assertBackgroundImageUrlFromBackgroundCss(page) {

FILE: e2e/tests/functional/plugins/importAndExportAsJSON/exportAsJson.e2e.spec.js
  function getFirstKeyFromOpenMctJson (line 199) | function getFirstKeyFromOpenMctJson(jsonData) {

FILE: e2e/tests/functional/plugins/lad/lad.e2e.spec.js
  function openObjectTreeContextMenu (line 318) | async function openObjectTreeContextMenu(page, url) {

FILE: e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js
  constant NOTEBOOK_NAME (line 37) | const NOTEBOOK_NAME = 'Notebook';
  function enterAndCommitTextEntry (line 642) | async function enterAndCommitTextEntry(page, text) {
  function verifyNameChange (line 654) | async function verifyNameChange(page, newName) {

FILE: e2e/tests/functional/plugins/notebook/notebookSnapshotImage.e2e.spec.js
  constant NOTEBOOK_NAME (line 33) | const NOTEBOOK_NAME = 'Notebook';

FILE: e2e/tests/functional/plugins/notebook/notebookWithCouchDB.e2e.spec.js
  function addTagAndAwaitNetwork (line 86) | async function addTagAndAwaitNetwork(page, tagName) {

FILE: e2e/tests/functional/plugins/notebook/restrictedNotebook.e2e.spec.js
  constant TEST_TEXT (line 31) | const TEST_TEXT = 'Testing text for entries.';
  constant TEST_TEXT_NAME (line 32) | const TEST_TEXT_NAME = 'Test Page';
  function openObjectTreeContextMenu (line 195) | async function openObjectTreeContextMenu(page, url) {

FILE: e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js
  function testYTicks (line 137) | async function testYTicks(page, values) {

FILE: e2e/tests/functional/plugins/plot/logPlot.e2e.spec.js
  function testRegularTicks (line 107) | async function testRegularTicks(page) {
  function testLogTicks (line 122) | async function testLogTicks(page) {
  function enableEditMode (line 139) | async function enableEditMode(page) {
  function enableLogMode (line 148) | async function enableLogMode(page) {
  function disableLogMode (line 156) | async function disableLogMode(page) {
  function testLogPlotPixels (line 166) | async function testLogPlotPixels(page) {

FILE: e2e/tests/functional/plugins/plot/overlayPlot.e2e.spec.js
  function assertLimitLinesExistAndAreVisible (line 386) | async function assertLimitLinesExistAndAreVisible(page) {

FILE: e2e/tests/functional/plugins/plot/plotRendering.e2e.spec.js
  function editSineWaveToUseInfinityOption (line 129) | async function editSineWaveToUseInfinityOption(page, sineWaveGeneratorOb...

FILE: e2e/tests/functional/plugins/plot/plotViewActions.e2e.spec.js
  constant SWG_NAME (line 30) | const SWG_NAME = 'Sine Wave Generator';
  constant OVERLAY_PLOT_NAME (line 31) | const OVERLAY_PLOT_NAME = 'Overlay Plot';
  constant STACKED_PLOT_NAME (line 32) | const STACKED_PLOT_NAME = 'Stacked Plot';

FILE: e2e/tests/functional/plugins/plot/stackedPlot.e2e.spec.js
  function assertAggregateLegendIsVisible (line 362) | async function assertAggregateLegendIsVisible(page) {

FILE: e2e/tests/functional/plugins/plot/timeTicks.e2e.spec.js
  function testYearTimeSeriesTicks (line 164) | async function testYearTimeSeriesTicks(page) {
  function testDaysTimeSeriesTicks (line 173) | async function testDaysTimeSeriesTicks(page) {
  function testHoursTimeSeriesTicks (line 183) | async function testHoursTimeSeriesTicks(page) {
  function testMinutesTimeSeriesTicks (line 196) | async function testMinutesTimeSeriesTicks(page) {
  function testSecondsTimeSeriesTicks (line 212) | async function testSecondsTimeSeriesTicks(page) {

FILE: e2e/tests/functional/plugins/styling/conditionSetStyling.e2e.spec.js
  function waitForStyleChange (line 156) | async function waitForStyleChange(element, expectedStyle, timeout = 0) {

FILE: e2e/tests/functional/plugins/styling/conditional/displayLayoutConditionalStyling.e2e.spec.js
  constant TINY_IMAGE_BASE64 (line 31) | const TINY_IMAGE_BASE64 =

FILE: e2e/tests/functional/plugins/styling/flexLayoutStyling.e2e.spec.js
  constant NO_STYLE_RGBA (line 39) | const NO_STYLE_RGBA = 'rgba(0, 0, 0, 0)';

FILE: e2e/tests/functional/plugins/styling/stackedPlotStyling.e2e.spec.js
  constant NO_STYLE_RGBA (line 40) | const NO_STYLE_RGBA = 'rgba(0, 0, 0, 0)';
  constant DEFAULT_PLOT_VIEW_BORDER_COLOR (line 41) | const DEFAULT_PLOT_VIEW_BORDER_COLOR = '#acacac';

FILE: e2e/tests/functional/plugins/telemetryTable/telemetryTable.e2e.spec.js
  function getScrollPosition (line 224) | async function getScrollPosition(page, top = true) {

FILE: e2e/tests/functional/plugins/timeConductor/datepicker.e2e.spec.js
  constant FIXED_TIME_URL (line 30) | const FIXED_TIME_URL = './#/browse/mine';

FILE: e2e/tests/functional/plugins/timer/timer.e2e.spec.js
  function triggerTimerContextMenuAction (line 139) | async function triggerTimerContextMenuAction(page, timerUrl, action) {
  function triggerTimer3dotMenuAction (line 151) | async function triggerTimer3dotMenuAction(page, action) {
  function triggerTimerViewAction (line 173) | async function triggerTimerViewAction(page, action) {
  function buttonTitleFromAction (line 184) | function buttonTitleFromAction(action) {
  function assertTimerStateAfterAction (line 200) | async function assertTimerStateAfterAction(page, action) {
  function openObjectTreeContextMenu (line 228) | async function openObjectTreeContextMenu(page, url) {

FILE: e2e/tests/functional/recentObjects.e2e.spec.js
  function assertInitialRecentObjectsListState (line 346) | function assertInitialRecentObjectsListState() {

FILE: e2e/tests/functional/renaming.e2e.spec.js
  function renameObjectFromContextMenu (line 83) | async function renameObjectFromContextMenu(page, url, newName) {
  function openObjectTreeContextMenu (line 99) | async function openObjectTreeContextMenu(page, url) {

FILE: e2e/tests/functional/search.e2e.spec.js
  function waitForSearchCompletion (line 385) | async function waitForSearchCompletion(page) {
  function createObjectsForSearch (line 402) | async function createObjectsForSearch(page) {

FILE: e2e/tests/functional/tree.e2e.spec.js
  method get (line 281) | get({ key }) {
  function getAndAssertTreeItems (line 347) | async function getAndAssertTreeItems(page, expected) {
  function renameObjectFromContextMenu (line 359) | async function renameObjectFromContextMenu(page, url, newName) {
  function openObjectTreeContextMenu (line 374) | async function openObjectTreeContextMenu(page, url) {

FILE: e2e/tests/performance/memory/navigation.memory.perf.spec.js
  function navigateToObjectAndDetectMemoryLeak (line 286) | async function navigateToObjectAndDetectMemoryLeak(page, objectName) {

FILE: e2e/tests/visual-a11y/imagery.visual.spec.js
  constant TEN_MINUTES (line 27) | const TEN_MINUTES = 10 * 60 * 1000;
  function scrollLastThumbnailIntoView (line 109) | async function scrollLastThumbnailIntoView(page) {

FILE: e2e/tests/visual-a11y/planning-gantt.visual.spec.js
  constant FIRST_ACTIVITY_SMALL_2 (line 43) | const FIRST_ACTIVITY_SMALL_2 = getFirstActivity(examplePlanSmall2);

FILE: e2e/tests/visual-a11y/planning-timestrip.visual.spec.js
  constant FIRST_ACTIVITY_SMALL_2 (line 36) | const FIRST_ACTIVITY_SMALL_2 = getFirstActivity(examplePlanSmall2);

FILE: e2e/tests/visual-a11y/planning-view.visual.spec.js
  constant FIRST_ACTIVITY_SMALL_2 (line 39) | const FIRST_ACTIVITY_SMALL_2 = getFirstActivity(examplePlanSmall2);

FILE: example/dataVisualization/ExampleDataVisualizationSourceViewProvider.js
  function ExampleDataVisualizationSourceViewProvider (line 27) | function ExampleDataVisualizationSourceViewProvider(openmct) {

FILE: example/dataVisualization/plugin.js
  method initialize (line 33) | initialize(domainObject) {

FILE: example/eventGenerator/EventLimitProvider.js
  constant SEVERITY_CSS (line 23) | const SEVERITY_CSS = {
  constant NOMINAL_SEVERITY (line 31) | const NOMINAL_SEVERITY = {
  class EventLimitProvider (line 41) | class EventLimitProvider {
    method constructor (line 42) | constructor(openmct) {
    method getLimitEvaluator (line 46) | getLimitEvaluator(domainObject) {
    method getSeverity (line 72) | getSeverity(datum, valueMetadata) {
    method supportsLimits (line 85) | supportsLimits(domainObject) {

FILE: example/eventGenerator/EventMetadataProvider.js
  class EventMetadataProvider (line 23) | class EventMetadataProvider {
    method constructor (line 24) | constructor() {
    method supportsMetadata (line 74) | supportsMetadata(domainObject) {
    method getMetadata (line 78) | getMetadata(domainObject) {

FILE: example/eventGenerator/EventTelemetryProvider.js
  constant DUR_MIN (line 30) | const DUR_MIN = 1000;
  constant DUR_MAX (line 31) | const DUR_MAX = 10000;
  class EventTelemetryProvider (line 32) | class EventTelemetryProvider {
    method constructor (line 33) | constructor() {
    method generateData (line 37) | generateData(firstObservedTime, count, startTime, duration, name) {
    method supportsRequest (line 59) | supportsRequest(domainObject) {
    method supportsSubscribe (line 63) | supportsSubscribe(domainObject) {
    method subscribe (line 67) | subscribe(domainObject, callback) {
    method request (line 90) | request(domainObject, options) {

FILE: example/eventGenerator/EventWithAcknowledgeTelemetryProvider.js
  class EventWithAcknowledgeTelemetryProvider (line 29) | class EventWithAcknowledgeTelemetryProvider extends EventTelemetryProvid...
    method constructor (line 30) | constructor() {
    method generateData (line 36) | generateData(firstObservedTime, count, startTime, duration, name) {
    method supportsRequest (line 61) | supportsRequest(domainObject) {
    method supportsSubscribe (line 65) | supportsSubscribe(domainObject) {

FILE: example/eventGenerator/plugin.js
  function EventGeneratorPlugin (line 27) | function EventGeneratorPlugin(options) {

FILE: example/exampleStalenessProvider/ExampleStalenessProvider.js
  class ExampleStalenessProvider (line 26) | class ExampleStalenessProvider {
    method constructor (line 28) | constructor(openmct, config = { stalenessInterval: 3000, reportStalene...
    method #observeTimeSystem (line 39) | #observeTimeSystem() {
    method supportsStaleness (line 45) | supportsStaleness(domainObject) {
    method subscribeToStaleness (line 49) | subscribeToStaleness(domainObject, callback) {
    method #observeStaleness (line 66) | #observeStaleness() {
    method isStale (line 98) | async isStale(domainObject) {
    method #updateLatestReceivedTelemetry (line 123) | #updateLatestReceivedTelemetry(domainObject, datum) {

FILE: example/exampleStalenessProvider/plugin.js
  function ExampleStalenessPlugin (line 25) | function ExampleStalenessPlugin(config) {

FILE: example/exampleTags/plugin.js
  function exampleTagsPlugin (line 34) | function exampleTagsPlugin(options) {

FILE: example/exampleUser/ExampleUserProvider.js
  constant STATUSES (line 28) | const STATUSES = [
  constant MISSION_STATUSES (line 64) | const MISSION_STATUSES = [
  class ExampleUserProvider (line 77) | class ExampleUserProvider extends EventEmitter {
    method constructor (line 79) | constructor(
    method isLoggedIn (line 107) | isLoggedIn() {
    method autoLogin (line 111) | autoLogin(username) {
    method getCurrentUser (line 115) | getCurrentUser() {
    method canProvideStatusForRole (line 123) | canProvideStatusForRole(role) {
    method canSetPollQuestion (line 127) | canSetPollQuestion() {
    method canSetMissionStatus (line 131) | canSetMissionStatus() {
    method hasRole (line 135) | hasRole(roleId) {
    method getPossibleRoles (line 143) | getPossibleRoles() {
    method getPossibleMissionActions (line 147) | getPossibleMissionActions() {
    method getPossibleMissionActionStatuses (line 151) | getPossibleMissionActionStatuses() {
    method getStatusForMissionAction (line 155) | getStatusForMissionAction(action) {
    method setStatusForMissionAction (line 159) | setStatusForMissionAction(action, status) {
    method getAllStatusRoles (line 169) | getAllStatusRoles() {
    method getStatusForRole (line 173) | getStatusForRole(role) {
    method getDefaultStatusForRole (line 179) | async getDefaultStatusForRole(role) {
    method setStatusForRole (line 185) | setStatusForRole(role, status) {
    method getPollQuestion (line 198) | async getPollQuestion() {
    method setPollQuestion (line 206) | setPollQuestion(pollQuestion) {
    method getPossibleStatuses (line 223) | getPossibleStatuses() {
    method _login (line 227) | _login() {

FILE: example/exampleUser/exampleUserCreator.js
  function createExampleUser (line 23) | function createExampleUser(UserClass) {

FILE: example/exampleUser/plugin.js
  constant AUTO_LOGIN_USER (line 24) | const AUTO_LOGIN_USER = 'mct-user';
  constant STATUS_ROLES (line 25) | const STATUS_ROLES = ['flight', 'driver'];
  function ExampleUserPlugin (line 27) | function ExampleUserPlugin(

FILE: example/faultManagement/exampleFaultSource.js
  method request (line 33) | request(domainObject, options) {
  method subscribe (line 36) | subscribe(domainObject, callback) {
  method supportsRequest (line 41) | supportsRequest(domainObject) {
  method supportsSubscribe (line 44) | supportsSubscribe(domainObject) {
  method acknowledgeFault (line 47) | acknowledgeFault(fault, { comment = '' }) {
  method shelveFault (line 54) | shelveFault(fault, duration) {
  method getShelveDurations (line 61) | getShelveDurations() {

FILE: example/faultManagement/utils.js
  constant SEVERITIES (line 23) | const SEVERITIES = ['WATCH', 'WARNING', 'CRITICAL'];
  constant MOONWALK_TIMESTAMP (line 24) | const MOONWALK_TIMESTAMP = 14159040000;
  constant NAMESPACE (line 25) | const NAMESPACE = '/Example/fault-';
  function shelveFault (line 70) | function shelveFault(fault, opts = { shelved: true, comment: '', shelveD...
  function acknowledgeFault (line 78) | function acknowledgeFault(fault) {
  function randomFaults (line 82) | function randomFaults(staticFaults, count = 5) {

FILE: example/generator/GeneratorMetadataProvider.js
  constant METADATA_BY_TYPE (line 1) | const METADATA_BY_TYPE = {
  function GeneratorMetadataProvider (line 140) | function GeneratorMetadataProvider() {}

FILE: example/generator/GeneratorProvider.js
  constant REQUEST_DEFAULTS (line 25) | const REQUEST_DEFAULTS = {
  function GeneratorProvider (line 37) | function GeneratorProvider(openmct, StalenessProvider) {

FILE: example/generator/SinewaveLimitProvider.js
  function SinewaveLimitProvider (line 70) | function SinewaveLimitProvider() {}

FILE: example/generator/SinewaveStalenessProvider.js
  class SinewaveLimitProvider (line 25) | class SinewaveLimitProvider extends EventEmitter {
    method constructor (line 30) | constructor(openmct) {
    method supportsStaleness (line 38) | supportsStaleness(domainObject) {
    method isStale (line 42) | isStale(domainObject, options) {
    method subscribeToStaleness (line 59) | subscribeToStaleness(domainObject, callback) {
    method #handleClockUpdate (line 85) | #handleClockUpdate() {
    method #realTimeCheck (line 97) | #realTimeCheck() {
    method #updateStaleness (line 105) | #updateStaleness(id, isStale) {
    method #createObserver (line 118) | #createObserver(id, callback) {
    method #destroyObserver (line 129) | #destroyObserver(id) {
    method #providingStaleness (line 135) | #providingStaleness(domainObject) {
    method #getObjectKeyString (line 139) | #getObjectKeyString(object) {
    method #addCallbackToObserver (line 143) | #addCallbackToObserver(id, callback) {
    method #observerExists (line 147) | #observerExists(id) {

FILE: example/generator/StateGeneratorProvider.js
  class StateGeneratorProvider (line 23) | class StateGeneratorProvider {
    method constructor (line 24) | constructor(openmct) {
    method supportsRequest (line 28) | supportsRequest(domainObject, options) {
    method supportsSubscribe (line 32) | supportsSubscribe(domainObject) {
    method subscribe (line 36) | subscribe(domainObject, callback, options) {
    method request (line 61) | request(domainObject, options) {
    method #pointForTimestamp (line 83) | #pointForTimestamp(timestamp, duration, name, flip = false) {
    method #shouldBeFiltered (line 96) | #shouldBeFiltered(point, options) {

FILE: example/generator/WorkerInterface.js
  function WorkerInterface (line 25) | function WorkerInterface(openmct, StalenessProvider) {
  function callback (line 76) | function callback(message) {

FILE: example/generator/generatorWorker.js
  function workSubscriptions (line 34) | function workSubscriptions(timestamp) {
  function onSubscribe (line 52) | function onSubscribe(message) {
  function onUnsubscribe (line 116) | function onUnsubscribe(message) {
  function onRequest (line 120) | function onRequest(message) {
  function createDataPoint (line 173) | function createDataPoint(time, request) {
  function postOnRequest (line 202) | function postOnRequest(message, request, data) {
  function cos (line 218) | function cos(
  function sin (line 247) | function sin(
  function getRandomFloat32OverflowValue (line 277) | function getRandomFloat32OverflowValue() {
  function wavelengths (line 283) | function wavelengths() {
  function intensities (line 295) | function intensities() {
  function sendError (line 307) | function sendError(error, message) {

FILE: example/imagery/plugin.js
  constant DEFAULT_IMAGE_SAMPLES (line 25) | const DEFAULT_IMAGE_SAMPLES = [
  constant DEFAULT_IMAGE_LOAD_DELAY_IN_MILLISECONDS (line 45) | const DEFAULT_IMAGE_LOAD_DELAY_IN_MILLISECONDS = 20000;
  constant MIN_IMAGE_LOAD_DELAY_IN_MILLISECONDS (line 46) | const MIN_IMAGE_LOAD_DELAY_IN_MILLISECONDS = 5000;
  function getCompassValues (line 167) | function getCompassValues(min, max, timestamp) {
  function getImageSamples (line 171) | function getImageSamples(configuration) {
  function getImageUrlListFromConfig (line 181) | function getImageUrlListFromConfig(configuration) {
  function getImageLoadDelay (line 185) | function getImageLoadDelay(domainObject) {
  function getRealtimeProvider (line 212) | function getRealtimeProvider(openmct) {
  function getHistoricalProvider (line 230) | function getHistoricalProvider(openmct) {
  function getLadProvider (line 252) | function getLadProvider(openmct) {
  function pointForTimestamp (line 271) | function pointForTimestamp(timestamp, name, imageSamples, delay) {

FILE: src/MCT.js
  class MCT (line 76) | class MCT extends EventEmitter {
    method constructor (line 94) | constructor() {
    method setAssetPath (line 314) | setAssetPath(assetPath) {
    method getAssetPath (line 321) | getAssetPath() {
    method #bootstrap (line 333) | #bootstrap(domElementOrSelector, isHeadlessMode) {
    method start (line 404) | start(domElementOrSelector, isHeadlessMode = false) {
    method startHeadless (line 417) | startHeadless() {
    method install (line 428) | install(plugin) {
    method destroy (line 432) | destroy() {

FILE: src/api/Branding.js
  function Branding (line 39) | function Branding(options) {

FILE: src/api/Editor.js
  class Editor (line 25) | class Editor extends EventEmitter {
    method constructor (line 26) | constructor(openmct) {
    method edit (line 37) | edit() {
    method isEditing (line 50) | isEditing() {
    method save (line 58) | async save() {
    method cancel (line 69) | cancel() {

FILE: src/api/actions/ActionCollection.js
  class ActionCollection (line 30) | class ActionCollection extends EventEmitter {
    method constructor (line 39) | constructor(applicableActions, objectPath, view, openmct, skipEnvironm...
    method disable (line 67) | disable(actionKeys) {
    method enable (line 80) | enable(actionKeys) {
    method hide (line 93) | hide(actionKeys) {
    method show (line 106) | show(actionKeys) {
    method destroy (line 118) | destroy() {
    method getVisibleActions (line 135) | getVisibleActions() {
    method getStatusBarActions (line 154) | getStatusBarActions() {
    method getActionsObject (line 173) | getActionsObject() {
    method _update (line 181) | _update() {
    method _observeObjectPath (line 189) | _observeObjectPath() {
    method _updateActions (line 220) | _updateActions() {
    method _mergeOldAndNewActions (line 237) | _mergeOldAndNewActions(oldActions, newActions) {

FILE: src/api/actions/ActionsAPI.js
  class ActionsAPI (line 31) | class ActionsAPI extends EventEmitter {
    method constructor (line 35) | constructor(openmct) {
    method register (line 58) | register(actionDefinition) {
    method getAction (line 67) | getAction(key) {
    method getActionsCollection (line 77) | getActionsCollection(objectPath, view) {
    method updateGroupOrder (line 92) | updateGroupOrder(groupArray) {
    method _getCachedActionCollection (line 102) | _getCachedActionCollection(objectPath, view) {
    method _newActionCollection (line 113) | _newActionCollection(objectPath, view, skipEnvironmentObservers) {
    method _cacheActionCollection (line 135) | _cacheActionCollection(view, actionCollection) {
    method _updateCachedActionCollections (line 144) | _updateCachedActionCollections(view) {
    method _applicableActions (line 159) | _applicableActions(objectPath, view) {
    method _groupAndSortActions (line 186) | _groupAndSortActions(actionsArray = []) {

FILE: src/api/annotation/AnnotationAPI.js
  constant ANNOTATION_TYPES (line 36) | const ANNOTATION_TYPES = Object.freeze({
  constant ANNOTATION_TYPE (line 47) | const ANNOTATION_TYPE = 'annotation';
  constant ANNOTATION_LAST_CREATED (line 52) | const ANNOTATION_LAST_CREATED = 'annotationLastCreated';
  class AnnotationAPI (line 85) | class AnnotationAPI extends EventEmitter {
    method constructor (line 92) | constructor(openmct) {
    method create (line 137) | async create({
    method #updateAnnotationModified (line 208) | #updateAnnotationModified(targetDomainObject) {
    method defineTag (line 224) | defineTag(tagKey, tagsDefinition) {
    method setNamespaceToSaveAnnotations (line 232) | setNamespaceToSaveAnnotations(namespace) {
    method isAnnotation (line 241) | isAnnotation(domainObject) {
    method getAvailableTags (line 249) | getAvailableTags() {
    method getAnnotations (line 270) | async getAnnotations(domainObjectIdentifier, abortSignal = null) {
    method deleteAnnotations (line 289) | deleteAnnotations(annotations) {
    method unDeleteAnnotation (line 305) | unDeleteAnnotation(annotation) {
    method getTagsFromAnnotations (line 319) | getTagsFromAnnotations(annotations, filterDuplicates = true) {
    method #addTagMetaInformationToTags (line 348) | #addTagMetaInformationToTags(tags) {
    method #getMatchingTags (line 365) | #getMatchingTags(query) {
    method #combineSameTargets (line 414) | #combineSameTargets(results) {
    method #breakApartSeparateTargets (line 436) | #breakApartSeparateTargets(results) {
    method #addTagMetaInformationToResults (line 463) | #addTagMetaInformationToResults(results, matchingTagKeys) {
    method #addTargetModelsToResults (line 483) | async #addTargetModelsToResults(results, abortSignal) {
    method searchForTags (line 520) | async searchForTags(query, abortSignal) {
    method addTargetComparator (line 562) | addTargetComparator(annotationType, comparator) {
    method areAnnotationTargetsEqual (line 577) | areAnnotationTargetsEqual(annotationType, targets, otherTargets) {
    method isAnnotatableType (line 591) | isAnnotatableType(type) {

FILE: src/api/composition/CompositionAPI.js
  class CompositionAPI (line 45) | class CompositionAPI {
    method constructor (line 49) | constructor(publicAPI) {
    method addProvider (line 67) | addProvider(provider) {
    method get (line 77) | get(domainObject) {
    method addPolicy (line 111) | addPolicy(policy) {
    method checkPolicy (line 128) | checkPolicy(container, containee) {
    method supportsComposition (line 140) | supportsComposition(domainObject) {

FILE: src/api/composition/CompositionCollection.js
  class CompositionCollection (line 59) | class CompositionCollection {
    method constructor (line 74) | constructor(domainObject, provider, publicAPI) {
    method on (line 109) | on(event, callback, context) {
    method off (line 141) | off(event, callback, context) {
    method add (line 184) | add(child, skipMutate) {
    method load (line 210) | async load(abortSignal) {
    method remove (line 241) | remove(child, skipMutate) {
    method reorder (line 266) | reorder(oldIndex, newIndex, _skipMutate) {
    method _destroy (line 272) | _destroy() {
    method #onProviderReorder (line 283) | #onProviderReorder(reorderMap) {
    method #onProviderAdd (line 293) | #onProviderAdd(childId) {
    method #onProviderRemove (line 307) | #onProviderRemove(child) {
    method #emit (line 318) | #emit(event, ...payload) {
    method #cleanUpMutables (line 332) | #cleanUpMutables() {

FILE: src/api/composition/CompositionProvider.js
  class CompositionProvider (line 55) | class CompositionProvider {
    method constructor (line 63) | constructor(publicAPI, compositionAPI) {
    method listeningTo (line 71) | get listeningTo() {
    method establishTopicListener (line 75) | get establishTopicListener() {
    method publicAPI (line 79) | get publicAPI() {
    method appliesTo (line 91) | appliesTo(domainObject) {
    method load (line 103) | load(domainObject) {
    method on (line 115) | on(domainObject, event, callback, context) {
    method off (line 128) | off(domainObject, event, callback, context) {
    method remove (line 141) | remove(domainObject, childId) {
    method add (line 154) | add(parent, childId) {
    method includes (line 163) | includes(parent, childId) {
    method reorder (line 173) | reorder(domainObject, oldIndex, newIndex) {
    method #establishTopicListener (line 181) | #establishTopicListener() {
    method #cannotContainItself (line 198) | #cannotContainItself(parent, child) {
    method #supportsComposition (line 209) | #supportsComposition(parent, _child) {
    method #onMutation (line 219) | #onMutation(newDomainObject, oldDomainObject) {

FILE: src/api/composition/DefaultCompositionProvider.js
  class DefaultCompositionProvider (line 56) | class DefaultCompositionProvider extends CompositionProvider {
    method appliesTo (line 65) | appliesTo(domainObject) {
    method load (line 77) | load(domainObject) {
    method on (line 94) | on(domainObject, event, callback, context) {
    method off (line 125) | off(domainObject, event, callback, context) {
    method remove (line 155) | remove(domainObject, childId) {
    method add (line 174) | add(parent, childId) {
    method includes (line 188) | includes(parent, childId) {
    method reorder (line 201) | reorder(domainObject, oldIndex, newIndex) {

FILE: src/api/faultmanagement/FaultManagementAPI.js
  constant DEFAULT_SHELVE_DURATIONS (line 24) | const DEFAULT_SHELVE_DURATIONS = [
  class FaultManagementAPI (line 49) | class FaultManagementAPI {
    method constructor (line 53) | constructor(openmct) {
    method addProvider (line 63) | addProvider(provider) {
    method supportsActions (line 73) | supportsActions() {
    method request (line 88) | request(domainObject) {
    method subscribe (line 106) | subscribe(domainObject, callback) {
    method acknowledgeFault (line 121) | acknowledgeFault(fault, ackData) {
    method shelveFault (line 132) | shelveFault(fault, shelveData) {
    method getShelveDurations (line 141) | getShelveDurations() {

FILE: src/api/faultmanagement/FaultManagementAPISpec.js
  method request (line 60) | request() {
  method subscribe (line 63) | subscribe(domainObject, callback) {
  method supportsRequest (line 66) | supportsRequest(domainObject) {
  method supportsSubscribe (line 69) | supportsSubscribe(domainObject) {
  method acknowledgeFault (line 72) | acknowledgeFault(fault, { comment = '' }) {
  method shelveFault (line 77) | shelveFault(fault, shelveData) {

FILE: src/api/forms/FormController.js
  constant DEFAULT_CONTROLS_MAP (line 38) | const DEFAULT_CONTROLS_MAP = {
  class FormControl (line 52) | class FormControl {
    method constructor (line 59) | constructor(openmct) {
    method addControl (line 70) | addControl(controlName, controlViewProvider) {
    method getControl (line 85) | getControl(controlName) {
    method _addDefaultFormControls (line 97) | _addDefaultFormControls() {
    method _getControlViewProvider (line 109) | _getControlViewProvider(control) {

FILE: src/api/forms/FormsAPI.js
  class FormsAPI (line 32) | class FormsAPI {
    method constructor (line 37) | constructor(openmct) {
    method addNewFormControl (line 60) | addNewFormControl(controlName, controlViewProvider) {
    method getFormControl (line 70) | getFormControl(controlName) {
    method showForm (line 103) | showForm(formStructure, { onChange } = {}) {
    method showCustomForm (line 148) | showCustomForm(formStructure, { element, onChange } = {}) {

FILE: src/api/forms/toggle-check-box-mixin.js
  method data (line 25) | data() {
  method toggleCheckBox (line 31) | toggleCheckBox(event) {

FILE: src/api/indicators/IndicatorAPI.js
  class IndicatorAPI (line 35) | class IndicatorAPI extends EventEmitter {
    method constructor (line 38) | constructor(openmct) {
    method getIndicatorObjectsByPriority (line 45) | getIndicatorObjectsByPriority() {
    method simpleIndicator (line 51) | simpleIndicator() {
    method add (line 95) | add(indicator) {

FILE: src/api/indicators/IndicatorAPISpec.js
  function generateHTMLIndicator (line 38) | function generateHTMLIndicator(className, label, priority) {
  function generateVueIndicator (line 51) | function generateVueIndicator(priority) {

FILE: src/api/indicators/SimpleIndicator.js
  constant DEFAULT_ICON_CLASS (line 29) | const DEFAULT_ICON_CLASS = 'icon-info';
  class SimpleIndicator (line 31) | class SimpleIndicator extends EventEmitter {
    method constructor (line 32) | constructor(openmct) {
    method text (line 55) | text(text) {
    method description (line 70) | description(description) {
    method iconClass (line 79) | iconClass(iconClass) {
    method statusClass (line 97) | statusClass(statusClass) {
    method click (line 113) | click(event) {
    method getElement (line 117) | getElement() {

FILE: src/api/menu/MenuAPI.js
  class MenuAPI (line 29) | class MenuAPI {
    method constructor (line 33) | constructor(openmct) {
    method showMenu (line 51) | showMenu(x, y, items, menuOptions) {
    method actionsToMenuItems (line 64) | actionsToMenuItems(actions, objectPath, view) {
    method showSuperMenu (line 84) | showSuperMenu(x, y, actions, menuOptions) {
    method _clearMenuComponent (line 94) | _clearMenuComponent() {
    method _createMenuComponent (line 107) | _createMenuComponent(x, y, actions, menuOptions = {}) {
    method _showObjectMenu (line 131) | _showObjectMenu(objectPath, x, y, actionsToBeIncluded) {

FILE: src/api/menu/menu.js
  constant MENU_PLACEMENT (line 34) | const MENU_PLACEMENT = {
  class Menu (line 49) | class Menu extends EventEmitter {
    method constructor (line 54) | constructor(options) {
    method dismiss (line 71) | dismiss() {
    method showMenu (line 83) | showMenu() {
    method showSuperMenu (line 105) | showSuperMenu() {
    method show (line 130) | show() {

FILE: src/api/menu/mixins/popupMenuMixin.js
  method _calculatePopupPosition (line 7) | _calculatePopupPosition(menuElement) {
  method _getMenuPositionBasedOnPlacement (line 21) | _getMenuPositionBasedOnPlacement(menuDimensions) {
  method _preventMenuOverflow (line 63) | _preventMenuOverflow(menuPosition, menuDimensions) {
  method mounted (line 90) | mounted() {
  method data (line 97) | data() {
  method styleObject (line 104) | styleObject() {

FILE: src/api/notifications/NotificationAPI.js
  constant DEFAULT_AUTO_DISMISS_TIMEOUT (line 34) | const DEFAULT_AUTO_DISMISS_TIMEOUT = 3000;
  constant MINIMIZE_ANIMATION_TIMEOUT (line 35) | const MINIMIZE_ANIMATION_TIMEOUT = 300;
  class NotificationAPI (line 42) | class NotificationAPI extends EventEmitter {
    method constructor (line 46) | constructor() {
    method info (line 68) | info(message, options = {}) {
    method alert (line 86) | alert(message, options = {}) {
    method error (line 102) | error(message, options = {}) {
    method progress (line 119) | progress(message, progressPerc, progressText) {
    method dismissAllNotifications (line 134) | dismissAllNotifications() {
    method _minimize (line 148) | _minimize(notification) {
    method _dismiss (line 191) | _dismiss(notification) {
    method _dismissOrMinimize (line 228) | _dismissOrMinimize(notification) {
    method _setHighestSeverity (line 241) | _setHighestSeverity() {
    method _notify (line 267) | _notify(notificationModel) {
    method _createNotification (line 309) | _createNotification(notificationModel) {
    method _setActiveNotification (line 333) | _setActiveNotification(notification) {
    method _selectNextNotification (line 360) | _selectNextNotification() {

FILE: src/api/objects/ConflictError.js
  class ConflictError (line 28) | class ConflictError extends Error {}

FILE: src/api/objects/InMemorySearchProvider.js
  class InMemorySearchProvider (line 25) | class InMemorySearchProvider {
    method constructor (line 33) | constructor(openmct) {
    method startIndexing (line 89) | startIndexing() {
    method indexAnnotations (line 113) | indexAnnotations() {
    method getIntermediateResponse (line 132) | getIntermediateResponse() {
    method search (line 142) | search(query, searchType) {
    method #localQueryFallBack (line 165) | #localQueryFallBack({ queryId, searchType, query, maxResults }) {
    method supportsSearchType (line 177) | supportsSearchType(searchType) {
    method onWorkerMessage (line 185) | async onWorkerMessage(event) {
    method onWorkerMessageError (line 209) | onWorkerMessageError(event) {
    method onWorkerError (line 217) | onWorkerError(event) {
    method startSharedWorker (line 224) | startSharedWorker() {
    method scheduleForIndexing (line 245) | scheduleForIndexing(identifier) {
    method keepIndexing (line 265) | keepIndexing() {
    method onAnnotationCreation (line 271) | onAnnotationCreation(annotationObject) {
    method onNameMutation (line 279) | onNameMutation(domainObject, name) {
    method onCompositionAdded (line 286) | onCompositionAdded(newDomainObjectToIndex) {
    method onCompositionRemoved (line 300) | onCompositionRemoved(domainObjectToRemoveIdentifier) {
    method index (line 324) | async index(domainObject) {
    method beginIndexRequest (line 368) | async beginIndexRequest() {
    method #dispatchSearchToWorker (line 396) | #dispatchSearchToWorker({ queryId, searchType, query, maxResults }) {
    method localIndexTags (line 406) | localIndexTags(keyString, objectToIndex, model) {
    method localIndexAnnotation (line 437) | localIndexAnnotation(objectToIndex, model) {
    method localIndexItem (line 462) | localIndexItem(keyString, model) {
    method localSearchForObjects (line 488) | localSearchForObjects(queryId, searchInput, maxResults) {
    method localSearchForAnnotations (line 517) | localSearchForAnnotations(queryId, searchInput, maxResults) {
    method localSearchForTags (line 542) | localSearchForTags(queryId, matchingTagKeys, maxResults) {
    method destroyObservers (line 575) | destroyObservers(observers) {

FILE: src/api/objects/InMemorySearchWorker.js
  function indexAnnotation (line 59) | function indexAnnotation(objectToIndex, model) {
  function indexTags (line 78) | function indexTags(keyString, objectToIndex, model) {
  function indexItem (line 108) | function indexItem(keyString, model) {
  function searchForObjects (line 136) | function searchForObjects(data) {
  function searchForAnnotations (line 157) | function searchForAnnotations(data) {
  function searchForTags (line 174) | function searchForTags(data) {

FILE: src/api/objects/InterceptorRegistry.js
  constant DEFAULT_INTERCEPTOR_PRIORITY (line 22) | const DEFAULT_INTERCEPTOR_PRIORITY = 0;
  class InterceptorRegistry (line 23) | class InterceptorRegistry {
    method constructor (line 28) | constructor() {
    method addInterceptor (line 45) | addInterceptor(interceptorDef) {
    method getInterceptors (line 54) | getInterceptors(identifier, object) {

FILE: src/api/objects/MutableDomainObject.js
  constant ANY_OBJECT_EVENT (line 27) | const ANY_OBJECT_EVENT = 'mutation';
  class MutableDomainObject (line 42) | class MutableDomainObject {
    method constructor (line 43) | constructor(eventEmitter) {
    method $observe (line 67) | $observe(path, callback) {
    method $set (line 76) | $set(path, value) {
    method $refresh (line 125) | $refresh(model) {
    method $on (line 134) | $on(event, callback) {
    method $destroy (line 139) | $destroy() {
    method createMutable (line 148) | static createMutable(object, mutationTopic) {
    method mutateObject (line 160) | static mutateObject(object, path, value) {
  function qualifiedEventName (line 169) | function qualifiedEventName(object, eventName) {

FILE: src/api/objects/NamespaceProvider.js
  class NamespaceProvider (line 26) | class NamespaceProvider {
    method constructor (line 30) | constructor(namespace, provider) {
    method appliesTo (line 53) | appliesTo(identifier) {
    method getWrappedProvider (line 57) | getWrappedProvider() {
    method get (line 61) | get(identifier) {
    method #delegateIfImplemented (line 65) | #delegateIfImplemented(delegateFunction, delegateArguments) {

FILE: src/api/objects/ObjectAPI.js
  class ObjectAPI (line 68) | class ObjectAPI {
    method constructor (line 79) | constructor(typeRegistry, openmct) {
    method getProvider (line 122) | getProvider(identifier) {
    method getRootRegistry (line 142) | getRootRegistry() {
    method getActiveTransaction (line 150) | getActiveTransaction() {
    method getRoot (line 158) | getRoot() {
    method addProvider (line 168) | addProvider(namespaceOrProvider, providerOrNothing) {
    method get (line 204) | get(identifier, abortSignal, forceRemote = false) {
    method search (line 282) | search(query, abortSignal, searchType = this.SEARCH_TYPES.OBJECTS) {
    method getMutable (line 317) | getMutable(identifier) {
    method destroyMutable (line 333) | destroyMutable(domainObject) {
    method delete (line 341) | delete() {
    method isPersistable (line 345) | isPersistable(idOrKeyString) {
    method isMissing (line 355) | isMissing(domainObject) {
    method save (line 368) | async save(domainObject) {
    method #getCurrentUsername (line 455) | async #getCurrentUsername() {
    method startTransaction (line 471) | startTransaction() {
    method endTransaction (line 484) | endTransaction() {
    method addRoot (line 498) | addRoot(identifier, priority) {
    method removeRoot (line 502) | removeRoot(identifier) {
    method addGetInterceptor (line 514) | addGetInterceptor(interceptorDef) {
    method #listGetInterceptors (line 521) | #listGetInterceptors(identifier, object) {
    method applyGetInterceptors (line 529) | applyGetInterceptors(identifier, domainObject) {
    method getRelativePath (line 544) | getRelativePath(objectPath) {
    method getTelemetryPath (line 558) | async getTelemetryPath(identifier, telemetryIdentifier) {
    method #mutate (line 598) | #mutate(domainObject, path, value) {
    method mutate (line 627) | mutate(domainObject, path, value) {
    method toMutable (line 642) | toMutable(domainObject) {
    method refresh (line 685) | async refresh(domainObject, forceRemote = false) {
    method supportsMutation (line 702) | supportsMutation(identifier) {
    method observe (line 713) | observe(domainObject, path, callback) {
    method makeKeyString (line 728) | makeKeyString(identifier) {
    method parseKeyString (line 736) | parseKeyString(keyString) {
    method areIdsEqual (line 744) | areIdsEqual(...identifiers) {
    method isReachable (line 761) | isReachable(originalPath) {
    method #pathContainsDomainObject (line 775) | #pathContainsDomainObject(keyStringToCheck, path) {
    method getOriginalPath (line 794) | async getOriginalPath(identifierOrObject, path = [], abortSignal = nul...
    method getRelativeObjectPath (line 829) | async getRelativeObjectPath(navigationPath) {
    method isObjectPathToALink (line 866) | isObjectPathToALink(domainObject, objectPath) {
    method isTransactionActive (line 878) | isTransactionActive() {
    method #hasAlreadyBeenPersisted (line 887) | #hasAlreadyBeenPersisted(domainObject) {

FILE: src/api/objects/ObjectAPISpec.js
  method isLoggedIn (line 17) | isLoggedIn() {
  method getCurrentUser (line 20) | getCurrentUser() {
  method getPossibleRoles (line 27) | getPossibleRoles() {
  function hasOwnProperty (line 601) | function hasOwnProperty(object, property) {

FILE: src/api/objects/RootObjectCompositionProvider.js
  class RootObjectCompositionProvider (line 3) | class RootObjectCompositionProvider extends CompositionProvider {
    method constructor (line 8) | constructor(openmct, rootRegistry) {
    method appliesTo (line 14) | appliesTo(domainObject) {
    method load (line 18) | load(domainObject) {
    method on (line 22) | on(domainObject, event, callback, context) {
    method off (line 28) | off(domainObject, event, callback, context) {
    method add (line 36) | add(domainObject, childId) {
    method remove (line 40) | remove(domainObject, childId) {
    method includes (line 44) | includes(domainObject, childId) {
    method #addListener (line 48) | #addListener(event, callback, context) {
    method #removeListener (line 69) | #removeListener(event, callback, context) {

FILE: src/api/objects/RootObjectProvider.js
  class RootObjectProvider (line 26) | class RootObjectProvider {
    method constructor (line 30) | constructor(rootRegistry) {
    method updateName (line 54) | updateName(name) {
    method get (line 62) | get() {
  function instance (line 72) | function instance(rootRegistry) {

FILE: src/api/objects/RootRegistry.js
  class RootRegistry (line 28) | class RootRegistry extends EventTarget {
    method constructor (line 32) | constructor(openmct) {
    method getRoots (line 44) | getRoots() {
    method isRootObject (line 51) | isRootObject(identifier) {
    method addRoot (line 62) | addRoot(rootItem, priority) {
    method removeRoot (line 74) | removeRoot(identifier) {
    method _isValid (line 93) | _isValid(rootItem) {

FILE: src/api/objects/Transaction.js
  class Transaction (line 26) | class Transaction {
    method constructor (line 30) | constructor(objectAPI) {
    method add (line 41) | add(object) {
    method cancel (line 51) | cancel() {
    method commit (line 59) | commit() {
    method createDirtyObjectPromise (line 78) | createDirtyObjectPromise(object, action, ...args) {
    method getDirtyObject (line 96) | getDirtyObject(identifier) {
    method _clear (line 114) | _clear() {

FILE: src/api/objects/TransactionSpec.js
  function createMockDomainObjects (line 98) | function createMockDomainObjects(size = 1) {

FILE: src/api/objects/object-utils.js
  function isIdentifier (line 27) | function isIdentifier(thing) {
  function isKeyString (line 39) | function isKeyString(thing) {
  function parseKeyString (line 52) | function parseKeyString(keyString) {
  function makeKeyString (line 89) | function makeKeyString(identifier) {
  function toOldFormat (line 115) | function toOldFormat(model) {
  function toNewFormat (line 134) | function toNewFormat(model, keyString) {
  function identifierEquals (line 151) | function identifierEquals(a, b) {
  function objectEquals (line 163) | function objectEquals(a, b) {
  function refresh (line 167) | function refresh(oldObject, newObject) {

FILE: src/api/overlays/Dialog.js
  class Dialog (line 6) | class Dialog extends Overlay {
    method constructor (line 7) | constructor({ iconClass, message, title, hint, timestamp, ...options }) {

FILE: src/api/overlays/Overlay.js
  class Overlay (line 14) | class Overlay extends EventEmitter {
    method constructor (line 15) | constructor({
    method dismiss (line 61) | dismiss() {
    method notifyAndDismiss (line 68) | notifyAndDismiss() {
    method show (line 76) | show() {

FILE: src/api/overlays/OverlayAPI.js
  class OverlayAPI (line 33) | class OverlayAPI {
    method constructor (line 34) | constructor() {
    method showOverlay (line 51) | showOverlay(overlay) {
    method dismissLastOverlay (line 76) | dismissLastOverlay() {
    method overlay (line 88) | overlay(options) {
    method dialog (line 102) | dialog(options) {
    method progressDialog (line 118) | progressDialog(options) {
    method selection (line 131) | selection(options) {

FILE: src/api/overlays/ProgressDialog.js
  class ProgressDialog (line 7) | class ProgressDialog extends Overlay {
    method constructor (line 8) | constructor({
    method updateProgress (line 52) | updateProgress(progressPerc, progressText) {

FILE: src/api/overlays/Selection.js
  class Selection (line 28) | class Selection extends Overlay {
    method constructor (line 29) | constructor({

FILE: src/api/priority/PriorityAPI.js
  constant PRIORITIES (line 23) | const PRIORITIES = Object.freeze({

FILE: src/api/status/StatusAPI.js
  class StatusAPI (line 36) | class StatusAPI extends EventEmitter {
    method constructor (line 41) | constructor(openmct) {
    method get (line 58) | get(identifier) {
    method set (line 69) | set(identifier, status) {
    method delete (line 80) | delete(identifier) {
    method observe (line 95) | observe(identifier, callback) {

FILE: src/api/telemetry/BatchingWebSocket.js
  function requestIdleCallbackPolyfill (line 46) | function requestIdleCallbackPolyfill(callback, options) {
  constant ONE_SECOND (line 58) | const ONE_SECOND = 1000;
  class BatchingWebSocket (line 73) | class BatchingWebSocket extends EventTarget {
    method constructor (line 86) | constructor(openmct) {
    method connect (line 115) | connect(url) {
    method #readyForNextBatch (line 124) | #readyForNextBatch() {
    method sendMessage (line 135) | sendMessage(message) {
    method setMaxBufferSize (line 159) | setMaxBufferSize(maxBatchSize) {
    method setThrottleRate (line 163) | setThrottleRate(throttleRate) {
    method setThrottleMessagePattern (line 167) | setThrottleMessagePattern(throttleMessagePattern) {
    method #sendMaxBufferSizeToWorker (line 174) | #sendMaxBufferSizeToWorker(maxBufferSize) {
    method #sendThrottleRateToWorker (line 181) | #sendThrottleRateToWorker(throttleRate) {
    method disconnect (line 192) | disconnect() {
    method #routeMessageToHandler (line 198) | #routeMessageToHandler(message) {
    method #waitUntilIdleAndRequestNextBatch (line 253) | #waitUntilIdleAndRequestNextBatch(batch) {

FILE: src/api/telemetry/DefaultMetadataProvider.js
  class DefaultMetadataProvider (line 34) | class DefaultMetadataProvider {
    method constructor (line 35) | constructor(openmct) {
    method supportsMetadata (line 43) | supportsMetadata(domainObject) {
    method getMetadata (line 50) | getMetadata(domainObject) {
    method typeHasTelemetry (line 68) | typeHasTelemetry(domainObject) {
  function valueMetadatasFromOldFormat (line 79) | function valueMetadatasFromOldFormat(metadata) {

FILE: src/api/telemetry/TelemetryAPI.js
  constant SUBSCRIBE_STRATEGY (line 73) | const SUBSCRIBE_STRATEGY = {
  class TelemetryAPI (line 82) | class TelemetryAPI {
    method SUBSCRIBE_STRATEGY (line 87) | get SUBSCRIBE_STRATEGY() {
    method constructor (line 91) | constructor(openmct) {
    method abortAllRequests (line 112) | abortAllRequests() {
    method customStringFormatter (line 124) | customStringFormatter(valueMetadata, format) {
    method isTelemetryObject (line 136) | isTelemetryObject(domainObject) {
    method canProvideTelemetry (line 149) | canProvideTelemetry(domainObject) {
    method addProvider (line 163) | addProvider(provider) {
    method findSubscriptionProvider (line 189) | findSubscriptionProvider() {
    method findRequestProvider (line 202) | findRequestProvider() {
    method #findMetadataProvider (line 214) | #findMetadataProvider(domainObject) {
    method #findLimitEvaluator (line 223) | #findLimitEvaluator(domainObject) {
    method standardizeRequestOptions (line 233) | standardizeRequestOptions(options = {}) {
    method sanitizeForSerialization (line 259) | sanitizeForSerialization(key, value) {
    method hasNumericTelemetry (line 299) | hasNumericTelemetry(domainObject) {
    method #hashOptions (line 335) | #hashOptions(options) {
    method #getSubscriptionCacheKey (line 366) | #getSubscriptionCacheKey(domainObject, options) {
    method addRequestInterceptor (line 380) | addRequestInterceptor(requestInterceptorDef) {
    method #getInterceptorsForRequest (line 388) | #getInterceptorsForRequest(identifier, request) {
    method applyRequestInterceptors (line 395) | async applyRequestInterceptors(domainObject, request) {
    method greedyLAD (line 423) | greedyLAD(isGreedy) {
    method requestCollection (line 448) | requestCollection(domainObject, options = {}) {
    method request (line 466) | async request(domainObject) {
    method subscribe (line 525) | subscribe(domainObject, callback, options = { strategy: SUBSCRIBE_STRA...
    method subscribeToStaleness (line 642) | subscribeToStaleness(domainObject, callback) {
    method subscribeToLimits (line 696) | subscribeToLimits(domainObject, callback) {
    method isStale (line 747) | async isStale(domainObject) {
    method #findStalenessProvider (line 773) | #findStalenessProvider(domainObject) {
    method getMetadata (line 786) | getMetadata(domainObject) {
    method removeMetadataFromCache (line 806) | removeMetadataFromCache(domainObject) {
    method getValueFormatter (line 815) | getValueFormatter(valueMetadata) {
    method getFormatter (line 832) | getFormatter(key) {
    method getFormatMap (line 842) | getFormatMap(metadata) {
    method #handleMissingRequestProvider (line 867) | #handleMissingRequestProvider(domainObject) {
    method addFormat (line 900) | addFormat(format) {
    method limitEvaluator (line 919) | limitEvaluator(domainObject) {
    method limitDefinition (line 938) | limitDefinition(domainObject) {
    method getLimitEvaluator (line 957) | getLimitEvaluator(domainObject) {
    method getLimits (line 984) | getLimits(domainObject) {

FILE: src/api/telemetry/TelemetryAPISpec.js
  method supportsMetadata (line 466) | supportsMetadata() {
  method getMetadata (line 469) | getMetadata() {
  method supportsMetadata (line 690) | supportsMetadata() {
  method getMetadata (line 693) | getMetadata() {

FILE: src/api/telemetry/TelemetryCollection.js
  class TelemetryCollection (line 47) | class TelemetryCollection extends EventEmitter {
    method constructor (line 55) | constructor(openmct, domainObject, options = {}) {
    method _extractBootstrapBounds (line 84) | _extractBootstrapBounds(options) {
    method _isBootstrapMode (line 98) | _isBootstrapMode() {
    method _exitBootstrapMode (line 106) | _exitBootstrapMode() {
    method _getBoundsForFiltering (line 125) | _getBoundsForFiltering(isHistoricalData) {
    method load (line 146) | load() {
    method destroy (line 180) | destroy() {
    method getAll (line 199) | getAll() {
    method _requestHistoricalTelemetry (line 207) | async _requestHistoricalTelemetry() {
    method _initiateSubscriptionTelemetry (line 256) | _initiateSubscriptionTelemetry() {
    method _processNewTelemetry (line 279) | _processNewTelemetry(telemetryData, isSubscriptionData = false) {
    method _sortedIndex (line 374) | _sortedIndex(datum) {
    method _bounds (line 401) | _bounds(bounds, isTick) {
    method _handleUserBoundsChange (line 489) | _handleUserBoundsChange(bounds) {
    method _handleDataInsideBounds (line 499) | _handleDataInsideBounds() {
    method _handleDataOutsideBounds (line 506) | _handleDataOutsideBounds() {
    method _setTimeSystem (line 521) | _setTimeSystem(timeSystem) {
    method _setTimeSystemAndFetchData (line 553) | _setTimeSystemAndFetchData(timeSystem) {
    method _timeModeChanged (line 558) | _timeModeChanged() {
    method _reset (line 570) | _reset() {
    method _watchBounds (line 582) | _watchBounds() {
    method _unwatchBounds (line 590) | _unwatchBounds() {
    method _watchTimeModeChange (line 598) | _watchTimeModeChange() {
    method _unwatchTimeModeChange (line 606) | _unwatchTimeModeChange() {
    method _watchTimeSystem (line 614) | _watchTimeSystem() {
    method _unwatchTimeSystem (line 626) | _unwatchTimeSystem() {
    method _error (line 639) | _error(message) {
    method _warn (line 643) | _warn(message) {

FILE: src/api/telemetry/TelemetryCollectionSpec.js
  method supportsMetadata (line 47) | supportsMetadata() {
  method getMetadata (line 50) | getMetadata() {

FILE: src/api/telemetry/TelemetryMetadataManager.js
  function applyReasonableDefaults (line 25) | function applyReasonableDefaults(valueMetadata, index) {
  function TelemetryMetadataManager (line 71) | function TelemetryMetadataManager(metadata) {
  function hasHint (line 101) | function hasHint(hint) {
  function hasHints (line 106) | function hasHints(metadata) {

FILE: src/api/telemetry/TelemetryRequestInterceptor.js
  class TelemetryRequestInterceptorRegistry (line 23) | class TelemetryRequestInterceptorRegistry {
    method constructor (line 29) | constructor() {
    method addInterceptor (line 46) | addInterceptor(interceptorDef) {
    method getInterceptors (line 56) | getInterceptors(identifier, request) {

FILE: src/api/telemetry/TelemetryValueFormatter.js
  class TelemetryValueFormatter (line 27) | class TelemetryValueFormatter {
    method constructor (line 28) | constructor(valueMetadata, formatMap) {
    method getNonArrayValue (line 105) | getNonArrayValue(value) {
    method parse (line 115) | parse(datum) {
    method format (line 131) | format(datum) {

FILE: src/api/telemetry/WebSocketWorker.js
  function installWorker (line 23) | function installWorker() {

FILE: src/api/telemetry/constants.js
  constant TIMESYSTEM_KEY_WARNING (line 23) | const TIMESYSTEM_KEY_WARNING =
  constant TIMESYSTEM_KEY_NOTIFICATION (line 25) | const TIMESYSTEM_KEY_NOTIFICATION =
  constant LOADED_ERROR (line 27) | const LOADED_ERROR = 'Telemetry Collection has already been loaded.';

FILE: src/api/time/GlobalTimeContext.js
  class GlobalTimeContext (line 33) | class GlobalTimeContext extends TimeContext {
    method constructor (line 34) | constructor() {
    method bounds (line 50) | bounds(newBounds) {
    method tick (line 70) | tick(timestamp) {
    method timeOfInterest (line 89) | timeOfInterest(newTOI) {

FILE: src/api/time/IndependentTimeContext.js
  class IndependentTimeContext (line 39) | class IndependentTimeContext extends TimeContext {
    method constructor (line 45) | constructor(openmct, globalTimeContext, objectPath) {
    method bounds (line 71) | bounds() {
    method getBounds (line 82) | getBounds() {
    method setBounds (line 93) | setBounds() {
    method tick (line 104) | tick() {
    method clockOffsets (line 115) | clockOffsets() {
    method getClockOffsets (line 126) | getClockOffsets() {
    method setClockOffsets (line 137) | setClockOffsets() {
    method timeOfInterest (line 150) | timeOfInterest(newTOI) {
    method timeSystem (line 161) | timeSystem(timeSystemOrKey, bounds) {
    method getTimeSystem (line 171) | getTimeSystem() {
    method clock (line 186) | clock(keyOrClock, offsets) {
    method getClock (line 240) | getClock() {
    method setClock (line 257) | setClock(keyOrClock) {
    method getMode (line 300) | getMode() {
    method setMode (line 315) | setMode(mode, offsetsOrBounds) {
    method isRealTime (line 365) | isRealTime() {
    method isFixed (line 377) | isFixed() {
    method now (line 389) | now() {
    method followTimeContext (line 401) | followTimeContext() {
    method stopFollowingTimeContext (line 420) | stopFollowingTimeContext() {
    method resetContext (line 428) | resetContext() {
    method refreshContext (line 439) | refreshContext(viewKey) {
    method hasOwnContext (line 463) | hasOwnContext() {
    method getUpstreamContext (line 471) | getUpstreamContext() {
    method removeIndependentContext (line 500) | removeIndependentContext(viewKey) {
    method #copy (line 541) | #copy(object) {

FILE: src/api/time/TimeAPI.js
  class TimeAPI (line 83) | class TimeAPI extends GlobalTimeContext {
    method constructor (line 84) | constructor(openmct) {
    method addTimeSystem (line 95) | addTimeSystem(timeSystem) {
    method getAllTimeSystems (line 102) | getAllTimeSystems() {
    method addClock (line 125) | addClock(clock) {
    method getAllClocks (line 132) | getAllClocks() {
    method addIndependentContext (line 143) | addIndependentContext(keyString, boundsOrOffsets, clockKey) {
    method getIndependentContext (line 174) | getIndependentContext(key) {
    method getContextForView (line 184) | getContextForView(objectPath) {

FILE: src/api/time/TimeContext.js
  class TimeContext (line 71) | class TimeContext extends EventEmitter {
    method constructor (line 72) | constructor() {
    method timeSystem (line 121) | timeSystem(timeSystemOrKey, bounds) {
    method validateBounds (line 185) | validateBounds(bounds) {
    method bounds (line 218) | bounds(newBounds) {
    method validateOffsets (line 250) | validateOffsets(offsets) {
    method clockOffsets (line 282) | clockOffsets(offsets) {
    method stopClock (line 319) | stopClock() {
    method clock (line 338) | clock(keyOrClock, offsets) {
    method tick (line 391) | tick(timestamp) {
    method now (line 413) | now() {
    method getTimeSystem (line 421) | getTimeSystem() {
    method setTimeSystem (line 431) | setTimeSystem(timeSystemOrKey, bounds) {
    method getBounds (line 476) | getBounds() {
    method setBounds (line 488) | setBounds(newBounds) {
    method getClock (line 511) | getClock() {
    method setClock (line 522) | setClock(keyOrClock) {
    method getMode (line 559) | getMode() {
    method setMode (line 571) | setMode(mode, offsetsOrBounds) {
    method isRealTime (line 603) | isRealTime() {
    method isFixed (line 611) | isFixed() {
    method getClockOffsets (line 619) | getClockOffsets() {
    method setClockOffsets (line 627) | setClockOffsets(offsets) {
    method #warnMethodDeprecated (line 660) | #warnMethodDeprecated(method, newMethod) {
    method #copy (line 689) | #copy(object) {

FILE: src/api/time/constants.js
  constant TIME_CONTEXT_EVENTS (line 1) | const TIME_CONTEXT_EVENTS = {
  constant REALTIME_MODE_KEY (line 16) | const REALTIME_MODE_KEY = 'realtime';
  constant FIXED_MODE_KEY (line 17) | const FIXED_MODE_KEY = 'fixed';
  constant MODES (line 19) | const MODES = {

FILE: src/api/tooltips/ToolTip.js
  class Tooltip (line 28) | class Tooltip extends EventEmitter {
    method constructor (line 29) | constructor(
    method destroy (line 58) | destroy() {
    method show (line 69) | show() {

FILE: src/api/tooltips/ToolTipAPI.js
  constant TOOLTIP_LOCATIONS (line 34) | const TOOLTIP_LOCATIONS = Object.freeze({
  class TooltipAPI (line 49) | class TooltipAPI {
    method constructor (line 50) | constructor() {
    method showTooltip (line 58) | showTooltip(tooltip) {
    method removeAllTooltips (line 67) | removeAllTooltips() {
    method tooltip (line 90) | tooltip(options) {

FILE: src/api/tooltips/tooltipMixins.js
  method getTelemetryPathString (line 25) | async getTelemetryPathString(telemetryIdentifier) {
  method getObjectPath (line 39) | async getObjectPath(objectIdentifier) {
  method buildToolTip (line 51) | buildToolTip(tooltipText, tooltipLocation, elementRef, cssClasses) {
  method hideToolTip (line 66) | hideToolTip() {

FILE: src/api/types/Type.js
  class Type (line 27) | class Type {
    method constructor (line 31) | constructor(definition) {
    method definitionFromLegacyDefinition (line 42) | static definitionFromLegacyDefinition(legacyDefinition) {
    method check (line 93) | check(domainObject) {
    method toLegacyDefinition (line 102) | toLegacyDefinition() {

FILE: src/api/types/TypeRegistry.js
  constant UNKNOWN_TYPE (line 24) | const UNKNOWN_TYPE = new Type({
  class TypeRegistry (line 46) | class TypeRegistry {
    method constructor (line 47) | constructor() {
    method addType (line 59) | addType(typeKey, typeDef) {
    method standardizeType (line 68) | standardizeType(typeDef) {
    method listKeys (line 81) | listKeys() {
    method get (line 89) | get(typeKey) {
    method getAllTypes (line 96) | getAllTypes() {
    method importLegacyTypes (line 103) | importLegacyTypes(types) {

FILE: src/api/user/ActiveRoleSynchronizer.js
  class ActiveRoleSynchronizer (line 3) | class ActiveRoleSynchronizer {
    method constructor (line 6) | constructor(openmct) {
    method subscribeToRoleChanges (line 13) | subscribeToRoleChanges(callback) {
    method unsubscribeFromRoleChanges (line 16) | unsubscribeFromRoleChanges(callback) {
    method setActiveRoleFromChannelMessage (line 20) | setActiveRoleFromChannelMessage(event) {
    method broadcastNewRole (line 24) | broadcastNewRole(role) {
    method destroy (line 31) | destroy() {

FILE: src/api/user/StatusAPI.js
  class StatusAPI (line 31) | class StatusAPI extends EventEmitter {
    method constructor (line 41) | constructor(userAPI, openmct) {
    method getPollQuestion (line 68) | getPollQuestion() {
    method setPollQuestion (line 83) | async setPollQuestion(questionText) {
    method canSetPollQuestion (line 108) | canSetPollQuestion() {
    method canSetMissionStatus (line 122) | canSetMissionStatus() {
    method getStatusForMissionAction (line 137) | getStatusForMissionAction(action) {
    method getPossibleMissionActionStatuses (line 151) | async getPossibleMissionActionStatuses() {
    method getPossibleMissionActions (line 167) | async getPossibleMissionActions() {
    method getPossibleStatuses (line 182) | async getPossibleStatuses() {
    method getStatusForRole (line 198) | async getStatusForRole(role) {
    method canProvideStatusForRole (line 215) | canProvideStatusForRole(role) {
    method setStatusForRole (line 230) | setStatusForRole(status) {
    method setStatusForMissionAction (line 250) | setStatusForMissionAction(action, status) {
    method resetStatusForRole (line 265) | async resetStatusForRole(role) {
    method resetAllStatuses (line 280) | async resetAllStatuses() {
    method getDefaultStatusForRole (line 291) | async getDefaultStatusForRole(role) {
    method getAllStatusRoles (line 305) | getAllStatusRoles() {
    method canProvideStatusForCurrentUser (line 319) | async canProvideStatusForCurrentUser() {
    method listenToStatusEvents (line 335) | listenToStatusEvents(provider) {
    method onProviderStatusChange (line 347) | onProviderStatusChange(newStatus) {
    method onProviderPollQuestionChange (line 355) | onProviderPollQuestionChange(pollQuestion) {
    method onMissionActionStatusChange (line 363) | onMissionActionStatusChange({ action, status }) {

FILE: src/api/user/StatusUserProvider.js
  class StatusUserProvider (line 24) | class StatusUserProvider extends UserProvider {
    method on (line 29) | on(event, callback) {}
    method off (line 34) | off(event, callback) {}
    method getPollQuestion (line 38) | async getPollQuestion() {}
    method setPollQuestion (line 43) | async setPollQuestion(pollQuestion) {}
    method canSetPollQuestion (line 47) | async canSetPollQuestion() {}
    method getPossibleStatuses (line 51) | async getPossibleStatuses() {}
    method getStatusForRole (line 56) | async getStatusForRole(role) {}
    method getDefaultStatusForRole (line 61) | async getDefaultStatusForRole(role) {}
    method setStatusForRole (line 67) | async setStatusForRole(role, status) {}
    method canProvideStatusForRole (line 72) | async canProvideStatusForRole(role) {}
    method getAllStatusRoles (line 76) | async getAllStatusRoles() {}

FILE: src/api/user/StoragePersistence.js
  class StoragePersistence (line 25) | class StoragePersistence {
    method getActiveRole (line 26) | getActiveRole() {
    method setActiveRole (line 29) | setActiveRole(role) {
    method clearActiveRole (line 32) | clearActiveRole() {

FILE: src/api/user/User.js
  class User (line 26) | class User {
    method constructor (line 27) | constructor(id, name) {
    method getId (line 35) | getId() {
    method getName (line 39) | getName() {

FILE: src/api/user/UserAPI.js
  class UserAPI (line 30) | class UserAPI extends EventEmitter {
    method constructor (line 38) | constructor(openmct) {
    method setProvider (line 55) | setProvider(provider) {
    method getProvider (line 64) | getProvider() {
    method hasProvider (line 73) | hasProvider() {
    method getCurrentUser (line 84) | getCurrentUser() {
    method getPossibleRoles (line 98) | getPossibleRoles() {
    method getActiveRole (line 108) | getActiveRole() {
    method setActiveRole (line 122) | setActiveRole(role) {
    method canProvideStatusForRole (line 135) | canProvideStatusForRole() {
    method isLoggedIn (line 151) | isLoggedIn() {
    method hasRole (line 167) | hasRole(roleId) {
    method noProviderCheck (line 179) | noProviderCheck() {
    method error (line 192) | error(error) {

FILE: src/api/user/UserProvider.js
  class UserProvider (line 28) | class UserProvider {
    method getCurrentUser (line 32) | getCurrentUser() {}
    method isLoggedIn (line 36) | isLoggedIn() {}
    method hasRole (line 41) | hasRole(role) {}

FILE: src/api/user/constants.js
  constant MULTIPLE_PROVIDER_ERROR (line 23) | const MULTIPLE_PROVIDER_ERROR = 'Only one user provider may be set at a ...
  constant NO_PROVIDER_ERROR (line 24) | const NO_PROVIDER_ERROR = 'No user provider has been set.';
  constant ACTIVE_ROLE_LOCAL_STORAGE_KEY (line 26) | const ACTIVE_ROLE_LOCAL_STORAGE_KEY = 'ACTIVE_USER_ROLE';
  constant ACTIVE_ROLE_BROADCAST_CHANNEL_NAME (line 27) | const ACTIVE_ROLE_BROADCAST_CHANNEL_NAME = 'ActiveRoleChannel';

FILE: src/exporters/CSVExporter.js
  class CSVExporter (line 26) | class CSVExporter {
    method export (line 27) | export(rows, options) {

FILE: src/exporters/ImageExporter.js
  function sanitizeFilename (line 28) | function sanitizeFilename(filename) {
  class ImageExporter (line 42) | class ImageExporter {
    method constructor (line 43) | constructor(openmct) {
    method renderElement (line 53) | renderElement(element, { imageType, className, thumbnailSize }) {
    method getThumbnail (line 138) | getThumbnail(canvas, mimeType, size) {
    method exportJPG (line 156) | async exportJPG(element, filename, className) {
    method exportPNG (line 173) | async exportPNG(element, filename, className) {
    method exportPNGtoSRC (line 190) | exportPNGtoSRC(element, options) {

FILE: src/exporters/JSONExporter.js
  class JSONExporter (line 25) | class JSONExporter {
    method export (line 26) | export(obj, options) {

FILE: src/plugins/CouchDBSearchFolder/plugin.js
  method get (line 16) | get(identifier) {
  method search (line 28) | search() {
  method appliesTo (line 34) | appliesTo(domainObject) {
  method load (line 40) | load() {

FILE: src/plugins/DeviceClassifier/src/DeviceClassifier.js
  function eventHandler (line 54) | function eventHandler(event) {

FILE: src/plugins/DeviceClassifier/src/DeviceClassifierSpec.js
  constant AGENT_METHODS (line 25) | const AGENT_METHODS = ['isMobile', 'isPhone', 'isTablet', 'isPortrait', ...
  constant TEST_PERMUTATIONS (line 26) | const TEST_PERMUTATIONS = [

FILE: src/plugins/DeviceClassifier/src/DeviceMatchersSpec.js
  function method (line 45) | function method(deviceType) {

FILE: src/plugins/ISOTimeFormat/ISOTimeFormat.js
  class ISOTimeFormat (line 23) | class ISOTimeFormat {
    method constructor (line 24) | constructor() {
    method format (line 28) | format(value) {
    method parse (line 36) | parse(text) {
    method validate (line 44) | validate(text) {

FILE: src/plugins/LADTable/LADTableCompositionPolicy.js
  function ladTableCompositionPolicy (line 23) | function ladTableCompositionPolicy(openmct) {

FILE: src/plugins/LADTable/LADTableConfiguration.js
  class LADTableConfiguration (line 25) | class LADTableConfiguration extends EventEmitter {
    method constructor (line 26) | constructor(domainObject, openmct) {
    method getConfiguration (line 43) | getConfiguration() {
    method updateConfiguration (line 52) | updateConfiguration(configuration) {
    method objectMutated (line 56) | objectMutated(configuration) {
    method destroy (line 62) | destroy() {

FILE: src/plugins/LADTable/LADTableConfigurationViewProvider.js
  function LADTableConfigurationViewProvider (line 27) | function LADTableConfigurationViewProvider(openmct) {

FILE: src/plugins/LADTable/LADTableSetViewProvider.js
  function LADTableSetViewProvider (line 25) | function LADTableSetViewProvider(openmct) {

FILE: src/plugins/LADTable/LADTableView.js
  class LADTableView (line 28) | class LADTableView {
    method constructor (line 29) | constructor(openmct, domainObject, objectPath) {
    method show (line 37) | show(element, isEditing, { renderWhenVisible }) {
    method getViewContext (line 70) | getViewContext() {
    method destroy (line 78) | destroy() {

FILE: src/plugins/LADTable/LADTableViewProvider.js
  class LADTableViewProvider (line 25) | class LADTableViewProvider {
    method constructor (line 26) | constructor(openmct) {
    method canView (line 33) | canView(domainObject) {
    method canEdit (line 42) | canEdit(domainObject) {
    method view (line 46) | view(domainObject, objectPath) {

FILE: src/plugins/LADTable/LadTableSetView.js
  class LadTableSetView (line 28) | class LadTableSetView {
    method constructor (line 29) | constructor(openmct, domainObject, objectPath) {
    method show (line 37) | show(element, isEditing, { renderWhenVisible }) {
    method getViewContext (line 69) | getViewContext() {
    method destroy (line 77) | destroy() {

FILE: src/plugins/LADTable/plugin.js
  function plugin (line 28) | function plugin() {

FILE: src/plugins/LADTable/pluginSpec.js
  constant TABLE_BODY_ROWS (line 35) | const TABLE_BODY_ROWS = '.js-lad-table__body__row';
  constant TABLE_BODY_FIRST_ROW (line 36) | const TABLE_BODY_FIRST_ROW = TABLE_BODY_ROWS + ':first-child';
  constant TABLE_BODY_FIRST_ROW_FIRST_DATA (line 37) | const TABLE_BODY_FIRST_ROW_FIRST_DATA = TABLE_BODY_FIRST_ROW + ' .js-fir...
  constant TABLE_BODY_FIRST_ROW_SECOND_DATA (line 38) | const TABLE_BODY_FIRST_ROW_SECOND_DATA = TABLE_BODY_FIRST_ROW + ' .js-se...
  constant TABLE_BODY_FIRST_ROW_THIRD_DATA (line 39) | const TABLE_BODY_FIRST_ROW_THIRD_DATA = TABLE_BODY_FIRST_ROW + ' .js-thi...
  constant LAD_SET_TABLE_HEADERS (line 40) | const LAD_SET_TABLE_HEADERS = '.js-lad-table-set__table-headers';
  function utcTimeFormat (line 42) | function utcTimeFormat(value) {

FILE: src/plugins/URLIndicatorPlugin/URLIndicator.js
  constant CONNECTED (line 28) | const CONNECTED = {
  constant PENDING (line 31) | const PENDING = {
  constant DISCONNECTED (line 34) | const DISCONNECTED = {
  function URLIndicator (line 37) | function URLIndicator(options, simpleIndicator) {

FILE: src/plugins/URLIndicatorPlugin/URLIndicatorPlugin.js
  function URLIndicatorPlugin (line 24) | function URLIndicatorPlugin(opts) {

FILE: src/plugins/URLTimeSettingsSynchronizer/URLTimeSettingsSynchronizer.js
  constant SEARCH_MODE (line 29) | const SEARCH_MODE = 'tc.mode';
  constant SEARCH_TIME_SYSTEM (line 30) | const SEARCH_TIME_SYSTEM = 'tc.timeSystem';
  constant SEARCH_START_BOUND (line 31) | const SEARCH_START_BOUND = 'tc.startBound';
  constant SEARCH_END_BOUND (line 32) | const SEARCH_END_BOUND = 'tc.endBound';
  constant SEARCH_START_DELTA (line 33) | const SEARCH_START_DELTA = 'tc.startDelta';
  constant SEARCH_END_DELTA (line 34) | const SEARCH_END_DELTA = 'tc.endDelta';
  constant TIME_EVENTS (line 35) | const TIME_EVENTS = [
  class URLTimeSettingsSynchronizer (line 42) | class URLTimeSettingsSynchronizer {
    method constructor (line 43) | constructor(openmct) {
    method initialize (line 57) | initialize() {
    method destroy (line 67) | destroy() {
    method updateTimeSettings (line 79) | updateTimeSettings() {
    method parseParametersFromUrl (line 90) | parseParametersFromUrl() {
    method setTimeApiFromUrl (line 115) | setTimeApiFromUrl(timeParameters) {
    method updateBounds (line 149) | updateBounds(bounds, isTick) {
    method setUrlFromTimeApi (line 155) | setUrlFromTimeApi() {
    method areTimeParametersValid (line 188) | areTimeParametersValid(timeParameters) {
    method areStartAndEndValid (line 205) | areStartAndEndValid(bounds) {
    method isTimeSystemValid (line 217) | isTimeSystemValid(timeSystem) {
    method isModeValid (line 228) | isModeValid(mode) {
    method areStartAndEndEqual (line 245) | areStartAndEndEqual(firstBounds, secondBounds) {

FILE: src/plugins/activityStates/activityStatesInterceptor.js
  constant ACTIVITY_STATES_TYPE (line 39) | const ACTIVITY_STATES_TYPE = 'activity-states';
  function activityStatesInterceptor (line 41) | function activityStatesInterceptor(openmct, options) {

FILE: src/plugins/activityStates/createActivityStatesIdentifier.js
  constant ACTIVITY_STATES_KEY (line 23) | const ACTIVITY_STATES_KEY = 'activity-states';
  function createActivityStatesIdentifier (line 25) | function createActivityStatesIdentifier(namespace = '') {

FILE: src/plugins/activityStates/pluginSpec.js
  constant MISSING_NAME (line 30) | const MISSING_NAME = `Missing: ${ACTIVITY_STATES_KEY}`;
  constant DEFAULT_NAME (line 31) | const DEFAULT_NAME = 'Activity States';

FILE: src/plugins/autoflow/AutoflowTabularController.js
  function AutoflowTabularController (line 34) | function AutoflowTabularController(domainObject, data, openmct) {

FILE: src/plugins/autoflow/AutoflowTabularPluginSpec.js
  function waitsForChange (line 87) | function waitsForChange() {
  function emitEvent (line 93) | function emitEvent(mockEmitter, type, event) {
  function rowsMatch (line 190) | function rowsMatch() {
  function widthHasChanged (line 242) | function widthHasChanged() {
  function rowTextDefined (line 262) | function rowTextDefined() {
  function columnsHaveAutoflowed (line 321) | function columnsHaveAutoflowed() {
  function setHeight (line 341) | function setHeight(height) {

FILE: src/plugins/autoflow/AutoflowTabularRowController.js
  function AutoflowTabularRowController (line 32) | function AutoflowTabularRowController(domainObject, data, openmct, callb...

FILE: src/plugins/autoflow/AutoflowTabularView.js
  constant ROW_HEIGHT (line 28) | const ROW_HEIGHT = AutoflowTabularConstants.ROW_HEIGHT;
  constant SLIDER_HEIGHT (line 29) | const SLIDER_HEIGHT = AutoflowTabularConstants.SLIDER_HEIGHT;
  constant INITIAL_COLUMN_WIDTH (line 30) | const INITIAL_COLUMN_WIDTH = AutoflowTabularConstants.INITIAL_COLUMN_WIDTH;
  constant MAX_COLUMN_WIDTH (line 31) | const MAX_COLUMN_WIDTH = AutoflowTabularConstants.MAX_COLUMN_WIDTH;
  constant COLUMN_WIDTH_STEP (line 32) | const COLUMN_WIDTH_STEP = AutoflowTabularConstants.COLUMN_WIDTH_STEP;
  function AutoflowTabularView (line 37) | function AutoflowTabularView(domainObject, openmct) {

FILE: src/plugins/autoflow/VueView.js
  class VueView (line 25) | class VueView {
    method constructor (line 26) | constructor(options) {

FILE: src/plugins/autoflow/dom-observer.js
  function DOMObserver (line 23) | function DOMObserver(element) {

FILE: src/plugins/charts/bar/BarGraphCompositionPolicy.js
  function BarGraphCompositionPolicy (line 25) | function BarGraphCompositionPolicy(openmct) {

FILE: src/plugins/charts/bar/BarGraphConstants.js
  constant BAR_GRAPH_VIEW (line 1) | const BAR_GRAPH_VIEW = 'bar-graph.view';
  constant BAR_GRAPH_KEY (line 2) | const BAR_GRAPH_KEY = 'telemetry.plot.bar-graph';
  constant BAR_GRAPH_INSPECTOR_KEY (line 3) | const BAR_GRAPH_INSPECTOR_KEY = 'telemetry.plot.bar-graph.inspector';

FILE: src/plugins/charts/bar/BarGraphViewProvider.js
  function BarGraphViewProvider (line 28) | function BarGraphViewProvider(openmct) {

FILE: src/plugins/charts/bar/inspector/BarGraphInspectorViewProvider.js
  function BarGraphInspectorViewProvider (line 6) | function BarGraphInspectorViewProvider(openmct) {

FILE: src/plugins/charts/bar/pluginSpec.js
  method observe (line 100) | observe() {}
  method unobserve (line 101) | unobserve() {}
  method disconnect (line 102) | disconnect() {}

FILE: src/plugins/charts/scatter/ScatterPlotCompositionPolicy.js
  function ScatterPlotCompositionPolicy (line 25) | function ScatterPlotCompositionPolicy(openmct) {

FILE: src/plugins/charts/scatter/ScatterPlotViewProvider.js
  function ScatterPlotViewProvider (line 28) | function ScatterPlotViewProvider(openmct) {

FILE: src/plugins/charts/scatter/inspector/ScatterPlotInspectorViewProvider.js
  function ScatterPlotInspectorViewProvider (line 6) | function ScatterPlotInspectorViewProvider(openmct) {

FILE: src/plugins/charts/scatter/plugin.js
  function getScatterPlotFormControl (line 101) | function getScatterPlotFormControl(openmct) {

FILE: src/plugins/charts/scatter/pluginSpec.js
  method observe (line 91) | observe() {}
  method unobserve (line 92) | unobserve() {}
  method disconnect (line 93) | disconnect() {}

FILE: src/plugins/charts/scatter/scatterPlotConstants.js
  constant SCATTER_PLOT_VIEW (line 1) | const SCATTER_PLOT_VIEW = 'scatter-plot.view';
  constant SCATTER_PLOT_KEY (line 2) | const SCATTER_PLOT_KEY = 'telemetry.plot.scatter-plot';
  constant SCATTER_PLOT_INSPECTOR_KEY (line 3) | const SCATTER_PLOT_INSPECTOR_KEY = 'telemetry.plot.scatter-plot.inspector';
  constant TIME_STRIP_KEY (line 4) | const TIME_STRIP_KEY = 'time-strip';

FILE: src/plugins/clearData/ClearDataAction.js
  function inSelectionPath (line 23) | function inSelectionPath(openmct, domainObject) {
  constant CLEAR_DATA_ACTION_KEY (line 35) | const CLEAR_DATA_ACTION_KEY = 'clear-data-action';
  class ClearDataAction (line 36) | class ClearDataAction {
    method constructor (line 37) | constructor(openmct, appliesToObjects) {
    method invoke (line 47) | invoke(objectPath) {
    method appliesTo (line 55) | appliesTo(objectPath) {

FILE: src/plugins/clearData/plugin.js
  function plugin (line 25) | function plugin(appliesToObjects, options = { indicator: true }) {

FILE: src/plugins/clock/ClockViewProvider.js
  function ClockViewProvider (line 27) | function ClockViewProvider(openmct) {

FILE: src/plugins/clock/plugin.js
  function ClockPlugin (line 28) | function ClockPlugin(options) {

FILE: src/plugins/clock/pluginSpec.js
  function setupClock (line 38) | function setupClock(enableClockIndicator) {

FILE: src/plugins/comps/CompsCompositionPolicy.js
  function CompsCompositionPolicy (line 23) | function CompsCompositionPolicy(openmct) {

FILE: src/plugins/comps/CompsInspectorViewProvider.js
  class CompsInspectorViewProvider (line 27) | class CompsInspectorViewProvider {
    method constructor (line 28) | constructor(openmct, compsManagerPool) {
    method canView (line 35) | canView(selection) {
    method view (line 44) | view(selection) {

FILE: src/plugins/comps/CompsManager.js
  class CompsManager (line 3) | class CompsManager extends EventEmitter {
    method constructor (line 17) | constructor(openmct, domainObject) {
    method #getNextAlphabeticalParameterName (line 24) | #getNextAlphabeticalParameterName() {
    method addParameter (line 42) | addParameter(telemetryObject) {
    method getParameters (line 70) | getParameters() {
    method getTelemetryObjectForParameter (line 81) | getTelemetryObjectForParameter(keyString) {
    method getMetaDataValuesForParameter (line 85) | getMetaDataValuesForParameter(keyString) {
    method deleteParameter (line 94) | deleteParameter(keyString) {
    method setDomainObject (line 108) | setDomainObject(passedDomainObject) {
    method isReady (line 112) | isReady() {
    method load (line 116) | async load(telemetryOptions) {
    method #startListeningToUnderlyingTelemetry (line 155) | async #startListeningToUnderlyingTelemetry() {
    method #destroy (line 192) | #destroy() {
    method stopListeningToUnderlyingTelemetry (line 201) | stopListeningToUnderlyingTelemetry() {
    method getTelemetryObjects (line 212) | getTelemetryObjects() {
    method #loadComposition (line 216) | async #loadComposition() {
    method #getParameterForKeyString (line 225) | #getParameterForKeyString(keyString) {
    method #getImputedDataUsingLOCF (line 231) | #getImputedDataUsingLOCF(datum, telemetryCollection) {
    method getDataFrameForRequest (line 247) | getDataFrameForRequest() {
    method getDataFrameForSubscription (line 285) | getDataFrameForSubscription(newTelemetry) {
    method #requestUnderlyingTelemetry (line 335) | #requestUnderlyingTelemetry() {
    method #getTelemetryProcessor (line 344) | #getTelemetryProcessor(keyString) {
    method clearData (line 360) | clearData(telemetryLoadedPromise) {
    method setOutputFormat (line 364) | setOutputFormat(outputFormat) {
    method getOutputFormat (line 369) | getOutputFormat() {
    method getExpression (line 373) | getExpression() {
    method getCompsManager (line 395) | static getCompsManager(domainObject, openmct, compsManagerPool) {

FILE: src/plugins/comps/CompsMathWorker.js
  function getFullDataFrame (line 35) | function getFullDataFrame(telemetryForComps, parameters) {
  function calculateSubscription (line 46) | function calculateSubscription(telemetryForComps, newTelemetry, paramete...
  function calculateRequest (line 58) | function calculateRequest(telemetryForComps, parameters, expression) {
  function calculate (line 63) | function calculate(dataFrame, parameters, expression) {

FILE: src/plugins/comps/CompsMetadataProvider.js
  class CompsMetadataProvider (line 24) | class CompsMetadataProvider {
    method constructor (line 28) | constructor(openmct, compsManagerPool) {
    method supportsMetadata (line 33) | supportsMetadata(domainObject) {
    method getDefaultDomains (line 37) | getDefaultDomains(domainObject) {
    method getMetadata (line 50) | getMetadata(domainObject) {

FILE: src/plugins/comps/CompsTelemetryProvider.js
  class CompsTelemetryProvider (line 25) | class CompsTelemetryProvider {
    method constructor (line 35) | constructor(openmct, compsManagerPool) {
    method isTelemetryObject (line 41) | isTelemetryObject(domainObject) {
    method supportsRequest (line 45) | supportsRequest(domainObject) {
    method supportsSubscribe (line 49) | supportsSubscribe(domainObject) {
    method #getCallbackID (line 53) | #getCallbackID() {
    method request (line 57) | request(domainObject, options) {
    method #computeOnNewTelemetry (line 88) | #computeOnNewTelemetry(specificCompsManager, callbackID, newTelemetry) {
    method subscribe (line 109) | subscribe(domainObject, callback) {
    method #startSharedWorker (line 135) | #startSharedWorker() {
    method onSharedWorkerMessage (line 153) | onSharedWorkerMessage(event) {
    method onSharedWorkerMessageError (line 172) | onSharedWorkerMessageError(event) {

FILE: src/plugins/comps/CompsViewProvider.js
  constant DEFAULT_VIEW_PRIORITY (line 27) | const DEFAULT_VIEW_PRIORITY = 100;
  class CompsViewProvider (line 29) | class CompsViewProvider {
    method constructor (line 30) | constructor(openmct, compsManagerPool) {
    method canView (line 38) | canView(domainObject, objectPath) {
    method canEdit (line 42) | canEdit(domainObject, objectPath) {
    method view (line 46) | view(domainObject, objectPath) {
    method priority (line 91) | priority(domainObject) {

FILE: src/plugins/comps/plugin.js
  function DerivedTelemetryPlugin (line 27) | function DerivedTelemetryPlugin() {

FILE: src/plugins/condition/Condition.js
  class Condition (line 46) | class Condition extends EventEmitter {
    method constructor (line 55) | constructor(definition, openmct, conditionManager) {
    method id (line 75) | get id() {
    method configuration (line 78) | get configuration() {
    method updateResult (line 82) | updateResult(latestDataTable, telemetryIdThatChanged) {
    method isAnyOrAllTelemetry (line 109) | isAnyOrAllTelemetry(criterion) {
    method hasNoTelemetry (line 113) | hasNoTelemetry() {
    method isTelemetryUsed (line 121) | isTelemetryUsed(id) {
    method update (line 127) | update(conditionConfiguration) {
    method updateTrigger (line 132) | updateTrigger(trigger) {
    method generateCriterion (line 138) | generateCriterion(criterionConfiguration) {
    method createCriteria (line 149) | createCriteria(criterionConfigurations) {
    method updateCriteria (line 155) | updateCriteria(criterionConfigurations) {
    method updateTelemetryObjects (line 160) | updateTelemetryObjects() {
    method addCriterion (line 169) | addCriterion(criterionConfiguration) {
    method findCriterion (line 193) | findCriterion(id) {
    method updateCriterion (line 208) | updateCriterion(id, criterionConfiguration) {
    method destroyCriterion (line 226) | destroyCriterion(id) {
    method handleCriterionUpdated (line 242) | handleCriterionUpdated(criterion) {
    method handleOldTelemetryCriterion (line 249) | handleOldTelemetryCriterion(updatedCriterion) {
    method handleTelemetryStaleness (line 264) | handleTelemetryStaleness() {
    method updateDescription (line 272) | updateDescription() {
    method getTriggerDescription (line 287) | getTriggerDescription() {
    method requestLADConditionResult (line 301) | requestLADConditionResult(options) {
    method getCriteria (line 336) | getCriteria() {
    method destroyCriteria (line 340) | destroyCriteria() {
    method destroy (line 350) | destroy() {

FILE: src/plugins/condition/ConditionManager.js
  class ConditionManager (line 29) | class ConditionManager extends EventEmitter {
    method constructor (line 36) | constructor(conditionSetDomainObject, openmct) {
    method subscribeToTelemetry (line 57) | subscribeToTelemetry(telemetryObject) {
    method unsubscribeFromTelemetry (line 88) | unsubscribeFromTelemetry(endpointIdentifier) {
    method initialize (line 116) | initialize() {
    method updateConditionTelemetryObjects (line 132) | updateConditionTelemetryObjects() {
    method removeConditionTelemetryObjects (line 146) | removeConditionTelemetryObjects() {
    method updateConditionDescription (line 183) | updateConditionDescription(condition) {
    method updateCondition (line 189) | updateCondition(conditionConfiguration) {
    method initCondition (line 206) | initCondition(conditionConfiguration, index) {
    method createCondition (line 217) | createCondition(conditionConfiguration) {
    method addCondition (line 252) | addCondition() {
    method cloneCondition (line 256) | cloneCondition(conditionConfiguration, index) {
    method createAndSaveCondition (line 262) | createAndSaveCondition(index, conditionConfiguration) {
    method removeCondition (line 278) | removeCondition(id) {
    method findConditionById (line 298) | findConditionById(id) {
    method reorderConditions (line 302) | reorderConditions(reorderPlan) {
    method getCurrentConditionLAD (line 313) | getCurrentConditionLAD(conditionResults) {
    method requestLADConditionSetOutput (line 328) | async requestLADConditionSetOutput(options) {
    method isTelemetryUsed (line 378) | isTelemetryUsed(endpoint) {
    method shouldEvaluateNewTelemetry (line 390) | shouldEvaluateNewTelemetry(currentTimestamp) {
    method telemetryReceived (line 394) | telemetryReceived(endpoint, data) {
    method updateConditionResults (line 415) | updateConditionResults(keyStringForUpdatedTelemetryObject) {
    method updateCurrentCondition (line 426) | updateCurrentCondition(timestamp, matchingCondition) {
    method getTestData (line 445) | getTestData(metadatum, identifier) {
    method createNormalizedDatum (line 461) | createNormalizedDatum(telemetryDatum, endpoint) {
    method updateTestData (line 481) | updateTestData(testData) {
    method persistConditions (line 492) | persistConditions() {
    method destroy (line 500) | destroy() {

FILE: src/plugins/condition/ConditionManagerSpec.js
  function mockAngularComponents (line 70) | function mockAngularComponents() {

FILE: src/plugins/condition/ConditionSetCompositionPolicy.js
  function ConditionSetCompositionPolicy (line 23) | function ConditionSetCompositionPolicy(openmct) {

FILE: src/plugins/condition/ConditionSetMetadataProvider.js
  class ConditionSetMetadataProvider (line 23) | class ConditionSetMetadataProvider {
    method constructor (line 24) | constructor(openmct) {
    method supportsMetadata (line 28) | supportsMetadata(domainObject) {
    method getDomains (line 32) | getDomains(domainObject) {
    method getMetadata (line 45) | getMetadata(domainObject) {

FILE: src/plugins/condition/ConditionSetTelemetryProvider.js
  class ConditionSetTelemetryProvider (line 25) | class ConditionSetTelemetryProvider {
    method constructor (line 26) | constructor(openmct) {
    method isTelemetryObject (line 31) | isTelemetryObject(domainObject) {
    method supportsRequest (line 35) | supportsRequest(domainObject) {
    method supportsSubscribe (line 39) | supportsSubscribe(domainObject) {
    method request (line 43) | async request(domainObject, options) {
    method subscribe (line 49) | subscribe(domainObject, callback) {
    method getConditionManager (line 67) | getConditionManager(domainObject) {
    method destroyConditionManager (line 81) | destroyConditionManager(id) {

FILE: src/plugins/condition/ConditionSetViewProvider.js
  class ConditionSetViewProvider (line 27) | class ConditionSetViewProvider {
    method constructor (line 28) | constructor(openmct) {
    method canView (line 35) | canView(domainObject, objectPath) {
    method canEdit (line 41) | canEdit(domainObject, objectPath) {
    method view (line 47) | view(domainObject, objectPath) {
    method priority (line 91) | priority(domainObject) {

FILE: src/plugins/condition/ConditionSpec.js
  method parse (line 101) | parse(input) {

FILE: src/plugins/condition/StyleRuleManager.js
  class StyleRuleManager (line 25) | class StyleRuleManager extends EventEmitter {
    method constructor (line 26) | constructor(styleConfiguration, openmct, callback, suppressSubscriptio...
    method toggleSubscription (line 52) | toggleSubscription(isEditing) {
    method initialize (line 72) | initialize(styleConfiguration) {
    method subscribeToConditionSet (line 80) | subscribeToConditionSet() {
    method refreshData (line 115) | refreshData(bounds, isTick) {
    method updateObjectStyleConfig (line 133) | updateObjectStyleConfig(styleConfiguration) {
    method updateConditionStylesMap (line 157) | updateConditionStylesMap(conditionStyles) {
    method handleConditionSetResultUpdated (line 169) | handleConditionSetResultUpdated(resultData) {
    method updateDomainObjectStyle (line 182) | updateDomainObjectStyle() {
    method applySelectedConditionStyle (line 188) | applySelectedConditionStyle() {
    method applyStaticStyle (line 198) | applyStaticStyle() {
    method destroy (line 212) | destroy(skipEventListeners) {

FILE: src/plugins/condition/criterion/AllTelemetryCriterion.js
  class AllTelemetryCriterion (line 30) | class AllTelemetryCriterion extends TelemetryCriterion {
    method initialize (line 40) | initialize() {
    method checkForOldData (line 53) | checkForOldData(telemetryObjects) {
    method handleOldTelemetry (line 68) | handleOldTelemetry(id, data) {
    method subscribeToStaleness (line 77) | subscribeToStaleness(telemetryObjects) {
    method handleStaleTelemetry (line 105) | handleStaleTelemetry(id, stalenessResponse) {
    method isValid (line 116) | isValid() {
    method updateTelemetryObjects (line 122) | updateTelemetryObjects(telemetryObjects) {
    method removeTelemetryDataCache (line 135) | removeTelemetryDataCache() {
    method formatData (line 153) | formatData(data, telemetryObjects) {
    method updateResult (line 180) | updateResult(allTelemetryDataMap, telemetryObjects) {
    method requestLAD (line 211) | requestLAD(telemetryObjects, requestOptions) {
    method getDescription (line 267) | getDescription() {
    method destroy (line 290) | destroy() {

FILE: src/plugins/condition/criterion/TelemetryCriterion.js
  class TelemetryCriterion (line 31) | class TelemetryCriterion extends EventEmitter {
    method constructor (line 43) | constructor(telemetryDomainObjectDefinition, openmct) {
    method initialize (line 67) | initialize() {
    method usesTelemetry (line 86) | usesTelemetry(id) {
    method checkForOldData (line 90) | checkForOldData() {
    method handleOldTelemetry (line 97) | handleOldTelemetry(data) {
    method subscribeToStaleness (line 102) | subscribeToStaleness() {
    method handleStaleTelemetry (line 122) | handleStaleTelemetry(stalenessResponse) {
    method isValid (line 132) | isValid() {
    method isOldCheck (line 136) | isOldCheck() {
    method isStalenessCheck (line 140) | isStalenessCheck() {
    method isValidInput (line 144) | isValidInput() {
    method updateTelemetryObjects (line 148) | updateTelemetryObjects(telemetryObjects) {
    method createNormalizedDatum (line 160) | createNormalizedDatum(telemetryDatum, endpoint) {
    method formatData (line 179) | formatData(data) {
    method shouldUpdateResult (line 192) | shouldUpdateResult(datum, timesystem) {
    method updateResult (line 200) | updateResult(data, currentTimeSystemKey) {
    method requestLAD (line 218) | requestLAD(telemetryObjects, requestOptions) {
    method #findOperation (line 258) | #findOperation(operation) {
    method computeResult (line 268) | computeResult(data) {
    method emitEvent (line 285) | emitEvent(eventName, data) {
    method getMetaDataObject (line 292) | getMetaDataObject(telemetryObject, metadata) {
    method getInputValueFromMetaData (line 306) | getInputValueFromMetaData(metadataObject, input) {
    method getMetadataValueFromMetaData (line 322) | getMetadataValueFromMetaData(metadataObject) {
    method getDescription (line 333) | getDescription(criterion, index) {
    method destroy (line 352) | destroy() {

FILE: src/plugins/condition/plugin.js
  function ConditionPlugin (line 29) | function ConditionPlugin() {

FILE: src/plugins/condition/utils/constants.js
  constant TRIGGER (line 23) | const TRIGGER = {
  constant TRIGGER_LABEL (line 30) | const TRIGGER_LABEL = {
  constant TRIGGER_CONJUNCTION (line 37) | const TRIGGER_CONJUNCTION = {
  constant STYLE_CONSTANTS (line 44) | const STYLE_CONSTANTS = {
  constant ERROR (line 54) | const ERROR = {
  constant IS_OLD_KEY (line 63) | const IS_OLD_KEY = 'isStale';
  constant IS_STALE_KEY (line 64) | const IS_STALE_KEY = 'isStale.new';

FILE: src/plugins/condition/utils/evaluator.js
  function evaluateResults (line 24) | function evaluateResults(results, trigger) {
  function matchAll (line 36) | function matchAll(results) {
  function matchAny (line 46) | function matchAny(results) {
  function matchExact (line 56) | function matchExact(results, target) {

FILE: src/plugins/condition/utils/operations.js
  function convertToNumbers (line 25) | function convertToNumbers(input) {
  function convertToStrings (line 32) | function convertToStrings(input) {
  function joinValues (line 41) | function joinValues(values, length) {
  constant OPERATIONS (line 45) | const OPERATIONS = [
  constant INPUT_TYPES (line 327) | const INPUT_TYPES = {
  function getOperatorText (line 332) | function getOperatorText(operationName, values) {

FILE: src/plugins/condition/utils/styleUtils.js
  constant NONE_VALUE (line 24) | const NONE_VALUE = '__no_value';
  function aggregateStyleValues (line 73) | function aggregateStyleValues(accumulator, currentStyle) {
  function getStaticStyleForItem (line 90) | function getStaticStyleForItem(domainObject, id) {
  function getConsolidatedStyleValues (line 106) | function getConsolidatedStyleValues(multipleItemStyles) {
  function getConditionalStyleForItem (line 130) | function getConditionalStyleForItem(domainObject, id) {
  function getConditionSetIdentifierForItem (line 144) | function getConditionSetIdentifierForItem(domainObject, id) {
  function getApplicableStylesForItem (line 159) | function getApplicableStylesForItem(domainObject, item) {
  function getStylesWithoutNoneValue (line 184) | function getStylesWithoutNoneValue(style) {

FILE: src/plugins/condition/utils/time.js
  function updateLatestTimeStamp (line 23) | function updateLatestTimeStamp(timestamp, timeSystems) {
  function getLatestTimestamp (line 33) | function getLatestTimestamp(
  function checkIfOld (line 54) | function checkIfOld(callback, timeout) {

FILE: src/plugins/condition/utils/timeSpec.js
  function updated (line 42) | function updated() {

FILE: src/plugins/conditionWidget/ConditionWidgetViewProvider.js
  function ConditionWidget (line 27) | function ConditionWidget(openmct) {

FILE: src/plugins/conditionWidget/conditionWidgetStylesInterceptor.js
  function conditionWidgetStylesInterceptor (line 23) | function conditionWidgetStylesInterceptor(openmct) {

FILE: src/plugins/conditionWidget/plugin.js
  function plugin (line 26) | function plugin() {

FILE: src/plugins/correlationTelemetryPlugin/plugin.js
  constant CORRELATOR_TYPE (line 1) | const CORRELATOR_TYPE = 'telemetry.correlator';
  function CorrelationTelemetryPlugin (line 3) | function CorrelationTelemetryPlugin() {

FILE: src/plugins/defaultRootName/pluginSpec.js
  constant OLD_ROOT_NAME (line 24) | const OLD_ROOT_NAME = 'Open MCT';
  constant NEW_ROOT_NAME (line 25) | const NEW_ROOT_NAME = 'not_a_root';

FILE: src/plugins/displayLayout/AlphanumericFormatViewProvider.js
  class AlphanumericFormatView (line 27) | class AlphanumericFormatView {
    method constructor (line 28) | constructor(openmct, domainObject, objectPath) {
    method show (line 36) | show(element) {
    method getViewContext (line 59) | getViewContext() {
    method priority (line 67) | priority() {
    method destroy (line 73) | destroy() {
  function AlphanumericFormatViewProvider (line 80) | function AlphanumericFormatViewProvider(openmct, options) {

FILE: src/plugins/displayLayout/CustomStringFormatter.js
  class CustomStringFormatter (line 3) | class CustomStringFormatter {
    method constructor (line 4) | constructor(openmct, valueMetadata, itemFormat) {
    method format (line 11) | format(datum) {
    method setFormat (line 35) | setFormat(itemFormat) {

FILE: src/plugins/displayLayout/CustomStringFormatterSpec.js
  constant CUSTOM_FORMATS (line 5) | const CUSTOM_FORMATS = [

FILE: src/plugins/displayLayout/DisplayLayoutToolbar.js
  constant CONTEXT_ACTION (line 25) | const CONTEXT_ACTION = 'contextAction';
  constant CONTEXT_ACTIONS (line 26) | const CONTEXT_ACTIONS = Object.freeze({
  constant DIALOG_FORM (line 37) | const DIALOG_FORM = {
  constant VIEW_TYPES (line 71) | const VIEW_TYPES = {
  constant APPLICABLE_VIEWS (line 93) | const APPLICABLE_VIEWS = {
  class DisplayLayoutToolbar (line 122) | class DisplayLayoutToolbar {
    method constructor (line 125) | constructor(openmct) {
    method forSelection (line 132) | forSelection(selection) {
    method #getPath (line 150) | #getPath(selectionPath) {
    method #getAllOfType (line 154) | #getAllOfType(selection, specificType) {
    method #getAllTypes (line 162) | #getAllTypes(selection) {
    method #getAddButton (line 178) | #getAddButton(selection, selectionPath) {
    method #getToggleFrameButton (line 230) | #getToggleFrameButton(selectedParent, selection) {
    method #getRemoveButton (line 257) | #getRemoveButton(selectedParent, selectionPath, selection) {
    method #getStackOrder (line 295) | #getStackOrder(selectedParent, selectionPath, selectedObjects) {
    method #getXInput (line 336) | #getXInput(selectedParent, selection) {
    method #getYInput (line 352) | #getYInput(selectedParent, selection) {
    method #getWidthInput (line 368) | #getWidthInput(selectedParent, selection) {
    method #getHeightInput (line 384) | #getHeightInput(selectedParent, selection) {
    method #getX2Input (line 400) | #getX2Input(selectedParent, selection) {
    method #getY2Input (line 418) | #getY2Input(selectedParent, selection) {
    method #getTextButton (line 436) | #getTextButton(selectedParent, selection) {
    method #getTelemetryValueMenu (line 453) | #getTelemetryValueMenu(selectionPath, selection) {
    method #getDisplayModeMenu (line 478) | #getDisplayModeMenu(selectedParent, selection) {
    method #getDuplicateButton (line 508) | #getDuplicateButton(selectedParent, selectionPath, selection) {
    method #getPropertyFromPath (line 526) | #getPropertyFromPath(object, path) {
    method #areAllViews (line 537) | #areAllViews(type, path, selection) {
    method #getToggleUnitsButton (line 551) | #getToggleUnitsButton(selectedParent, selection) {
    method #unitsOnly (line 582) | #unitsOnly(items) {
    method #getViewSwitcherMenu (line 598) | #getViewSwitcherMenu(selectedParent, selectionPath, selection) {
    method #getToggleGridButton (line 670) | #getToggleGridButton(selection, selectionPath) {
    method #getSeparator (line 701) | #getSeparator() {
    method #isMainLayoutSelected (line 707) | #isMainLayoutSelected(selectionPath) {
    method #showForm (line 715) | #showForm(formStructure, name, selection) {
    method toolbar (line 729) | toolbar(selectedObjects) {

FILE: src/plugins/displayLayout/DisplayLayoutType.js
  function DisplayLayoutType (line 23) | function DisplayLayoutType() {

FILE: src/plugins/displayLayout/LayoutDrag.js
  function LayoutDrag (line 49) | function LayoutDrag(rawPosition, posFactor, dimFactor, gridSize) {
  function toGridDelta (line 58) | function toGridDelta(gridSize, pixelDelta) {
  function multiply (line 65) | function multiply(array, factors) {
  function add (line 72) | function add(array, other) {
  function max (line 79) | function max(array, other) {

FILE: src/plugins/displayLayout/actions/CopyToClipboardAction.js
  constant COPY_TO_CLIPBOARD_ACTION_KEY (line 3) | const COPY_TO_CLIPBOARD_ACTION_KEY = 'copyToClipboard';
  class CopyToClipboardAction (line 5) | class CopyToClipboardAction {
    method constructor (line 6) | constructor(openmct) {
    method invoke (line 17) | invoke(objectPath, view = {}) {
    method appliesTo (line 31) | appliesTo(objectPath, view = {}) {

FILE: src/plugins/displayLayout/displayLayoutStylesInterceptor.js
  function displayLayoutStylesInterceptor (line 23) | function displayLayoutStylesInterceptor(openmct) {

FILE: src/plugins/displayLayout/mixins/objectStyles-mixin.js
  method data (line 28) | data() {
  method mounted (line 35) | mounted() {
  method beforeUnmount (line 43) | beforeUnmount() {
  method getObjectStyleForItem (line 53) | getObjectStyleForItem(objectStyle) {
  method initObjectStyles (line 60) | initObjectStyles() {
  method updateStyle (line 89) | updateStyle(style) {

FILE: src/plugins/displayLayout/plugin.js
  class DisplayLayoutView (line 33) | class DisplayLayoutView {
    method constructor (line 34) | constructor(openmct, domainObject, objectPath, options) {
    method show (line 43) | show(container, isEditing, { renderWhenVisible }) {
    method getViewContext (line 75) | getViewContext() {
    method getSelectionContext (line 83) | getSelectionContext() {
    method contextAction (line 90) | contextAction(action, ...rest) {
    method onEditModeChange (line 96) | onEditModeChange(isEditing) {
    method destroy (line 100) | destroy() {
  function DisplayLayoutPlugin (line 108) | function DisplayLayoutPlugin(options) {

FILE: src/plugins/duplicate/DuplicateAction.js
  constant DUPLICATE_ACTION_KEY (line 24) | const DUPLICATE_ACTION_KEY = 'duplicate';
  class DuplicateAction (line 26) | class DuplicateAction {
    method constructor (line 27) | constructor(openmct) {
    method invoke (line 39) | invoke(objectPath) {
    method inNavigationPath (line 46) | inNavigationPath() {
    method onSave (line 52) | async onSave(changes) {
    method showForm (line 73) | showForm(domainObject, parentDomainObject) {
    method validate (line 105) | validate(currentParent) {
    method appliesTo (line 138) | appliesTo(objectPath) {
    method startTransaction (line 158) | startTransaction() {
    method saveTransaction (line 164) | async saveTransaction() {

FILE: src/plugins/duplicate/DuplicateTask.js
  class DuplicateTask (line 36) | class DuplicateTask {
    method constructor (line 37) | constructor(openmct) {
    method changeName (line 50) | changeName(name) {
    method duplicate (line 59) | async duplicate(domainObject, parent, filter) {
    method buildDuplicationPlan (line 84) | async buildDuplicationPlan() {
    method persistObjects (line 104) | async persistObjects() {
    method addClonesToParent (line 135) | async addClonesToParent() {
    method duplicateObject (line 154) | async duplicateObject(originalObject) {
    method duplicateComposees (line 178) | async duplicateComposees(clonedParent, composees = []) {
    method rewriteIdentifiers (line 210) | rewriteIdentifiers(clonedParent, childIdMappings) {
    method composeChild (line 241) | composeChild(child, parent, setLocation) {
    method getTypeDefinition (line 251) | getTypeDefinition(domainObject, definition) {
    method cloneObjectModel (line 257) | cloneObjectModel(domainObject) {
    method getKeyString (line 282) | getKeyString(domainObject) {
    method isCreatable (line 286) | isCreatable(domainObject) {

FILE: src/plugins/events/EventInspectorViewProvider.js
  function EventInspectorViewProvider (line 5) | function EventInspectorViewProvider(openmct) {

FILE: src/plugins/events/EventTimelineViewProvider.js
  function EventTimestripViewProvider (line 26) | function EventTimestripViewProvider(openmct, extendedLinesBus) {

FILE: src/plugins/events/mixins/eventData.js
  constant DEFAULT_DURATION_FORMATTER (line 23) | const DEFAULT_DURATION_FORMATTER = 'duration';
  method mounted (line 28) | mounted() {
  method beforeUnmount (line 49) | beforeUnmount() {
  method dataAdded (line 65) | dataAdded(addedItems, addedItemIndices) {
  method dataCleared (line 74) | dataCleared() {
  method dataRemoved (line 77) | dataRemoved(removed) {
  method setDataTimeContext (line 90) | setDataTimeContext() {
  method stopFollowingDataTimeContext (line 96) | stopFollowingDataTimeContext() {
  method formatEventUrl (line 102) | formatEventUrl(datum) {
  method formatEventThumbnailUrl (line 109) | formatEventThumbnailUrl(datum) {
  method formatTime (line 116) | formatTime(datum) {
  method getEventDownloadName (line 126) | getEventDownloadName(datum) {
  method parseTime (line 135) | parseTime(datum) {
  method loadTelemetry (line 142) | loadTelemetry() {
  method boundsChanged (line 151) | boundsChanged(bounds, isTick) {
  method timeSystemChanged (line 158) | timeSystemChanged() {
  method normalizeDatum (line 166) | normalizeDatum(datum) {
  method getFormatter (line 176) | getFormatter(key) {

FILE: src/plugins/events/plugin.js
  function plugin (line 26) | function plugin(extendedLinesBus) {

FILE: src/plugins/exportAsJSONAction/ExportAsJSONAction.js
  constant EXPORT_AS_JSON_ACTION_KEY (line 25) | const EXPORT_AS_JSON_ACTION_KEY = 'export.JSON';
  class ExportAsJSONAction (line 27) | class ExportAsJSONAction {
    method constructor (line 33) | constructor(openmct) {
    method appliesTo (line 66) | appliesTo(objectPath) {
    method invoke (line 75) | invoke(objectPath) {
    method #write (line 113) | async #write(parent) {
    method #updateProgress (line 165) | #updateProgress() {
    method #exportObject (line 173) | #exportObject(child, parent) {
    method #rewriteLink (line 199) | #rewriteLink(child, parent) {
    method #getKeystring (line 273) | #getKeystring(domainObject) {
    method #isCreatableAndPersistable (line 282) | #isCreatableAndPersistable(domainObject) {
    method #isLinkedObject (line 295) | #isLinkedObject(child, parent) {
    method #getConditionSetIdentifier (line 308) | #getConditionSetIdentifier(object) {
    method #hasItemConditionSetIdentifiers (line 312) | #hasItemConditionSetIdentifiers(parent) {
    method #getItemConditionSetIdentifiers (line 324) | #getItemConditionSetIdentifiers(parent) {
    method #resetCounts (line 339) | #resetCounts() {
    method #rewriteReferences (line 347) | #rewriteReferences() {
    method saveAs (line 382) | saveAs(completedTree) {
    method #wrapTree (line 389) | #wrapTree() {
    method #decrementCallsAndSave (line 396) | #decrementCallsAndSave() {
    method #copy (line 410) | #copy(object) {

FILE: src/plugins/faultManagement/FaultManagementInspectorViewProvider.js
  function FaultManagementInspectorViewProvider (line 28) | function FaultManagementInspectorViewProvider(openmct) {

FILE: src/plugins/faultManagement/FaultManagementObjectProvider.js
  class FaultManagementObjectProvider (line 29) | class FaultManagementObjectProvider {
    method constructor (line 30) | constructor(openmct) {
    method createFaultManagementRootObject (line 39) | createFaultManagementRootObject() {
    method get (line 53) | get(identifier) {

FILE: src/plugins/faultManagement/FaultManagementPlugin.js
  function FaultManagementPlugin (line 28) | function FaultManagementPlugin() {

FILE: src/plugins/faultManagement/FaultManagementViewProvider.js
  class FaultManagementViewProvider (line 28) | class FaultManagementViewProvider {
    method constructor (line 29) | constructor(openmct) {
    method canView (line 34) | canView(domainObject) {
    method canEdit (line 38) | canEdit(domainObject) {
    method view (line 42) | view(domainObject) {

FILE: src/plugins/faultManagement/constants.js
  constant FAULT_SEVERITY (line 23) | const FAULT_SEVERITY = {
  function sortByTriggerTime (line 41) | function sortByTriggerTime(a, b) {
  constant FAULT_MANAGEMENT_TYPE (line 53) | const FAULT_MANAGEMENT_TYPE = 'faultManagement';
  constant FAULT_MANAGEMENT_INSPECTOR (line 54) | const FAULT_MANAGEMENT_INSPECTOR = 'faultManagementInspector';
  constant FAULT_MANAGEMENT_ALARMS (line 55) | const FAULT_MANAGEMENT_ALARMS = 'alarms';
  constant FAULT_MANAGEMENT_GLOBAL_ALARMS (line 56) | const FAULT_MANAGEMENT_GLOBAL_ALARMS = 'global-alarm-status';
  constant FAULT_MANAGEMENT_VIEW (line 57) | const FAULT_MANAGEMENT_VIEW = 'faultManagement.view';
  constant FAULT_MANAGEMENT_NAMESPACE (line 58) | const FAULT_MANAGEMENT_NAMESPACE = 'faults.taxonomy';
  constant FILTER_ITEMS (line 59) | const FILTER_ITEMS = ['Standard View', 'Acknowledged', 'Unacknowledged',...
  constant SORT_ITEMS (line 60) | const SORT_ITEMS = {

FILE: src/plugins/filters/FiltersInspectorViewProvider.js
  constant FILTERS_INSPECTOR_KEY (line 27) | const FILTERS_INSPECTOR_KEY = 'filters-inspector';
  class FiltersInspectorViewProvider (line 28) | class FiltersInspectorViewProvider {
    method constructor (line 29) | constructor(openmct, supportedObjectTypesArray) {
    method canView (line 35) | canView(selection) {
    method view (line 42) | view(selection) {

FILE: src/plugins/filters/plugin.js
  function plugin (line 25) | function plugin(supportedObjectTypesArray) {

FILE: src/plugins/flexibleLayout/flexibleLayoutStylesInterceptor.js
  function flexibleLayoutStylesInterceptor (line 23) | function flexibleLayoutStylesInterceptor(openmct) {

FILE: src/plugins/flexibleLayout/flexibleLayoutViewProvider.js
  constant FLEXIBLE_LAYOUT_KEY (line 27) | const FLEXIBLE_LAYOUT_KEY = 'flexible-layout';
  class FlexibleLayoutViewProvider (line 28) | class FlexibleLayoutViewProvider {
    method constructor (line 29) | constructor(openmct) {
    method canView (line 37) | canView(domainObject) {
    method canEdit (line 41) | canEdit(domainObject) {
    method view (line 45) | view(domainObject, objectPath) {

FILE: src/plugins/flexibleLayout/plugin.js
  function plugin (line 29) | function plugin() {

FILE: src/plugins/flexibleLayout/toolbarProvider.js
  function ToolbarProvider (line 23) | function ToolbarProvider(openmct) {

FILE: src/plugins/folderView/FolderGridView.js
  class FolderGridView (line 27) | class FolderGridView {
    method constructor (line 28) | constructor(openmct) {
    method canView (line 34) | canView(domainObject) {
    method view (line 38) | view(domainObject) {

FILE: src/plugins/folderView/FolderListView.js
  class FolderListView (line 28) | class FolderListView {
    method constructor (line 29) | constructor(openmct) {
    method canView (line 36) | canView(domainObject) {
    method view (line 40) | view(domainObject) {

FILE: src/plugins/folderView/components/composition-loader.js
  method data (line 10) | data() {
  method mounted (line 15) | mounted() {
  method beforeUnmount (line 26) | beforeUnmount() {
  method add (line 34) | add(child, index, anything) {
  method remove (line 44) | remove(identifier) {

FILE: src/plugins/folderView/components/status-listener.js
  method statusClass (line 10) | statusClass() {
  method data (line 14) | data() {
  method setStatus (line 20) | setStatus(status) {
  method mounted (line 24) | mounted() {
  method unmounted (line 30) | unmounted() {

FILE: src/plugins/folderView/constants.js
  constant ALLOWED_FOLDER_TYPES (line 23) | const ALLOWED_FOLDER_TYPES = ['folder', 'noneditable.folder'];

FILE: src/plugins/formActions/CreateAction.js
  constant CREATE_ACTION_KEY (line 29) | const CREATE_ACTION_KEY = 'create';
  class CreateAction (line 31) | class CreateAction extends PropertiesAction {
    method constructor (line 34) | constructor(openmct) {
    method invoke (line 43) | get invoke() {
    method _onSave (line 50) | async _onSave(changes) {
    method _onCancel (line 104) | _onCancel() {
    method _navigateAndEdit (line 114) | async _navigateAndEdit(domainObject, parentDomainObjectpath) {
    method _showCreateForm (line 148) | _showCreateForm(type, parentDomainObject) {
    method startTransaction (line 181) | startTransaction() {
    method saveTransaction (line 187) | async saveTransaction() {

FILE: src/plugins/formActions/CreateActionSpec.js
  function callback (line 104) | function callback(newObject) {

FILE: src/plugins/formActions/CreateWizard.js
  class CreateWizard (line 23) | class CreateWizard {
    method constructor (line 24) | constructor(openmct, domainObject, parent) {
    method addNotes (line 35) | addNotes(sections) {
    method addTitle (line 54) | addTitle(sections) {
    method getFormStructure (line 83) | getFormStructure(includeLocation) {
    method getValue (line 138) | getValue(row) {

FILE: src/plugins/formActions/EditPropertiesAction.js
  constant EDIT_PROPERTIES_ACTION_KEY (line 27) | const EDIT_PROPERTIES_ACTION_KEY = 'properties';
  class EditPropertiesAction (line 29) | class EditPropertiesAction extends PropertiesAction {
    method constructor (line 30) | constructor(openmct) {
    method appliesTo (line 43) | appliesTo(objectPath) {
    method invoke (line 51) | invoke(objectPath) {
    method _onSave (line 58) | async _onSave(changes) {
    method _onCancel (line 84) | _onCancel() {
    method _showEditForm (line 91) | _showEditForm(objectPath) {

FILE: src/plugins/formActions/PropertiesAction.js
  class PropertiesAction (line 22) | class PropertiesAction {
    method constructor (line 23) | constructor(openmct) {
    method _getTypeDefinition (line 30) | _getTypeDefinition(type) {

FILE: src/plugins/formActions/pluginSpec.js
  function callback (line 143) | function callback(newObject) {

FILE: src/plugins/gauge/GaugeCompositionPolicy.js
  function GaugeCompositionPolicy (line 23) | function GaugeCompositionPolicy(openmct) {

FILE: src/plugins/gauge/GaugePlugin.js
  constant GAUGE_TYPES (line 30) | const GAUGE_TYPES = [
  method initialize (line 49) | initialize(domainObject) {
  function getGaugeFormController (line 174) | function getGaugeFormController(openmct) {

FILE: src/plugins/gauge/GaugePluginSpec.js
  function WatchUpdateValue (line 213) | function WatchUpdateValue() {
  function WatchUpdateValue (line 355) | function WatchUpdateValue() {
  function WatchUpdateValue (line 497) | function WatchUpdateValue() {
  function WatchUpdateValue (line 813) | function WatchUpdateValue() {

FILE: src/plugins/gauge/GaugeViewProvider.js
  function GaugeViewProvider (line 27) | function GaugeViewProvider(openmct) {

FILE: src/plugins/gauge/gauge-limit-util.js
  constant GAUGE_LIMITS (line 1) | const GAUGE_LIMITS = {
  constant DIAL_VALUE_DEG_OFFSET (line 8) | const DIAL_VALUE_DEG_OFFSET = 45;
  function getLimitDegree (line 12) | function getLimitDegree(type, quadrant) {
  function getLowLimitDegree (line 20) | function getLowLimitDegree(quadrant) {
  function getHighLimitDegree (line 24) | function getHighLimitDegree(quadrant) {

FILE: src/plugins/gauge/gaugeStylesInterceptor.js
  function gaugeStylesInterceptor (line 23) | function gaugeStylesInterceptor(openmct) {

FILE: src/plugins/goToOriginalAction/goToOriginalAction.js
  constant GO_TO_ORIGINAL_ACTION_KEY (line 23) | const GO_TO_ORIGINAL_ACTION_KEY = 'goToOriginal';
  class GoToOriginalAction (line 25) | class GoToOriginalAction {
    method constructor (line 26) | constructor(openmct) {
    method invoke (line 35) | invoke(objectPath) {
    method appliesTo (line 52) | appliesTo(objectPath) {

FILE: src/plugins/goToOriginalAction/pluginSpec.js
  function waitForNavigation (line 84) | function waitForNavigation(navigated) {
  function getMockObject (line 104) | function getMockObject(key) {

FILE: src/plugins/hyperlink/HyperlinkProvider.js
  function HyperlinkProvider (line 27) | function HyperlinkProvider(openmct) {

FILE: src/plugins/hyperlink/pluginSpec.js
  function getView (line 27) | function getView(openmct, domainObj, objectPath) {
  function destroyView (line 36) | function destroyView(view) {

FILE: src/plugins/imagery/ImageryTimestripViewProvider.js
  function ImageryTimestripViewProvider (line 26) | function ImageryTimestripViewProvider(openmct) {

FILE: src/plugins/imagery/ImageryView.js
  constant DEFAULT_IMAGE_FRESHNESS_OPTIONS (line 5) | const DEFAULT_IMAGE_FRESHNESS_OPTIONS = {
  class ImageryView (line 9) | class ImageryView {
    method constructor (line 10) | constructor(openmct, domainObject, objectPath, options) {
    method show (line 19) | show(element, isEditing, viewOptions) {
    method getViewContext (line 58) | getViewContext() {
    method pause (line 66) | pause() {
    method unpause (line 72) | unpause() {
    method onPreviewModeChange (line 79) | onPreviewModeChange({ isPreviewing } = {}) {
    method destroy (line 87) | destroy() {
    method _getInstance (line 93) | _getInstance() {

FILE: src/plugins/imagery/ImageryViewProvider.js
  function ImageryViewProvider (line 24) | function ImageryViewProvider(openmct, options) {

FILE: src/plugins/imagery/actions/OpenImageInNewTabAction.js
  constant OPEN_IMAGE_IN_NEW_TAB_ACTION_KEY (line 23) | const OPEN_IMAGE_IN_NEW_TAB_ACTION_KEY = 'openImageInNewTab';
  class OpenImageInNewTabAction (line 24) | class OpenImageInNewTabAction {
    method constructor (line 25) | constructor(openmct) {
    method invoke (line 36) | invoke(objectPath, view) {
    method appliesTo (line 41) | appliesTo(objectPath, view = {}) {

FILE: src/plugins/imagery/actions/SaveImageAsAction.js
  constant SAVE_IMAGE_ACTION_KEY (line 23) | const SAVE_IMAGE_ACTION_KEY = 'saveImageAs';
  class SaveImageAction (line 24) | class SaveImageAction {
    method constructor (line 25) | constructor(openmct) {
    method invoke (line 36) | async invoke(objectPath, view) {
    method appliesTo (line 62) | appliesTo(objectPath, view = {}) {

FILE: src/plugins/imagery/components/Compass/pluginSpec.js
  constant COMPASS_ROSE_CLASS (line 26) | const COMPASS_ROSE_CLASS = '.c-direction-rose';
  constant COMPASS_HUD_CLASS (line 27) | const COMPASS_HUD_CLASS = '.c-compass__hud';
  method data (line 60) | data() {

FILE: src/plugins/imagery/components/Compass/utils.js
  function rotate (line 10) | function rotate(...rotations) {
  function inRange (line 16) | function inRange(degrees, [min, max]) {
  function percentOfRange (line 24) | function percentOfRange(degrees, [min, max]) {
  function normalizeCompassDirection (line 40) | function normalizeCompassDirection(degrees) {

FILE: src/plugins/imagery/components/RelatedTelemetry/RelatedTelemetry.js
  function copyRelatedMetadata (line 23) | function copyRelatedMetadata(metadata) {
  class RelatedTelemetry (line 32) | class RelatedTelemetry {
    method constructor (line 33) | constructor(openmct, domainObject, telemetryKeys, timeContext) {
    method load (line 65) | async load() {
    method _initializeHistorical (line 91) | async _initializeHistorical(key) {
    method _initializeRealtime (line 134) | async _initializeRealtime(key) {
    method _subscribeToDataForKey (line 156) | _subscribeToDataForKey(key) {
    method _parseTime (line 175) | _parseTime(datum) {
    method _timeSystemChange (line 179) | _timeSystemChange(system) {
    method destroy (line 186) | destroy() {

FILE: src/plugins/imagery/mixins/imageryData.js
  constant DEFAULT_DURATION_FORMATTER (line 23) | const DEFAULT_DURATION_FORMATTER = 'duration';
  constant IMAGE_HINT_KEY (line 24) | const IMAGE_HINT_KEY = 'image';
  constant IMAGE_THUMBNAIL_HINT_KEY (line 25) | const IMAGE_THUMBNAIL_HINT_KEY = 'thumbnail';
  constant IMAGE_DOWNLOAD_NAME_HINT_KEY (line 26) | const IMAGE_DOWNLOAD_NAME_HINT_KEY = 'imageDownloadName';
  method mounted (line 31) | mounted() {
  method beforeUnmount (line 65) | beforeUnmount() {
  method dataAdded (line 81) | dataAdded(addedItems, addedItemIndices) {
  method dataCleared (line 90) | dataCleared() {
  method dataRemoved (line 93) | dataRemoved(removed) {
  method setDataTimeContext (line 106) | setDataTimeContext() {
  method stopFollowingDataTimeContext (line 112) | stopFollowingDataTimeContext() {
  method formatImageUrl (line 118) | formatImageUrl(datum) {
  method formatImageThumbnailUrl (line 125) | formatImageThumbnailUrl(datum) {
  method formatTime (line 132) | formatTime(datum) {
  method getImageDownloadName (line 142) | getImageDownloadName(datum) {
  method parseTime (line 151) | parseTime(datum) {
  method loadTelemetry (line 158) | loadTelemetry() {
  method boundsChanged (line 167) | boundsChanged(bounds, isTick) {
  method timeSystemChanged (line 174) | timeSystemChanged() {
  method normalizeDatum (line 182) | normalizeDatum(datum) {
  method getFormatter (line 198) | getFormatter(key) {

FILE: src/plugins/imagery/pluginSpec.js
  constant ONE_MINUTE (line 33) | const ONE_MINUTE = 1000 * 60;
  constant TEN_MINUTES (line 34) | const TEN_MINUTES = ONE_MINUTE * 10;
  constant MAIN_IMAGE_CLASS (line 35) | const MAIN_IMAGE_CLASS = '.js-imageryView-image';
  constant NEW_IMAGE_CLASS (line 36) | const NEW_IMAGE_CLASS = '.c-imagery__age.c-imagery--new';
  constant REFRESH_CSS_MS (line 37) | const REFRESH_CSS_MS = 500;
  function formatThumbnail (line 39) | function formatThumbnail(url) {
  function getImageInfo (line 43) | function getImageInfo(doc) {
  function isNew (line 56) | function isNew(doc) {
  function generateTelemetry (line 62) | function generateTelemetry(start, count) {
  method observe (line 209) | observe() {}
  method disconnect (line 210) | disconnect() {}

FILE: src/plugins/importFromJSONAction/ImportFromJSONAction.js
  constant IMPORT_FROM_JSON_ACTION_KEY (line 27) | const IMPORT_FROM_JSON_ACTION_KEY = 'import.JSON';
  class ImportFromJSONAction (line 29) | class ImportFromJSONAction {
    method constructor (line 30) | constructor(openmct) {
    method appliesTo (line 47) | appliesTo(objectPath) {
    method invoke (line 65) | invoke(objectPath) {
    method onSave (line 74) | onSave(object, changes) {
    method _deepInstantiate (line 89) | _deepInstantiate(parent, tree, seen, objectsToCreate) {
    method _getObjectReferenceIds (line 120) | _getObjectReferenceIds(parent) {
    method _generateIdMap (line 158) | _generateIdMap(tree, newNamespace) {
    method _walkAndRewriteIds (line 190) | async _walkAndRewriteIds(obj, idMap, importDialog) {
    method _generateNewIdentifiers (line 271) | async _generateNewIdentifiers(tree, newNamespace, importDialog) {
    method _importObjectTree (line 282) | async _importObjectTree(domainObject, objTree) {
    method _instantiate (line 348) | _instantiate(model) {
    method _showForm (line 356) | _showForm(domainObject) {
    method _validateJSON (line 386) | _validateJSON(data) {

FILE: src/plugins/importFromJSONAction/ImportFromJSONActionSpec.js
  function callback (line 120) | function callback(newObject) {
  function returnResponseWithPrototypePollution (line 130) | function returnResponseWithPrototypePollution() {

FILE: src/plugins/inspectorDataVisualization/InspectorDataVisualizationViewProvider.js
  function InspectorDataVisualizationViewProvider (line 27) | function InspectorDataVisualizationViewProvider(openmct, configuration) {

FILE: src/plugins/inspectorViews/annotations/AnnotationsViewProvider.js
  function AnnotationsViewProvider (line 27) | function AnnotationsViewProvider(openmct) {

FILE: src/plugins/inspectorViews/elements/ElementsViewProvider.js
  constant CUSTOM_ELEMENTS_VIEW_PROVIDER_TYPES (line 27) | const CUSTOM_ELEMENTS_VIEW_PROVIDER_TYPES = ['time-strip', 'telemetry.pl...
  function ElementsViewProvider (line 29) | function ElementsViewProvider(openmct) {

FILE: src/plugins/inspectorViews/elements/PlotElementsViewProvider.js
  function PlotElementsViewProvider (line 27) | function PlotElementsViewProvider(openmct) {

FILE: src/plugins/inspectorViews/plugin.js
  function InspectorViewsPlugin (line 29) | function InspectorViewsPlugin() {

FILE: src/plugins/inspectorViews/properties/PropertiesViewProvider.js
  function PropertiesViewProvider (line 27) | function PropertiesViewProvider(openmct) {

FILE: src/plugins/inspectorViews/styles/StylesInspectorViewProvider.js
  constant NON_STYLABLE_TYPES (line 28) | const NON_STYLABLE_TYPES = [
  function isLayoutObject (line 47) | function isLayoutObject(selection, objectType) {
  function isCreatableObject (line 55) | function isCreatableObject(object, typeObject) {
  function StylesInspectorViewProvider (line 59) | function StylesInspectorViewProvider(openmct) {

FILE: src/plugins/inspectorViews/styles/StylesManager.js
  constant LOCAL_STORAGE_KEY (line 3) | const LOCAL_STORAGE_KEY = 'mct-saved-styles';
  constant LIMIT (line 4) | const LIMIT = 20;
  class StylesManager (line 10) | class StylesManager extends EventEmitter {
    method load (line 11) | load() {
    method save (line 18) | save(style) {
    method delete (line 31) | delete(index) {
    method select (line 40) | select(style) {
    method normalizeStyle (line 47) | normalizeStyle(style) {
    method getBaseStyleObject (line 63) | getBaseStyleObject() {
    method isSaveLimitReached (line 76) | isSaveLimitReached(styles) {
    method isExistingStyle (line 89) | isExistingStyle(style, styles) {
    method persist (line 96) | persist(styles) {
    method isEqual (line 111) | isEqual(style1, style2) {

FILE: src/plugins/inspectorViews/styles/constants.js
  constant FONT_SIZES (line 1) | const FONT_SIZES = [
  constant FONTS (line 84) | const FONTS = [

FILE: src/plugins/interceptors/missingObjectInterceptor.js
  function MissingObjectInterceptor (line 23) | function MissingObjectInterceptor(openmct) {

FILE: src/plugins/interceptors/plugin.js
  function plugin (line 3) | function plugin() {

FILE: src/plugins/latestDataClock/LADClock.js
  class LADClock (line 25) | class LADClock extends LocalClock {
    method constructor (line 32) | constructor(period) {

FILE: src/plugins/linkAction/LinkAction.js
  constant LINK_ACTION_KEY (line 23) | const LINK_ACTION_KEY = 'link';
  class LinkAction (line 25) | class LinkAction {
    method constructor (line 26) | constructor(openmct) {
    method appliesTo (line 38) | appliesTo(objectPath) {
    method invoke (line 42) | invoke(objectPath) {
    method inNavigationPath (line 48) | inNavigationPath() {
    method onSave (line 54) | onSave(changes) {
    method linkInNewParent (line 70) | linkInNewParent(child, newParent) {
    method showForm (line 76) | showForm(domainObject, parentDomainObject) {
    method validate (line 98) | validate(currentParent) {
    method startTransaction (line 143) | startTransaction() {
    method saveTransaction (line 149) | async saveTransaction() {

FILE: src/plugins/localStorage/LocalStorageObjectProvider.js
  class LocalStorageObjectProvider (line 25) | class LocalStorageObjectProvider {
    method constructor (line 26) | constructor(spaceKey = 'mct') {
    method get (line 32) | get(identifier) {
    method getAllObjects (line 46) | getAllObjects() {
    method create (line 50) | create(object) {
    method update (line 54) | update(object) {
    method persistObject (line 61) | persistObject(domainObject) {
    method persistSpace (line 73) | persistSpace(space) {
    method isReadOnly (line 77) | isReadOnly() {
    method getSpace (line 84) | getSpace() {
    method getSpaceAsObject (line 91) | getSpaceAsObject() {
    method initializeSpace (line 98) | initializeSpace() {
    method isEmpty (line 107) | isEmpty() {

FILE: src/plugins/localStorage/pluginSpec.js
  function resetLocalStorage (line 102) | function resetLocalStorage() {
  function getLocalStorage (line 106) | function getLocalStorage() {
  function getSpaceAsObject (line 110) | function getSpaceAsObject() {

FILE: src/plugins/localTimeSystem/LocalTimeFormat.js
  constant DATE_FORMAT (line 25) | const DATE_FORMAT = 'YYYY-MM-DD h:mm:ss.SSS a';
  constant DATE_FORMATS (line 27) | const DATE_FORMATS = [DATE_FORMAT, 'YYYY-MM-DD h:mm:ss a', 'YYYY-MM-DD h...
  function LocalTimeFormat (line 42) | function LocalTimeFormat() {

FILE: src/plugins/localTimeSystem/LocalTimeSystem.js
  class LocalTimeSystem (line 28) | class LocalTimeSystem {
    method constructor (line 29) | constructor() {

FILE: src/plugins/move/MoveAction.js
  constant MOVE_ACTION_KEY (line 23) | const MOVE_ACTION_KEY = 'move';
  class MoveAction (line 25) | class MoveAction {
    method constructor (line 26) | constructor(openmct) {
    method invoke (line 38) | invoke(objectPath) {
    method inNavigationPath (line 45) | inNavigationPath() {
    method navigateTo (line 51) | navigateTo(objectPath) {
    method addToNewParent (line 60) | addToNewParent(child, newParent) {
    method onSave (line 68) | async onSave(changes) {
    method removeFromOldParent (line 114) | removeFromOldParent(child) {
    method showForm (line 119) | showForm(domainObject, parentDomainObject) {
    method validate (line 151) | validate(currentParent) {
    method appliesTo (line 188) | appliesTo(objectPath) {
    method startTransaction (line 206) | startTransaction() {
    method saveTransaction (line 212) | async saveTransaction() {

FILE: src/plugins/myItems/createMyItemsIdentifier.js
  constant MY_ITEMS_KEY (line 1) | const MY_ITEMS_KEY = 'mine';
  function createMyItemsIdentifier (line 3) | function createMyItemsIdentifier(namespace = '') {

FILE: src/plugins/myItems/myItemsInterceptor.js
  function myItemsInterceptor (line 23) | function myItemsInterceptor({ openmct, identifierObject, name }) {

FILE: src/plugins/myItems/plugin.js
  constant MY_ITEMS_DEFAULT_NAME (line 26) | const MY_ITEMS_DEFAULT_NAME = 'My Items';
  function MyItemsPlugin (line 28) | function MyItemsPlugin(

FILE: src/plugins/myItems/pluginSpec.js
  constant MISSING_NAME (line 27) | const MISSING_NAME = `Missing: ${MY_ITEMS_KEY}`;
  constant DEFAULT_NAME (line 28) | const DEFAULT_NAME = 'My Items';
  constant FANCY_NAME (line 29) | const FANCY_NAME = 'Fancy Items';

FILE: src/plugins/newFolderAction/newFolderAction.js
  constant NEW_FOLDER_ACTION_KEY (line 23) | const NEW_FOLDER_ACTION_KEY = 'newFolder';
  class NewFolderAction (line 25) | class NewFolderAction {
    method constructor (line 26) | constructor(openmct) {
    method invoke (line 38) | invoke(objectPath) {
    method appliesTo (line 44) | appliesTo(objectPath) {

FILE: src/plugins/notebook/NotebookType.js
  class NotebookType (line 25) | class NotebookType {
    method constructor (line 26) | constructor(name, description, icon) {
    method initialize (line 68) | initialize(domainObject) {

FILE: src/plugins/notebook/NotebookViewProvider.js
  class NotebookViewProvider (line 29) | class NotebookViewProvider {
    method constructor (line 30) | constructor(openmct, name, key, type, cssClass, snapshotContainer, ent...
    method canView (line 40) | canView(domainObject) {
    method view (line 44) | view(domainObject) {

FILE: src/plugins/notebook/actions/CopyToNotebookAction.js
  constant COPY_TO_NOTEBOOK_ACTION_KEY (line 4) | const COPY_TO_NOTEBOOK_ACTION_KEY = 'copyToNotebook';
  class CopyToNotebookAction (line 5) | class CopyToNotebookAction {
    method constructor (line 6) | constructor(openmct) {
    method copyToNotebook (line 17) | copyToNotebook(entryText) {
    method invoke (line 37) | invoke(objectPath, view) {
    method appliesTo (line 43) | appliesTo(objectPath, view = {}) {

FILE: src/plugins/notebook/actions/ExportNotebookAsTextAction.js
  constant UNKNOWN_USER (line 5) | const UNKNOWN_USER = 'Unknown';
  constant UNKNOWN_TIME (line 6) | const UNKNOWN_TIME = 'Unknown';
  constant ALLOWED_TYPES (line 7) | const ALLOWED_TYPES = [NOTEBOOK_TYPE, RESTRICTED_NOTEBOOK_TYPE];
  constant EXPORT_NOTEBOOK_AS_TEXT_ACTION_KEY (line 8) | const EXPORT_NOTEBOOK_AS_TEXT_ACTION_KEY = 'exportNotebookAsText';
  class ExportNotebookAsTextAction (line 10) | class ExportNotebookAsTextAction {
    method constructor (line 11) | constructor(openmct) {
    method invoke (line 21) | invoke(objectPath) {
    method getTagName (line 25) | getTagName(tagId, availableTags) {
    method getTagsForEntry (line 34) | getTagsForEntry(entry, domainObjectKeyString, annotations) {
    method formatTimeStamp (line 52) | formatTimeStamp(timestamp) {
    method appliesTo (line 60) | appliesTo(objectPath) {
    method onSave (line 66) | async onSave(changes, objectPath) {
    method getUserName (line 145) | getUserName(userId) {
    method showForm (line 153) | async showForm(objectPath) {

FILE: src/plugins/notebook/monkeyPatchObjectAPIForNotebooks.js
  function resolveConflicts (line 40) | function resolveConflicts(domainObject, localMutable, openmct) {
  function resolveNotebookTagConflicts (line 48) | async function resolveNotebookTagConflicts(localAnnotation, openmct) {
  function resolveNotebookEntryConflicts (line 88) | async function resolveNotebookEntryConflicts(localMutable, openmct) {
  function applyLocalEntries (line 104) | function applyLocalEntries(remoteObject, entries, openmct) {

FILE: src/plugins/notebook/notebook-constants.js
  constant NOTEBOOK_TYPE (line 1) | const NOTEBOOK_TYPE = 'notebook';
  constant RESTRICTED_NOTEBOOK_TYPE (line 2) | const RESTRICTED_NOTEBOOK_TYPE = 'restricted-notebook';
  constant ANNOTATION_TYPE (line 3) | const ANNOTATION_TYPE = 'annotation';
  constant EVENT_SNAPSHOTS_UPDATED (line 4) | const EVENT_SNAPSHOTS_UPDATED = 'SNAPSHOTS_UPDATED';
  constant NOTEBOOK_DEFAULT (line 5) | const NOTEBOOK_DEFAULT = 'DEFAULT';
  constant NOTEBOOK_SNAPSHOT (line 6) | const NOTEBOOK_SNAPSHOT = 'SNAPSHOT';
  constant NOTEBOOK_VIEW_TYPE (line 7) | const NOTEBOOK_VIEW_TYPE = 'notebook-vue';
  constant RESTRICTED_NOTEBOOK_VIEW_TYPE (line 8) | const RESTRICTED_NOTEBOOK_VIEW_TYPE = 'restricted-notebook-vue';
  constant NOTEBOOK_BASE_INSTALLED (line 9) | const NOTEBOOK_BASE_INSTALLED = '_NOTEBOOK_BASE_FUNCTIONALITY_INSTALLED';
  function isNotebookOrAnnotationType (line 12) | function isNotebookOrAnnotationType(domainObject) {
  function isNotebookType (line 16) | function isNotebookType(domainObject) {
  function isAnnotationType (line 20) | function isAnnotationType(domainObject) {
  function isNotebookViewType (line 24) | function isNotebookViewType(view) {

FILE: src/plugins/notebook/plugin.js
  function getSnapshotContainer (line 40) | function getSnapshotContainer(openmct) {
  function addLegacyNotebookGetInterceptor (line 48) | function addLegacyNotebookGetInterceptor(openmct) {
  function installBaseNotebookFunctionality (line 61) | function installBaseNotebookFunctionality(openmct) {
  function NotebookPlugin (line 95) | function NotebookPlugin(name = 'Notebook', entryUrlWhitelist = []) {
  function RestrictedNotebookPlugin (line 121) | function RestrictedNotebookPlugin(name = 'Notebook Shift Log', entryUrlW...

FILE: src/plugins/notebook/pluginSpec.js
  function clickSnapshotIndicator (line 341) | async function clickSnapshotIndicator() {
  function getEntryText (line 417) | function getEntryText(entryNumber) {
  function allNotebookEntryElements (line 421) | function allNotebookEntryElements() {
  function allNotebookSectionElements (line 425) | function allNotebookSectionElements() {
  function allNotebookPageElements (line 429) | function allNotebookPageElements() {

FILE: src/plugins/notebook/snapshot-container.js
  constant NOTEBOOK_SNAPSHOT_STORAGE (line 4) | const NOTEBOOK_SNAPSHOT_STORAGE = 'notebook-snapshot-storage';
  constant NOTEBOOK_SNAPSHOT_MAX_COUNT (line 6) | const NOTEBOOK_SNAPSHOT_MAX_COUNT = 5;
  class SnapshotContainer (line 8) | class SnapshotContainer extends EventEmitter {
    method constructor (line 9) | constructor(openmct) {
    method addSnapshot (line 22) | addSnapshot(notebookImageDomainObject, embedObject) {
    method getSnapshot (line 38) | getSnapshot(id) {
    method getSnapshots (line 44) | getSnapshots() {
    method removeSnapshot (line 50) | removeSnapshot(id) {
    method removeAllSnapshots (line 61) | removeAllSnapshots() {
    method saveSnapshots (line 65) | saveSnapshots(snapshots) {
    method updateSnapshot (line 80) | updateSnapshot(snapshot) {

FILE: src/plugins/notebook/snapshot.js
  class Snapshot (line 19) | class Snapshot {
    method constructor (line 20) | constructor(openmct) {
    method capture (line 29) | capture(snapshotMeta, notebookType, domElement) {
    method _saveSnapShot (line 48) | _saveSnapShot(notebookType, fullSizeImageURL, thumbnailImageURL, snaps...
    method _saveToDefaultNoteBook (line 74) | _saveToDefaultNoteBook(notebookStorage, embed) {
    method _saveToNotebookSnapshots (line 105) | _saveToNotebookSnapshots(notebookImageDomainObject, embed) {
    method _showNotification (line 109) | _showNotification(msg, url) {
    method _navigateToNotebook (line 125) | _navigateToNotebook(url = null) {

FILE: src/plugins/notebook/utils/notebook-entries.js
  function getUsername (line 10) | async function getUsername(openmct) {
  function getActiveRole (line 21) | async function getActiveRole(openmct) {
  constant DEFAULT_CLASS (line 30) | const DEFAULT_CLASS = 'notebook-default';
  constant TIME_BOUNDS (line 31) | const TIME_BOUNDS = {
  function addEntryIntoPage (line 38) | function addEntryIntoPage(notebookStorage, entries, entry) {
  function selectEntry (line 61) | function selectEntry({
  function getHistoricLinkInFixedMode (line 96) | function getHistoricLinkInFixedMode(openmct, bounds, historicLink) {
  function createNewImageEmbed (line 124) | function createNewImageEmbed(image, openmct, imageName = '') {
  function createNewEmbed (line 163) | async function createNewEmbed(snapshotMeta, snapshot = '') {
  function addNotebookEntry (line 206) | async function addNotebookEntry(
  function getNotebookEntries (line 246) | function getNotebookEntries(domainObject, selectedSection, selectedPage) {
  function getEntryPosById (line 269) | function getEntryPosById(entryId, domainObject, selectedSection, selecte...
  function deleteNotebookEntries (line 287) | function deleteNotebookEntries(openmct, domainObject, selectedSection, s...
  function mutateObject (line 312) | function mutateObject(openmct, object, key, value) {
  function addDefaultClass (line 316) | function addDefaultClass(domainObject, openmct) {

FILE: src/plugins/notebook/utils/notebook-image.js
  constant DEFAULT_SIZE (line 3) | const DEFAULT_SIZE = {
  function createNotebookImageDomainObject (line 8) | function createNotebookImageDomainObject(fullSizeImageURL) {
  function getThumbnailURLFromCanvas (line 25) | function getThumbnailURLFromCanvas(canvas, size = DEFAULT_SIZE) {
  function getThumbnailURLFromImageUrl (line 36) | function getThumbnailURLFromImageUrl(imageUrl, size = DEFAULT_SIZE) {
  function saveNotebookImageDomainObject (line 53) | async function saveNotebookImageDomainObject(openmct, object) {
  function updateNotebookImageDomainObject (line 57) | async function updateNotebookImageDomainObject(openmct, identifier, full...
  function updateNamespaceOfDomainObject (line 76) | function updateNamespaceOfDomainObject(object, namespace) {

FILE: src/plugins/notebook/utils/notebook-key-code.js
  constant KEY_ENTER (line 2) | const KEY_ENTER = 13;
  constant KEY_ESCAPE (line 3) | const KEY_ESCAPE = 27;

FILE: src/plugins/notebook/utils/notebook-migration.js
  constant IMAGE_MIGRATION_VER (line 9) | const IMAGE_MIGRATION_VER = 'v1';
  function notebookImageMigration (line 11) | function notebookImageMigration(openmct, domainObject) {

FILE: src/plugins/notebook/utils/notebook-snapshot-menu.js
  function getMenuItems (line 3) | async function getMenuItems(openmct, menuItemOptions) {

FILE: src/plugins/notebook/utils/notebook-storage.js
  constant NOTEBOOK_LOCAL_STORAGE (line 3) | const NOTEBOOK_LOCAL_STORAGE = 'notebook-storage';
  function defaultNotebookObjectChanged (line 7) | function defaultNotebookObjectChanged(newDomainObject) {
  function observeDefaultNotebookObject (line 22) | function observeDefaultNotebookObject(openmct, notebookStorage, domainOb...
  function removeListener (line 35) | function removeListener() {
  function saveDefaultNotebook (line 42) | function saveDefaultNotebook(notebookStorage) {
  function clearDefaultNotebook (line 46) | function clearDefaultNotebook() {
  function getDefaultNotebook (line 53) | function getDefaultNotebook() {
  function getNotebookSectionAndPage (line 59) | function getNotebookSectionAndPage(domainObject, sectionId, pageId) {
  function getDefaultNotebookLink (line 70) | async function getDefaultNotebookLink(openmct, domainObject = null) {
  function setDefaultNotebook (line 83) | function setDefaultNotebook(openmct, notebookStorage, domainObject) {
  function setDefaultNotebookSectionId (line 88) | function setDefaultNotebookSectionId(sectionId) {
  function setDefaultNotebookPageId (line 94) | function setDefaultNotebookPageId(pageId) {
  function validateNotebookStorageObject (line 100) | function validateNotebookStorageObject() {

FILE: src/plugins/notebook/utils/painterroInstance.js
  constant DEFAULT_CONFIG (line 5) | const DEFAULT_CONFIG = {
  class PainterroInstance (line 29) | class PainterroInstance {
    method constructor (line 30) | constructor(element, openmct) {
    method dismiss (line 38) | dismiss() {
    method initialize (line 43) | initialize() {
    method save (line 52) | save(callback) {
    method saveHandler (line 58) | saveHandler(image, done) {
    method show (line 89) | show(src) {

FILE: src/plugins/notebook/utils/removeDialog.js
  class RemoveDialog (line 1) | class RemoveDialog {
    method constructor (line 2) | constructor(openmct, options) {
    method show (line 16) | show() {

FILE: src/plugins/notificationIndicator/plugin.js
  function plugin (line 24) | function plugin() {

FILE: src/plugins/objectMigration/Migrations.js
  function Migrations (line 25) | function Migrations(openmct) {

FILE: src/plugins/objectMigration/plugin.js
  function needsMigration (line 29) | function needsMigration(domainObject) {
  function migrateObject (line 33) | function migrateObject(domainObject) {

FILE: src/plugins/openInNewTabAction/openInNewTabAction.js
  constant NEW_TAB_ACTION_KEY (line 24) | const NEW_TAB_ACTION_KEY = 'newTab';
  class OpenInNewTab (line 26) | class OpenInNewTab {
    method constructor (line 27) | constructor(openmct) {
    method invoke (line 55) | invoke(objectPath, _view, customUrlParams) {

FILE: src/plugins/operatorStatus/AbstractStatusIndicator.js
  class AbstractStatusIndicator (line 24) | class AbstractStatusIndicator {
    method constructor (line 33) | constructor(openmct, configuration) {
    method install (line 46) | install() {
    method showPopup (line 50) | showPopup() {
    method positionBox (line 64) | positionBox() {
    method clearPopup (line 77) | clearPopup(clickAwayEvent) {
    method createPopupComponent (line 87) | createPopupComponent() {
    method getPopupElement (line 91) | getPopupElement() {
    method createIndicator (line 95) | createIndicator() {
    method getIndicator (line 99) | getIndicator() {
    method getConfiguration (line 103) | getConfiguration() {

FILE: src/plugins/operatorStatus/operatorStatus/OperatorStatusIndicator.js
  class OperatorStatusIndicator (line 28) | class OperatorStatusIndicator extends AbstractStatusIndicator {
    method createPopupComponent (line 29) | createPopupComponent() {
    method createIndicator (line 57) | createIndicator() {

FILE: src/plugins/operatorStatus/plugin.js
  function operatorStatusPlugin (line 29) | function operatorStatusPlugin(configuration) {

FILE: src/plugins/operatorStatus/pollQuestion/PollQuestionIndicator.js
  class PollQuestionIndicator (line 27) | class PollQuestionIndicator extends AbstractStatusIndicator {
    method createPopupComponent (line 28) | createPopupComponent() {
    method createIndicator (line 56) | createIndicator() {

FILE: src/plugins/performanceIndicator/plugin.js
  constant PERFORMANCE_OVERLAY_RENDER_INTERVAL (line 22) | const PERFORMANCE_OVERLAY_RENDER_INTERVAL = 1000;
  function PerformanceIndicator (line 24) | function PerformanceIndicator() {

FILE: src/plugins/performanceIndicator/pluginSpec.js
  function loopForABit (line 66) | function loopForABit() {

FILE: src/plugins/persistence/couch/CouchDocument.js
  function CouchDocument (line 38) | function CouchDocument(id, model, rev, markDeleted) {

FILE: src/plugins/persistence/couch/CouchObjectProvider.js
  constant REV (line 30) | const REV = '_rev';
  constant HEARTBEAT (line 32) | const HEARTBEAT = 50000;
  constant ALL_DOCS (line 33) | const ALL_DOCS = '_all_docs?include_docs=true';
  class CouchObjectProvider (line 35) | class CouchObjectProvider {
    method constructor (line 36) | constructor({ openmct, databaseConfiguration, couchStatusIndicator }) {
    method #startSharedWorker (line 56) | #startSharedWorker() {
    method onSharedWorkerMessageError (line 82) | onSharedWorkerMessageError(event) {
    method isSynchronizedObject (line 86) | isSynchronizedObject(object) {
    method onSharedWorkerMessage (line 95) | onSharedWorkerMessage(event) {
    method #messageToIndicatorState (line 133) | #messageToIndicatorState(message) {
    method #statusCodeToIndicatorState (line 159) | #statusCodeToIndicatorState(statusCode) {
    method isReadOnly (line 191) | isReadOnly() {
    method request (line 195) | async request(subPath, method, body, signal) {
    method #handleResponseCode (line 254) | #handleResponseCode(status, json, fetchOptions) {
    method #checkResponse (line 275) | #checkResponse(response, intermediateResponse, key) {
    method #getModel (line 305) | #getModel(response) {
    method get (line 329) | get(identifier, abortSignal) {
    method #deferBatchedGet (line 344) | #deferBatchedGet(abortSignal) {
    method #returnAsMap (line 369) | #returnAsMap(objectKey) {
    method #clearBatch (line 381) | #clearBatch() {
    method #waitOneEventCycle (line 389) | #waitOneEventCycle() {
    method #bulkGet (line 398) | #bulkGet(ids, signal) {
    method removeDuplicates (line 425) | removeDuplicates(array) {
    method search (line 429) | search() {
    method isViewDefined (line 437) | async isViewDefined(designDoc, viewName) {
    method getObjectsByView (line 462) | async getObjectsByView(
    method getObjectsByFilter (line 530) | async getObjectsByFilter(filter, abortSignal) {
    method observe (line 586) | observe(identifier, callback) {
    method isObservingObjectChanges (line 607) | isObservingObjectChanges() {
    method #observeObjectChanges (line 614) | #observeObjectChanges() {
    method #initiateSharedWorkerFetchChanges (line 631) | #initiateSharedWorkerFetchChanges(url) {
    method onEventError (line 650) | onEventError(error) {
    method onEventOpen (line 656) | onEventOpen(event) {
    method onEventMessage (line 661) | onEventMessage(event) {
    method fetchChanges (line 682) | fetchChanges(url) {
    method #getIntermediateResponse (line 711) | #getIntermediateResponse() {
    method #updateIndicatorStatus (line 725) | #updateIndicatorStatus(readyState) {
    method enqueueObject (line 749) | enqueueObject(key, model, intermediateResponse) {
    method create (line 763) | create(model) {
    method #enqueueForPersistence (line 790) | #enqueueForPersistence({ key, document }) {
    method flushPersistenceQueue (line 802) | async flushPersistenceQueue() {
    method #updateQueued (line 829) | #updateQueued(key) {
    method update (line 845) | update(model) {
    method toPersistableModel (line 856) | toPersistableModel(model) {
    method fromPersistedModel (line 865) | fromPersistedModel(model, key) {

FILE: src/plugins/persistence/couch/CouchObjectQueue.js
  class CouchObjectQueue (line 23) | class CouchObjectQueue {
    method constructor (line 24) | constructor(object, rev) {
    method updateRevision (line 30) | updateRevision(rev) {
    method hasNext (line 34) | hasNext() {
    method enqueue (line 38) | enqueue(item) {
    method dequeue (line 42) | dequeue() {
    method clear (line 46) | clear() {

FILE: src/plugins/persistence/couch/CouchSearchProvider.js
  constant BATCH_ANNOTATION_DEBOUNCE_MS (line 30) | const BATCH_ANNOTATION_DEBOUNCE_MS = 100;
  class CouchSearchProvider (line 32) | class CouchSearchProvider {
    method constructor (line 41) | constructor(couchObjectProvider) {
    method supportsSearchType (line 54) | supportsSearchType(searchType) {
    method isReadOnly (line 58) | isReadOnly() {
    method search (line 62) | search(query, abortSignal, searchType) {
    method #isOptimizedSearchByNameSupported (line 74) | #isOptimizedSearchByNameSupported() {
    method searchForObjects (line 87) | async searchForObjects(query, abortSignal) {
    method #deferBatchAnnotationSearch (line 117) | async #deferBatchAnnotationSearch() {
    method #clearBatch (line 126) | #clearBatch() {
    method #waitForDebounce (line 131) | #waitForDebounce() {
    method #bulkAnnotationSearch (line 142) | #bulkAnnotationSearch(batchIdsToSearch) {
    method searchForAnnotations (line 190) | async searchForAnnotations(keyString, abortSignal) {
    method searchForTags (line 200) | searchForTags(tagsArray, abortSignal) {

FILE: src/plugins/persistence/couch/CouchStatusIndicator.js
  constant CONNECTED (line 41) | const CONNECTED = {
  constant PENDING (line 47) | const PENDING = {
  constant DISCONNECTED (line 53) | const DISCONNECTED = {
  constant UNKNOWN (line 59) | const UNKNOWN = {
  class CouchStatusIndicator (line 65) | class CouchStatusIndicator {
    method constructor (line 66) | constructor(simpleIndicator) {
    method #setDefaults (line 75) | #setDefaults() {
    method setIndicatorToState (line 83) | setIndicatorToState(state) {

FILE: src/plugins/persistence/couch/plugin.js
  constant DEFAULT_NAMESPACE (line 27) | const DEFAULT_NAMESPACE = '';
  constant LEGACY_SPACE (line 28) | const LEGACY_SPACE = 'mct';
  function CouchPlugin (line 30) | function CouchPlugin(options) {

FILE: src/plugins/persistence/couch/pluginSpec.js
  function assertCouchIndicatorStatus (line 416) | function assertCouchIndicatorStatus(status) {

FILE: src/plugins/persistence/couch/scripts/deleteAnnotations.js
  function main (line 26) | async function main() {
  constant ANNOTATION_TYPES (line 55) | const ANNOTATION_TYPES = Object.freeze({
  function processArguments (line 63) | function processArguments() {
  function gatherDocumentsForDeletion (line 107) | async function gatherDocumentsForDeletion({
  function performBulkDelete (line 167) | async function performBulkDelete({ docsToDelete, serverUrl, databaseName...

FILE: src/plugins/persistence/couch/scripts/lockObjects.mjs
  constant COUCH_URL (line 5) | const COUCH_URL = process.env.OPENMCT_COUCH_URL || 'http://127.0.0.1:5984';
  constant COUCH_DB_NAME (line 6) | const COUCH_DB_NAME = process.env.OPENMCT_DATABASE_NAME || 'openmct';
  constant BATCH_SIZE (line 43) | const BATCH_SIZE = 100;
  constant SOCKET_POOL_SIZE (line 44) | const SOCKET_POOL_SIZE = 100;
  function processObjectTreeFrom (line 77) | function processObjectTreeFrom(parentObjectIdentifier) {
  function fetchDocument (line 112) | async function fetchDocument(identifierOrKeystring) {
  function persistBatchIfNeeded (line 129) | function persistBatchIfNeeded() {
  function persistBatch (line 138) | async function persistBatch() {
  function keystringToIdentifier (line 166) | function keystringToIdentifier(keystring) {
  function identifierToKeystring (line 181) | function identifierToKeystring(identifier) {

FILE: src/plugins/plan/GanttChartCompositionPolicy.js
  constant ALLOWED_TYPES (line 22) | const ALLOWED_TYPES = ['plan'];
  function ganttChartCompositionPolicy (line 24) | function ganttChartCompositionPolicy(openmct) {

FILE: src/plugins/plan/PlanViewConfiguration.js
  constant DEFAULT_CONFIGURATION (line 25) | const DEFAULT_CONFIGURATION = {
  class PlanViewConfiguration (line 30) | class PlanViewConfiguration extends EventEmitter {
    method constructor (line 31) | constructor(domainObject, openmct) {
    method getConfiguration (line 48) | getConfiguration() {
    method #updateConfiguration (line 57) | #updateConfiguration(configuration) {
    method setSwimlaneVisibility (line 65) | setSwimlaneVisibility(swimlaneName, isVisible) {
    method resetSwimlaneVisibility (line 72) | resetSwimlaneVisibility() {
    method initializeSwimlaneVisibility (line 79) | initializeSwimlaneVisibility(swimlaneNames) {
    method setClipActivityNames (line 99) | setClipActivityNames(isEnabled) {
    method configurationChanged (line 105) | configurationChanged(configuration) {
    method destroy (line 111) | destroy() {

FILE: src/plugins/plan/PlanViewProvider.js
  function PlanViewProvider (line 27) | function PlanViewProvider(openmct) {

FILE: src/plugins/plan/inspector/ActivityInspectorViewProvider.js
  function ActivityInspectorViewProvider (line 27) | function ActivityInspectorViewProvider(openmct) {

FILE: src/plugins/plan/inspector/GanttChartInspectorViewProvider.js
  function GanttChartInspectorViewProvider (line 27) | function GanttChartInspectorViewProvider(openmct) {

FILE: src/plugins/plan/inspector/PlanInspectorViewProvider.js
  function PlanInspectorViewProvider (line 27) | function PlanInspectorViewProvider(openmct) {

FILE: src/plugins/plan/plugin.js
  constant PLAN_EXECUTION_MONITORING_DEFAULT_NAME (line 34) | const PLAN_EXECUTION_MONITORING_DEFAULT_NAME = 'Plan Execution Monitoring';
  constant ACTIVITY_STATES_DEFAULT_NAME (line 35) | const ACTIVITY_STATES_DEFAULT_NAME = 'Activity States';
  method initialize (line 86) | initialize(domainObject) {

FILE: src/plugins/plan/util.js
  function getValidatedData (line 37) | function getValidatedData(domainObject) {
  function getObjectJson (line 94) | function getObjectJson(domainObject) {
  function getValidatedGroups (line 110) | function getValidatedGroups(domainObject, planData) {
  function getDisplayProperties (line 134) | function getDisplayProperties(activity) {
  function getFilteredValues (line 154) | function getFilteredValues(activity) {
  function getContrastingColor (line 165) | function getContrastingColor(hexColor) {

FILE: src/plugins/planExecutionMonitoring/planExecutionMonitoringIdentifier.js
  constant PLAN_EXECUTION_MONITORING_KEY (line 23) | const PLAN_EXECUTION_MONITORING_KEY = 'plan-execution-monitoring';
  function createPlanExecutionMonitoringIdentifier (line 25) | function createPlanExecutionMonitoringIdentifier(namespace = '') {

FILE: src/plugins/planExecutionMonitoring/planExecutionMonitoringInterceptor.js
  function planExecutionMonitoringInterceptor (line 40) | function planExecutionMonitoringInterceptor(openmct, options) {

FILE: src/plugins/planExecutionMonitoring/pluginSpec.js
  constant MISSING_NAME (line 30) | const MISSING_NAME = `Missing: ${PLAN_EXECUTION_MONITORING_KEY}`;
  constant DEFAULT_NAME (line 31) | const DEFAULT_NAME = 'Plan Execution Monitoring';

FILE: src/plugins/plot/LinearScale.js
  class LinearScale (line 29) | class LinearScale {
    method constructor (line 30) | constructor(domain) {
    method domain (line 34) | domain(newDomain) {
    method range (line 43) | range(newRange) {
    method scale (line 52) | scale(domainValue) {
    method invert (line 65) | invert(rangeValue) {

FILE: src/plugins/plot/PlotViewProvider.js
  function PlotViewProvider (line 27) | function PlotViewProvider(openmct) {

FILE: src/plugins/plot/actions/ViewActions.js
  method invoke (line 30) | invoke(objectPath, view, filename) {
  method invoke (line 41) | invoke(objectPath, view, filename) {

FILE: src/plugins/plot/actions/utils.js
  function isPlotView (line 1) | function isPlotView(view) {

FILE: src/plugins/plot/chart/MCTChartAlarmLineSet.js
  class MCTChartAlarmLineSet (line 25) | class MCTChartAlarmLineSet {
    method constructor (line 29) | constructor(series, chart, offset, bounds) {
    method updateBounds (line 49) | updateBounds(bounds) {
    method color (line 54) | color() {
    method name (line 58) | name() {
    method makePoint (line 62) | makePoint(point, series) {
    method getLimitPoints (line 73) | getLimitPoints(series) {
    method reset (line 112) | reset() {
    method destroy (line 119) | destroy() {

FILE: src/plugins/plot/chart/MCTChartAlarmPointSet.js
  class MCTChartAlarmPointSet (line 25) | class MCTChartAlarmPointSet {
    method constructor (line 26) | constructor(series, chart, offset) {
    method append (line 44) | append(datum) {
    method remove (line 54) | remove(datum) {
    method reset (line 60) | reset() {
    method destroy (line 64) | destroy() {

FILE: src/plugins/plot/chart/MCTChartLineLinear.js
  class MCTChartLineLinear (line 25) | class MCTChartLineLinear extends MCTChartSeriesElement {
    method addPoint (line 26) | addPoint(point, start) {

FILE: src/plugins/plot/chart/MCTChartLineStepAfter.js
  class MCTChartLineStepAfter (line 25) | class MCTChartLineStepAfter extends MCTChartSeriesElement {
    method removePoint (line 26) | removePoint(index) {
    method vertexCountForPointAtIndex (line 32) | vertexCountForPointAtIndex(index) {
    method startIndexForPointAtIndex (line 40) | startIndexForPointAtIndex(index) {
    method addPoint (line 48) | addPoint(point, start) {

FILE: src/plugins/plot/chart/MCTChartPointSet.js
  class MCTChartPointSet (line 26) | class MCTChartPointSet extends MCTChartSeriesElement {
    method addPoint (line 27) | addPoint(point, start) {

FILE: src/plugins/plot/chart/MCTChartSeriesElement.js
  class MCTChartSeriesElement (line 26) | class MCTChartSeriesElement {
    method constructor (line 27) | constructor(series, chart, offset) {
    method getBuffer (line 45) | getBuffer() {
    method color (line 54) | color() {
    method vertexCountForPointAtIndex (line 58) | vertexCountForPointAtIndex(index) {
    method startIndexForPointAtIndex (line 62) | startIndexForPointAtIndex(index) {
    method removeSegments (line 66) | removeSegments(index, count) {
    method removePoint (line 77) | removePoint(index) {}
    method addPoint (line 80) | addPoint(point, index) {}
    method remove (line 82) | remove(point, index, series) {
    method makePoint (line 95) | makePoint(point, series) {
    method append (line 107) | append(point, index, series) {
    method makeInsertionPoint (line 116) | makeInsertionPoint(insertionPoint, pointsRequired) {
    method reset (line 131) | reset() {
    method growIfNeeded (line 142) | growIfNeeded(pointsRequired) {
    method destroy (line 153) | destroy() {

FILE: src/plugins/plot/chart/limitUtil.js
  function getLimitClass (line 1) | function getLimitClass(limit, prefix) {

FILE: src/plugins/plot/configuration/Collection.js
  class Collection (line 29) | class Collection extends Model {
    method initialize (line 33) | initialize(options) {
    method modelFn (line 42) | modelFn(model) {
    method first (line 56) | first() {
    method forEach (line 60) | forEach(iteree, context) {
    method map (line 64) | map(iteree, context) {
    method filter (line 68) | filter(iteree, context) {
    method size (line 72) | size() {
    method at (line 76) | at(index) {
    method add (line 80) | add(model) {
    method insert (line 87) | insert(model, index) {
    method indexOf (line 93) | indexOf(model) {
    method remove (line 97) | remove(model) {
    method destroy (line 108) | destroy(model) {

FILE: src/plugins/plot/configuration/ConfigStore.js
  class ConfigStore (line 22) | class ConfigStore {
    method deleteStore (line 29) | deleteStore(id) {
    method deleteAll (line 41) | deleteAll() {
    method add (line 49) | add(id, config) {
    method get (line 56) | get(id) {
  constant STORE (line 61) | const STORE = new ConfigStore();

FILE: src/plugins/plot/configuration/LegendModel.js
  class LegendModel (line 27) | class LegendModel extends Model {
    method listenToSeriesCollection (line 28) | listenToSeriesCollection(seriesCollection) {
    method setHeight (line 36) | setHeight() {
    method defaultModel (line 48) | defaultModel(options) {
    method destroy (line 63) | destroy() {

FILE: src/plugins/plot/configuration/Model.js
  class Model (line 32) | class Model extends EventEmitter {
    method constructor (line 36) | constructor(options) {
    method defaultModel (line 76) | defaultModel(options) {
    method initialize (line 84) | initialize(options) {}
    method destroy (line 89) | destroy() {
    method id (line 94) | id() {
    method get (line 103) | get(attribute) {
    method has (line 112) | has(attribute) {
    method set (line 121) | set(attribute, value) {
    method unset (line 132) | unset(attribute) {

FILE: src/plugins/plot/configuration/PlotConfigurationModel.js
  constant MAX_Y_AXES (line 30) | const MAX_Y_AXES = 3;
  constant MAIN_Y_AXES_ID (line 31) | const MAIN_Y_AXES_ID = 1;
  constant MAX_ADDITIONAL_AXES (line 32) | const MAX_ADDITIONAL_AXES = MAX_Y_AXES - 1;
  class PlotConfigurationModel (line 41) | class PlotConfigurationModel extends Model {
    method initialize (line 49) | initialize(options) {
    method getPersistedSeriesConfig (line 132) | getPersistedSeriesConfig(identifier) {
    method getPersistedFilters (line 148) | getPersistedFilters(identifier) {
    method updateDomainObject (line 161) | updateDomainObject(domainObject) {
    method onDestroy (line 168) | onDestroy() {
    method defaultModel (line 185) | defaultModel(options) {

FILE: src/plugins/plot/configuration/PlotSeries.js
  constant FLOAT32_MAX (line 66) | const FLOAT32_MAX = 3.4e38;
  constant FLOAT32_MIN (line 67) | const FLOAT32_MIN = -3.4e38;
  class PlotSeries (line 69) | class PlotSeries extends Model {
    method constructor (line 75) | constructor(options) {
    method getLogMode (line 92) | getLogMode(options) {
    method defaultModel (line 110) | defaultModel(options) {
    method destroy (line 139) | destroy() {
    method initialize (line 165) | initialize(options) {
    method updateLimits (line 185) | updateLimits(bounds) {
    method fetch (line 196) | async fetch(options) {
    method updateName (line 248) | updateName(name) {
    method onXKeyChange (line 256) | onXKeyChange(xKey) {
    method onYKeyChange (line 267) | onYKeyChange(newKey, oldKey) {
    method formatX (line 294) | formatX(point) {
    method formatY (line 298) | formatY(point) {
    method resetStats (line 305) | resetStats() {
    method reset (line 314) | reset(newData) {
    method nearestPoint (line 325) | nearestPoint(xValue) {
    method load (line 343) | async load(options) {
    method loadLimits (line 349) | async loadLimits() {
    method limitsUpdated (line 361) | limitsUpdated(limitsResponse) {
    method sortedIndex (line 376) | sortedIndex(point) {
    method updateStats (line 384) | updateStats(point) {
    method add (line 436) | add(newData, sorted = false) {
    method addAll (line 474) | addAll(points, sorted = false) {
    method isValueInvalid (line 484) | isValueInvalid(val) {
    method isValidFloat32 (line 492) | isValidFloat32(val) {
    method remove (line 500) | remove(point) {
    method purgeRecordsOutsideRange (line 517) | purgeRecordsOutsideRange(range) {
    method updateFiltersAndRefresh (line 538) | updateFiltersAndRefresh(updatedFilters) {
    method getDisplayRange (line 558) | getDisplayRange(xKey) {
    method markerOptionsDisplayText (line 572) | markerOptionsDisplayText() {
    method nameWithUnit (line 584) | nameWithUnit() {
    method updateSeriesData (line 593) | updateSeriesData(data) {
    method getSeriesData (line 614) | getSeriesData() {

FILE: src/plugins/plot/configuration/SeriesCollection.js
  class SeriesCollection (line 33) | class SeriesCollection extends Collection {
    method initialize (line 38) | initialize(options) {
    method trackPersistedConfig (line 60) | trackPersistedConfig(domainObject) {
    method watchTelemetryContainer (line 75) | watchTelemetryContainer(domainObject) {
    method addTelemetryObject (line 85) | addTelemetryObject(domainObject, index) {
    method removeTelemetryObject (line 123) | removeTelemetryObject(identifier) {
    method onSeriesAdd (line 156) | onSeriesAdd(series) {
    method onSeriesRemove (line 171) | onSeriesRemove(series) {
    method updateColorPalette (line 176) | updateColorPalette(newColor, oldColor) {
    method byIdentifier (line 185) | byIdentifier(identifier) {
    method destroy (line 196) | destroy() {

FILE: src/plugins/plot/configuration/XAxisModel.js
  class XAxisModel (line 27) | class XAxisModel extends Model {
    method initialize (line 36) | initialize(options) {
    method changeKey (line 68) | changeKey(newKey) {
    method resetSeries (line 86) | resetSeries() {
    method defaultModel (line 95) | defaultModel(options) {
    method destroy (line 115) | destroy() {

FILE: src/plugins/plot/configuration/YAxisModel.js
  class YAxisModel (line 47) | class YAxisModel extends Model {
    method initialize (line 52) | initialize(options) {
    method listenToSeriesCollection (line 72) | listenToSeriesCollection(seriesCollection) {
    method toggleFreeze (line 95) | toggleFreeze(frozen) {
    method applyPadding (line 100) | applyPadding(range) {
    method updatePadding (line 111) | updatePadding(newPadding) {
    method calculateAutoscaleExtents (line 116) | calculateAutoscaleExtents(newStats) {
    method updateStats (line 125) | updateStats(seriesStats) {
    method resetStats (line 154) | resetStats() {
    method getSeriesForYAxis (line 163) | getSeriesForYAxis(seriesCollection) {
    method getYAxisForId (line 171) | getYAxisForId(id) {
    method trackSeries (line 189) | trackSeries(series) {
    method untrackSeries (line 221) | untrackSeries(series) {
    method updateDisplayRange (line 233) | updateDisplayRange(range) {
    method toggleAutoscale (line 251) | toggleAutoscale(autoscale) {
    method onLogModeChange (line 276) | onLogModeChange(logMode) {
    method resetSeries (line 291) | resetSeries() {
    method getMetadataValueByProperty (line 307) | getMetadataValueByProperty(series, property) {
    method updateFromSeries (line 326) | updateFromSeries(seriesCollection) {
    method defaultModel (line 377) | defaultModel(options) {
    method destroy (line 388) | destroy() {

FILE: src/plugins/plot/draw/Draw2D.js
  class Draw2D (line 42) | class Draw2D extends EventEmitter {
    method constructor (line 43) | constructor(canvas) {
    method x (line 58) | x(v) {
    method y (line 62) | y(v) {
    method setColor (line 66) | setColor(color) {
    method clear (line 75) | clear() {
    method setDimensions (line 80) | setDimensions(newDimensions, newOrigin) {
    method drawLine (line 84) | drawLine(buf, color, points) {
    method drawSquare (line 106) | drawSquare(min, max, color) {
    method drawPoints (line 115) | drawPoints(buf, color, points, pointSize, shape) {
    method drawLimitPoint (line 124) | drawLimitPoint(x, y, size) {
    method drawLimitPoints (line 130) | drawLimitPoints(points, color, pointSize) {

FILE: src/plugins/plot/draw/DrawLoader.js
  constant CHARTS (line 26) | const CHARTS = [

FILE: src/plugins/plot/draw/DrawWebGL.js
  constant FRAGMENT_SHADER (line 30) | const FRAGMENT_SHADER = `
  constant VERTEX_SHADER (line 74) | const VERTEX_SHADER = `
  class DrawWebGL (line 93) | class DrawWebGL extends EventEmitter {
    method constructor (line 94) | constructor(canvas, overlay) {
    method onContextLost (line 117) | onContextLost(event) {
    method initContext (line 123) | initContext() {
    method destroy (line 165) | destroy() {
    method x (line 184) | x(v) {
    method y (line 188) | y(v) {
    method doDraw (line 191) | doDraw(drawType, buf, color, points, shape) {
    method clear (line 207) | clear() {
    method setDimensions (line 229) | setDimensions(dimensions, origin) {
    method drawLine (line 251) | drawLine(buf, color, points) {
    method drawPoints (line 262) | drawPoints(buf, color, points, pointSize, shape) {
    method drawSquare (line 279) | drawSquare(min, max, color) {
    method drawLimitPoint (line 291) | drawLimitPoint(x, y, size) {
    method drawLimitPoints (line 297) | drawLimitPoints(points, color, pointSize) {

FILE: src/plugins/plot/draw/MarkerShapes.js
  constant MARKER_SHAPES (line 28) | const MARKER_SHAPES = {

FILE: src/plugins/plot/inspector/PlotsInspectorViewProvider.js
  function PlotsInspectorViewProvider (line 5) | function PlotsInspectorViewProvider(openmct) {

FILE: src/plugins/plot/inspector/StackedPlotsInspectorViewProvider.js
  function StackedPlotsInspectorViewProvider (line 5) | function StackedPlotsInspectorViewProvider(openmct) {

FILE: src/plugins/plot/inspector/forms/formUtil.js
  function coerce (line 1) | function coerce(value, coerceFunc) {
  function validate (line 9) | function validate(value, model, validateFunc) {
  function objectPath (line 17) | function objectPath(path) {

FILE: src/plugins/plot/mathUtils.js
  function log (line 10) | function log(n, base = e) {
  function antilog (line 24) | function antilog(n, base = e) {
  function symlog (line 33) | function symlog(n, base = e) {
  function antisymlog (line 42) | function antisymlog(n, base = e) {

FILE: src/plugins/plot/overlayPlot/OverlayPlotCompositionPolicy.js
  function OverlayPlotCompositionPolicy (line 1) | function OverlayPlotCompositionPolicy(openmct) {

FILE: src/plugins/plot/overlayPlot/OverlayPlotViewProvider.js
  function OverlayPlotViewProvider (line 26) | function OverlayPlotViewProvider(openmct) {

FILE: src/plugins/plot/overlayPlot/overlayPlotStylesInterceptor.js
  function overlayPlotStylesInterceptor (line 23) | function overlayPlotStylesInterceptor(openmct) {

FILE: src/plugins/plot/overlayPlot/pluginSpec.js
  method observe (line 134) | observe() {}
  method unobserve (line 135) | unobserve() {}
  method disconnect (line 136) | disconnect() {}

FILE: src/plugins/plot/pluginSpec.js
  constant TEST_KEY_ID (line 39) | const TEST_KEY_ID = 'some-other-key';

FILE: src/plugins/plot/stackedPlot/StackedPlotCompositionPolicy.js
  function StackedPlotCompositionPolicy (line 1) | function StackedPlotCompositionPolicy(openmct) {

FILE: src/plugins/plot/stackedPlot/StackedPlotViewProvider.js
  function StackedPlotViewProvider (line 27) | function StackedPlotViewProvider(openmct) {

FILE: src/plugins/plot/stackedPlot/mixins/objectStyles-mixin.js
  method data (line 28) | data() {
  method mounted (line 33) | mounted() {
  method beforeUnmount (line 37) | beforeUnmount() {
  method getObjectStyleForItem (line 51) | getObjectStyleForItem(config) {
  method initObjectStyles (line 58) | initObjectStyles() {
  method getStyleReceiver (line 102) | getStyleReceiver() {
  method setFontSize (line 116) | setFontSize(newSize) {
  method setFont (line 123) | setFont(newFont) {
  method updateStyle (line 130) | updateStyle(styleObj) {

FILE: src/plugins/plot/stackedPlot/pluginSpec.js
  method observe (line 128) | observe() {}
  method unobserve (line 129) | unobserve() {}
  method disconnect (line 130) | disconnect() {}

FILE: src/plugins/plot/stackedPlot/stackedPlotConfigurationInterceptor.js
  function stackedPlotConfigurationInterceptor (line 23) | function stackedPlotConfigurationInterceptor(openmct) {

FILE: src/plugins/plot/tickUtils.js
  constant TIME_UNITS_UTC (line 8) | const TIME_UNITS_UTC = [
  function tickStep (line 22) | function tickStep(start, stop, count) {
  function timeTickStep (line 40) | function timeTickStep(start, stop, count, unitName) {
  function getTimeTicks (line 94) | function getTimeTicks(start, stop, count) {
  function generateMonthYearTicks (line 130) | function generateMonthYearTicks(start, stop, unit, stepSize) {
  function generateFixedIntervalTicks (line 168) | function generateFixedIntervalTicks(start, stop, interval) {
  function getPrecision (line 183) | function getPrecision(step) {
  function getLogTicks (line 199) | function getLogTicks(start, stop, mainTickCount = 8, secondaryTickCount ...
  function ticks (line 237) | function ticks(start, stop, count) {
  function commonPrefix (line 250) | function commonPrefix(a, b) {
  function commonSuffix (line 266) | function commonSuffix(a, b) {
  function getFormattedTicks (line 282) | function getFormattedTicks(newTicks, format) {
  function measureTextWidth (line 319) | function measureTextWidth(text, font = '12px "Open Sans", sans-serif') {

FILE: src/plugins/reloadAction/ReloadAction.js
  constant RELOAD_ACTION_KEY (line 23) | const RELOAD_ACTION_KEY = 'reload';
  class ReloadAction (line 25) | class ReloadAction {
    method constructor (line 26) | constructor(openmct) {
    method invoke (line 36) | invoke(objectPath, view) {

FILE: src/plugins/reloadAction/plugin.js
  function plugin (line 24) | function plugin() {

FILE: src/plugins/remoteClock/RemoteClock.js
  class RemoteClock (line 35) | class RemoteClock extends DefaultClock {
    method constructor (line 36) | constructor(openmct, identifier) {
    method start (line 61) | start() {
    method stop (line 79) | stop() {
    method _subscribe (line 94) | _subscribe() {
    method _requestLatest (line 106) | _requestLatest() {
    method _processDatum (line 123) | _processDatum(datum) {
    method _timeSystemChange (line 136) | _timeSystemChange() {
    method #waitForReady (line 153) | #waitForReady() {

FILE: src/plugins/remoteClock/RemoteClockSpec.js
  constant REMOTE_CLOCK_KEY (line 25) | const REMOTE_CLOCK_KEY = 'remote-clock';
  constant TIME_TELEMETRY_ID (line 26) | const TIME_TELEMETRY_ID = {
  constant TIME_VALUE (line 30) | const TIME_VALUE = 12345;
  constant REQ_OPTIONS (line 31) | const REQ_OPTIONS = {
  constant OFFSET_START (line 35) | const OFFSET_START = -10;
  constant OFFSET_END (line 36) | const OFFSET_END = 1;

FILE: src/plugins/remoteClock/requestInterceptor.js
  function remoteClockRequestInterceptor (line 31) | function remoteClockRequestInterceptor(openmct, _remoteClockIdentifier, ...

FILE: src/plugins/remove/RemoveAction.js
  constant SPECIAL_MESSAGE_TYPES (line 23) | const SPECIAL_MESSAGE_TYPES = ['layout', 'flexible-layout'];
  constant REMOVE_ACTION_KEY (line 24) | const REMOVE_ACTION_KEY = 'remove';
  class RemoveAction (line 26) | class RemoveAction {
    method constructor (line 29) | constructor(openmct) {
    method invoke (line 43) | async invoke(objectPath) {
    method showConfirmDialog (line 60) | showConfirmDialog(child, parent) {
    method inNavigationPath (line 96) | inNavigationPath(object) {
    method navigateTo (line 102) | navigateTo(objectPath) {
    method removeFromComposition (line 111) | async removeFromComposition(parent, child, objectPath) {
    method appliesTo (line 128) | appliesTo(objectPath) {
    method startTransaction (line 150) | startTransaction() {
    method saveTransaction (line 156) | async saveTransaction() {

FILE: src/plugins/staticRootPlugin/StaticModelProvider.js
  class StaticModelProvider (line 31) | class StaticModelProvider {
    method constructor (line 32) | constructor(importData, rootIdentifier) {
    method get (line 40) | get(identifier) {
    method parseObjectLeaf (line 49) | parseObjectLeaf(objectLeaf, idMap, newRootNamespace, oldRootNamespace) {
    method parseArrayLeaf (line 79) | parseArrayLeaf(arrayLeaf, idMap, newRootNamespace, oldRootNamespace) {
    method parseBranchedLeaf (line 85) | parseBranchedLeaf(branchedLeafValue, idMap, newRootNamespace, oldRootN...
    method parseTreeLeaf (line 93) | parseTreeLeaf(leafKey, leafValue, idMap, newRootNamespace, oldRootName...
    method rewriteObjectIdentifiers (line 149) | rewriteObjectIdentifiers(importData, rootIdentifier) {
    method convertToNewObjects (line 173) | convertToNewObjects(oldObjectMap) {
    method setRootLocation (line 182) | setRootLocation(objectMap, rootIdentifier) {
    method rewriteModel (line 192) | rewriteModel(importData, rootIdentifier) {

FILE: src/plugins/staticRootPlugin/plugin.js
  function StaticRootPlugin (line 25) | function StaticRootPlugin(options) {

FILE: src/plugins/summaryWidget/SummaryWidgetViewPolicy.js
  function SummaryWidgetViewPolicy (line 27) | function SummaryWidgetViewPolicy() {}

FILE: src/plugins/summaryWidget/SummaryWidgetsCompositionPolicy.js
  function SummaryWidgetsCompositionPolicy (line 23) | function SummaryWidgetsCompositionPolicy(openmct) {

FILE: src/plugins/summaryWidget/plugin.js
  function plugin (line 6) | function plugin() {

FILE: src/plugins/summaryWidget/src/Condition.js
  function Condition (line 42) | function Condition(conditionConfig, index, conditionManager) {

FILE: src/plugins/summaryWidget/src/ConditionEvaluator.js
  function ConditionEvaluator (line 12) | function ConditionEvaluator(subscriptionCache, compositionObjs) {

FILE: src/plugins/summaryWidget/src/ConditionManager.js
  function ConditionManager (line 15) | function ConditionManager(domainObject, openmct) {

FILE: src/plugins/summaryWidget/src/Rule.js
  function Rule (line 23) | function Rule(

FILE: src/plugins/summaryWidget/src/SummaryWidget.js
  constant DEFAULT_PROPS (line 12) | const DEFAULT_PROPS = {
  function SummaryWidget (line 26) | function SummaryWidget(domainObject, openmct) {

FILE: src/plugins/summaryWidget/src/TestDataItem.js
  function TestDataItem (line 20) | function TestDataItem(itemConfig, index, conditionManager) {

FILE: src/plugins/summaryWidget/src/TestDataManager.js
  function TestDataManager (line 15) | function TestDataManager(domainObject, conditionManager, openmct) {

FILE: src/plugins/summaryWidget/src/WidgetDnD.js
  function WidgetDnD (line 12) | function WidgetDnD(container, ruleOrder, rulesById) {

FILE: src/plugins/summaryWidget/src/eventHelpers.js
  method listenTo (line 24) | listenTo(object, event, callback, context) {
  method stopListening (line 50) | stopListening(object, event, callback, context) {

FILE: src/plugins/summaryWidget/src/input/ColorPalette.js
  constant DEFAULT_COLORS (line 4) | const DEFAULT_COLORS = [
  function ColorPalette (line 95) | function ColorPalette(cssClass, container, colors) {

FILE: src/plugins/summaryWidget/src/input/IconPalette.js
  constant DEFAULT_ICONS (line 4) | const DEFAULT_ICONS = [
  function IconPalette (line 39) | function IconPalette(cssClass, container, icons) {

FILE: src/plugins/summaryWidget/src/input/KeySelect.js
  constant NULLVALUE (line 17) | const NULLVALUE = '- Select Field -';
  function KeySelect (line 19) | function KeySelect(config, objectSelect, manager, changeCallback) {

FILE: src/plugins/summaryWidget/src/input/ObjectSelect.js
  function ObjectSelect (line 16) | function ObjectSelect(config, manager, baseOptions) {

FILE: src/plugins/summaryWidget/src/input/OperationSelect.js
  constant NULLVALUE (line 18) | const NULLVALUE = '- Select Comparison -';
  function OperationSelect (line 20) | function OperationSelect(config, keySelect, manager, changeCallback) {

FILE: src/plugins/summaryWidget/src/input/Palette.js
  function Palette (line 17) | function Palette(cssClass, container, items) {

FILE: src/plugins/summaryWidget/src/input/Select.js
  function Select (line 12) | function Select() {

FILE: src/plugins/summaryWidget/src/telemetry/EvaluatorPool.js
  function EvaluatorPool (line 27) | function EvaluatorPool(openmct) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetCondition.js
  function SummaryWidgetCondition (line 25) | function SummaryWidgetCondition(definition) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetEvaluator.js
  function SummaryWidgetEvaluator (line 34) | function SummaryWidgetEvaluator(domainObject, openmct) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetMetadataProvider.js
  function SummaryWidgetMetadataProvider (line 23) | function SummaryWidgetMetadataProvider(openmct) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetRule.js
  function SummaryWidgetRule (line 25) | function SummaryWidgetRule(definition) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetTelemetryProvider.js
  function SummaryWidgetTelemetryProvider (line 25) | function SummaryWidgetTelemetryProvider(openmct) {

FILE: src/plugins/summaryWidget/src/telemetry/SummaryWidgetTelemetryProviderSpec.js
  function notify (line 147) | function notify(eventName, a, b) {

FILE: src/plugins/summaryWidget/src/telemetry/operations.js
  constant OPERATIONS (line 23) | const OPERATIONS = {

FILE: src/plugins/summaryWidget/src/views/SummaryWidgetView.js
  constant WIDGET_ICON_CLASS (line 3) | const WIDGET_ICON_CLASS = 'c-sw__icon js-sw__icon';
  class SummaryWidgetView (line 5) | class SummaryWidgetView {
    method #createSummaryWidgetTemplate (line 6) | #createSummaryWidgetTemplate() {
    method constructor (line 30) | constructor(domainObject, openmct) {
    method updateState (line 37) | updateState(datum) {
    method render (line 48) | render() {
    method show (line 102) | show(container) {
    method onMutation (line 113) | onMutation(domainObject) {
    method destroy (line 118) | destroy() {

FILE: src/plugins/summaryWidget/src/views/SummaryWidgetViewProvider.js
  constant DEFAULT_VIEW_PRIORITY (line 26) | const DEFAULT_VIEW_PRIORITY = 100;
  function SummaryWidgetViewProvider (line 27) | function SummaryWidgetViewProvider(openmct) {

FILE: src/plugins/tabs/plugin.js
  function plugin (line 24) | function plugin(options) {

FILE: src/plugins/tabs/tabs.js
  constant TABS_KEY (line 27) | const TABS_KEY = 'tabs';
  class Tabs (line 28) | class Tabs {
    method constructor (line 29) | constructor(openmct) {
    method canView (line 37) | canView(domainObject) {
    method canEdit (line 41) | canEdit(domainObject) {
    method view (line 45) | view(domainObject, objectPath) {

FILE: src/plugins/telemetryMean/plugin.js
  constant DEFAULT_SAMPLES (line 25) | const DEFAULT_SAMPLES = 10;
  function plugin (line 27) | function plugin() {

FILE: src/plugins/telemetryMean/src/MeanTelemetryProvider.js
  function MeanTelemetryProvider (line 27) | function MeanTelemetryProvider(openmct) {
  function logError (line 127) | function logError(error) {

FILE: src/plugins/telemetryMean/src/MeanTelemetryProviderSpec.js
  constant RANGE_KEY (line 27) | const RANGE_KEY = 'value';
  function feedInputTelemetry (line 370) | function feedInputTelemetry(inputTelemetry) {
  function expectAveragesForTelemetry (line 374) | function expectAveragesForTelemetry(expectedAverages) {
  function expectObjectWasSubscribedTo (line 382) | function expectObjectWasSubscribedTo(object) {
  function expectAverageToBe (line 562) | function expectAverageToBe(expectedValue, averageData) {
  function whenTelemetryRequestedReturn (line 567) | function whenTelemetryRequestedReturn(telemetry) {
  function createMockObjects (line 572) | function createMockObjects() {
  function setSampleSize (line 580) | function setSampleSize(sampleSize) {
  function createMockApi (line 584) | function createMockApi() {
  function createMockObjectApi (line 592) | function createMockObjectApi() {
  function mockObjectWithType (line 596) | function mockObjectWithType(type) {
  function resolvePromiseWith (line 602) | function resolvePromiseWith(value) {
  function waitForPromises (line 609) | function waitForPromises() {
  function createMockTimeApi (line 613) | function createMockTimeApi() {
  function setTimeSystemTo (line 617) | function s
Condensed preview — 1234 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,367K chars).
[
  {
    "path": ".cspell.json",
    "chars": 8189,
    "preview": "{\n  \"version\": \"0.2\",\n  \"language\": \"en,en-us\",\n  \"words\": [\n    \"gress\",\n    \"doctoc\",\n    \"minmax\",\n    \"openmct\",\n   "
  },
  {
    "path": ".eslintrc.cjs",
    "chars": 6385,
    "preview": "const LEGACY_FILES = ['example/**'];\n/** @type {import('eslint').Linter.Config} */\nconst config = {\n  env: {\n    browser"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 569,
    "preview": "# git-blame ignored revisions\n# To configure, run:\n#   git config blame.ignoreRevsFile .git-blame-ignore-revs\n# Requires"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1455,
    "preview": "---\nname: Bug report\nabout: File a Bug !\ntitle: ''\nlabels: type:bug\nassignees: ''\n\n---\n\n<!--- Focus on user impact in th"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 163,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Discussions\n    url: https://github.com/nasa/openmct/discussions\n   "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement-request.md",
    "chars": 639,
    "preview": "---\nname: Enhancement request\nabout: Suggest an enhancement or new improvement for this project\ntitle: ''\nlabels: type:e"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/maintenance-type.md",
    "chars": 214,
    "preview": "---\nname: Maintenance\nabout: Add, update or remove documentation, tests, or dependencies.\ntitle: ''\nlabels: type:mainten"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1671,
    "preview": "<!--- Note: Please open the PR in draft form until you are ready for active review. -->\nCloses <!--- Insert Issue Number"
  },
  {
    "path": ".github/codeql/codeql-config.yml",
    "chars": 87,
    "preview": "name: 'Custom CodeQL config'\n\npaths-ignore:\n  # Ignore e2e tests and framework\n  - e2e\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1402,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: 'npm'\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n    open-pull"
  },
  {
    "path": ".github/release.yml",
    "chars": 530,
    "preview": "changelog:\n  categories:\n    - title: 💥 Notable Changes\n      labels:\n        - notable_change\n    - title: 🏕 Features\n "
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 977,
    "preview": "name: 'CodeQL'\n\non:\n  push:\n    branches: [master, 'release/*']\n  pull_request:\n    branches: [master, 'release/*']\n    "
  },
  {
    "path": ".github/workflows/e2e-couchdb.yml",
    "chars": 2826,
    "preview": "name: 'e2e-couchdb'\non:\n  push:\n  pull_request:\n    types:\n      - opened\njobs:\n  e2e-couchdb:\n    runs-on: ubuntu-lates"
  },
  {
    "path": ".github/workflows/e2e-full.yml",
    "chars": 2046,
    "preview": "name: 'e2e-full'\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch:\n  pull_request:\n    types:\n      - labele"
  },
  {
    "path": ".github/workflows/e2e-perf.yml",
    "chars": 1798,
    "preview": "name: 'e2e-perf'\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch:\n  pull_request:\n    types:\n      - labele"
  },
  {
    "path": ".github/workflows/npm-prerelease.yml",
    "chars": 1078,
    "preview": "# This workflow will run tests using node and then publish a package to npmjs when a prerelease is created\n# For more in"
  },
  {
    "path": ".github/workflows/pr-platform.yml",
    "chars": 1960,
    "preview": "name: 'pr-platform'\non:\n  push:\n    branches:\n      - master\n  workflow_dispatch:\n  pull_request:\n    types:\n      - lab"
  },
  {
    "path": ".github/workflows/pr.yml",
    "chars": 12636,
    "preview": "name: PR\n\non:\n  push:\n  pull_request:\n    types:\n      - opened\n      - labeled\n\nenv:\n  NODE_ENV: development\n  NODE_VER"
  },
  {
    "path": ".github/workflows/prcop-config.json",
    "chars": 498,
    "preview": "{\n  \"linters\": [\n    {\n      \"name\": \"descriptionRegexp\",\n      \"config\": {\n        \"regexp\": \"[x|X]] Testing instructio"
  },
  {
    "path": ".github/workflows/prcop.yml",
    "chars": 964,
    "preview": "name: PRCop\n\non:\n  pull_request:\n    types:\n      - labeled\n      - unlabeled\n      - milestoned\n      - demilestoned\n  "
  },
  {
    "path": ".gitignore",
    "chars": 648,
    "preview": "*.scssc\n*.zip\n*.gzip\n*.tgz\n*.DS_Store\n*.swp\n\n# Compiled CSS, unless directly added\n*.sass-cache\n*COMPILE.css\n*.css\n*.css"
  },
  {
    "path": ".npmignore",
    "chars": 637,
    "preview": "# Ignore everything first (will not ignore special files like LICENSE.md,\n# README.md, and package.json)...\n/**/*\n\n# ..."
  },
  {
    "path": ".npmrc",
    "chars": 108,
    "preview": "loglevel=warn\n\n#Prevent folks from ignoring an important error when building from source\nengine-strict=true\n"
  },
  {
    "path": ".nvmrc",
    "chars": 5,
    "preview": "lts/*"
  },
  {
    "path": ".prettierignore",
    "chars": 268,
    "preview": "# Docs\n*.md\n\n# Build output\ntarget\ndist\n\n# Mac OS X Finder\n.DS_Store\n\n# Node dependencies\nnode_modules\n\n# npm-debug log\n"
  },
  {
    "path": ".prettierrc",
    "chars": 97,
    "preview": "{\n  \"trailingComma\": \"none\",\n  \"singleQuote\": true,\n  \"printWidth\": 100,\n  \"endOfLine\": \"auto\"\n}\n"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 527,
    "preview": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n  // Extension ident"
  },
  {
    "path": ".webpack/webpack.common.mjs",
    "chars": 5839,
    "preview": "/*\nThis is the OpenMCT common webpack file. It is imported by the other three webpack configurations:\n - webpack.prod.mj"
  },
  {
    "path": ".webpack/webpack.coverage.mjs",
    "chars": 650,
    "preview": "/*\nThis file extends the webpack.dev.mjs config to add babel istanbul coverage.\nOpenMCT Continuous Integration servers u"
  },
  {
    "path": ".webpack/webpack.dev.mjs",
    "chars": 1763,
    "preview": "/*\nThis configuration should be used for development purposes. It contains full source map, a\ndevServer (which be invoke"
  },
  {
    "path": ".webpack/webpack.prod.mjs",
    "chars": 397,
    "preview": "/*\nThis configuration should be used for production installs.\nIt is the default webpack configuration.\n*/\n\nimport webpac"
  },
  {
    "path": "API.md",
    "chars": 62573,
    "preview": "<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD "
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 13453,
    "preview": "# Contributing to Open MCT\n\nThis document describes the process of contributing to Open MCT as well as the standards tha"
  },
  {
    "path": "LICENSE.md",
    "chars": 725,
    "preview": "# Open MCT License\n\nOpen MCT, Copyright (c) 2014-2024, United States Government as represented by the Administrator of t"
  },
  {
    "path": "README.md",
    "chars": 14251,
    "preview": "# Open MCT [![license](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](http://www.apache.org/licenses/LICEN"
  },
  {
    "path": "SECURITY.md",
    "chars": 1632,
    "preview": "# Security Policy\n\nOpen MCT is an open source project and may contain externally provided code. External contributions m"
  },
  {
    "path": "TESTING.md",
    "chars": 7850,
    "preview": "# Testing\nOpen MCT Testing is iterating and improving at a rapid pace. This document serves to capture and index existin"
  },
  {
    "path": "build-docs.sh",
    "chars": 2314,
    "preview": "#!/bin/bash\n\n#*****************************************************************************\n#* Open MCT, Copyright (c) 2"
  },
  {
    "path": "codecov.yml",
    "chars": 690,
    "preview": "codecov:\n  require_ci_to_pass: false #This setting will update the bot regardless of whether or not tests pass\n\n# Disabl"
  },
  {
    "path": "copyright-notice.html",
    "chars": 1005,
    "preview": "<!--\n Open MCT, Copyright (c) 2014-2024, United States Government\n as represented by the Administrator of the National A"
  },
  {
    "path": "copyright-notice.js",
    "chars": 1193,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "docs/src/guide/security.md",
    "chars": 4799,
    "preview": "# Security Guide\n\nOpen MCT is a rich client with plugin support that executes as a single page\nweb application in a brow"
  },
  {
    "path": "docs/src/index.md",
    "chars": 1161,
    "preview": "# Open MCT Documentation\n\n## Overview\n\n Documentation is provided to support the use and development of\n Open MCT. It's "
  },
  {
    "path": "docs/src/process/cycle.md",
    "chars": 8553,
    "preview": "# Development Cycle\n\nDevelopment of Open MCT occurs on an iterative cycle of\nsprints and releases.\n\n* A _sprint_ is thre"
  },
  {
    "path": "docs/src/process/index.md",
    "chars": 413,
    "preview": "# Development Process\n\nThe process used to develop Open MCT is described in the following\ndocuments:\n\n* The [Development"
  },
  {
    "path": "docs/src/process/release.md",
    "chars": 2555,
    "preview": "\n# Release of NASA Open MCT NPM Package\n\nThis document outlines the process and key considerations for releasing a new v"
  },
  {
    "path": "docs/src/process/testing/plan.md",
    "chars": 6844,
    "preview": "# Test Plan\n\n## Test Levels\n\nTesting for Open MCT includes:\n\n* _Smoke testing_: Brief, informal testing to verify that n"
  },
  {
    "path": "docs/src/process/version.md",
    "chars": 7316,
    "preview": "# Version Guide\n\nThis document describes semantics and processes for providing version\nnumbers for Open MCT, and additio"
  },
  {
    "path": "e2e/.eslintrc.cjs",
    "chars": 1040,
    "preview": "/* eslint-disable no-undef */\nmodule.exports = {\n  extends: ['plugin:playwright/recommended'],\n  rules: {\n    'playwrigh"
  },
  {
    "path": "e2e/.npmignore",
    "chars": 85,
    "preview": "*\n!appActions.js\n!baseFixtures.js\n!pluginFixtures.js\n!avpFixtures.js\n!index.js\n!*.md\n"
  },
  {
    "path": "e2e/.percy.ci.yml",
    "chars": 1050,
    "preview": "version: 2\nsnapshot:\n  widths: [1024]\n  min-height: 1440 # px\n  percyCSS: |\n    /* Clock indicator... your days are numb"
  },
  {
    "path": "e2e/.percy.nightly.yml",
    "chars": 1056,
    "preview": "version: 2\nsnapshot:\n  widths: [1024, 2000]\n  min-height: 1440 # px\n  percyCSS: |\n    /* Clock indicator... your days ar"
  },
  {
    "path": "e2e/README.md",
    "chars": 40622,
    "preview": "# e2e testing\n\nThis document captures information specific to the e2e testing of Open MCT. For general information about"
  },
  {
    "path": "e2e/appActions.js",
    "chars": 31043,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/avpFixtures.js",
    "chars": 6762,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/baseFixtures.js",
    "chars": 5521,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/constants.js",
    "chars": 1756,
    "preview": "/**\n * Constants which may be used across all e2e tests.\n */\n\n/**\n * Time Constants\n * - Used for overriding the browser"
  },
  {
    "path": "e2e/helper/addInitDataVisualization.js",
    "chars": 1535,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitDerivedTelemetryPlugin.js",
    "chars": 1503,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitExampleFaultProvider.js",
    "chars": 1508,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitExampleFaultProviderStatic.js",
    "chars": 1550,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitExampleStalenessProvider.js",
    "chars": 1441,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2025, Uni"
  },
  {
    "path": "e2e/helper/addInitExampleUser.js",
    "chars": 1395,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitFaultManagementPlugin.js",
    "chars": 1497,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitFileInputObject.js",
    "chars": 1707,
    "preview": "class DomainObjectViewProvider {\n  constructor(openmct) {\n    this.key = 'doViewProvider';\n    this.name = 'Domain Objec"
  },
  {
    "path": "e2e/helper/addInitNotebookWithUrls.js",
    "chars": 1634,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitOperatorStatus.js",
    "chars": 1393,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addInitRestrictedNotebook.js",
    "chars": 1573,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/addNoneditableObject.js",
    "chars": 665,
    "preview": "(function () {\n  document.addEventListener('DOMContentLoaded', () => {\n    const PERSISTENCE_KEY = 'persistence-tests';\n"
  },
  {
    "path": "e2e/helper/faultUtils.js",
    "chars": 7138,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/hotkeys/clipboard.js",
    "chars": 1737,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/hotkeys/hotkeys.js",
    "chars": 1226,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/imageryUtils.js",
    "chars": 984,
    "preview": "import { createDomainObjectWithDefaults } from '../appActions.js';\nimport { expect } from '../pluginFixtures.js';\n\nconst"
  },
  {
    "path": "e2e/helper/notebookUtils.js",
    "chars": 5665,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/planningUtils.js",
    "chars": 8855,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/plotTagsUtils.js",
    "chars": 7158,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/stylingUtils.js",
    "chars": 5118,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/useDarkmatterTheme.js",
    "chars": 1503,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/helper/useSnowTheme.js",
    "chars": 1505,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/index.js",
    "chars": 355,
    "preview": "// Import everything from the specific fixture files\nimport * as appActions from './appActions.js';\nimport * as avpFixtu"
  },
  {
    "path": "e2e/package.json",
    "chars": 600,
    "preview": "{\n  \"name\": \"openmct-e2e\",\n  \"version\": \"4.1.0-next\",\n  \"description\": \"The Open MCT e2e framework\",\n  \"type\": \"module\","
  },
  {
    "path": "e2e/playwright-ci.config.js",
    "chars": 2678,
    "preview": "// playwright.config.js\n// @ts-check\n\n// eslint-disable-next-line no-unused-vars\nimport { devices } from '@playwright/te"
  },
  {
    "path": "e2e/playwright-local.config.js",
    "chars": 1939,
    "preview": "// playwright.config.js\n// @ts-check\nimport { fileURLToPath } from 'url';\n/** @type {import('@playwright/test').Playwrig"
  },
  {
    "path": "e2e/playwright-mobile.config.js",
    "chars": 2636,
    "preview": "// playwright.config.js\n// @ts-check\n\nimport { devices } from '@playwright/test';\nconst MAX_FAILURES = 5;\n\nimport { file"
  },
  {
    "path": "e2e/playwright-performance-dev.config.js",
    "chars": 1366,
    "preview": "// playwright.config.js\n// @ts-check\nimport { fileURLToPath } from 'url';\n/** @type {import('@playwright/test').Playwrig"
  },
  {
    "path": "e2e/playwright-performance-prod.config.js",
    "chars": 1859,
    "preview": "// playwright.config.js\n// @ts-check\nimport { fileURLToPath } from 'url';\n/** @type {import('@playwright/test').Playwrig"
  },
  {
    "path": "e2e/playwright-visual-a11y.config.js",
    "chars": 1960,
    "preview": "// playwright.config.js\n// @ts-check\nimport { fileURLToPath } from 'url';\n/** @type {import('@playwright/test').Playwrig"
  },
  {
    "path": "e2e/playwright-watch.config.js",
    "chars": 2287,
    "preview": "// playwright.config.js\n// @ts-check\nimport { devices } from '@playwright/test';\nimport { fileURLToPath } from 'url';\n\n/"
  },
  {
    "path": "e2e/pluginFixtures.js",
    "chars": 5788,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/test-data/ExampleLayouts.json",
    "chars": 67926,
    "preview": "{\n  \"openmct\": {\n    \"45b24009-dfed-4023-a30b-d31f5e3a2d87\": {\n      \"identifier\": {\n        \"key\": \"45b24009-dfed-4023-"
  },
  {
    "path": "e2e/test-data/PerformanceDisplayLayout.json",
    "chars": 2939,
    "preview": "{\n  \"openmct\": {\n    \"b3cee102-86dd-4c0a-8eec-4d5d276f8691\": {\n      \"identifier\": { \"key\": \"b3cee102-86dd-4c0a-8eec-4d5"
  },
  {
    "path": "e2e/test-data/PerformanceNotebook.json",
    "chars": 2923,
    "preview": "{\n  \"openmct\": {\n    \"6d2fa9fd-f2aa-461a-a1e1-164ac44bec9d\": {\n      \"identifier\": { \"key\": \"6d2fa9fd-f2aa-461a-a1e1-164"
  },
  {
    "path": "e2e/test-data/blank.html",
    "chars": 1103,
    "preview": "<!--\n Open MCT, Copyright (c) 2014-2024, United States Government\n as represented by the Administrator of the National A"
  },
  {
    "path": "e2e/test-data/condition_set_storage.json",
    "chars": 7688,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/display_layout_with_child_layouts.json",
    "chars": 11347,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/display_layout_with_child_overlay_plot.json",
    "chars": 11263,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/examplePlans/ExamplePlanWithOrderedLanes.json",
    "chars": 1023,
    "preview": "{\n  \"Groups\": [\n    {\n      \"name\": \"Group 1\"\n    },\n    {\n      \"name\": \"Group 2\"\n    }\n  ],\n  \"Group 2\": [\n    {\n     "
  },
  {
    "path": "e2e/test-data/examplePlans/ExamplePlan_Large.json",
    "chars": 31318,
    "preview": "{\n  \"Lorem\": [\n    {\n      \"uuid\": \"ef59547d-50ed-45c6-a5eb-a49629829001\",\n      \"name\": \"Lorem ipsum dolor 2023-03-15 2"
  },
  {
    "path": "e2e/test-data/examplePlans/ExamplePlan_Small1.json",
    "chars": 987,
    "preview": "{\n  \"Group 1\": [\n    {\n      \"name\": \"Past event 1\",\n      \"start\": 1660320408000,\n      \"end\": 1660343797000,\n      \"ty"
  },
  {
    "path": "e2e/test-data/examplePlans/ExamplePlan_Small2.json",
    "chars": 762,
    "preview": "{\n  \"Group 1\": [\n    {\n      \"name\": \"Group 1 event 1\",\n      \"start\": 1650320408000,\n      \"end\": 1660343797000,\n      "
  },
  {
    "path": "e2e/test-data/examplePlans/ExamplePlan_Small3.json",
    "chars": 852,
    "preview": "{\n  \"Group 1\": [\n    {\n      \"name\": \"Time until birthday\",\n      \"start\": 1650320402000,\n      \"end\": 1660343797000,\n  "
  },
  {
    "path": "e2e/test-data/flexible_layout_with_child_layouts.json",
    "chars": 11480,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/memory-leak-detection.json",
    "chars": 232680,
    "preview": "{\"openmct\":{\"9224ac93-50af-4bb9-ac72-89a42b33f031\":{\"identifier\":{\"key\":\"9224ac93-50af-4bb9-ac72-89a42b33f031\",\"namespac"
  },
  {
    "path": "e2e/test-data/overlay_plot_storage.json",
    "chars": 6195,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/overlay_plot_with_delay_storage.json",
    "chars": 1777,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/test-data/recycled_local_storage.json",
    "chars": 29329,
    "preview": "{\n  \"cookies\": [],\n  \"origins\": [\n    {\n      \"origin\": \"http://localhost:8080\",\n      \"localStorage\": [\n        {\n     "
  },
  {
    "path": "e2e/tests/framework/appActions.e2e.spec.js",
    "chars": 14833,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/framework/baseFixtures.e2e.spec.js",
    "chars": 3109,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/framework/exampleTemplate.e2e.spec.js",
    "chars": 7238,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/framework/generateLocalStorageData.e2e.spec.js",
    "chars": 16423,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/framework/pluginFixtures.e2e.spec.js",
    "chars": 2028,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/MCT.e2e.spec.js",
    "chars": 6174,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/branding.e2e.spec.js",
    "chars": 2765,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/clearDataAction.e2e.spec.js",
    "chars": 2790,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/couchdb.e2e.spec.js",
    "chars": 4392,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/example/eventGenerator.e2e.spec.js",
    "chars": 2598,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/example/eventWithAcknowledgeGenerator.e2e.spec.js",
    "chars": 2946,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/example/generator/sineWaveLimitProvider.e2e.spec.js",
    "chars": 6298,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/example/generator/sineWaveStalenessProvider.e2e.spec.js",
    "chars": 2636,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/forms.e2e.spec.js",
    "chars": 11356,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/menu.e2e.spec.js",
    "chars": 2263,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/missionStatus.e2e.spec.js",
    "chars": 5822,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/moveAndLinkObjects.e2e.spec.js",
    "chars": 11191,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/notification.e2e.spec.js",
    "chars": 4958,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/planning/ganttChart.e2e.spec.js",
    "chars": 6513,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/planning/plan.e2e.spec.js",
    "chars": 4374,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/planning/timelist.e2e.spec.js",
    "chars": 7020,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/planning/timelistControlledClock.e2e.spec.js",
    "chars": 9768,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/planning/timestrip.e2e.spec.js",
    "chars": 8695,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/clocks/clock.e2e.spec.js",
    "chars": 2886,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/clocks/remoteClock.e2e.spec.js",
    "chars": 1988,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/comps/comps.e2e.spec.js",
    "chars": 5277,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/conditionSet/conditionSet.e2e.spec.js",
    "chars": 22357,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/conditionSet/conditionSetOperations.e2e.spec.js",
    "chars": 21743,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/correlationTelemetry/correlationTelemetry.e2e.spec.js",
    "chars": 4853,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/displayLayout/displayLayout.e2e.spec.js",
    "chars": 29065,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/event/eventTimelineView.e2e.spec.js",
    "chars": 3987,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/faultManagement/faultManagement.e2e.spec.js",
    "chars": 12867,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/flexibleLayout/flexibleLayout.e2e.spec.js",
    "chars": 13507,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/folders/viewPersist.e2e.spec.js",
    "chars": 2839,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/gauge/gauge.e2e.spec.js",
    "chars": 9186,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/imagery/exampleImagery.e2e.spec.js",
    "chars": 42510,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/imagery/exampleImageryControlledClock.e2e.spec.js",
    "chars": 18511,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/imagery/exampleImageryFile.e2e.spec.js",
    "chars": 4520,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/importAndExportAsJSON/exportAsJson.e2e.spec.js",
    "chars": 8300,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/importAndExportAsJSON/importAsJson.e2e.spec.js",
    "chars": 2356,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/inspectorDataVisualization/numericData.e2e.spec.js",
    "chars": 4222,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/lad/lad.e2e.spec.js",
    "chars": 17148,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/lad/ladSet.e2e.spec.js",
    "chars": 2893,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/lad/ladTable.e2e.spec.js",
    "chars": 3582,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/notebook.e2e.spec.js",
    "chars": 25764,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/notebookSnapshotImage.e2e.spec.js",
    "chars": 5988,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/notebookSnapshots.e2e.spec.js",
    "chars": 9314,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/notebookTags.e2e.spec.js",
    "chars": 11362,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/notebookWithCouchDB.e2e.spec.js",
    "chars": 4259,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/notebook/restrictedNotebook.e2e.spec.js",
    "chars": 7884,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/operatorStatus/operatorStatus.e2e.spec.js",
    "chars": 7955,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/performanceIndicator/performanceIndicator.e2e.spec.js",
    "chars": 3370,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/autoscale.e2e.spec.js",
    "chars": 4814,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/logPlot.e2e.spec.js",
    "chars": 8400,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/missingPlotObj.e2e.spec.js",
    "chars": 3454,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/overlayPlot.e2e.spec.js",
    "chars": 16019,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/plotControls.e2e.spec.js",
    "chars": 6157,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/plotControlsCompactMode.e2e.spec.js",
    "chars": 2472,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2025, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/plotRendering.e2e.spec.js",
    "chars": 5885,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/plotViewActions.e2e.spec.js",
    "chars": 7945,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/previews.e2e.spec.js",
    "chars": 4337,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/scatterPlot.e2e.spec.js",
    "chars": 4304,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/stackedPlot.e2e.spec.js",
    "chars": 15064,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/tagging.e2e.spec.js",
    "chars": 5702,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/plot/timeTicks.e2e.spec.js",
    "chars": 8381,
    "preview": "import { expect, test } from '@playwright/test';\n\nimport { createDomainObjectWithDefaults, setTimeConductorBounds } from"
  },
  {
    "path": "e2e/tests/functional/plugins/reloadAction/reloadAction.e2e.spec.js",
    "chars": 5561,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/conditionSetStyling.e2e.spec.js",
    "chars": 7281,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/conditional/displayLayoutConditionalStyling.e2e.spec.js",
    "chars": 5576,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/conditionalStyling.e2e.spec.js",
    "chars": 1791,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/flexLayoutStyling.e2e.spec.js",
    "chars": 15497,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/stackedPlotStyling.e2e.spec.js",
    "chars": 8306,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/styling/styleInspectorOptions.e2e.spec.js",
    "chars": 3608,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/tabs/tabs.e2e.spec.js",
    "chars": 6624,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/telemetryTable/preview.e2e.spec.js",
    "chars": 3498,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/telemetryTable/telemetryTable.e2e.spec.js",
    "chars": 9130,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/timeConductor/datepicker.e2e.spec.js",
    "chars": 3058,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/timeConductor/timeConductor.e2e.spec.js",
    "chars": 15150,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/plugins/timer/timer.e2e.spec.js",
    "chars": 8739,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/recentObjects.e2e.spec.js",
    "chars": 14662,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/renaming.e2e.spec.js",
    "chars": 3815,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/search.e2e.spec.js",
    "chars": 16330,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/smoke.e2e.spec.js",
    "chars": 2648,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/staleness.e2e.spec.js",
    "chars": 3525,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2025, Uni"
  },
  {
    "path": "e2e/tests/functional/tooltips.e2e.spec.js",
    "chars": 19372,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/tree.e2e.spec.js",
    "chars": 13378,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/functional/ui/inspector.e2e.spec.js",
    "chars": 11571,
    "preview": "/* eslint-disable playwright/no-conditional-in-test */\n/* eslint-disable playwright/no-conditional-expect */\n/**********"
  },
  {
    "path": "e2e/tests/functional/ui/statusArea.e2e.spec.js",
    "chars": 10225,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2025, Uni"
  },
  {
    "path": "e2e/tests/functional/userRoles.e2e.spec.js",
    "chars": 3225,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/mobile/smoke.e2e.spec.js",
    "chars": 5048,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/performance/contract/imagery.contract.perf.spec.js",
    "chars": 8157,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/performance/contract/notebook.contract.perf.spec.js",
    "chars": 7447,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/performance/memory/navigation.memory.perf.spec.js",
    "chars": 13321,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/performance/tabs.perf.spec.js",
    "chars": 4129,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  },
  {
    "path": "e2e/tests/performance/tagging.perf.spec.js",
    "chars": 4456,
    "preview": "/*****************************************************************************\n * Open MCT, Copyright (c) 2014-2024, Uni"
  }
]

// ... and 1034 more files (download for full content)

About this extraction

This page contains the full source code of the nasa/openmct GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1234 files (6.7 MB), approximately 1.8M tokens, and a symbol index with 2924 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!