@smartbit4all/ng-client 5.0.21 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +386 -386
- package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +17 -0
- package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +35 -0
- package/esm2022/lib/component-factory-service/projects.mjs +6 -0
- package/esm2022/lib/session/api/api/api.mjs +4 -0
- package/esm2022/lib/session/api/api/session.service.mjs +306 -0
- package/esm2022/lib/session/api/configuration.mjs +91 -0
- package/esm2022/lib/session/api/encoder.mjs +19 -0
- package/esm2022/lib/session/api/index.mjs +3 -0
- package/esm2022/lib/session/api/model/accountInfo.mjs +13 -0
- package/esm2022/lib/session/api/model/apiError.mjs +13 -0
- package/esm2022/lib/session/api/model/authenticationProviderData.mjs +13 -0
- package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +2 -0
- package/esm2022/lib/session/api/model/models.mjs +9 -0
- package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +13 -0
- package/esm2022/lib/session/api/model/session.mjs +2 -0
- package/esm2022/lib/session/api/model/sessionInfoData.mjs +2 -0
- package/esm2022/lib/session/api/model/userActivityLog.mjs +13 -0
- package/esm2022/lib/session/api/param.mjs +2 -0
- package/esm2022/lib/session/api/variables.mjs +9 -0
- package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +225 -0
- package/esm2022/lib/session/projects.mjs +13 -0
- package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +2 -0
- package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +214 -0
- package/esm2022/lib/session/smart-default-error-ui.service.mjs +134 -0
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +109 -0
- package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +44 -0
- package/esm2022/lib/session/smart-session-handler.service.mjs +7 -0
- package/esm2022/lib/session/smart-session.module.mjs +58 -0
- package/esm2022/lib/session/smart-session.service.mjs +284 -0
- package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +39 -0
- package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +63 -0
- package/esm2022/lib/shared/projects.mjs +4 -0
- package/esm2022/lib/shared/shared.module.mjs +19 -0
- package/esm2022/lib/shared/smart-tooltip.directive.mjs +58 -0
- package/esm2022/lib/shared/smarttable.date-pipe.mjs +43 -0
- package/esm2022/lib/smart-client/projects.mjs +4 -0
- package/esm2022/lib/smart-client/smart-component-api-client.mjs +928 -0
- package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +79 -0
- package/esm2022/lib/smart-client/smart.component.mjs +88 -0
- package/esm2022/lib/smart-client/smart.service.mjs +71 -0
- package/esm2022/lib/smart-component-layout/api/api/api.mjs +4 -0
- package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +133 -0
- package/esm2022/lib/smart-component-layout/api/api.module.mjs +40 -0
- package/esm2022/lib/smart-component-layout/api/configuration.mjs +91 -0
- package/esm2022/lib/smart-component-layout/api/encoder.mjs +19 -0
- package/esm2022/lib/smart-component-layout/api/index.mjs +7 -0
- package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +18 -0
- package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +22 -0
- package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +2 -0
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +17 -0
- package/esm2022/lib/smart-component-layout/api/model/models.mjs +9 -0
- package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +2 -0
- package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +2 -0
- package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +17 -0
- package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +2 -0
- package/esm2022/lib/smart-component-layout/api/param.mjs +2 -0
- package/esm2022/lib/smart-component-layout/api/variables.mjs +9 -0
- package/esm2022/lib/smart-component-layout/projects.mjs +8 -0
- package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +169 -0
- package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +433 -0
- package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +57 -0
- package/esm2022/lib/smart-diagram/api/api/api.mjs +4 -0
- package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +141 -0
- package/esm2022/lib/smart-diagram/api/api.module.mjs +40 -0
- package/esm2022/lib/smart-diagram/api/configuration.mjs +91 -0
- package/esm2022/lib/smart-diagram/api/encoder.mjs +19 -0
- package/esm2022/lib/smart-diagram/api/index.mjs +7 -0
- package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +13 -0
- package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +13 -0
- package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +18 -0
- package/esm2022/lib/smart-diagram/api/model/labelText.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/model/models.mjs +10 -0
- package/esm2022/lib/smart-diagram/api/param.mjs +2 -0
- package/esm2022/lib/smart-diagram/api/variables.mjs +9 -0
- package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +312 -0
- package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +359 -0
- package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +40 -0
- package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +10 -0
- package/esm2022/lib/smart-diagram/projects.mjs +5 -0
- package/esm2022/lib/smart-dialog/projects.mjs +8 -0
- package/esm2022/lib/smart-dialog/smartdialog.component.mjs +54 -0
- package/esm2022/lib/smart-dialog/smartdialog.model.mjs +16 -0
- package/esm2022/lib/smart-dialog/smartdialog.module.mjs +46 -0
- package/esm2022/lib/smart-dialog/smartdialog.service.mjs +86 -0
- package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +101 -0
- package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +12 -0
- package/esm2022/lib/smart-expandable-section/projects.mjs +8 -0
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +57 -0
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +14 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +17 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +8 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +20 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +28 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +32 -0
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +18 -0
- package/esm2022/lib/smart-filter/api/filter/model/model.mjs +16 -0
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +2 -0
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +13 -0
- package/esm2022/lib/smart-filter/api/value/model/value.mjs +13 -0
- package/esm2022/lib/smart-filter/projects.mjs +9 -0
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +14 -0
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +166 -0
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +45 -0
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +36 -0
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +31 -0
- package/esm2022/lib/smart-filter/smart-filter.model.mjs +13 -0
- package/esm2022/lib/smart-filter/smart-filter.module.mjs +33 -0
- package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +198 -0
- package/esm2022/lib/smart-filter-editor/api/configuration.mjs +91 -0
- package/esm2022/lib/smart-filter-editor/api/encoder.mjs +19 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +17 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +13 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +8 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +7 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +20 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +28 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +32 -0
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +19 -0
- package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +17 -0
- package/esm2022/lib/smart-filter-editor/api/param.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/api/variables.mjs +9 -0
- package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +15 -0
- package/esm2022/lib/smart-filter-editor/project.mjs +8 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +73 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +40 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +294 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +2 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +69 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +63 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +24 -0
- package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +57 -0
- package/esm2022/lib/smart-form/api/api/api.mjs +4 -0
- package/esm2022/lib/smart-form/api/api/default.service.mjs +133 -0
- package/esm2022/lib/smart-form/api/api.module.mjs +40 -0
- package/esm2022/lib/smart-form/api/configuration.mjs +91 -0
- package/esm2022/lib/smart-form/api/encoder.mjs +19 -0
- package/esm2022/lib/smart-form/api/index.mjs +7 -0
- package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +13 -0
- package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/imageProperties.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/models.mjs +19 -0
- package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +13 -0
- package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +7 -0
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +14 -0
- package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +22 -0
- package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +17 -0
- package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +49 -0
- package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +2 -0
- package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +18 -0
- package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +13 -0
- package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +13 -0
- package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +13 -0
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +21 -0
- package/esm2022/lib/smart-form/api/param.mjs +2 -0
- package/esm2022/lib/smart-form/api/variables.mjs +9 -0
- package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +20 -0
- package/esm2022/lib/smart-form/projects.mjs +18 -0
- package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +753 -0
- package/esm2022/lib/smart-form/services/smartform.service.mjs +683 -0
- package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +15 -0
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +193 -0
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +2 -0
- package/esm2022/lib/smart-form/smartform.component.mjs +190 -0
- package/esm2022/lib/smart-form/smartform.form-model.mjs +2 -0
- package/esm2022/lib/smart-form/smartform.model.mjs +38 -0
- package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +179 -0
- package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +83 -0
- package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +170 -0
- package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +151 -0
- package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +35 -0
- package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +79 -0
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +1038 -0
- package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +78 -0
- package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +31 -0
- package/esm2022/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.mjs +98 -0
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +2 -0
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +18 -0
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +19 -0
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +13 -0
- package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +2 -0
- package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +2 -0
- package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +13 -0
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +2 -0
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +2 -0
- package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +54 -0
- package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +40 -0
- package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +40 -0
- package/esm2022/lib/smart-generic-pages/projects.mjs +13 -0
- package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +80 -0
- package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +116 -0
- package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +77 -0
- package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +93 -0
- package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +4 -0
- package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +514 -0
- package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +40 -0
- package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +91 -0
- package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +19 -0
- package/esm2022/lib/smart-grid/api/grid-api/index.mjs +7 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +17 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +20 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +13 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +18 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +17 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +8 -0
- package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +15 -0
- package/esm2022/lib/smart-grid/api/grid-api/param.mjs +2 -0
- package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +9 -0
- package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +20 -0
- package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +47 -0
- package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +72 -0
- package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +200 -0
- package/esm2022/lib/smart-grid/models/model.mjs +29 -0
- package/esm2022/lib/smart-grid/projects.mjs +9 -0
- package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +65 -0
- package/esm2022/lib/smart-grid/smart-grid.component.mjs +1035 -0
- package/esm2022/lib/smart-grid/smart-grid.module.mjs +103 -0
- package/esm2022/lib/smart-grid/smart-grid.service.mjs +92 -0
- package/esm2022/lib/smart-icon/projects.mjs +9 -0
- package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +95 -0
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +40 -0
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +37 -0
- package/esm2022/lib/smart-icon/smart-icon.module.mjs +26 -0
- package/esm2022/lib/smart-icon/smart-icon.service.mjs +93 -0
- package/esm2022/lib/smart-map/abstract-map.mjs +112 -0
- package/esm2022/lib/smart-map/api/api/api.mjs +4 -0
- package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +312 -0
- package/esm2022/lib/smart-map/api/api.module.mjs +40 -0
- package/esm2022/lib/smart-map/api/configuration.mjs +91 -0
- package/esm2022/lib/smart-map/api/encoder.mjs +19 -0
- package/esm2022/lib/smart-map/api/index.mjs +7 -0
- package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +13 -0
- package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +17 -0
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +19 -0
- package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +18 -0
- package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +17 -0
- package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +18 -0
- package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +17 -0
- package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +2 -0
- package/esm2022/lib/smart-map/api/model/models.mjs +21 -0
- package/esm2022/lib/smart-map/api/param.mjs +2 -0
- package/esm2022/lib/smart-map/api/variables.mjs +9 -0
- package/esm2022/lib/smart-map/api-default/api-default.mjs +2 -0
- package/esm2022/lib/smart-map/impl/google-map.mjs +224 -0
- package/esm2022/lib/smart-map/impl/leaflet-map.mjs +422 -0
- package/esm2022/lib/smart-map/projects.mjs +9 -0
- package/esm2022/lib/smart-map/smart-map.component.mjs +222 -0
- package/esm2022/lib/smart-map/smart-map.module.mjs +22 -0
- package/esm2022/lib/smart-map/smart-map.types.mjs +2 -0
- package/esm2022/lib/smart-navbar/projects.mjs +8 -0
- package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +61 -0
- package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +6 -0
- package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +63 -0
- package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +14 -0
- package/esm2022/lib/smart-navigation/projects.mjs +6 -0
- package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +2 -0
- package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +18 -0
- package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +27 -0
- package/esm2022/lib/smart-ng-client.module.mjs +130 -0
- package/esm2022/lib/smart-ng-client.service.mjs +19 -0
- package/esm2022/lib/smart-subject/projects.mjs +5 -0
- package/esm2022/lib/smart-subject/smart-subject.mjs +21 -0
- package/esm2022/lib/smart-tab-group/projects.mjs +5 -0
- package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +22 -0
- package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +43 -0
- package/esm2022/lib/smart-table/components/loading/loading.component.mjs +15 -0
- package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +52 -0
- package/esm2022/lib/smart-table/projects.mjs +8 -0
- package/esm2022/lib/smart-table/smarttable.component.mjs +98 -0
- package/esm2022/lib/smart-table/smarttable.model.mjs +177 -0
- package/esm2022/lib/smart-table/smarttable.module.mjs +109 -0
- package/esm2022/lib/smart-table/smarttable.service.mjs +14 -0
- package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +42 -0
- package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +23 -0
- package/esm2022/lib/smart-table/tables/table.mjs +573 -0
- package/esm2022/lib/smart-tree/projects.mjs +9 -0
- package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +289 -0
- package/esm2022/lib/smart-tree/smarttree.component.mjs +187 -0
- package/esm2022/lib/smart-tree/smarttree.model.mjs +7 -0
- package/esm2022/lib/smart-tree/smarttree.module.mjs +60 -0
- package/esm2022/lib/smart-tree/smarttree.node.model.mjs +6 -0
- package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +2 -0
- package/esm2022/lib/smart-tree/smarttree.service.mjs +47 -0
- package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +1190 -0
- package/esm2022/lib/smart-tree/tree-api/configuration.mjs +91 -0
- package/esm2022/lib/smart-tree/tree-api/encoder.mjs +19 -0
- package/esm2022/lib/smart-tree/tree-api/param.mjs +2 -0
- package/esm2022/lib/smart-tree/tree-api/variables.mjs +9 -0
- package/esm2022/lib/smart-validation/named-validator.service.mjs +115 -0
- package/esm2022/lib/smart-validation/projects.mjs +4 -0
- package/esm2022/lib/smart-validation/smart-validation.module.mjs +24 -0
- package/esm2022/lib/smart-validation/smart-validation.types.mjs +4 -0
- package/esm2022/lib/view-context/api/api/api.mjs +4 -0
- package/esm2022/lib/view-context/api/api/view.service.mjs +903 -0
- package/esm2022/lib/view-context/api/api-default/binaryData.mjs +2 -0
- package/esm2022/lib/view-context/api/api-default/invocationError.mjs +2 -0
- package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +2 -0
- package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +2 -0
- package/esm2022/lib/view-context/api/api.module.mjs +40 -0
- package/esm2022/lib/view-context/api/configuration.mjs +91 -0
- package/esm2022/lib/view-context/api/encoder.mjs +19 -0
- package/esm2022/lib/view-context/api/index.mjs +7 -0
- package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +2 -0
- package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +13 -0
- package/esm2022/lib/view-context/api/model/clipboardData.mjs +13 -0
- package/esm2022/lib/view-context/api/model/closeResult.mjs +18 -0
- package/esm2022/lib/view-context/api/model/componentConstraint.mjs +2 -0
- package/esm2022/lib/view-context/api/model/componentModel.mjs +2 -0
- package/esm2022/lib/view-context/api/model/componentModelChange.mjs +13 -0
- package/esm2022/lib/view-context/api/model/dataChange.mjs +2 -0
- package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +2 -0
- package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +21 -0
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +13 -0
- package/esm2022/lib/view-context/api/model/downloadedFile.mjs +13 -0
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +21 -0
- package/esm2022/lib/view-context/api/model/imageResource.mjs +8 -0
- package/esm2022/lib/view-context/api/model/link.mjs +20 -0
- package/esm2022/lib/view-context/api/model/messageData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/messageOption.mjs +2 -0
- package/esm2022/lib/view-context/api/model/messageOptionType.mjs +18 -0
- package/esm2022/lib/view-context/api/model/messageResult.mjs +2 -0
- package/esm2022/lib/view-context/api/model/messageTextType.mjs +17 -0
- package/esm2022/lib/view-context/api/model/messageType.mjs +19 -0
- package/esm2022/lib/view-context/api/model/models.mjs +63 -0
- package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +13 -0
- package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +2 -0
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +19 -0
- package/esm2022/lib/view-context/api/model/openPendingData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +2 -0
- package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +2 -0
- package/esm2022/lib/view-context/api/model/serverRequestType.mjs +24 -0
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +8 -0
- package/esm2022/lib/view-context/api/model/statisticRecord.mjs +13 -0
- package/esm2022/lib/view-context/api/model/style.mjs +13 -0
- package/esm2022/lib/view-context/api/model/uiAction.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +27 -0
- package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +13 -0
- package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +20 -0
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +21 -0
- package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +13 -0
- package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +13 -0
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +22 -0
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +18 -0
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +2 -0
- package/esm2022/lib/view-context/api/model/valueSet.mjs +2 -0
- package/esm2022/lib/view-context/api/model/view.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewApiError.mjs +13 -0
- package/esm2022/lib/view-context/api/model/viewConstraint.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewContext.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewContextChange.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewContextData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +8 -0
- package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +13 -0
- package/esm2022/lib/view-context/api/model/viewState.mjs +22 -0
- package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +2 -0
- package/esm2022/lib/view-context/api/model/viewType.mjs +18 -0
- package/esm2022/lib/view-context/api/param.mjs +2 -0
- package/esm2022/lib/view-context/api/variables.mjs +9 -0
- package/esm2022/lib/view-context/default-view-components.token.mjs +9 -0
- package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +20 -0
- package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +93 -0
- package/esm2022/lib/view-context/projects.mjs +29 -0
- package/esm2022/lib/view-context/property-definition-data.mjs +2 -0
- package/esm2022/lib/view-context/reuse-router-slot.token.mjs +4 -0
- package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +55 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +199 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +72 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +21 -0
- package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +30 -0
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +198 -0
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +95 -0
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +134 -0
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +12 -0
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +256 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +77 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +54 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +60 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +106 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +60 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +132 -0
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +58 -0
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +33 -0
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +215 -0
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +319 -0
- package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +185 -0
- package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +7 -0
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +235 -0
- package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +77 -0
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +35 -0
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +74 -0
- package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +63 -0
- package/esm2022/lib/view-context/smart-view-context.model.mjs +2 -0
- package/esm2022/lib/view-context/smart-view-context.module.mjs +397 -0
- package/esm2022/lib/view-context/smart-view-context.service.mjs +1043 -0
- package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +41 -0
- package/esm2022/lib/view-context/utility/componentLibrary.mjs +9 -0
- package/esm2022/lib/view-context/utility/smart-object-utility.mjs +44 -0
- package/esm2022/lib/view-context/utility/smart-style-utility.mjs +68 -0
- package/esm2022/lib/view-context/value-api/api/api.mjs +4 -0
- package/esm2022/lib/view-context/value-api/api/value.service.mjs +138 -0
- package/esm2022/lib/view-context/value-api/api.module.mjs +40 -0
- package/esm2022/lib/view-context/value-api/configuration.mjs +91 -0
- package/esm2022/lib/view-context/value-api/encoder.mjs +19 -0
- package/esm2022/lib/view-context/value-api/index.mjs +7 -0
- package/esm2022/lib/view-context/value-api/model/genericValue.mjs +13 -0
- package/esm2022/lib/view-context/value-api/model/models.mjs +11 -0
- package/esm2022/lib/view-context/value-api/model/value.mjs +13 -0
- package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +2 -0
- package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +2 -0
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +2 -0
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +13 -0
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +24 -0
- package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +2 -0
- package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +2 -0
- package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +19 -0
- package/esm2022/lib/view-context/value-api/param.mjs +2 -0
- package/esm2022/lib/view-context/value-api/variables.mjs +9 -0
- package/esm2022/lib/view-context/view-handler-resolution.mjs +21 -0
- package/esm2022/lib/view-context/view-op.mjs +41 -0
- package/esm2022/lib/view-context/view-slot-resolution.mjs +28 -0
- package/esm2022/projects.mjs +30 -0
- package/esm2022/smartbit4all-ng-client.mjs +5 -0
- package/fesm2022/smartbit4all-ng-client.mjs +8945 -4553
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/session/api/model/accountInfo.d.ts +2 -0
- package/lib/session/projects.d.ts +3 -0
- package/lib/session/smart-backend-bootstrap.config.d.ts +65 -0
- package/lib/session/smart-backend-bootstrap.service.d.ts +55 -0
- package/lib/session/smart-default-error-ui.service.d.ts +90 -0
- package/lib/session/smart-error-catching.interceptor.d.ts +4 -1
- package/lib/session/smart-session-handler.service.d.ts +2 -1
- package/lib/session/smart-session.service.d.ts +16 -1
- package/lib/session/smart-timer/smart-session-timer.component.d.ts +3 -1
- package/lib/smart-client/projects.d.ts +0 -1
- package/lib/smart-client/smart-component-api-client.d.ts +45 -19
- package/lib/smart-client/smart.component.d.ts +7 -5
- package/lib/smart-client/smart.service.d.ts +4 -5
- package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +3 -1
- package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +19 -0
- package/lib/smart-component-layout/api/model/models.d.ts +3 -0
- package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +2 -0
- package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +6 -0
- package/{src/lib/smart-chart/smart-chart/api/model/chartData.d.ts → lib/smart-component-layout/api/model/toolbarDirection.d.ts} +5 -6
- package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +16 -0
- package/lib/smart-component-layout/smart-component-layout-utility.d.ts +9 -1
- package/lib/smart-component-layout/smart-component-layout.component.d.ts +31 -5
- package/lib/smart-component-layout/smart-component-layout.module.d.ts +4 -1
- package/lib/smart-diagram/api/api/api.d.ts +3 -0
- package/lib/smart-diagram/api/api/diagramService.service.d.ts +36 -0
- package/lib/smart-diagram/api/encoder.d.ts +11 -0
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramColor.d.ts +2 -2
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataContainer.d.ts +2 -3
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataItem.d.ts +3 -3
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataSet.d.ts +4 -4
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDescriptor.d.ts +13 -9
- package/{src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.d.ts → lib/smart-diagram/api/model/diagramModel.d.ts} +5 -4
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramShape.d.ts +2 -2
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/drawTime.d.ts +2 -2
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/labelText.d.ts +2 -2
- package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/models.d.ts +1 -2
- package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +33 -0
- package/lib/smart-diagram/component/smart-diagram.component.d.ts +43 -0
- package/lib/smart-diagram/component/smart-diagram.module.d.ts +11 -0
- package/lib/smart-diagram/component/smart-diagram.util.d.ts +1 -0
- package/lib/smart-diagram/projects.d.ts +4 -0
- package/lib/smart-dialog/smartdialog.model.d.ts +2 -1
- package/lib/smart-dialog/smartdialog.module.d.ts +1 -2
- package/lib/smart-dialog/smartdialog.service.d.ts +1 -3
- package/lib/smart-expandable-section/expandable-section.component.d.ts +3 -1
- package/lib/smart-expandable-section/expandable-section.model.d.ts +1 -0
- package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +2 -1
- package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +4 -2
- package/{src/lib/smart-chart/smart-chart/api/model/chartOrientation.d.ts → lib/smart-form/api/model/dateFieldProperties.d.ts} +6 -7
- package/lib/smart-form/api/model/fileUploaderProperties.d.ts +20 -0
- package/lib/smart-form/api/model/imageProperties.d.ts +15 -0
- package/lib/smart-form/api/model/models.d.ts +7 -0
- package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +19 -0
- package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +20 -0
- package/lib/smart-form/api/model/selectionDefinition.d.ts +17 -0
- package/lib/smart-form/api/model/smartFormWidgetType.d.ts +4 -1
- package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +5 -0
- package/lib/smart-form/api/model/textBoxProperties.d.ts +15 -0
- package/{src/lib/smart-chart/smart-chart/api/model/chartValue.d.ts → lib/smart-form/api/model/textFieldProperties.d.ts} +4 -6
- package/lib/smart-form/api/model/valueChangeMode.d.ts +3 -2
- package/lib/smart-form/projects.d.ts +3 -0
- package/lib/smart-form/services/smartform.layout-definition.service.d.ts +6 -2
- package/lib/smart-form/services/smartform.service.d.ts +3 -2
- package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +19 -3
- package/lib/smart-form/smartform.component.d.ts +3 -2
- package/lib/smart-form/smartform.form-model.d.ts +160 -11
- package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +54 -0
- package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +57 -0
- package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +50 -0
- package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +38 -7
- package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +21 -0
- package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +18 -0
- package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +54 -0
- package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +19 -0
- package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +24 -0
- package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +2 -0
- package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +27 -0
- package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +14 -0
- package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +17 -0
- package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +18 -0
- package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +12 -0
- package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +11 -0
- package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +11 -0
- package/lib/smart-generic-pages/projects.d.ts +9 -0
- package/lib/smart-generic-pages/search-page/search-page.component.d.ts +25 -0
- package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +19 -0
- package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +17 -0
- package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +25 -0
- package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +27 -6
- package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +4 -0
- package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +2 -2
- package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +2 -0
- package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +6 -0
- package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +21 -0
- package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +1 -0
- package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +1 -0
- package/lib/smart-grid/smart-grid-toolbar-util.d.ts +1 -0
- package/lib/smart-grid/smart-grid.component.d.ts +20 -6
- package/lib/smart-grid/smart-grid.module.d.ts +20 -21
- package/lib/smart-grid/smart-grid.service.d.ts +2 -0
- package/lib/smart-icon/projects.d.ts +2 -0
- package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +10 -4
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +12 -0
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +14 -0
- package/lib/smart-icon/smart-icon.module.d.ts +8 -5
- package/lib/smart-map/abstract-map.d.ts +1 -1
- package/lib/smart-navigation/smart-navigation.interface.d.ts +1 -7
- package/lib/smart-navigation/smart-navigation.service.d.ts +2 -8
- package/lib/smart-ng-client.module.d.ts +3 -4
- package/lib/smart-tab-group/projects.d.ts +0 -4
- package/lib/smart-tab-group/smart-tab-group.module.d.ts +5 -8
- package/lib/smart-table/tables/material-table/material-table.component.d.ts +2 -3
- package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +1 -2
- package/lib/smart-table/tables/table.d.ts +5 -5
- package/lib/smart-tree/smarttree-generic.service.d.ts +0 -1
- package/lib/smart-tree/smarttree.component.d.ts +1 -0
- package/lib/smart-tree/smarttree.model.d.ts +1 -0
- package/lib/smart-tree/smarttree.service.d.ts +1 -0
- package/lib/view-context/api/api/view.service.d.ts +14 -13
- package/lib/view-context/api/api-default/invocationRun.d.ts +2 -0
- package/lib/view-context/api/model/backgroundProcessInfo.d.ts +25 -0
- package/lib/view-context/api/model/componentModel.d.ts +5 -0
- package/lib/view-context/api/model/deviceInfo.d.ts +4 -0
- package/lib/view-context/api/model/iconPosition.d.ts +2 -1
- package/lib/view-context/api/model/imageResource.d.ts +2 -0
- package/lib/view-context/api/model/messageOption.d.ts +2 -0
- package/lib/view-context/api/model/models.d.ts +6 -0
- package/lib/view-context/api/model/multiComboBoxElement.d.ts +16 -0
- package/lib/view-context/api/model/multiComboBoxModel.d.ts +16 -0
- package/lib/view-context/api/model/namedValidator.d.ts +1 -0
- package/lib/view-context/api/model/smartLinkData.d.ts +3 -0
- package/lib/view-context/api/model/uiAction.d.ts +8 -0
- package/lib/view-context/api/model/uiActionDefinition.d.ts +19 -0
- package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +18 -0
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +4 -0
- package/lib/view-context/api/model/uiActionRequest.d.ts +3 -0
- package/lib/view-context/api/model/uiActionSchedule.d.ts +14 -0
- package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +2 -0
- package/lib/view-context/api/model/view.d.ts +7 -0
- package/lib/view-context/api/model/viewContext.d.ts +1 -0
- package/lib/view-context/api/model/viewData.d.ts +2 -0
- package/lib/view-context/api/model/viewEventHandler.d.ts +5 -0
- package/lib/view-context/api/model/viewPlaceholder.d.ts +1 -0
- package/lib/view-context/default-view-components.token.d.ts +18 -0
- package/lib/view-context/message-dialog/message-dialog.component.d.ts +1 -0
- package/lib/view-context/projects.d.ts +8 -3
- package/lib/view-context/reuse-router-slot.token.d.ts +3 -0
- package/lib/view-context/smart-embedded-slot.directive.d.ts +20 -0
- package/lib/view-context/smart-ui-action/components/menu/menu.component.d.ts +6 -2
- package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +32 -0
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +40 -0
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +3 -0
- package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/voice-record-widget/voice-record-widget.component.d.ts +15 -6
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +1 -2
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +2 -16
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +3 -3
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +1 -2
- package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +13 -0
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +14 -7
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +27 -3
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +4 -3
- package/lib/view-context/smart-view-context-dialog.service.d.ts +1 -3
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +1 -2
- package/lib/view-context/smart-view-context.model.d.ts +7 -2
- package/lib/view-context/smart-view-context.module.d.ts +74 -65
- package/lib/view-context/smart-view-context.service.d.ts +54 -8
- package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +3 -1
- package/lib/view-context/view-handler-resolution.d.ts +11 -0
- package/lib/view-context/view-op.d.ts +18 -0
- package/lib/view-context/view-slot-resolution.d.ts +15 -0
- package/package.json +16 -18
- package/projects.d.ts +2 -0
- package/smartbit4all-ng-client-6.0.0.tgz +0 -0
- package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -686
- package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +0 -1
- package/lib/smart-client/smart-authentication.service.d.ts +0 -15
- package/lib/smart-tab-group/smart-tab-group.component.d.ts +0 -21
- package/lib/smart-tab-group/smart-tab-group.service.d.ts +0 -6
- package/lib/smart-tab-group/tab-content/tab-content.component.d.ts +0 -14
- package/lib/smart-tab-group/tab-group-simplified/tab-group.component.d.ts +0 -29
- package/lib/smart-tab-group/tabTile.model.d.ts +0 -8
- package/lib/view-context/smart-ui-action/components/action-badge/action-badge.component.d.ts +0 -12
- package/smartbit4all-ng-client-5.0.21.tgz +0 -0
- package/src/lib/smart-chart/index.d.ts +0 -5
- package/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.d.ts +0 -37
- package/src/lib/smart-chart/smart-chart/api/model/chartType.d.ts +0 -21
- package/src/lib/smart-chart/smart-chart/api/model/models.d.ts +0 -6
- package/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.d.ts +0 -16
- package/src/lib/smart-chart/smart-chart/default-chart-options.provider.d.ts +0 -31
- package/src/lib/smart-chart/smart-chart/smart-chart.component.d.ts +0 -33
- package/src/lib/smart-chart/smart-chart/smart-chart.module.d.ts +0 -11
- package/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.d.ts +0 -1
- package/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.d.ts +0 -21
- package/src/lib/smart-chart/smart-chart-projects.d.ts +0 -5
- package/src/lib/smart-chart/view-context/utility/componentLibrary.d.ts +0 -6
- /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/api.module.d.ts +0 -0
- /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/configuration.d.ts +0 -0
- /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/index.d.ts +0 -0
- /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/param.d.ts +0 -0
- /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/variables.d.ts +0 -0
- /package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/photo-capture-widget/photo-capture-widget.component.d.ts +0 -0
|
@@ -0,0 +1,1043 @@
|
|
|
1
|
+
import { Inject, Injectable, InjectionToken, Optional, } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import { LinkTargetEnum, ViewState, ViewType, } from './api';
|
|
4
|
+
import { MessageDialogComponent } from './message-dialog/message-dialog.component';
|
|
5
|
+
import { SmartSubject } from '../smart-subject/projects';
|
|
6
|
+
import { MatDialogRef } from '@angular/material/dialog';
|
|
7
|
+
import { DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
8
|
+
import { COMPONENT_LIBRARY } from './utility/componentLibrary';
|
|
9
|
+
import { resolveSlot } from './view-slot-resolution';
|
|
10
|
+
import { SMART_DEFAULT_VIEW_COMPONENTS, } from './default-view-components.token';
|
|
11
|
+
import { resolveViewHandler } from './view-handler-resolution';
|
|
12
|
+
import { buildViewOps } from './view-op';
|
|
13
|
+
import { REUSE_ROUTER_SLOT_COMPONENT } from './reuse-router-slot.token';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "./api";
|
|
16
|
+
import * as i2 from "../session/smart-session.service";
|
|
17
|
+
import * as i3 from "./smart-view-context-dialog.service";
|
|
18
|
+
import * as i4 from "./utility/componentLibrary";
|
|
19
|
+
export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
|
|
20
|
+
export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
|
|
21
|
+
export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
|
|
22
|
+
export const DefaultUiActionCode_CLOSE = 'DEFAULT_CLOSE';
|
|
23
|
+
export const DIALOG_DISABLE_CLOSE = new InjectionToken('dialogDisableClose');
|
|
24
|
+
export class SmartViewContextService {
|
|
25
|
+
set translateService(translateService) {
|
|
26
|
+
this._translateService = translateService;
|
|
27
|
+
this.translateServiceChanged.next();
|
|
28
|
+
this.translateServiceChanged.complete();
|
|
29
|
+
}
|
|
30
|
+
get translateService() {
|
|
31
|
+
if (this._translateService) {
|
|
32
|
+
return this._translateService;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
constructor(view, session, dialog, apiQueueService, inject, compLib, defaultViewComponents) {
|
|
37
|
+
this.view = view;
|
|
38
|
+
this.session = session;
|
|
39
|
+
this.dialog = dialog;
|
|
40
|
+
this.apiQueueService = apiQueueService;
|
|
41
|
+
this.inject = inject;
|
|
42
|
+
this.viewContextUuidName = 'viewContextUuid';
|
|
43
|
+
this.viewContextUuidHeaderName = 'viewContextUuid';
|
|
44
|
+
this.pageNamePrefix = 'page.';
|
|
45
|
+
this.componentNamePrefix = 'component.';
|
|
46
|
+
this.viewHandlers = new Array();
|
|
47
|
+
this.defaultComponents = new Map();
|
|
48
|
+
this.openedViewUuids = new Array();
|
|
49
|
+
this.openedViewData = new Array();
|
|
50
|
+
// Monotonic counter bumped on every successful startViewContext(). Callers
|
|
51
|
+
// that hold a reference to a view-uuid from a previous viewcontext can
|
|
52
|
+
// detect a rebuild by comparing snapshots of this value.
|
|
53
|
+
this.generation = 0;
|
|
54
|
+
this._destroy$ = new Subject();
|
|
55
|
+
this.uuidOfPageHasBeenChanged = new SmartSubject(this._destroy$);
|
|
56
|
+
this.viewContextHasBeenSynced = new SmartSubject(this._destroy$);
|
|
57
|
+
this.openSmartLink = new SmartSubject(this._destroy$);
|
|
58
|
+
this.isOpeningSmartLink = false;
|
|
59
|
+
this.dialogRefs = [];
|
|
60
|
+
this.embeddedContainers = new Map();
|
|
61
|
+
this.embeddedViewRefs = [];
|
|
62
|
+
this.pendingEmbeddedViews = [];
|
|
63
|
+
this.smartApiClients = new Map();
|
|
64
|
+
this.translateServiceChanged = new SmartSubject(this._destroy$);
|
|
65
|
+
this.componentLibrary = compLib;
|
|
66
|
+
for (const entry of defaultViewComponents ?? []) {
|
|
67
|
+
this.defaultComponents.set(entry.componentName, entry.component);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ngOnDestroy() {
|
|
71
|
+
this._destroy$.next();
|
|
72
|
+
this._destroy$.complete();
|
|
73
|
+
}
|
|
74
|
+
follow(uuid, detectChange) {
|
|
75
|
+
this.smartApiClients.set(uuid, detectChange);
|
|
76
|
+
}
|
|
77
|
+
unfollow(uuid) {
|
|
78
|
+
this.smartApiClients.delete(uuid);
|
|
79
|
+
}
|
|
80
|
+
registerEmbeddedSlot(containerUuid, containerId, vcRef) {
|
|
81
|
+
let innerMap = this.embeddedContainers.get(containerUuid);
|
|
82
|
+
if (!innerMap) {
|
|
83
|
+
innerMap = new Map();
|
|
84
|
+
this.embeddedContainers.set(containerUuid, innerMap);
|
|
85
|
+
}
|
|
86
|
+
innerMap.set(containerId, vcRef);
|
|
87
|
+
// Reattach embedded views that were detached before layout re-render
|
|
88
|
+
const existing = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid && ref.containerId === containerId);
|
|
89
|
+
for (const ref of existing) {
|
|
90
|
+
if (!ref.componentRef.hostView.destroyed) {
|
|
91
|
+
vcRef.insert(ref.componentRef.hostView);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Drain pending queue (match on the resolved slot, so router-slot NORMAL views match too)
|
|
95
|
+
const matches = (v) => {
|
|
96
|
+
const s = resolveSlot(v);
|
|
97
|
+
return s.containerUuid === containerUuid && s.containerId === containerId;
|
|
98
|
+
};
|
|
99
|
+
const matching = this.pendingEmbeddedViews.filter(matches);
|
|
100
|
+
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => !matches(v));
|
|
101
|
+
if (matching.length > 0) {
|
|
102
|
+
const updates = matching.map((v) => this.openView(v));
|
|
103
|
+
this.sendViewContextUpdates(updates);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
detachAllEmbeddedViews(containerUuid) {
|
|
107
|
+
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
108
|
+
for (const child of children) {
|
|
109
|
+
if (child.componentRef.hostView.destroyed) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const vcRef = this.getEmbeddedSlot(containerUuid, child.containerId);
|
|
113
|
+
if (vcRef) {
|
|
114
|
+
const idx = vcRef.indexOf(child.componentRef.hostView);
|
|
115
|
+
if (idx >= 0) {
|
|
116
|
+
vcRef.detach(idx);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
cleanupOrphanedEmbeddedViews(containerUuid) {
|
|
122
|
+
const orphaned = this.embeddedViewRefs.filter((ref) => {
|
|
123
|
+
if (ref.containerUuid !== containerUuid) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
if (ref.componentRef.hostView.destroyed) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
const vcRef = this.getEmbeddedSlot(containerUuid, ref.containerId);
|
|
130
|
+
return !vcRef || vcRef.indexOf(ref.componentRef.hostView) < 0;
|
|
131
|
+
});
|
|
132
|
+
for (const ref of orphaned) {
|
|
133
|
+
if (!ref.componentRef.hostView.destroyed) {
|
|
134
|
+
ref.componentRef.destroy();
|
|
135
|
+
}
|
|
136
|
+
const idx = this.openedViewUuids.indexOf(ref.uuid);
|
|
137
|
+
if (idx >= 0) {
|
|
138
|
+
this.openedViewUuids.splice(idx, 1);
|
|
139
|
+
this.openedViewData.splice(idx, 1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => !orphaned.includes(ref));
|
|
143
|
+
}
|
|
144
|
+
getCompositeModel(containerUuid) {
|
|
145
|
+
const result = {};
|
|
146
|
+
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
147
|
+
for (const child of children) {
|
|
148
|
+
result[child.uuid] = child.componentRef.instance.getModel();
|
|
149
|
+
Object.assign(result, this.getCompositeModel(child.uuid));
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
submitEmbeddedForms(containerUuid, validate) {
|
|
154
|
+
const allInvalidKeys = [];
|
|
155
|
+
const allInvalidNames = [];
|
|
156
|
+
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
157
|
+
for (const child of children) {
|
|
158
|
+
const instance = child.componentRef.instance;
|
|
159
|
+
instance.submitForm(validate);
|
|
160
|
+
if (validate) {
|
|
161
|
+
const invalid = instance.getInvalidFields();
|
|
162
|
+
allInvalidKeys.push(...invalid.invalidFieldKeys);
|
|
163
|
+
allInvalidNames.push(...invalid.invalidFieldNames);
|
|
164
|
+
}
|
|
165
|
+
const nested = this.submitEmbeddedForms(child.uuid, validate);
|
|
166
|
+
allInvalidKeys.push(...nested.invalidFieldKeys);
|
|
167
|
+
allInvalidNames.push(...nested.invalidFieldNames);
|
|
168
|
+
}
|
|
169
|
+
return { invalidFieldKeys: allInvalidKeys, invalidFieldNames: allInvalidNames };
|
|
170
|
+
}
|
|
171
|
+
unregisterEmbeddedSlot(containerUuid, containerId) {
|
|
172
|
+
const innerMap = this.embeddedContainers.get(containerUuid);
|
|
173
|
+
if (innerMap) {
|
|
174
|
+
innerMap.delete(containerId);
|
|
175
|
+
if (innerMap.size === 0) {
|
|
176
|
+
this.embeddedContainers.delete(containerUuid);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
getEmbeddedSlot(containerUuid, containerId) {
|
|
181
|
+
return this.embeddedContainers.get(containerUuid)?.get(containerId);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Create the view's component into its resolved slot. Returns false and queues
|
|
185
|
+
* the view if the slot is not registered yet (drained on registration).
|
|
186
|
+
*/
|
|
187
|
+
insertViewIntoSlot(view, component) {
|
|
188
|
+
const { containerUuid, containerId } = resolveSlot(view);
|
|
189
|
+
const vcRef = this.getEmbeddedSlot(containerUuid, containerId);
|
|
190
|
+
if (!vcRef) {
|
|
191
|
+
this.pendingEmbeddedViews.push(view);
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
const componentRef = vcRef.createComponent(component);
|
|
195
|
+
componentRef.instance.uuid = view.uuid;
|
|
196
|
+
componentRef.instance.run();
|
|
197
|
+
this.embeddedViewRefs.push({ uuid: view.uuid, containerUuid, containerId, componentRef });
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
setActionDescriptors(actionDescriptors) {
|
|
201
|
+
this.actionDescriptors = actionDescriptors;
|
|
202
|
+
}
|
|
203
|
+
getActionDescriptors() {
|
|
204
|
+
if (!this.actionDescriptors) {
|
|
205
|
+
console.error('No action descriptors has been set to ViewContext.');
|
|
206
|
+
}
|
|
207
|
+
return this.actionDescriptors;
|
|
208
|
+
}
|
|
209
|
+
setViewHandlers(viewHandlers) {
|
|
210
|
+
this.viewHandlers = viewHandlers;
|
|
211
|
+
}
|
|
212
|
+
setViewApiErrors(viewApiErrors) {
|
|
213
|
+
this.smartViewContextApiErrors = viewApiErrors;
|
|
214
|
+
}
|
|
215
|
+
setMessageDialogName(messageDialogName) {
|
|
216
|
+
this.messageDialogname = messageDialogName;
|
|
217
|
+
this.viewHandlers.push({
|
|
218
|
+
name: messageDialogName,
|
|
219
|
+
component: MessageDialogComponent,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
setUpUrlForViewService() {
|
|
223
|
+
this.view.configuration.basePath = this.url;
|
|
224
|
+
}
|
|
225
|
+
getModuleURL(module) {
|
|
226
|
+
if (!this.moduleUrlsByModule) {
|
|
227
|
+
throw new Error('ModulesMap does not exist.');
|
|
228
|
+
}
|
|
229
|
+
let moduleUrl = this.moduleUrlsByModule?.get(module);
|
|
230
|
+
if (!moduleUrl) {
|
|
231
|
+
throw new Error('ModuleUrl does not exist with the given module.');
|
|
232
|
+
}
|
|
233
|
+
return moduleUrl;
|
|
234
|
+
}
|
|
235
|
+
setModuleURL(modules) {
|
|
236
|
+
this.moduleUrlsByModule = modules;
|
|
237
|
+
}
|
|
238
|
+
setUrl(url) {
|
|
239
|
+
this.url = url + '/view';
|
|
240
|
+
this.setUpUrlForViewService();
|
|
241
|
+
}
|
|
242
|
+
async getAndSyncViewContext(uuid) {
|
|
243
|
+
if (!uuid) {
|
|
244
|
+
uuid = this.getViewContextUuid();
|
|
245
|
+
}
|
|
246
|
+
await this.getViewContext(uuid).then(async () => {
|
|
247
|
+
await this.syncView();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
async getViewContext(uuid) {
|
|
251
|
+
this.viewContext = await this.view.getViewContext(uuid).toPromise();
|
|
252
|
+
if (!this.viewContext) {
|
|
253
|
+
throw new Error('ViewContext does not exist with the given uuid.');
|
|
254
|
+
}
|
|
255
|
+
return this.viewContext;
|
|
256
|
+
}
|
|
257
|
+
async getViewContextDataByPageName(pageName) {
|
|
258
|
+
if (!this.viewContext) {
|
|
259
|
+
await this.getViewContext(this.getViewContextUuid());
|
|
260
|
+
}
|
|
261
|
+
let pageUuid = this.getUuidOfPage(pageName);
|
|
262
|
+
let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
|
|
263
|
+
if (!viewContextByPageName) {
|
|
264
|
+
throw new Error(`The ViewData of ${pageName} is not found!`);
|
|
265
|
+
}
|
|
266
|
+
return viewContextByPageName;
|
|
267
|
+
}
|
|
268
|
+
async updateViewContext(viewContextUpdate) {
|
|
269
|
+
viewContextUpdate.deviceInfo ??= {
|
|
270
|
+
deviceId: 'id',
|
|
271
|
+
userAgent: navigator.userAgent,
|
|
272
|
+
parameters: new Map(),
|
|
273
|
+
};
|
|
274
|
+
viewContextUpdate.deviceInfo.componentLibrary = this.componentLibrary;
|
|
275
|
+
this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
|
|
276
|
+
return this.viewContext;
|
|
277
|
+
}
|
|
278
|
+
clearSessionStorage() {
|
|
279
|
+
sessionStorage.clear();
|
|
280
|
+
this.clearEmbeddedViews();
|
|
281
|
+
this.openedViewData = [];
|
|
282
|
+
this.openedViewUuids = [];
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Tear down all slot-hosted view components on a viewContext reset (e.g. logout /
|
|
286
|
+
* viewcontext-lost). Without this the previous view tree stays mounted in the root
|
|
287
|
+
* slot and the new tree is appended alongside it. Destroying a parent cascades to
|
|
288
|
+
* its nested slot directives (which unregister their containers via ngOnDestroy),
|
|
289
|
+
* leaving only the host-owned root slot registered.
|
|
290
|
+
*/
|
|
291
|
+
clearEmbeddedViews() {
|
|
292
|
+
for (const ref of this.embeddedViewRefs) {
|
|
293
|
+
if (!ref.componentRef.hostView.destroyed) {
|
|
294
|
+
ref.componentRef.destroy();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
this.embeddedViewRefs = [];
|
|
298
|
+
this.pendingEmbeddedViews = [];
|
|
299
|
+
}
|
|
300
|
+
async startViewContext() {
|
|
301
|
+
this.clearSessionStorage();
|
|
302
|
+
this.session.addHeaderParam({
|
|
303
|
+
headerName: this.viewContextUuidHeaderName,
|
|
304
|
+
value: '',
|
|
305
|
+
});
|
|
306
|
+
let newViewContext = await this.view
|
|
307
|
+
.createViewContext()
|
|
308
|
+
.toPromise();
|
|
309
|
+
if (!newViewContext) {
|
|
310
|
+
throw new Error('No ViewContext was created');
|
|
311
|
+
}
|
|
312
|
+
this.viewContext = newViewContext;
|
|
313
|
+
this.setViewContextUuid(newViewContext.uuid);
|
|
314
|
+
this.generation++;
|
|
315
|
+
return this.viewContext;
|
|
316
|
+
}
|
|
317
|
+
getGeneration() {
|
|
318
|
+
return this.generation;
|
|
319
|
+
}
|
|
320
|
+
async initialize(uuid) {
|
|
321
|
+
if (this.initializeRunning) {
|
|
322
|
+
return this.initializeRunning.toPromise();
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
this.initializeRunning = new SmartSubject(this._destroy$);
|
|
326
|
+
try {
|
|
327
|
+
if (this.viewHandlers.length === 0) {
|
|
328
|
+
throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
|
|
329
|
+
}
|
|
330
|
+
if (!this.messageDialogname) {
|
|
331
|
+
throw new Error('The messageDialogName provided by the backend has not been set.');
|
|
332
|
+
}
|
|
333
|
+
if (uuid) {
|
|
334
|
+
this.setViewContextUuid(uuid);
|
|
335
|
+
try {
|
|
336
|
+
await this.getViewContext(uuid);
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
await this.startViewContext();
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
await this.startViewContext();
|
|
344
|
+
}
|
|
345
|
+
return this.viewContext;
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
this.initializeRunning.next(this.viewContext);
|
|
349
|
+
this.initializeRunning.complete();
|
|
350
|
+
this.initializeRunning = undefined;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async initViewContext() {
|
|
355
|
+
let uuid;
|
|
356
|
+
try {
|
|
357
|
+
uuid = this.getViewContextUuid();
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
await this.initialize();
|
|
361
|
+
uuid = this.getViewContextUuid();
|
|
362
|
+
}
|
|
363
|
+
await this.initialize(uuid);
|
|
364
|
+
await this.restoreViews(uuid);
|
|
365
|
+
await this.getAndSyncViewContext();
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Hydrates the view-context state from an already-existing UUID provided
|
|
369
|
+
* externally (e.g. by a native mobile shell via URL fragment). Unlike
|
|
370
|
+
* `initialize(uuid)`, this method does NOT fall back to creating a fresh
|
|
371
|
+
* viewContext if the backend rejects the UUID — the caller is expected to
|
|
372
|
+
* surface the failure (typically via the bootstrap's `onStartError` hook).
|
|
373
|
+
*/
|
|
374
|
+
async initFromExistingViewContext(uuid) {
|
|
375
|
+
this.setViewContextUuid(uuid);
|
|
376
|
+
await this.getViewContext(uuid);
|
|
377
|
+
await this.restoreViews(uuid);
|
|
378
|
+
}
|
|
379
|
+
async initNewViewContext() {
|
|
380
|
+
if (this.initiNewContextRunning) {
|
|
381
|
+
return this.initiNewContextRunning.toPromise();
|
|
382
|
+
}
|
|
383
|
+
this.initiNewContextRunning = new SmartSubject(this._destroy$);
|
|
384
|
+
try {
|
|
385
|
+
await this.startViewContext();
|
|
386
|
+
let uuid = this.getViewContextUuid();
|
|
387
|
+
await this.initialize(uuid);
|
|
388
|
+
await this.restoreViews(uuid);
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
this.initiNewContextRunning.next();
|
|
392
|
+
this.initiNewContextRunning.complete();
|
|
393
|
+
this.initiNewContextRunning = undefined;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
openView(view) {
|
|
397
|
+
let alreadyOpened = this.openedViewUuids.some((uuid) => uuid === view.uuid);
|
|
398
|
+
if (alreadyOpened)
|
|
399
|
+
return undefined;
|
|
400
|
+
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
|
|
401
|
+
if (!viewHandler) {
|
|
402
|
+
throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
|
|
403
|
+
}
|
|
404
|
+
if (view.type === ViewType.DIALOG) {
|
|
405
|
+
if (!viewHandler.component) {
|
|
406
|
+
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
407
|
+
}
|
|
408
|
+
let refIsAlradyAdded = this.dialogRefs.some((ref) => ref.uuid === view.uuid);
|
|
409
|
+
if (!refIsAlradyAdded) {
|
|
410
|
+
let dialogRef;
|
|
411
|
+
try {
|
|
412
|
+
this.openedViewUuids.push(view.uuid);
|
|
413
|
+
this.openedViewData.push(view);
|
|
414
|
+
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
415
|
+
dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name, view.uuid);
|
|
416
|
+
}
|
|
417
|
+
finally {
|
|
418
|
+
const index = this.openedViewUuids.indexOf(view.uuid);
|
|
419
|
+
if (index >= 0) {
|
|
420
|
+
this.openedViewUuids.splice(index, 1);
|
|
421
|
+
this.openedViewData.splice(index, 1);
|
|
422
|
+
this.clearUuidOfPage(view.viewName, viewHandler.componentName);
|
|
423
|
+
}
|
|
424
|
+
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
425
|
+
}
|
|
426
|
+
let dialogDisableClose = true;
|
|
427
|
+
let isMessageDialog = view.viewName === this.messageDialogname;
|
|
428
|
+
if (!isMessageDialog) {
|
|
429
|
+
try {
|
|
430
|
+
dialogDisableClose = this.inject.get(DIALOG_DISABLE_CLOSE);
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
console.error('Error during reading DIALOG_DISABLE_CLOSE');
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (dialogRef instanceof MatDialogRef) {
|
|
437
|
+
dialogRef.disableClose = dialogDisableClose;
|
|
438
|
+
// if (isMessageDialog) {
|
|
439
|
+
// if (view.message?.options && view.message.options.length) {
|
|
440
|
+
// }
|
|
441
|
+
// }
|
|
442
|
+
if (!dialogDisableClose) {
|
|
443
|
+
dialogRef
|
|
444
|
+
.afterClosed()
|
|
445
|
+
.pipe(takeUntil(this._destroy$))
|
|
446
|
+
.subscribe(() => {
|
|
447
|
+
this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
else if (dialogRef instanceof DynamicDialogRef) {
|
|
452
|
+
if (!dialogDisableClose) {
|
|
453
|
+
dialogRef.onDestroy.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
454
|
+
this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
this.dialogRefs.push({
|
|
459
|
+
uuid: view.uuid,
|
|
460
|
+
dialogRef,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
else if (view.type === ViewType.NORMAL) {
|
|
465
|
+
if (!viewHandler.component) {
|
|
466
|
+
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
467
|
+
}
|
|
468
|
+
// COMPATIBILITY SHIM (#28870, intentional): some child services (SmarttreeGenericService,
|
|
469
|
+
// SmartFilterEditorService) and generic components (SearchPageComponent, GenericPageComponent)
|
|
470
|
+
// still resolve their view uuid via the pageName -> getUuidOfPage(sessionStorage) indirection
|
|
471
|
+
// in their CONSTRUCTOR, which runs inside createComponent() below — before openView's normal
|
|
472
|
+
// bookkeeping. So the mapping must be written here, ahead of component creation. The proper
|
|
473
|
+
// fix (feed those consumers the injected uuid + defer their init) is deferred consumer plumbing;
|
|
474
|
+
// until then this write keeps the indirection correct in the slot world.
|
|
475
|
+
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
476
|
+
// A NORMAL view with no containerUuid lands in the host root slot (resolveSlot maps
|
|
477
|
+
// it to ROOT_CONTAINER_UUID); if no slot is registered yet it queues and drains later.
|
|
478
|
+
const inserted = this.insertViewIntoSlot(view, viewHandler.component);
|
|
479
|
+
if (!inserted)
|
|
480
|
+
return undefined;
|
|
481
|
+
}
|
|
482
|
+
else if (view.type === ViewType.EMBEDDED) {
|
|
483
|
+
if (!viewHandler.component) {
|
|
484
|
+
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
485
|
+
}
|
|
486
|
+
// Write the page-uuid mapping ahead of component creation so constructor-time
|
|
487
|
+
// and nested getUuidOfPage(viewName) consumers (filter, tree) resolve. The
|
|
488
|
+
// page.<viewName> key is distinct per view, so it never collides. The
|
|
489
|
+
// component.<componentName> reverse key CAN be overwritten by another
|
|
490
|
+
// concurrent dynamic view of the same default component, but it is read only
|
|
491
|
+
// synchronously in the constructor (right after this write) and slot views
|
|
492
|
+
// load via the injected _uuid afterwards, so the overwrite never mis-resolves
|
|
493
|
+
// at runtime. (#28870)
|
|
494
|
+
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
495
|
+
const inserted = this.insertViewIntoSlot(view, viewHandler.component);
|
|
496
|
+
if (!inserted)
|
|
497
|
+
return undefined;
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
throw new Error('The type of the view and its viewHandler is not the same!');
|
|
501
|
+
}
|
|
502
|
+
view.state = ViewState.OPENED;
|
|
503
|
+
this.openedViewUuids.push(view.uuid);
|
|
504
|
+
this.openedViewData.push(view);
|
|
505
|
+
if (view.type !== ViewType.EMBEDDED) {
|
|
506
|
+
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
507
|
+
this.uuidOfPageHasBeenChanged.next(view.viewName);
|
|
508
|
+
}
|
|
509
|
+
return {
|
|
510
|
+
state: ViewState.OPENED,
|
|
511
|
+
uuid: view.uuid,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
closeView(view) {
|
|
515
|
+
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
|
|
516
|
+
if (!viewHandler) {
|
|
517
|
+
throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
|
|
518
|
+
}
|
|
519
|
+
const updates = [];
|
|
520
|
+
if (view.type === ViewType.DIALOG) {
|
|
521
|
+
let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
|
|
522
|
+
if (dialogRef) {
|
|
523
|
+
dialogRef.dialogRef.close();
|
|
524
|
+
let index = this.dialogRefs.indexOf(dialogRef);
|
|
525
|
+
this.dialogRefs.splice(index, 1);
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
// console.log('DialogRef is not found by uuid.');
|
|
529
|
+
}
|
|
530
|
+
updates.push(...this.cleanupEmbeddedChildren(view.uuid));
|
|
531
|
+
}
|
|
532
|
+
else if (view.type === ViewType.NORMAL) {
|
|
533
|
+
// Destroy nested children first, then the view's own slot component.
|
|
534
|
+
// destroyViewRef is a no-op for the legacy route-rendered (rootless) case.
|
|
535
|
+
updates.push(...this.cleanupEmbeddedChildren(view.uuid));
|
|
536
|
+
this.destroyViewRef(view.uuid);
|
|
537
|
+
}
|
|
538
|
+
else if (view.type === ViewType.EMBEDDED) {
|
|
539
|
+
this.destroyViewRef(view.uuid);
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
throw new Error('The type of the view and its viewHandler is not the same!');
|
|
543
|
+
}
|
|
544
|
+
view.state = ViewState.CLOSED;
|
|
545
|
+
const index = this.openedViewUuids.indexOf(view.uuid);
|
|
546
|
+
if (index >= 0) {
|
|
547
|
+
this.openedViewUuids.splice(index, 1);
|
|
548
|
+
this.openedViewData.splice(index, 1);
|
|
549
|
+
// Clear for every type: openView now writes the page-uuid mapping for
|
|
550
|
+
// EMBEDDED views too (#28870), so the clear must be symmetric to avoid a
|
|
551
|
+
// stale sessionStorage entry. clearUuidOfPage is a no-op for keys never
|
|
552
|
+
// written, so this stays safe for the legacy rootless case.
|
|
553
|
+
this.clearUuidOfPage(view.viewName, viewHandler.componentName);
|
|
554
|
+
}
|
|
555
|
+
updates.push({
|
|
556
|
+
state: ViewState.CLOSED,
|
|
557
|
+
uuid: view.uuid,
|
|
558
|
+
});
|
|
559
|
+
return updates;
|
|
560
|
+
}
|
|
561
|
+
cleanupEmbeddedChildren(containerUuid) {
|
|
562
|
+
const updates = [];
|
|
563
|
+
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
564
|
+
for (const child of children) {
|
|
565
|
+
child.componentRef.destroy();
|
|
566
|
+
updates.push({ state: ViewState.CLOSED, uuid: child.uuid });
|
|
567
|
+
}
|
|
568
|
+
this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => ref.containerUuid !== containerUuid);
|
|
569
|
+
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.containerUuid !== containerUuid);
|
|
570
|
+
this.embeddedContainers.delete(containerUuid);
|
|
571
|
+
return updates;
|
|
572
|
+
}
|
|
573
|
+
/** Destroy the component for a view living in a slot, if present (no-op for route-rendered views). */
|
|
574
|
+
destroyViewRef(uuid) {
|
|
575
|
+
const refIndex = this.embeddedViewRefs.findIndex((ref) => ref.uuid === uuid);
|
|
576
|
+
if (refIndex >= 0) {
|
|
577
|
+
this.embeddedViewRefs[refIndex].componentRef.destroy();
|
|
578
|
+
this.embeddedViewRefs.splice(refIndex, 1);
|
|
579
|
+
}
|
|
580
|
+
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.uuid !== uuid);
|
|
581
|
+
}
|
|
582
|
+
async sendViewContextUpdates(updatesToSend) {
|
|
583
|
+
const updates = [];
|
|
584
|
+
updatesToSend.forEach((update) => {
|
|
585
|
+
if (update !== undefined && update !== null)
|
|
586
|
+
updates.push(update);
|
|
587
|
+
});
|
|
588
|
+
if (updates.length > 0) {
|
|
589
|
+
await this.updateViewContext({
|
|
590
|
+
updates,
|
|
591
|
+
uuid: this.viewContext?.uuid,
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
async restoreViews(uuid) {
|
|
596
|
+
const updates = [];
|
|
597
|
+
if (!this.viewContext) {
|
|
598
|
+
await this.getViewContext(uuid);
|
|
599
|
+
}
|
|
600
|
+
this.viewContext.views.filter((view) => view.state === ViewState.OPENED || view.state === ViewState.TO_OPEN).map((view) => {
|
|
601
|
+
const update = this.openView(view);
|
|
602
|
+
if (update) {
|
|
603
|
+
updates.push(update);
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
await this.sendViewContextUpdates(updates);
|
|
607
|
+
}
|
|
608
|
+
reuseEnabled() {
|
|
609
|
+
try {
|
|
610
|
+
const value = this.inject.get(REUSE_ROUTER_SLOT_COMPONENT);
|
|
611
|
+
return value !== false; // default ON when unset/null
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
return true;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
executeReuse(oldView, newView) {
|
|
618
|
+
const ref = this.embeddedViewRefs.find((r) => r.uuid === oldView.uuid);
|
|
619
|
+
if (!ref) {
|
|
620
|
+
// No live component to reuse (e.g. was route-rendered) — fall back to close + open.
|
|
621
|
+
const updates = [...this.closeView(oldView)];
|
|
622
|
+
const opened = this.openView(newView);
|
|
623
|
+
if (opened)
|
|
624
|
+
updates.push(opened);
|
|
625
|
+
return updates;
|
|
626
|
+
}
|
|
627
|
+
// The reused parent is logically a fresh page (new uuid); its previous embedded
|
|
628
|
+
// children do not carry over (the backend leaves them keyed under the old parent
|
|
629
|
+
// uuid). Tear them down here and report them CLOSED.
|
|
630
|
+
const childUpdates = this.cleanupEmbeddedChildren(oldView.uuid);
|
|
631
|
+
ref.componentRef.instance.uuid = newView.uuid; // setter runs unfollow(old)/follow(new)
|
|
632
|
+
ref.uuid = newView.uuid;
|
|
633
|
+
const oldIdx = this.openedViewUuids.indexOf(oldView.uuid);
|
|
634
|
+
if (oldIdx >= 0) {
|
|
635
|
+
this.openedViewUuids.splice(oldIdx, 1);
|
|
636
|
+
this.openedViewData.splice(oldIdx, 1);
|
|
637
|
+
}
|
|
638
|
+
this.openedViewUuids.push(newView.uuid);
|
|
639
|
+
this.openedViewData.push(newView);
|
|
640
|
+
ref.componentRef.instance.run();
|
|
641
|
+
oldView.state = ViewState.CLOSED;
|
|
642
|
+
newView.state = ViewState.OPENED;
|
|
643
|
+
// Mirror the normal openView tail so getUuidOfPage consumers (e.g. trees) resolve the new uuid.
|
|
644
|
+
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, newView);
|
|
645
|
+
this.setUuidOfPage(newView.viewName, newView.uuid, viewHandler?.componentName);
|
|
646
|
+
this.uuidOfPageHasBeenChanged.next(newView.viewName);
|
|
647
|
+
return [
|
|
648
|
+
...childUpdates,
|
|
649
|
+
{ state: ViewState.CLOSED, uuid: oldView.uuid },
|
|
650
|
+
{ state: ViewState.OPENED, uuid: newView.uuid },
|
|
651
|
+
];
|
|
652
|
+
}
|
|
653
|
+
async syncView() {
|
|
654
|
+
const updates = [];
|
|
655
|
+
const ops = buildViewOps(this.viewContext?.views ?? [], this.reuseEnabled());
|
|
656
|
+
for (const op of ops) {
|
|
657
|
+
if (op.kind === 'open') {
|
|
658
|
+
updates.push(this.openView(op.view));
|
|
659
|
+
}
|
|
660
|
+
else if (op.kind === 'close') {
|
|
661
|
+
updates.push(...this.closeView(op.view));
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
updates.push(...this.executeReuse(op.oldView, op.newView));
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
|
|
668
|
+
.flatMap((viewData) => viewData.uuid)
|
|
669
|
+
.includes(viewData.uuid));
|
|
670
|
+
if (viewDataToClose?.length) {
|
|
671
|
+
viewDataToClose.map((viewData) => {
|
|
672
|
+
updates.push(...this.closeView(viewData));
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
this.viewContext?.links?.map((data) => {
|
|
676
|
+
const link = document.createElement('a');
|
|
677
|
+
let target = '_blank'; // default
|
|
678
|
+
switch (data.target ?? LinkTargetEnum.BLANK) {
|
|
679
|
+
case 'SELF':
|
|
680
|
+
target = '_self';
|
|
681
|
+
break;
|
|
682
|
+
case 'BLANK':
|
|
683
|
+
target = '_blank';
|
|
684
|
+
break;
|
|
685
|
+
case 'PARENT':
|
|
686
|
+
target = '_parent';
|
|
687
|
+
break;
|
|
688
|
+
case 'TOP':
|
|
689
|
+
target = '_top';
|
|
690
|
+
break;
|
|
691
|
+
}
|
|
692
|
+
link.setAttribute('target', target);
|
|
693
|
+
link.setAttribute('href', data.url);
|
|
694
|
+
if (data.download) {
|
|
695
|
+
link.setAttribute('download', data.filename ?? '');
|
|
696
|
+
}
|
|
697
|
+
document.body.appendChild(link);
|
|
698
|
+
link.click();
|
|
699
|
+
link.remove();
|
|
700
|
+
});
|
|
701
|
+
this.startDownloadsFiles(this.viewContext?.downloads || []);
|
|
702
|
+
const clipboardText = this.viewContext?.clipboardData
|
|
703
|
+
?.map((cd) => cd.text || '')
|
|
704
|
+
.join('');
|
|
705
|
+
if (clipboardText) {
|
|
706
|
+
const clipboard = navigator.clipboard;
|
|
707
|
+
// available only in secure contexts.
|
|
708
|
+
if (clipboard) {
|
|
709
|
+
try {
|
|
710
|
+
clipboard
|
|
711
|
+
.writeText(clipboardText)
|
|
712
|
+
.catch((e) => console.error('Failed to copy text to clipboard', e));
|
|
713
|
+
}
|
|
714
|
+
catch (e) {
|
|
715
|
+
console.error('Error accessing clipboard', e);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
await this.sendViewContextUpdates(updates);
|
|
720
|
+
this.viewContextHasBeenSynced.next();
|
|
721
|
+
}
|
|
722
|
+
async startDownloadsFiles(downloads) {
|
|
723
|
+
for (const file of downloads) {
|
|
724
|
+
try {
|
|
725
|
+
let blob = await this.downloadResource(file.uuid, file.identifier);
|
|
726
|
+
let url = URL.createObjectURL(blob);
|
|
727
|
+
const link = document.createElement('a');
|
|
728
|
+
link.setAttribute('target', '_blank');
|
|
729
|
+
link.setAttribute('href', url);
|
|
730
|
+
link.setAttribute('download', file.filename);
|
|
731
|
+
document.body.appendChild(link);
|
|
732
|
+
link.click();
|
|
733
|
+
link.remove();
|
|
734
|
+
}
|
|
735
|
+
catch (e) {
|
|
736
|
+
console.error('Error downloading file', e);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
setViewContextUuid(uuid) {
|
|
741
|
+
sessionStorage.setItem(this.viewContextUuidName, uuid);
|
|
742
|
+
this.session.addHeaderParam({
|
|
743
|
+
headerName: this.viewContextUuidHeaderName,
|
|
744
|
+
value: uuid,
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
getViewContextUuid() {
|
|
748
|
+
let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
|
|
749
|
+
if (!viewContextUuid) {
|
|
750
|
+
throw new Error('View context is not initialized!');
|
|
751
|
+
}
|
|
752
|
+
return viewContextUuid;
|
|
753
|
+
}
|
|
754
|
+
hasViewContextUuid() {
|
|
755
|
+
let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
|
|
756
|
+
return viewContextUuid !== null && viewContextUuid !== undefined;
|
|
757
|
+
}
|
|
758
|
+
setUuidOfPage(pageName, uuid, componentName) {
|
|
759
|
+
sessionStorage.setItem(this.pageNamePrefix + pageName, uuid);
|
|
760
|
+
if (componentName) {
|
|
761
|
+
sessionStorage.setItem(this.componentNamePrefix + componentName, pageName);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
clearUuidOfPage(pageName, componentName) {
|
|
765
|
+
sessionStorage.removeItem(this.pageNamePrefix + pageName);
|
|
766
|
+
if (componentName) {
|
|
767
|
+
sessionStorage.removeItem(this.componentNamePrefix + componentName);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
getUuidOfPage(pageName) {
|
|
771
|
+
let uuid = sessionStorage.getItem(this.pageNamePrefix + pageName);
|
|
772
|
+
if (!uuid) {
|
|
773
|
+
throw new Error(`The uuid of ${pageName} is not available.`);
|
|
774
|
+
}
|
|
775
|
+
return uuid;
|
|
776
|
+
}
|
|
777
|
+
getPageNameOfComponent(componentName) {
|
|
778
|
+
let pageName = sessionStorage.getItem(this.componentNamePrefix + componentName);
|
|
779
|
+
if (!pageName) {
|
|
780
|
+
throw new Error(`The pageName of ${componentName} is not available.`);
|
|
781
|
+
}
|
|
782
|
+
return pageName;
|
|
783
|
+
}
|
|
784
|
+
async message(messageData, messageResult) {
|
|
785
|
+
return await this.handlePerformActionResponse(await this.view
|
|
786
|
+
.message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
|
|
787
|
+
.toPromise());
|
|
788
|
+
// in future use this.apiQueueService.addToQueue
|
|
789
|
+
}
|
|
790
|
+
async getSmartViewContextApiErrorByCode(code) {
|
|
791
|
+
let buttonLabel;
|
|
792
|
+
let dialogTitle;
|
|
793
|
+
let message;
|
|
794
|
+
if (this.translateService) {
|
|
795
|
+
buttonLabel = await this.translateService
|
|
796
|
+
.get(SmartViewContextErrorDialogButtonLabel)
|
|
797
|
+
.toPromise();
|
|
798
|
+
dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
|
|
799
|
+
message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
|
|
800
|
+
}
|
|
801
|
+
else {
|
|
802
|
+
buttonLabel = 'Ok';
|
|
803
|
+
dialogTitle = 'Hiba';
|
|
804
|
+
message = 'An error has occured.';
|
|
805
|
+
}
|
|
806
|
+
if (!this.smartViewContextApiErrors) {
|
|
807
|
+
return {
|
|
808
|
+
code,
|
|
809
|
+
message,
|
|
810
|
+
buttonLabel,
|
|
811
|
+
dialogTitle,
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
|
|
815
|
+
return apiError.code === code;
|
|
816
|
+
});
|
|
817
|
+
if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
|
|
818
|
+
console.error(`SmartViewContextApiError with code ${code} could not be found.`);
|
|
819
|
+
return {
|
|
820
|
+
code,
|
|
821
|
+
message,
|
|
822
|
+
buttonLabel,
|
|
823
|
+
dialogTitle,
|
|
824
|
+
};
|
|
825
|
+
}
|
|
826
|
+
return apiErrorsWithCode[0];
|
|
827
|
+
}
|
|
828
|
+
async getViewConstraint(uuid) {
|
|
829
|
+
let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
|
|
830
|
+
if (!viewConstraintResponse)
|
|
831
|
+
throw new Error('Could not get ViewConstraint with the given uuid.');
|
|
832
|
+
return viewConstraintResponse;
|
|
833
|
+
}
|
|
834
|
+
async showPublishedView(channel, uuid) {
|
|
835
|
+
this.isOpeningSmartLink = true;
|
|
836
|
+
await this.session.initialize();
|
|
837
|
+
// TODO init view context automatically
|
|
838
|
+
// await this.initialize();
|
|
839
|
+
await this.initViewContext();
|
|
840
|
+
this.openSmartLink.next(channel);
|
|
841
|
+
await this.openSmartLink.toPromise();
|
|
842
|
+
await this.view.showPublishedView(channel, uuid).toPromise();
|
|
843
|
+
await this.getAndSyncViewContext();
|
|
844
|
+
this.isOpeningSmartLink = false;
|
|
845
|
+
}
|
|
846
|
+
async downloadResource(uuid, item) {
|
|
847
|
+
return await this.view.downloadItem(uuid, item).toPromise();
|
|
848
|
+
}
|
|
849
|
+
async performAction(uuid, uiActionRequest) {
|
|
850
|
+
return await this._performAction({
|
|
851
|
+
uuid,
|
|
852
|
+
uiActionRequest,
|
|
853
|
+
});
|
|
854
|
+
// const isCompleted = new Subject<void>();
|
|
855
|
+
// this.apiQueueService.addToQueue({
|
|
856
|
+
// callback: this._performAction.bind(this),
|
|
857
|
+
// config: {
|
|
858
|
+
// uuid,
|
|
859
|
+
// uiActionRequest,
|
|
860
|
+
// },
|
|
861
|
+
// isCompleted,
|
|
862
|
+
// });
|
|
863
|
+
// return await isCompleted.toPromise();
|
|
864
|
+
}
|
|
865
|
+
async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
|
|
866
|
+
return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
|
|
867
|
+
// const isCompleted = new Subject<void>();
|
|
868
|
+
// this.apiQueueService.addToQueue({
|
|
869
|
+
// callback: this._performWidgetAction.bind(this),
|
|
870
|
+
// config: {
|
|
871
|
+
// uuid,
|
|
872
|
+
// widgetId,
|
|
873
|
+
// nodeId,
|
|
874
|
+
// uiActionRequest,
|
|
875
|
+
// },
|
|
876
|
+
// isCompleted,
|
|
877
|
+
// });
|
|
878
|
+
// return await isCompleted.toPromise();
|
|
879
|
+
}
|
|
880
|
+
async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
|
|
881
|
+
return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
|
|
882
|
+
// const isCompleted = new Subject<void>();
|
|
883
|
+
// this.apiQueueService.addToQueue({
|
|
884
|
+
// callback: this._performWidgetMainAction.bind(this),
|
|
885
|
+
// config: {
|
|
886
|
+
// uuid,
|
|
887
|
+
// widgetId,
|
|
888
|
+
// uiActionRequest,
|
|
889
|
+
// },
|
|
890
|
+
// isCompleted,
|
|
891
|
+
// });
|
|
892
|
+
// return await isCompleted.toPromise();
|
|
893
|
+
}
|
|
894
|
+
async performUploadAction(uuid, uiActionRequest, param, content) {
|
|
895
|
+
this._performUploadAction({
|
|
896
|
+
uuid,
|
|
897
|
+
uiActionRequest,
|
|
898
|
+
param,
|
|
899
|
+
content,
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
async performUploadMultipleAction(uuid, uiActionRequest, param, content) {
|
|
903
|
+
this._performUploadMultipleAction({
|
|
904
|
+
uuid,
|
|
905
|
+
uiActionRequest,
|
|
906
|
+
param,
|
|
907
|
+
content,
|
|
908
|
+
});
|
|
909
|
+
}
|
|
910
|
+
async dataChanged(uuid, dataChange) {
|
|
911
|
+
return await this._dataChanged({ uuid, dataChange });
|
|
912
|
+
// const isCompleted = new Subject<void>();
|
|
913
|
+
// this.apiQueueService.addToQueue(
|
|
914
|
+
// {
|
|
915
|
+
// callback: this._dataChanged.bind(this),
|
|
916
|
+
// config: {
|
|
917
|
+
// uuid,
|
|
918
|
+
// dataChange,
|
|
919
|
+
// },
|
|
920
|
+
// isCompleted,
|
|
921
|
+
// },
|
|
922
|
+
// true
|
|
923
|
+
// );
|
|
924
|
+
// return await isCompleted.toPromise();
|
|
925
|
+
}
|
|
926
|
+
async _performAction(config) {
|
|
927
|
+
return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
|
|
928
|
+
}
|
|
929
|
+
async _performWidgetAction(config) {
|
|
930
|
+
return await this.handlePerformActionResponse(await this.view
|
|
931
|
+
.performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
|
|
932
|
+
.toPromise());
|
|
933
|
+
}
|
|
934
|
+
async _performWidgetMainAction(config) {
|
|
935
|
+
return await this.handlePerformActionResponse(await this.view
|
|
936
|
+
.performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
|
|
937
|
+
.toPromise());
|
|
938
|
+
}
|
|
939
|
+
async _performUploadAction(config) {
|
|
940
|
+
return await this.handlePerformActionResponse(await this.view
|
|
941
|
+
.uploadAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
|
|
942
|
+
.toPromise());
|
|
943
|
+
}
|
|
944
|
+
async _performUploadMultipleAction(config) {
|
|
945
|
+
return await this.handlePerformActionResponse(await this.view
|
|
946
|
+
.uploadMultipleAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
|
|
947
|
+
.toPromise());
|
|
948
|
+
}
|
|
949
|
+
async _dataChanged(config) {
|
|
950
|
+
return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
|
|
951
|
+
}
|
|
952
|
+
async handlePerformActionResponse(viewContextChange) {
|
|
953
|
+
this.viewContext = viewContextChange?.viewContext;
|
|
954
|
+
await this.syncView();
|
|
955
|
+
if (viewContextChange?.changes) {
|
|
956
|
+
this.handleChanges(viewContextChange.changes);
|
|
957
|
+
}
|
|
958
|
+
return viewContextChange?.result;
|
|
959
|
+
}
|
|
960
|
+
handleChanges(changes) {
|
|
961
|
+
changes.forEach((componentModelChange) => {
|
|
962
|
+
let detectChange = this.smartApiClients.get(componentModelChange.uuid);
|
|
963
|
+
if (detectChange) {
|
|
964
|
+
detectChange.next(componentModelChange);
|
|
965
|
+
}
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
async load(uuid) {
|
|
969
|
+
return await this.view.getComponentModel(uuid).toPromise();
|
|
970
|
+
}
|
|
971
|
+
async load2(uuid) {
|
|
972
|
+
let change = await this.view.getComponentModel2(uuid).toPromise();
|
|
973
|
+
this.handlePerformActionResponse(change);
|
|
974
|
+
return change;
|
|
975
|
+
}
|
|
976
|
+
getCurrentViewContext() {
|
|
977
|
+
return this.viewContext;
|
|
978
|
+
}
|
|
979
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, deps: [{ token: i1.ViewService }, { token: i2.SmartSessionService }, { token: i3.SmartViewContextDialogService }, { token: ApiQueueService }, { token: i0.Injector }, { token: COMPONENT_LIBRARY, optional: true }, { token: SMART_DEFAULT_VIEW_COMPONENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
980
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, providedIn: 'root' }); }
|
|
981
|
+
}
|
|
982
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, decorators: [{
|
|
983
|
+
type: Injectable,
|
|
984
|
+
args: [{
|
|
985
|
+
providedIn: 'root',
|
|
986
|
+
}]
|
|
987
|
+
}], ctorParameters: () => [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartViewContextDialogService }, { type: ApiQueueService }, { type: i0.Injector }, { type: i4.ComponentLibrary, decorators: [{
|
|
988
|
+
type: Inject,
|
|
989
|
+
args: [COMPONENT_LIBRARY]
|
|
990
|
+
}, {
|
|
991
|
+
type: Optional
|
|
992
|
+
}] }, { type: undefined, decorators: [{
|
|
993
|
+
type: Inject,
|
|
994
|
+
args: [SMART_DEFAULT_VIEW_COMPONENTS]
|
|
995
|
+
}, {
|
|
996
|
+
type: Optional
|
|
997
|
+
}] }] });
|
|
998
|
+
export const IS_ASYNC_PARAM_NAME = 'isAsync';
|
|
999
|
+
export class ApiQueueService {
|
|
1000
|
+
constructor() {
|
|
1001
|
+
this._destroy$ = new Subject();
|
|
1002
|
+
this.queue = [];
|
|
1003
|
+
this.isProcessing = false;
|
|
1004
|
+
this.queueSubject = new SmartSubject(this._destroy$);
|
|
1005
|
+
this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
|
|
1006
|
+
}
|
|
1007
|
+
ngOnDestroy() {
|
|
1008
|
+
this._destroy$.next();
|
|
1009
|
+
this._destroy$.complete();
|
|
1010
|
+
}
|
|
1011
|
+
addToQueue(call, priority = false) {
|
|
1012
|
+
if (priority) {
|
|
1013
|
+
this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
|
|
1014
|
+
}
|
|
1015
|
+
else {
|
|
1016
|
+
this.queue.push(call); // Add at the end of the queue if it has lower priority
|
|
1017
|
+
}
|
|
1018
|
+
if (!this.isProcessing) {
|
|
1019
|
+
this.processQueue();
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
async processQueue() {
|
|
1023
|
+
if (this.queue.length === 0) {
|
|
1024
|
+
this.isProcessing = false;
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
const apiQueueCall = this.queue.shift();
|
|
1028
|
+
if (apiQueueCall) {
|
|
1029
|
+
await apiQueueCall.callback(apiQueueCall.config);
|
|
1030
|
+
apiQueueCall.isCompleted.complete();
|
|
1031
|
+
this.queueSubject.next();
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1035
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, providedIn: 'root' }); }
|
|
1036
|
+
}
|
|
1037
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, decorators: [{
|
|
1038
|
+
type: Injectable,
|
|
1039
|
+
args: [{
|
|
1040
|
+
providedIn: 'root',
|
|
1041
|
+
}]
|
|
1042
|
+
}], ctorParameters: () => [] });
|
|
1043
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUlkLFFBQVEsR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEVBT0wsY0FBYyxFQVdkLFNBQVMsRUFFVCxRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQVNuRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUNMLDZCQUE2QixHQUU5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQUV4RSxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyx3Q0FBd0MsQ0FBQztBQUMvRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FB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VSxDQUFDLElBQWtCLEVBQUUsV0FBb0IsS0FBSztRQUN0RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw4REFBOEQ7UUFDMUYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHVEQUF1RDtRQUNoRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNoQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDOytHQXRDVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBtb2RlbCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgfSBmcm9tICcuLi9zbWFydC1mb3JtL3NtYXJ0Zm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBTbWFydFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi9zbWFydC1zZXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ2xpcGJvYXJkRGF0YSxcbiAgQ29tcG9uZW50TW9kZWwsXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxuICBEYXRhQ2hhbmdlLFxuICBEb3dubG9hZGVkRmlsZSxcbiAgTGluayxcbiAgTGlua1RhcmdldEVudW0sXG4gIE1lc3NhZ2VEYXRhLFxuICBNZXNzYWdlUmVzdWx0LFxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXG4gIFVpQWN0aW9uUmVxdWVzdCxcbiAgVmlld0NvbnN0cmFpbnQsXG4gIFZpZXdDb250ZXh0Q2hhbmdlLFxuICBWaWV3Q29udGV4dERhdGEsXG4gIFZpZXdDb250ZXh0VXBkYXRlLFxuICBWaWV3RGF0YSxcbiAgVmlld1NlcnZpY2UsXG4gIFZpZXdTdGF0ZSxcbiAgVmlld1N0YXRlVXBkYXRlLFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgTWVzc2FnZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWVzc2FnZS1kaWFsb2cvbWVzc2FnZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFNtYXJ0RW1iZWRkZWRWaWV3UmVmLFxuICBTbWFydFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcixcbiAgU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyxcbiAgU21hcnRWaWV3RGlhbG9nUmVmLFxuICBTbWFydFZpZXdIYW5kbGVyTW9kZWwsXG59IGZyb20gJy4vc21hcnQtdmlldy1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7IFNtYXJ0U3ViamVjdCB9IGZyb20gJy4uL3NtYXJ0LXN1YmplY3QvcHJvamVjdHMnO1xuaW1wb3J0IHsgU21hcnRWaWV3Q29udGV4dERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3NtYXJ0LXZpZXctY29udGV4dC1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBDT01QT05FTlRfTElCUkFSWSwgQ29tcG9uZW50TGlicmFyeSB9IGZyb20gJy4vdXRpbGl0eS9jb21wb25lbnRMaWJyYXJ5JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHJlc29sdmVTbG90IH0gZnJvbSAnLi92aWV3LXNsb3QtcmVzb2x1dGlvbic7XG5pbXBvcnQge1xuICBTTUFSVF9ERUZBVUxUX1ZJRVdfQ09NUE9ORU5UUyxcbiAgRGVmYXVsdFZpZXdDb21wb25lbnRFbnRyeSxcbn0gZnJvbSAnLi9kZWZhdWx0LXZpZXctY29tcG9uZW50cy50b2tlbic7XG5pbXBvcnQgeyByZXNvbHZlVmlld0hhbmRsZXIgfSBmcm9tICcuL3ZpZXctaGFuZGxlci1yZXNvbHV0aW9uJztcbmltcG9ydCB7IGJ1aWxkVmlld09wcyB9IGZyb20gJy4vdmlldy1vcCc7XG5pbXBvcnQgeyBSRVVTRV9ST1VURVJfU0xPVF9DT01QT05FTlQgfSBmcm9tICcuL3JldXNlLXJvdXRlci1zbG90LnRva2VuJztcblxuZXhwb3J0IGNvbnN0IFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ0J1dHRvbkxhYmVsID0gJ1NtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ0J1dHRvbkxhYmVsJztcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSc7XG5leHBvcnQgY29uc3QgU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nTWVzc2FnZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlJztcbmV4cG9ydCBjb25zdCBEZWZhdWx0VWlBY3Rpb25Db2RlX0NMT1NFID0gJ0RFRkFVTFRfQ0xPU0UnO1xuXG5leHBvcnQgY29uc3QgRElBTE9HX0RJU0FCTEVfQ0xPU0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oJ2RpYWxvZ0Rpc2FibGVDbG9zZScpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU21hcnRWaWV3Q29udGV4dFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250ZXh0VXVpZE5hbWU6IHN0cmluZyA9ICd2aWV3Q29udGV4dFV1aWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250ZXh0VXVpZEhlYWRlck5hbWU6IHN0cmluZyA9ICd2aWV3Q29udGV4dFV1aWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VOYW1lUHJlZml4OiBzdHJpbmcgPSAncGFnZS4nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudE5hbWVQcmVmaXg6IHN0cmluZyA9ICdjb21wb25lbnQuJztcbiAgcHVibGljIG1lc3NhZ2VEaWFsb2duYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXJsPzogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdDb250ZXh0PzogVmlld0NvbnRleHREYXRhO1xuICBwcml2YXRlIHZpZXdIYW5kbGVyczogQXJyYXk8U21hcnRWaWV3SGFuZGxlck1vZGVsPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIGRlZmF1bHRDb21wb25lbnRzOiBNYXA8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdVdWlkczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdEYXRhOiBBcnJheTxWaWV3RGF0YT4gPSBuZXcgQXJyYXkoKTtcbiAgLy8gTW9ub3RvbmljIGNvdW50ZXIgYnVtcGVkIG9uIGV2ZXJ5IHN1Y2Nlc3NmdWwgc3RhcnRWaWV3Q29udGV4dCgpLiBDYWxsZXJzXG4gIC8vIHRoYXQgaG9sZCBhIHJlZmVyZW5jZSB0byBhIHZpZXctdXVpZCBmcm9tIGEgcHJldmlvdXMgdmlld2NvbnRleHQgY2FuXG4gIC8vIGRldGVjdCBhIHJlYnVpbGQgYnkgY29tcGFyaW5nIHNuYXBzaG90cyBvZiB0aGlzIHZhbHVlLlxuICBwcml2YXRlIGdlbmVyYXRpb246IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgdXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcbiAgcHVibGljIHZpZXdDb250ZXh0SGFzQmVlblN5bmNlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xuICBwcml2YXRlIGluaXRpYWxpemVSdW5uaW5nOiBTdWJqZWN0PFZpZXdDb250ZXh0RGF0YT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaW5pdGlOZXdDb250ZXh0UnVubmluZzogU3ViamVjdDx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycz86IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnM7XG5cbiAgcHVibGljIG9wZW5TbWFydExpbms6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xuICBwdWJsaWMgaXNPcGVuaW5nU21hcnRMaW5rOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xuXG4gIHByaXZhdGUgZW1iZWRkZWRDb250YWluZXJzOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBWaWV3Q29udGFpbmVyUmVmPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgZW1iZWRkZWRWaWV3UmVmczogU21hcnRFbWJlZGRlZFZpZXdSZWZbXSA9IFtdO1xuICBwcml2YXRlIHBlbmRpbmdFbWJlZGRlZFZpZXdzOiBWaWV3RGF0YVtdID0gW107XG5cbiAgcHJpdmF0ZSBhY3Rpb25EZXNjcmlwdG9ycz86IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj47XG5cbiAgcHJpdmF0ZSBtb2R1bGVVcmxzQnlNb2R1bGU/OiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIHB1YmxpYyBjb21tb25GZWVkYmFja1RleHQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHNtYXJ0QXBpQ2xpZW50czogTWFwPHN0cmluZywgU21hcnRTdWJqZWN0PGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBzZXQgdHJhbnNsYXRlU2VydmljZSh0cmFuc2xhdGVTZXJ2aWNlOiBTbWFydFRyYW5zbGF0ZVNlcnZpY2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdHJhbnNsYXRlU2VydmljZTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVNlcnZpY2UoKTogU21hcnRUcmFuc2xhdGVTZXJ2aWNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fdHJhbnNsYXRlU2VydmljZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2U7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlPzogU21hcnRUcmFuc2xhdGVTZXJ2aWNlO1xuICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcblxuICBwdWJsaWMgY29tcG9uZW50TGlicmFyeTogQ29tcG9uZW50TGlicmFyeSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXc6IFZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Vzc2lvbjogU21hcnRTZXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogU21hcnRWaWV3Q29udGV4dERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcGlRdWV1ZVNlcnZpY2U6IEFwaVF1ZXVlU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdDogSW5qZWN0b3IsXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgQE9wdGlvbmFsKCkgY29tcExpYj86IENvbXBvbmVudExpYnJhcnksXG4gICAgQEluamVjdChTTUFSVF9ERUZBVUxUX1ZJRVdfQ09NUE9ORU5UUylcbiAgICBAT3B0aW9uYWwoKVxuICAgIGRlZmF1bHRWaWV3Q29tcG9uZW50cz86IERlZmF1bHRWaWV3Q29tcG9uZW50RW50cnlbXVxuICApIHtcbiAgICB0aGlzLmNvbXBvbmVudExpYnJhcnkgPSBjb21wTGliO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVmYXVsdFZpZXdDb21wb25lbnRzID8/IFtdKSB7XG4gICAgICB0aGlzLmRlZmF1bHRDb21wb25lbnRzLnNldChlbnRyeS5jb21wb25lbnROYW1lLCBlbnRyeS5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGZvbGxvdyh1dWlkOiBzdHJpbmcsIGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnNtYXJ0QXBpQ2xpZW50cy5zZXQodXVpZCwgZGV0ZWN0Q2hhbmdlKTtcbiAgfVxuICBwdWJsaWMgdW5mb2xsb3codXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuZGVsZXRlKHV1aWQpO1xuICB9XG5cbiAgcmVnaXN0ZXJFbWJlZGRlZFNsb3QoY29udGFpbmVyVXVpZDogc3RyaW5nLCBjb250YWluZXJJZDogc3RyaW5nLCB2Y1JlZjogVmlld0NvbnRhaW5lclJlZik6IHZvaWQge1xuICAgIGxldCBpbm5lck1hcCA9IHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKTtcbiAgICBpZiAoIWlubmVyTWFwKSB7XG4gICAgICBpbm5lck1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuZW1iZWRkZWRDb250YWluZXJzLnNldChjb250YWluZXJVdWlkLCBpbm5lck1hcCk7XG4gICAgfVxuICAgIGlubmVyTWFwLnNldChjb250YWluZXJJZCwgdmNSZWYpO1xuXG4gICAgLy8gUmVhdHRhY2ggZW1iZWRkZWQgdmlld3MgdGhhdCB3ZXJlIGRldGFjaGVkIGJlZm9yZSBsYXlvdXQgcmUtcmVuZGVyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKFxuICAgICAgKHJlZikgPT4gcmVmLmNvbnRhaW5lclV1aWQgPT09IGNvbnRhaW5lclV1aWQgJiYgcmVmLmNvbnRhaW5lcklkID09PSBjb250YWluZXJJZFxuICAgICk7XG4gICAgZm9yIChjb25zdCByZWYgb2YgZXhpc3RpbmcpIHtcbiAgICAgIGlmICghcmVmLmNvbXBvbmVudFJlZi5ob3N0Vmlldy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdmNSZWYuaW5zZXJ0KHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYWluIHBlbmRpbmcgcXVldWUgKG1hdGNoIG9uIHRoZSByZXNvbHZlZCBzbG90LCBzbyByb3V0ZXItc2xvdCBOT1JNQUwgdmlld3MgbWF0Y2ggdG9vKVxuICAgIGNvbnN0IG1hdGNoZXMgPSAodjogVmlld0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IHMgPSByZXNvbHZlU2xvdCh2KTtcbiAgICAgIHJldHVybiBzLmNvbnRhaW5lclV1aWQgPT09IGNvbnRhaW5lclV1aWQgJiYgcy5jb250YWluZXJJZCA9PT0gY29udGFpbmVySWQ7XG4gICAgfTtcbiAgICBjb25zdCBtYXRjaGluZyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKG1hdGNoZXMpO1xuICAgIHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MgPSB0aGlzLnBlbmRpbmdFbWJlZGRlZFZpZXdzLmZpbHRlcigodikgPT4gIW1hdGNoZXModikpO1xuXG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXM6IChWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQpW10gPSBtYXRjaGluZy5tYXAoKHYpID0+IHRoaXMub3BlblZpZXcodikpO1xuICAgICAgdGhpcy5zZW5kVmlld0NvbnRleHRVcGRhdGVzKHVwZGF0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIGRldGFjaEFsbEVtYmVkZGVkVmlld3MoY29udGFpbmVyVXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoY2hpbGQuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZjUmVmID0gdGhpcy5nZXRFbWJlZGRlZFNsb3QoY29udGFpbmVyVXVpZCwgY2hpbGQuY29udGFpbmVySWQpO1xuICAgICAgaWYgKHZjUmVmKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHZjUmVmLmluZGV4T2YoY2hpbGQuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgdmNSZWYuZGV0YWNoKGlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbGVhbnVwT3JwaGFuZWRFbWJlZGRlZFZpZXdzKGNvbnRhaW5lclV1aWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9ycGhhbmVkID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiB7XG4gICAgICBpZiAocmVmLmNvbnRhaW5lclV1aWQgIT09IGNvbnRhaW5lclV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmNSZWYgPSB0aGlzLmdldEVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkLCByZWYuY29udGFpbmVySWQpO1xuICAgICAgcmV0dXJuICF2Y1JlZiB8fCB2Y1JlZi5pbmRleE9mKHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpIDwgMDtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBvcnBoYW5lZCkge1xuICAgICAgaWYgKCFyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICByZWYuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3BlbmVkVmlld1V1aWRzLmluZGV4T2YocmVmLnV1aWQpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+ICFvcnBoYW5lZC5pbmNsdWRlcyhyZWYpKTtcbiAgfVxuXG4gIGdldENvbXBvc2l0ZU1vZGVsKGNvbnRhaW5lclV1aWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgcmVzdWx0W2NoaWxkLnV1aWRdID0gY2hpbGQuY29tcG9uZW50UmVmLmluc3RhbmNlLmdldE1vZGVsKCk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgdGhpcy5nZXRDb21wb3NpdGVNb2RlbChjaGlsZC51dWlkKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdWJtaXRFbWJlZGRlZEZvcm1zKGNvbnRhaW5lclV1aWQ6IHN0cmluZywgdmFsaWRhdGU6IGJvb2xlYW4pOiBTbWFydEZvcm1JbnZhbGlkRmllbGRzIHtcbiAgICBjb25zdCBhbGxJbnZhbGlkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhbGxJbnZhbGlkTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNoaWxkLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIGluc3RhbmNlLnN1Ym1pdEZvcm0odmFsaWRhdGUpO1xuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgPSBpbnN0YW5jZS5nZXRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgIGFsbEludmFsaWRLZXlzLnB1c2goLi4uaW52YWxpZC5pbnZhbGlkRmllbGRLZXlzKTtcbiAgICAgICAgYWxsSW52YWxpZE5hbWVzLnB1c2goLi4uaW52YWxpZC5pbnZhbGlkRmllbGROYW1lcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLnN1Ym1pdEVtYmVkZGVkRm9ybXMoY2hpbGQudXVpZCwgdmFsaWRhdGUpO1xuICAgICAgYWxsSW52YWxpZEtleXMucHVzaCguLi5uZXN0ZWQuaW52YWxpZEZpZWxkS2V5cyk7XG4gICAgICBhbGxJbnZhbGlkTmFtZXMucHVzaCguLi5uZXN0ZWQuaW52YWxpZEZpZWxkTmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4geyBpbnZhbGlkRmllbGRLZXlzOiBhbGxJbnZhbGlkS2V5cywgaW52YWxpZEZpZWxkTmFtZXM6IGFsbEludmFsaWROYW1lcyB9O1xuICB9XG5cbiAgdW5yZWdpc3RlckVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkOiBzdHJpbmcsIGNvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbm5lck1hcCA9IHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKTtcbiAgICBpZiAoaW5uZXJNYXApIHtcbiAgICAgIGlubmVyTWFwLmRlbGV0ZShjb250YWluZXJJZCk7XG4gICAgICBpZiAoaW5uZXJNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmVtYmVkZGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVyVXVpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbWJlZGRlZFNsb3QoXG4gICAgY29udGFpbmVyVXVpZDogc3RyaW5nLFxuICAgIGNvbnRhaW5lcklkOiBzdHJpbmdcbiAgKTogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKT8uZ2V0KGNvbnRhaW5lcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHZpZXcncyBjb21wb25lbnQgaW50byBpdHMgcmVzb2x2ZWQgc2xvdC4gUmV0dXJucyBmYWxzZSBhbmQgcXVldWVzXG4gICAqIHRoZSB2aWV3IGlmIHRoZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldCAoZHJhaW5lZCBvbiByZWdpc3RyYXRpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnNlcnRWaWV3SW50b1Nsb3QodmlldzogVmlld0RhdGEsIGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBjb250YWluZXJVdWlkLCBjb250YWluZXJJZCB9ID0gcmVzb2x2ZVNsb3Qodmlldyk7XG4gICAgY29uc3QgdmNSZWYgPSB0aGlzLmdldEVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkLCBjb250YWluZXJJZCk7XG4gICAgaWYgKCF2Y1JlZikge1xuICAgICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2Y1JlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudXVpZCA9IHZpZXcudXVpZDtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucnVuKCk7XG4gICAgdGhpcy5lbWJlZGRlZFZpZXdSZWZzLnB1c2goeyB1dWlkOiB2aWV3LnV1aWQsIGNvbnRhaW5lclV1aWQsIGNvbnRhaW5lcklkLCBjb21wb25lbnRSZWYgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aW9uRGVzY3JpcHRvcnMoYWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkRlc2NyaXB0b3JzID0gYWN0aW9uRGVzY3JpcHRvcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aW9uRGVzY3JpcHRvcnMoKTogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbkRlc2NyaXB0b3JzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBhY3Rpb24gZGVzY3JpcHRvcnMgaGFzIGJlZW4gc2V0IHRvIFZpZXdDb250ZXh0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hY3Rpb25EZXNjcmlwdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWV3SGFuZGxlcnModmlld0hhbmRsZXJzOiBBcnJheTxTbWFydFZpZXdIYW5kbGVyTW9kZWw+KTogdm9pZCB7XG4gICAgdGhpcy52aWV3SGFuZGxlcnMgPSB2aWV3SGFuZGxlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0Vmlld0FwaUVycm9ycyh2aWV3QXBpRXJyb3JzOiBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzKTogdm9pZCB7XG4gICAgdGhpcy5zbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzID0gdmlld0FwaUVycm9ycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZXNzYWdlRGlhbG9nTmFtZShtZXNzYWdlRGlhbG9nTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSA9IG1lc3NhZ2VEaWFsb2dOYW1lO1xuICAgIHRoaXMudmlld0hhbmRsZXJzLnB1c2goe1xuICAgICAgbmFtZTogbWVzc2FnZURpYWxvZ05hbWUsXG4gICAgICBjb21wb25lbnQ6IE1lc3NhZ2VEaWFsb2dDb21wb25lbnQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFVwVXJsRm9yVmlld1NlcnZpY2UoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSB0aGlzLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2R1bGVVUkwobW9kdWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5tb2R1bGVVcmxzQnlNb2R1bGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlc01hcCBkb2VzIG5vdCBleGlzdC4nKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZVVybCA9IHRoaXMubW9kdWxlVXJsc0J5TW9kdWxlPy5nZXQobW9kdWxlKTtcblxuICAgIGlmICghbW9kdWxlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZVVybCBkb2VzIG5vdCBleGlzdCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUuJyk7XG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVVcmw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kdWxlVVJMKG1vZHVsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1vZHVsZVVybHNCeU1vZHVsZSA9IG1vZHVsZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cmwgPSB1cmwgKyAnL3ZpZXcnO1xuICAgIHRoaXMuc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFuZFN5bmNWaWV3Q29udGV4dCh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY1ZpZXcoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29udGV4dCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YT4ge1xuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Vmlld0NvbnRleHQodXVpZCkudG9Qcm9taXNlKCk7XG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXdDb250ZXh0IGRvZXMgbm90IGV4aXN0IHdpdGggdGhlIGdpdmVuIHV1aWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFZpZXdDb250ZXh0RGF0YUJ5UGFnZU5hbWUocGFnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Vmlld0RhdGE+IHtcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKSk7XG4gICAgfVxuICAgIGxldCBwYWdlVXVpZCA9IHRoaXMuZ2V0VXVpZE9mUGFnZShwYWdlTmFtZSk7XG5cbiAgICBsZXQgdmlld0NvbnRleHRCeVBhZ2VOYW1lID0gdGhpcy52aWV3Q29udGV4dD8udmlld3MuZmluZCgodmlldykgPT4gdmlldy51dWlkID09PSBwYWdlVXVpZCk7XG4gICAgaWYgKCF2aWV3Q29udGV4dEJ5UGFnZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFZpZXdEYXRhIG9mICR7cGFnZU5hbWV9IGlzIG5vdCBmb3VuZCFgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdDb250ZXh0QnlQYWdlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3Q29udGV4dChcbiAgICB2aWV3Q29udGV4dFVwZGF0ZTogVmlld0NvbnRleHRVcGRhdGVcbiAgKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICB2aWV3Q29udGV4dFVwZGF0ZS5kZXZpY2VJbmZvID8/PSB7XG4gICAgICBkZXZpY2VJZDogJ2lkJyxcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHBhcmFtZXRlcnM6IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHZpZXdDb250ZXh0VXBkYXRlLmRldmljZUluZm8uY29tcG9uZW50TGlicmFyeSA9IHRoaXMuY29tcG9uZW50TGlicmFyeTtcblxuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcudXBkYXRlVmlld0NvbnRleHQodmlld0NvbnRleHRVcGRhdGUpLnRvUHJvbWlzZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2Vzc2lvblN0b3JhZ2UoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcbiAgICB0aGlzLmNsZWFyRW1iZWRkZWRWaWV3cygpO1xuICAgIHRoaXMub3BlbmVkVmlld0RhdGEgPSBbXTtcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXIgZG93biBhbGwgc2xvdC1ob3N0ZWQgdmlldyBjb21wb25lbnRzIG9uIGEgdmlld0NvbnRleHQgcmVzZXQgKGUuZy4gbG9nb3V0IC9cbiAgICogdmlld2NvbnRleHQtbG9zdCkuIFdpdGhvdXQgdGhpcyB0aGUgcHJldmlvdXMgdmlldyB0cmVlIHN0YXlzIG1vdW50ZWQgaW4gdGhlIHJvb3RcbiAgICogc2xvdCBhbmQgdGhlIG5ldyB0cmVlIGlzIGFwcGVuZGVkIGFsb25nc2lkZSBpdC4gRGVzdHJveWluZyBhIHBhcmVudCBjYXNjYWRlcyB0b1xuICAgKiBpdHMgbmVzdGVkIHNsb3QgZGlyZWN0aXZlcyAod2hpY2ggdW5yZWdpc3RlciB0aGVpciBjb250YWluZXJzIHZpYSBuZ09uRGVzdHJveSksXG4gICAqIGxlYXZpbmcgb25seSB0aGUgaG9zdC1vd25lZCByb290IHNsb3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgY2xlYXJFbWJlZGRlZFZpZXdzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXMuZW1iZWRkZWRWaWV3UmVmcykge1xuICAgICAgaWYgKCFyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICByZWYuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbWJlZGRlZFZpZXdSZWZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Vmlld0NvbnRleHQoKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcbiAgICB0aGlzLmNsZWFyU2Vzc2lvblN0b3JhZ2UoKTtcbiAgICB0aGlzLnNlc3Npb24uYWRkSGVhZGVyUGFyYW0oe1xuICAgICAgaGVhZGVyTmFtZTogdGhpcy52aWV3Q29udGV4dFV1aWRIZWFkZXJOYW1lLFxuICAgICAgdmFsdWU6ICcnLFxuICAgIH0pO1xuXG4gICAgbGV0IG5ld1ZpZXdDb250ZXh0OiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnZpZXdcbiAgICAgIC5jcmVhdGVWaWV3Q29udGV4dCgpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgaWYgKCFuZXdWaWV3Q29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBWaWV3Q29udGV4dCB3YXMgY3JlYXRlZCcpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gbmV3Vmlld0NvbnRleHQ7XG4gICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQobmV3Vmlld0NvbnRleHQudXVpZCEpO1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0R2VuZXJhdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRpb247XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplUnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcudG9Qcm9taXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcgPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdIYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZXJlIGFyZW4ndCBhbnkgdmlld0hhbmRsZXJzIGluIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlISBQcm92aWRlIHNvbWUgdG8gdXNlIGl0cyBmdW5jdGlvbnMuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG1lc3NhZ2VEaWFsb2dOYW1lIHByb3ZpZGVkIGJ5IHRoZSBiYWNrZW5kIGhhcyBub3QgYmVlbiBzZXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV1aWQpIHtcbiAgICAgICAgICB0aGlzLnNldFZpZXdDb250ZXh0VXVpZCh1dWlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0ITtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcubmV4dCh0aGlzLnZpZXdDb250ZXh0ISk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplUnVubmluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5pdFZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB1dWlkO1xuICAgIHRyeSB7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKHV1aWQpO1xuICAgIGF3YWl0IHRoaXMucmVzdG9yZVZpZXdzKHV1aWQpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QW5kU3luY1ZpZXdDb250ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogSHlkcmF0ZXMgdGhlIHZpZXctY29udGV4dCBzdGF0ZSBmcm9tIGFuIGFscmVhZHktZXhpc3RpbmcgVVVJRCBwcm92aWRlZFxuICAgKiBleHRlcm5hbGx5IChlLmcuIGJ5IGEgbmF0aXZlIG1vYmlsZSBzaGVsbCB2aWEgVVJMIGZyYWdtZW50KS4gVW5saWtlXG4gICAqIGBpbml0aWFsaXplKHV1aWQpYCwgdGhpcyBtZXRob2QgZG9lcyBOT1QgZmFsbCBiYWNrIHRvIGNyZWF0aW5nIGEgZnJlc2hcbiAgICogdmlld0NvbnRleHQgaWYgdGhlIGJhY2tlbmQgcmVqZWN0cyB0aGUgVVVJRCDigJQgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0b1xuICAgKiBzdXJmYWNlIHRoZSBmYWlsdXJlICh0eXBpY2FsbHkgdmlhIHRoZSBib290c3RyYXAncyBgb25TdGFydEVycm9yYCBob29rKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0RnJvbUV4aXN0aW5nVmlld0NvbnRleHQodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQodXVpZCk7XG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVWaWV3cyh1dWlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0TmV3Vmlld0NvbnRleHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZy50b1Byb21pc2UoKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgICAgbGV0IHV1aWQgPSB0aGlzLmdldFZpZXdDb250ZXh0VXVpZCgpO1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKHV1aWQpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVmlld3ModXVpZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZy5uZXh0KCk7XG4gICAgICB0aGlzLmluaXRpTmV3Q29udGV4dFJ1bm5pbmcuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlblZpZXcodmlldzogVmlld0RhdGEpOiBWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBhbHJlYWR5T3BlbmVkID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuc29tZSgodXVpZCkgPT4gdXVpZCA9PT0gdmlldy51dWlkKTtcbiAgICBpZiAoYWxyZWFkeU9wZW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHZpZXdIYW5kbGVyID0gcmVzb2x2ZVZpZXdIYW5kbGVyKHRoaXMudmlld0hhbmRsZXJzLCB0aGlzLmRlZmF1bHRDb21wb25lbnRzLCB2aWV3KTtcblxuICAgIGlmICghdmlld0hhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3YXMgbm90IGZvdW5kIGJ5IHZpZXcgbmFtZTogJHt2aWV3LnZpZXdOYW1lfSAoY29tcG9uZW50TmFtZTogJHt2aWV3LmNvbXBvbmVudE5hbWV9KWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkRJQUxPRykge1xuICAgICAgaWYgKCF2aWV3SGFuZGxlci5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcmVmSXNBbHJhZHlBZGRlZCA9IHRoaXMuZGlhbG9nUmVmcy5zb21lKFxuICAgICAgICAocmVmOiBTbWFydFZpZXdEaWFsb2dSZWYpID0+IHJlZi51dWlkID09PSB2aWV3LnV1aWRcbiAgICAgICk7XG4gICAgICBpZiAoIXJlZklzQWxyYWR5QWRkZWQpIHtcbiAgICAgICAgbGV0IGRpYWxvZ1JlZjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKHZpZXcudXVpZCk7XG4gICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKHZpZXcpO1xuICAgICAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW5Db21wb25lbnRBc0RpYWxvZyhcbiAgICAgICAgICAgIHZpZXdIYW5kbGVyLmNvbXBvbmVudCxcbiAgICAgICAgICAgIHZpZXdIYW5kbGVyLm5hbWUsXG4gICAgICAgICAgICB2aWV3LnV1aWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclV1aWRPZlBhZ2Uodmlldy52aWV3TmFtZSwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpYWxvZ0Rpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICAgIGxldCBpc01lc3NhZ2VEaWFsb2cgPSB2aWV3LnZpZXdOYW1lID09PSB0aGlzLm1lc3NhZ2VEaWFsb2duYW1lO1xuICAgICAgICBpZiAoIWlzTWVzc2FnZURpYWxvZykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkaWFsb2dEaXNhYmxlQ2xvc2UgPSB0aGlzLmluamVjdC5nZXQoRElBTE9HX0RJU0FCTEVfQ0xPU0UpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHJlYWRpbmcgRElBTE9HX0RJU0FCTEVfQ0xPU0UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ1JlZiBpbnN0YW5jZW9mIE1hdERpYWxvZ1JlZikge1xuICAgICAgICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSBkaWFsb2dEaXNhYmxlQ2xvc2U7XG4gICAgICAgICAgLy8gaWYgKGlzTWVzc2FnZURpYWxvZykge1xuICAgICAgICAgIC8vICAgaWYgKHZpZXcubWVzc2FnZT8ub3B0aW9ucyAmJiB2aWV3Lm1lc3NhZ2Uub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcbiAgICAgICAgICAgIGRpYWxvZ1JlZlxuICAgICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaWFsb2dSZWYgaW5zdGFuY2VvZiBEeW5hbWljRGlhbG9nUmVmKSB7XG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5vbkRlc3Ryb3kucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpYWxvZ1JlZnMucHVzaCh7XG4gICAgICAgICAgdXVpZDogdmlldy51dWlkLFxuICAgICAgICAgIGRpYWxvZ1JlZixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLk5PUk1BTCkge1xuICAgICAgaWYgKCF2aWV3SGFuZGxlci5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIENPTVBBVElCSUxJVFkgU0hJTSAoIzI4ODcwLCBpbnRlbnRpb25hbCk6IHNvbWUgY2hpbGQgc2VydmljZXMgKFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlLFxuICAgICAgLy8gU21hcnRGaWx0ZXJFZGl0b3JTZXJ2aWNlKSBhbmQgZ2VuZXJpYyBjb21wb25lbnRzIChTZWFyY2hQYWdlQ29tcG9uZW50LCBHZW5lcmljUGFnZUNvbXBvbmVudClcbiAgICAgIC8vIHN0aWxsIHJlc29sdmUgdGhlaXIgdmlldyB1dWlkIHZpYSB0aGUgcGFnZU5hbWUgLT4gZ2V0VXVpZE9mUGFnZShzZXNzaW9uU3RvcmFnZSkgaW5kaXJlY3Rpb25cbiAgICAgIC8vIGluIHRoZWlyIENPTlNUUlVDVE9SLCB3aGljaCBydW5zIGluc2lkZSBjcmVhdGVDb21wb25lbnQoKSBiZWxvdyDigJQgYmVmb3JlIG9wZW5WaWV3J3Mgbm9ybWFsXG4gICAgICAvLyBib29ra2VlcGluZy4gU28gdGhlIG1hcHBpbmcgbXVzdCBiZSB3cml0dGVuIGhlcmUsIGFoZWFkIG9mIGNvbXBvbmVudCBjcmVhdGlvbi4gVGhlIHByb3BlclxuICAgICAgLy8gZml4IChmZWVkIHRob3NlIGNvbnN1bWVycyB0aGUgaW5qZWN0ZWQgdXVpZCArIGRlZmVyIHRoZWlyIGluaXQpIGlzIGRlZmVycmVkIGNvbnN1bWVyIHBsdW1iaW5nO1xuICAgICAgLy8gdW50aWwgdGhlbiB0aGlzIHdyaXRlIGtlZXBzIHRoZSBpbmRpcmVjdGlvbiBjb3JyZWN0IGluIHRoZSBzbG90IHdvcmxkLlxuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAvLyBBIE5PUk1BTCB2aWV3IHdpdGggbm8gY29udGFpbmVyVXVpZCBsYW5kcyBpbiB0aGUgaG9zdCByb290IHNsb3QgKHJlc29sdmVTbG90IG1hcHNcbiAgICAgIC8vIGl0IHRvIFJPT1RfQ09OVEFJTkVSX1VVSUQpOyBpZiBubyBzbG90IGlzIHJlZ2lzdGVyZWQgeWV0IGl0IHF1ZXVlcyBhbmQgZHJhaW5zIGxhdGVyLlxuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLmluc2VydFZpZXdJbnRvU2xvdCh2aWV3LCB2aWV3SGFuZGxlci5jb21wb25lbnQpO1xuICAgICAgaWYgKCFpbnNlcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIGlmICghdmlld0hhbmRsZXIuY29tcG9uZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tcG9uZW50IGlzIHVuZGVmaW5lZCBpbiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2l0aCBuYW1lOiAke3ZpZXcudmlld05hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gV3JpdGUgdGhlIHBhZ2UtdXVpZCBtYXBwaW5nIGFoZWFkIG9mIGNvbXBvbmVudCBjcmVhdGlvbiBzbyBjb25zdHJ1Y3Rvci10aW1lXG4gICAgICAvLyBhbmQgbmVzdGVkIGdldFV1aWRPZlBhZ2Uodmlld05hbWUpIGNvbnN1bWVycyAoZmlsdGVyLCB0cmVlKSByZXNvbHZlLiBUaGVcbiAgICAgIC8vIHBhZ2UuPHZpZXdOYW1lPiBrZXkgaXMgZGlzdGluY3QgcGVyIHZpZXcsIHNvIGl0IG5ldmVyIGNvbGxpZGVzLiBUaGVcbiAgICAgIC8vIGNvbXBvbmVudC48Y29tcG9uZW50TmFtZT4gcmV2ZXJzZSBrZXkgQ0FOIGJlIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXJcbiAgICAgIC8vIGNvbmN1cnJlbnQgZHluYW1pYyB2aWV3IG9mIHRoZSBzYW1lIGRlZmF1bHQgY29tcG9uZW50LCBidXQgaXQgaXMgcmVhZCBvbmx5XG4gICAgICAvLyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvciAocmlnaHQgYWZ0ZXIgdGhpcyB3cml0ZSkgYW5kIHNsb3Qgdmlld3NcbiAgICAgIC8vIGxvYWQgdmlhIHRoZSBpbmplY3RlZCBfdXVpZCBhZnRlcndhcmRzLCBzbyB0aGUgb3ZlcndyaXRlIG5ldmVyIG1pcy1yZXNvbHZlc1xuICAgICAgLy8gYXQgcnVudGltZS4gKCMyODg3MClcbiAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLmluc2VydFZpZXdJbnRvU2xvdCh2aWV3LCB2aWV3SGFuZGxlci5jb21wb25lbnQpO1xuICAgICAgaWYgKCFpbnNlcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHlwZSBvZiB0aGUgdmlldyBhbmQgaXRzIHZpZXdIYW5kbGVyIGlzIG5vdCB0aGUgc2FtZSEnKTtcbiAgICB9XG5cbiAgICB2aWV3LnN0YXRlID0gVmlld1N0YXRlLk9QRU5FRDtcblxuICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnB1c2godmlldy51dWlkKTtcbiAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnB1c2godmlldyk7XG5cbiAgICBpZiAodmlldy50eXBlICE9PSBWaWV3VHlwZS5FTUJFRERFRCkge1xuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogVmlld1N0YXRlLk9QRU5FRCxcbiAgICAgIHV1aWQ6IHZpZXcudXVpZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNsb3NlVmlldyh2aWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcbiAgICBjb25zdCB2aWV3SGFuZGxlciA9IHJlc29sdmVWaWV3SGFuZGxlcih0aGlzLnZpZXdIYW5kbGVycywgdGhpcy5kZWZhdWx0Q29tcG9uZW50cywgdmlldyk7XG5cbiAgICBpZiAoIXZpZXdIYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2FzIG5vdCBmb3VuZCBieSB2aWV3IG5hbWU6ICR7dmlldy52aWV3TmFtZX0gKGNvbXBvbmVudE5hbWU6ICR7dmlldy5jb21wb25lbnROYW1lfSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XG5cbiAgICBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5ESUFMT0cpIHtcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZnMuZmluZChcbiAgICAgICAgKGRpYWxvZ1JlZjogU21hcnRWaWV3RGlhbG9nUmVmKSA9PiBkaWFsb2dSZWYudXVpZCA9PT0gdmlldy51dWlkXG4gICAgICApO1xuICAgICAgaWYgKGRpYWxvZ1JlZikge1xuICAgICAgICBkaWFsb2dSZWYuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGlhbG9nUmVmcy5pbmRleE9mKGRpYWxvZ1JlZik7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RpYWxvZ1JlZiBpcyBub3QgZm91bmQgYnkgdXVpZC4nKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZXMucHVzaCguLi50aGlzLmNsZWFudXBFbWJlZGRlZENoaWxkcmVuKHZpZXcudXVpZCkpO1xuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5OT1JNQUwpIHtcbiAgICAgIC8vIERlc3Ryb3kgbmVzdGVkIGNoaWxkcmVuIGZpcnN0LCB0aGVuIHRoZSB2aWV3J3Mgb3duIHNsb3QgY29tcG9uZW50LlxuICAgICAgLy8gZGVzdHJveVZpZXdSZWYgaXMgYSBuby1vcCBmb3IgdGhlIGxlZ2FjeSByb3V0ZS1yZW5kZXJlZCAocm9vdGxlc3MpIGNhc2UuXG4gICAgICB1cGRhdGVzLnB1c2goLi4udGhpcy5jbGVhbnVwRW1iZWRkZWRDaGlsZHJlbih2aWV3LnV1aWQpKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdSZWYodmlldy51dWlkKTtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdSZWYodmlldy51dWlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHlwZSBvZiB0aGUgdmlldyBhbmQgaXRzIHZpZXdIYW5kbGVyIGlzIG5vdCB0aGUgc2FtZSEnKTtcbiAgICB9XG5cbiAgICB2aWV3LnN0YXRlID0gVmlld1N0YXRlLkNMT1NFRDtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgLy8gQ2xlYXIgZm9yIGV2ZXJ5IHR5cGU6IG9wZW5WaWV3IG5vdyB3cml0ZXMgdGhlIHBhZ2UtdXVpZCBtYXBwaW5nIGZvclxuICAgICAgLy8gRU1CRURERUQgdmlld3MgdG9vICgjMjg4NzApLCBzbyB0aGUgY2xlYXIgbXVzdCBiZSBzeW1tZXRyaWMgdG8gYXZvaWQgYVxuICAgICAgLy8gc3RhbGUgc2Vzc2lvblN0b3JhZ2UgZW50cnkuIGNsZWFyVXVpZE9mUGFnZSBpcyBhIG5vLW9wIGZvciBrZXlzIG5ldmVyXG4gICAgICAvLyB3cml0dGVuLCBzbyB0aGlzIHN0YXlzIHNhZmUgZm9yIHRoZSBsZWdhY3kgcm9vdGxlc3MgY2FzZS5cbiAgICAgIHRoaXMuY2xlYXJVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgIH1cblxuICAgIHVwZGF0ZXMucHVzaCh7XG4gICAgICBzdGF0ZTogVmlld1N0YXRlLkNMT1NFRCxcbiAgICAgIHV1aWQ6IHZpZXcudXVpZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRW1iZWRkZWRDaGlsZHJlbihjb250YWluZXJVdWlkOiBzdHJpbmcpOiBWaWV3U3RhdGVVcGRhdGVbXSB7XG4gICAgY29uc3QgdXBkYXRlczogVmlld1N0YXRlVXBkYXRlW10gPSBbXTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgY2hpbGQuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIHVwZGF0ZXMucHVzaCh7IHN0YXRlOiBWaWV3U3RhdGUuQ0xPU0VELCB1dWlkOiBjaGlsZC51dWlkIH0pO1xuICAgIH1cbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKFxuICAgICAgKHJlZikgPT4gcmVmLmNvbnRhaW5lclV1aWQgIT09IGNvbnRhaW5lclV1aWRcbiAgICApO1xuXG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKFxuICAgICAgKHYpID0+IHYuY29udGFpbmVyVXVpZCAhPT0gY29udGFpbmVyVXVpZFxuICAgICk7XG5cbiAgICB0aGlzLmVtYmVkZGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVyVXVpZCk7XG5cbiAgICByZXR1cm4gdXBkYXRlcztcbiAgfVxuXG4gIC8qKiBEZXN0cm95IHRoZSBjb21wb25lbnQgZm9yIGEgdmlldyBsaXZpbmcgaW4gYSBzbG90LCBpZiBwcmVzZW50IChuby1vcCBmb3Igcm91dGUtcmVuZGVyZWQgdmlld3MpLiAqL1xuICBwcml2YXRlIGRlc3Ryb3lWaWV3UmVmKHV1aWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlZkluZGV4ID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbmRJbmRleCgocmVmKSA9PiByZWYudXVpZCA9PT0gdXVpZCk7XG4gICAgaWYgKHJlZkluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmc1tyZWZJbmRleF0uY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5zcGxpY2UocmVmSW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdFbWJlZGRlZFZpZXdzID0gdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5maWx0ZXIoKHYpID0+IHYudXVpZCAhPT0gdXVpZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRWaWV3Q29udGV4dFVwZGF0ZXModXBkYXRlc1RvU2VuZDogKFZpZXdTdGF0ZVVwZGF0ZSB8IHVuZGVmaW5lZClbXSkge1xuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XG4gICAgdXBkYXRlc1RvU2VuZC5mb3JFYWNoKCh1cGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGUgIT09IG51bGwpIHVwZGF0ZXMucHVzaCh1cGRhdGUpO1xuICAgIH0pO1xuICAgIGlmICh1cGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmlld0NvbnRleHQoe1xuICAgICAgICB1cGRhdGVzLFxuICAgICAgICB1dWlkOiB0aGlzLnZpZXdDb250ZXh0Py51dWlkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhc3luYyByZXN0b3JlVmlld3ModXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXBkYXRlczogVmlld1N0YXRlVXBkYXRlW10gPSBbXTtcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodXVpZCk7XG4gICAgfVxuXG4gICAgdGhpcy52aWV3Q29udGV4dCEudmlld3MuZmlsdGVyKFxuICAgICAgKHZpZXcpID0+IHZpZXcuc3RhdGUgPT09IFZpZXdTdGF0ZS5PUEVORUQgfHwgdmlldy5zdGF0ZSA9PT0gVmlld1N0YXRlLlRPX09QRU5cbiAgICApLm1hcCgodmlldzogVmlld0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMub3BlblZpZXcodmlldyk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZXMucHVzaCh1cGRhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV1c2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5qZWN0LmdldChSRVVTRV9ST1VURVJfU0xPVF9DT01QT05FTlQpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBmYWxzZTsgLy8gZGVmYXVsdCBPTiB3aGVuIHVuc2V0L251bGxcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVJldXNlKG9sZFZpZXc6IFZpZXdEYXRhLCBuZXdWaWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmluZCgocikgPT4gci51dWlkID09PSBvbGRWaWV3LnV1aWQpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICAvLyBObyBsaXZlIGNvbXBvbmVudCB0byByZXVzZSAoZS5nLiB3YXMgcm91dGUtcmVuZGVyZWQpIOKAlCBmYWxsIGJhY2sgdG8gY2xvc2UgKyBvcGVuLlxuICAgICAgY29uc3QgdXBkYXRlcyA9IFsuLi50aGlzLmNsb3NlVmlldyhvbGRWaWV3KV07XG4gICAgICBjb25zdCBvcGVuZWQgPSB0aGlzLm9wZW5WaWV3KG5ld1ZpZXcpO1xuICAgICAgaWYgKG9wZW5lZCkgdXBkYXRlcy5wdXNoKG9wZW5lZCk7XG4gICAgICByZXR1cm4gdXBkYXRlcztcbiAgICB9XG4gICAgLy8gVGhlIHJldXNlZCBwYXJlbnQgaXMgbG9naWNhbGx5IGEgZnJlc2ggcGFnZSAobmV3IHV1aWQpOyBpdHMgcHJldmlvdXMgZW1iZWRkZWRcbiAgICAvLyBjaGlsZHJlbiBkbyBub3QgY2Fycnkgb3ZlciAodGhlIGJhY2tlbmQgbGVhdmVzIHRoZW0ga2V5ZWQgdW5kZXIgdGhlIG9sZCBwYXJlbnRcbiAgICAvLyB1dWlkKS4gVGVhciB0aGVtIGRvd24gaGVyZSBhbmQgcmVwb3J0IHRoZW0gQ0xPU0VELlxuICAgIGNvbnN0IGNoaWxkVXBkYXRlcyA9IHRoaXMuY2xlYW51cEVtYmVkZGVkQ2hpbGRyZW4ob2xkVmlldy51dWlkKTtcblxuICAgIHJlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UudXVpZCA9IG5ld1ZpZXcudXVpZDsgLy8gc2V0dGVyIHJ1bnMgdW5mb2xsb3cob2xkKS9mb2xsb3cobmV3KVxuICAgIHJlZi51dWlkID0gbmV3Vmlldy51dWlkO1xuXG4gICAgY29uc3Qgb2xkSWR4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZihvbGRWaWV3LnV1aWQpO1xuICAgIGlmIChvbGRJZHggPj0gMCkge1xuICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMuc3BsaWNlKG9sZElkeCwgMSk7XG4gICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShvbGRJZHgsIDEpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKG5ld1ZpZXcudXVpZCk7XG4gICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKG5ld1ZpZXcpO1xuXG4gICAgcmVmLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5ydW4oKTtcblxuICAgIG9sZFZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuQ0xPU0VEO1xuICAgIG5ld1ZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuT1BFTkVEO1xuXG4gICAgLy8gTWlycm9yIHRoZSBub3JtYWwgb3BlblZpZXcgdGFpbCBzbyBnZXRVdWlkT2ZQYWdlIGNvbnN1bWVycyAoZS5nLiB0cmVlcykgcmVzb2x2ZSB0aGUgbmV3IHV1aWQuXG4gICAgY29uc3Qgdmlld0hhbmRsZXIgPSByZXNvbHZlVmlld0hhbmRsZXIodGhpcy52aWV3SGFuZGxlcnMsIHRoaXMuZGVmYXVsdENvbXBvbmVudHMsIG5ld1ZpZXcpO1xuICAgIHRoaXMuc2V0VXVpZE9mUGFnZShuZXdWaWV3LnZpZXdOYW1lLCBuZXdWaWV3LnV1aWQsIHZpZXdIYW5kbGVyPy5jb21wb25lbnROYW1lKTtcbiAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KG5ld1ZpZXcudmlld05hbWUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmNoaWxkVXBkYXRlcyxcbiAgICAgIHsgc3RhdGU6IFZpZXdTdGF0ZS5DTE9TRUQsIHV1aWQ6IG9sZFZpZXcudXVpZCB9LFxuICAgICAgeyBzdGF0ZTogVmlld1N0YXRlLk9QRU5FRCwgdXVpZDogbmV3Vmlldy51dWlkIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jVmlldygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cGRhdGVzOiAoVmlld1N0YXRlVXBkYXRlIHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgY29uc3Qgb3BzID0gYnVpbGRWaWV3T3BzKHRoaXMudmlld0NvbnRleHQ/LnZpZXdzID8/IFtdLCB0aGlzLnJldXNlRW5hYmxlZCgpKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgaWYgKG9wLmtpbmQgPT09ICdvcGVuJykge1xuICAgICAgICB1cGRhdGVzLnB1c2godGhpcy5vcGVuVmlldyhvcC52aWV3KSk7XG4gICAgICB9IGVsc2UgaWYgKG9wLmtpbmQgPT09ICdjbG9zZScpIHtcbiAgICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xvc2VWaWV3KG9wLnZpZXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZXMucHVzaCguLi50aGlzLmV4ZWN1dGVSZXVzZShvcC5vbGRWaWV3LCBvcC5uZXdWaWV3KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0RhdGFUb0Nsb3NlID0gdGhpcy5vcGVuZWRWaWV3RGF0YS5maWx0ZXIoXG4gICAgICAodmlld0RhdGE6IFZpZXdEYXRhKSA9PlxuICAgICAgICAhdGhpcy52aWV3Q29udGV4dD8udmlld3NcbiAgICAgICAgICAuZmxhdE1hcCgodmlld0RhdGE6IFZpZXdEYXRhKSA9PiB2aWV3RGF0YS51dWlkKVxuICAgICAgICAgIC5pbmNsdWRlcyh2aWV3RGF0YS51dWlkKVxuICAgICk7XG4gICAgaWYgKHZpZXdEYXRhVG9DbG9zZT8ubGVuZ3RoKSB7XG4gICAgICB2aWV3RGF0YVRvQ2xvc2UubWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHtcbiAgICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xvc2VWaWV3KHZpZXdEYXRhKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250ZXh0Py5saW5rcz8ubWFwKChkYXRhOiBMaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgbGV0IHRhcmdldCA9ICdfYmxhbmsnOyAvLyBkZWZhdWx0XG4gICAgICBzd2l0Y2ggKGRhdGEudGFyZ2V0ID8/IExpbmtUYXJnZXRFbnVtLkJMQU5LKSB7XG4gICAgICAgIGNhc2UgJ1NFTEYnOlxuICAgICAgICAgIHRhcmdldCA9ICdfc2VsZic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0JMQU5LJzpcbiAgICAgICAgICB0YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUEFSRU5UJzpcbiAgICAgICAgICB0YXJnZXQgPSAnX3BhcmVudCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1RPUCc6XG4gICAgICAgICAgdGFyZ2V0ID0gJ190b3AnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHRhcmdldCk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGRhdGEudXJsKTtcbiAgICAgIGlmIChkYXRhLmRvd25sb2FkKSB7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGRhdGEuZmlsZW5hbWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0RG93bmxvYWRzRmlsZXModGhpcy52aWV3Q29udGV4dD8uZG93bmxvYWRzIHx8IFtdKTtcblxuICAgIGNvbnN0IGNsaXBib2FyZFRleHQgPSB0aGlzLnZpZXdDb250ZXh0Py5jbGlwYm9hcmREYXRhXG4gICAgICA/Lm1hcCgoY2Q6IENsaXBib2FyZERhdGEpID0+IGNkLnRleHQgfHwgJycpXG4gICAgICAuam9pbignJyk7XG4gICAgaWYgKGNsaXBib2FyZFRleHQpIHtcbiAgICAgIGNvbnN0IGNsaXBib2FyZCA9IG5hdmlnYXRvci5jbGlwYm9hcmQ7XG4gICAgICAvLyBhdmFpbGFibGUgb25seSBpbiBzZWN1cmUgY29udGV4dHMuXG4gICAgICBpZiAoY2xpcGJvYXJkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xpcGJvYXJkXG4gICAgICAgICAgICAud3JpdGVUZXh0KGNsaXBib2FyZFRleHQpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5IHRleHQgdG8gY2xpcGJvYXJkJywgZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIGNsaXBib2FyZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcbiAgICB0aGlzLnZpZXdDb250ZXh0SGFzQmVlblN5bmNlZC5uZXh0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydERvd25sb2Fkc0ZpbGVzKGRvd25sb2FkczogRG93bmxvYWRlZEZpbGVbXSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBkb3dubG9hZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBibG9iID0gYXdhaXQgdGhpcy5kb3dubG9hZFJlc291cmNlKGZpbGUudXVpZCEsIGZpbGUuaWRlbnRpZmllciEpO1xuICAgICAgICBsZXQgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGUuZmlsZW5hbWUhKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICBsaW5rLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkb3dubG9hZGluZyBmaWxlJywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaWV3Q29udGV4dFV1aWQodXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnZpZXdDb250ZXh0VXVpZE5hbWUsIHV1aWQpO1xuICAgIHRoaXMuc2Vzc2lvbi5hZGRIZWFkZXJQYXJhbSh7XG4gICAgICBoZWFkZXJOYW1lOiB0aGlzLnZpZXdDb250ZXh0VXVpZEhlYWRlck5hbWUsXG4gICAgICB2YWx1ZTogdXVpZCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3Q29udGV4dFV1aWQoKTogc3RyaW5nIHtcbiAgICBsZXQgdmlld0NvbnRleHRVdWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnZpZXdDb250ZXh0VXVpZE5hbWUpO1xuICAgIGlmICghdmlld0NvbnRleHRVdWlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXcgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQhJyk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3Q29udGV4dFV1aWQ7XG4gIH1cblxuICBwdWJsaWMgaGFzVmlld0NvbnRleHRVdWlkKCk6IGJvb2xlYW4ge1xuICAgIGxldCB2aWV3Q29udGV4dFV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMudmlld0NvbnRleHRVdWlkTmFtZSk7XG4gICAgcmV0dXJuIHZpZXdDb250ZXh0VXVpZCAhPT0gbnVsbCAmJiB2aWV3Q29udGV4dFV1aWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVdWlkT2ZQYWdlKHBhZ2VOYW1lOiBzdHJpbmcsIHV1aWQ6IHN0cmluZywgY29tcG9uZW50TmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5wYWdlTmFtZVByZWZpeCArIHBhZ2VOYW1lLCB1dWlkKTtcbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lLCBwYWdlTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyVXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nLCBjb21wb25lbnROYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnBhZ2VOYW1lUHJlZml4ICsgcGFnZU5hbWUpO1xuICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuY29tcG9uZW50TmFtZVByZWZpeCArIGNvbXBvbmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVdWlkT2ZQYWdlKHBhZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB1dWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnBhZ2VOYW1lUHJlZml4ICsgcGFnZU5hbWUpO1xuICAgIGlmICghdXVpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXVpZCBvZiAke3BhZ2VOYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlTmFtZU9mQ29tcG9uZW50KGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHBhZ2VOYW1lID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lKTtcbiAgICBpZiAoIXBhZ2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWdlTmFtZSBvZiAke2NvbXBvbmVudE5hbWV9IGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtZXNzYWdlKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YSwgbWVzc2FnZVJlc3VsdDogTWVzc2FnZVJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICAgIGF3YWl0IHRoaXMudmlld1xuICAgICAgICAubWVzc2FnZShtZXNzYWdlRGF0YS52aWV3VXVpZCA/PyAnJywgbWVzc2FnZURhdGEudXVpZCwgbWVzc2FnZVJlc3VsdClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgICAvLyBpbiBmdXR1cmUgdXNlIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxTbWFydFZpZXdDb250ZXh0QXBpRXJyb3I+IHtcbiAgICBsZXQgYnV0dG9uTGFiZWw7XG4gICAgbGV0IGRpYWxvZ1RpdGxlO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICAgIGJ1dHRvbkxhYmVsID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgIC5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nQnV0dG9uTGFiZWwpXG4gICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgIGRpYWxvZ1RpdGxlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSkudG9Qcm9taXNlKCk7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlKS50b1Byb21pc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnV0dG9uTGFiZWwgPSAnT2snO1xuICAgICAgZGlhbG9nVGl0bGUgPSAnSGliYSc7XG4gICAgICBtZXNzYWdlID0gJ0FuIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGJ1dHRvbkxhYmVsLFxuICAgICAgICBkaWFsb2dUaXRsZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBhcGlFcnJvcnNXaXRoQ29kZSA9IHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycy52aWV3Q29udGV4dEFwaUVycm9ycy5maWx0ZXIoXG4gICAgICAoYXBpRXJyb3I6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gYXBpRXJyb3IuY29kZSA9PT0gY29kZTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmICghYXBpRXJyb3JzV2l0aENvZGUgfHwgKGFwaUVycm9yc1dpdGhDb2RlICYmICFhcGlFcnJvcnNXaXRoQ29kZS5sZW5ndGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3Igd2l0aCBjb2RlICR7Y29kZX0gY291bGQgbm90IGJlIGZvdW5kLmApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBidXR0b25MYWJlbCxcbiAgICAgICAgZGlhbG9nVGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYXBpRXJyb3JzV2l0aENvZGVbMF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnN0cmFpbnQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29uc3RyYWludD4ge1xuICAgIGxldCB2aWV3Q29uc3RyYWludFJlc3BvbnNlID0gYXdhaXQgdGhpcy52aWV3LmdldFZpZXdDb25zdHJhaW50KHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGlmICghdmlld0NvbnN0cmFpbnRSZXNwb25zZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBWaWV3Q29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xuICAgIHJldHVybiB2aWV3Q29uc3RyYWludFJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWw6IHN0cmluZywgdXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5zZXNzaW9uLmluaXRpYWxpemUoKTtcbiAgICAvLyBUT0RPIGluaXQgdmlldyBjb250ZXh0IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcbiAgICBhd2FpdCB0aGlzLmluaXRWaWV3Q29udGV4dCgpO1xuXG4gICAgdGhpcy5vcGVuU21hcnRMaW5rLm5leHQoY2hhbm5lbCk7XG4gICAgYXdhaXQgdGhpcy5vcGVuU21hcnRMaW5rLnRvUHJvbWlzZSgpO1xuXG4gICAgYXdhaXQgdGhpcy52aWV3LnNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWwsIHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QW5kU3luY1ZpZXdDb250ZXh0KCk7XG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZFJlc291cmNlKHV1aWQ6IHN0cmluZywgaXRlbTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy52aWV3LmRvd25sb2FkSXRlbSh1dWlkLCBpdGVtKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtQWN0aW9uKHV1aWQ6IHN0cmluZywgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybUFjdGlvbih7XG4gICAgICB1dWlkLFxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtQWN0aW9uLmJpbmQodGhpcyksXG4gICAgLy8gICBjb25maWc6IHtcbiAgICAvLyAgICAgdXVpZCxcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIC8vICAgfSxcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0QWN0aW9uKFxuICAgIHV1aWQ6IHN0cmluZyxcbiAgICB3aWRnZXRJZDogc3RyaW5nLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uKHsgdXVpZCwgd2lkZ2V0SWQsIG5vZGVJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uLmJpbmQodGhpcyksXG4gICAgLy8gICBjb25maWc6IHtcbiAgICAvLyAgICAgdXVpZCxcbiAgICAvLyAgICAgd2lkZ2V0SWQsXG4gICAgLy8gICAgIG5vZGVJZCxcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIC8vICAgfSxcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihcbiAgICB1dWlkOiBzdHJpbmcsXG4gICAgd2lkZ2V0SWQ6IHN0cmluZyxcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oeyB1dWlkLCB3aWRnZXRJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbi5iaW5kKHRoaXMpLFxuICAgIC8vICAgY29uZmlnOiB7XG4gICAgLy8gICAgIHV1aWQsXG4gICAgLy8gICAgIHdpZGdldElkLFxuICAgIC8vICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgLy8gICB9LFxuICAgIC8vICAgaXNDb21wbGV0ZWQsXG4gICAgLy8gfSk7XG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBlcmZvcm1VcGxvYWRBY3Rpb24oXG4gICAgdXVpZDogc3RyaW5nLFxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0LFxuICAgIHBhcmFtOiAnaW5wdXQnIHwgJ2lucHV0XCInLFxuICAgIGNvbnRlbnQ6IGFueVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9wZXJmb3JtVXBsb2FkQWN0aW9uKHtcbiAgICAgIHV1aWQsXG4gICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgICBwYXJhbSxcbiAgICAgIGNvbnRlbnQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKFxuICAgIHV1aWQ6IHN0cmluZyxcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCxcbiAgICBwYXJhbTogJ2lucHV0JyB8ICdpbnB1dDInLFxuICAgIGNvbnRlbnQ6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3BlcmZvcm1VcGxvYWRNdWx0aXBsZUFjdGlvbih7XG4gICAgICB1dWlkLFxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgICAgcGFyYW0sXG4gICAgICBjb250ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRhdGFDaGFuZ2VkKHV1aWQ6IHN0cmluZywgZGF0YUNoYW5nZTogRGF0YUNoYW5nZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kYXRhQ2hhbmdlZCh7IHV1aWQsIGRhdGFDaGFuZ2UgfSk7XG4gICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoXG4gICAgLy8gICB7XG4gICAgLy8gICAgIGNhbGxiYWNrOiB0aGlzLl9kYXRhQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgIC8vICAgICBjb25maWc6IHtcbiAgICAvLyAgICAgICB1dWlkLFxuICAgIC8vICAgICAgIGRhdGFDaGFuZ2UsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIGlzQ29tcGxldGVkLFxuICAgIC8vICAgfSxcbiAgICAvLyAgIHRydWVcbiAgICAvLyApO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1BY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXcucGVyZm9ybUFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdCkudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVdpZGdldEFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICAgIGF3YWl0IHRoaXMudmlld1xuICAgICAgICAucGVyZm9ybVdpZGdldEFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLndpZGdldElkLCBjb25maWcubm9kZUlkLCBjb25maWcudWlBY3Rpb25SZXF1ZXN0KVxuICAgICAgICAudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRNYWluQWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcud2lkZ2V0SWQsIGNvbmZpZy51aUFjdGlvblJlcXVlc3QpXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3XG4gICAgICAgIC51cGxvYWRBY3Rpb24oXG4gICAgICAgICAgY29uZmlnLnV1aWQsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29uZmlnLnVpQWN0aW9uUmVxdWVzdCksXG4gICAgICAgICAgY29uZmlnLnBhcmFtLFxuICAgICAgICAgIGNvbmZpZy5jb250ZW50XG4gICAgICAgIClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcbiAgICAgICAgLnVwbG9hZE11bHRpcGxlQWN0aW9uKFxuICAgICAgICAgIGNvbmZpZy51dWlkLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbmZpZy51aUFjdGlvblJlcXVlc3QpLFxuICAgICAgICAgIGNvbmZpZy5wYXJhbSxcbiAgICAgICAgICBjb25maWcuY29udGVudFxuICAgICAgICApXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9kYXRhQ2hhbmdlZChjb25maWc6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3LmRhdGFDaGFuZ2VkKGNvbmZpZy51dWlkLCBjb25maWcuZGF0YUNoYW5nZSkudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICB2aWV3Q29udGV4dENoYW5nZTogVmlld0NvbnRleHRDaGFuZ2UgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gdmlld0NvbnRleHRDaGFuZ2U/LnZpZXdDb250ZXh0O1xuICAgIGF3YWl0IHRoaXMuc3luY1ZpZXcoKTtcblxuICAgIGlmICh2aWV3Q29udGV4dENoYW5nZT8uY2hhbmdlcykge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKHZpZXdDb250ZXh0Q2hhbmdlLmNoYW5nZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmlld0NvbnRleHRDaGFuZ2U/LnJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlcyhjaGFuZ2VzOiBBcnJheTxDb21wb25lbnRNb2RlbENoYW5nZT4pOiB2b2lkIHtcbiAgICBjaGFuZ2VzLmZvckVhY2goKGNvbXBvbmVudE1vZGVsQ2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgbGV0IGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRBcGlDbGllbnRzLmdldChcbiAgICAgICAgY29tcG9uZW50TW9kZWxDaGFuZ2UudXVpZFxuICAgICAgKTtcbiAgICAgIGlmIChkZXRlY3RDaGFuZ2UpIHtcbiAgICAgICAgZGV0ZWN0Q2hhbmdlLm5leHQoY29tcG9uZW50TW9kZWxDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwodXVpZCkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZDIodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dENoYW5nZSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBjaGFuZ2UgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwyKHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKGNoYW5nZSk7XG4gICAgcmV0dXJuIGNoYW5nZTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWaWV3Q29udGV4dCgpOiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBJU19BU1lOQ19QQVJBTV9OQU1FID0gJ2lzQXN5bmMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVF1ZXVlQ2FsbCB7XG4gIGNhbGxiYWNrOiAoY29uZmlnOiBhbnkpID0+IFByb21pc2U8YW55PjtcbiAgY29uZmlnOiBhbnk7XG4gIGlzQ29tcGxldGVkOiBTdWJqZWN0PHZvaWQ+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXBpUXVldWVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgcXVldWU6IEFwaVF1ZXVlQ2FsbFtdID0gW107XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcXVldWVTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5xdWV1ZVN1YmplY3QucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5wcm9jZXNzUXVldWUoKSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBhZGRUb1F1ZXVlKGNhbGw6IEFwaVF1ZXVlQ2FsbCwgcHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChwcmlvcml0eSkge1xuICAgICAgdGhpcy5xdWV1ZS51bnNoaWZ0KGNhbGwpOyAvLyBBZGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgaWYgaXQgaGFzIGhpZ2hlciBwcmlvcml0eVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goY2FsbCk7IC8vIEFkZCBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSBpZiBpdCBoYXMgbG93ZXIgcHJpb3JpdHlcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVF1ZXVlQ2FsbCA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAoYXBpUXVldWVDYWxsKSB7XG4gICAgICBhd2FpdCBhcGlRdWV1ZUNhbGwuY2FsbGJhY2soYXBpUXVldWVDYWxsLmNvbmZpZyk7XG4gICAgICBhcGlRdWV1ZUNhbGwuaXNDb21wbGV0ZWQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMucXVldWVTdWJqZWN0Lm5leHQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|