@smartbit4all/ng-client 5.0.20 → 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 +10266 -4870
- 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/{src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.d.ts → lib/smart-component-layout/api/model/toolbarProperties.d.ts} +7 -7
- 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 +2 -4
- 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-content/smart-filter-editor-content.component.d.ts +4 -2
- package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +11 -1
- 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 +7 -6
- 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 +49 -18
- 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 +21 -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 +15 -5
- 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 -4
- package/lib/smart-icon/smart-icon.service.d.ts +1 -0
- package/lib/smart-map/abstract-map.d.ts +1 -1
- package/lib/smart-map/api/model/geoMapItem.d.ts +2 -0
- 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/binaryData.d.ts +2 -0
- package/lib/view-context/api/api-default/invocationError.d.ts +2 -0
- package/lib/view-context/api/api-default/invocationRequest.d.ts +2 -0
- 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/badgeDescriptor.d.ts +15 -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 +9 -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 +8 -0
- package/lib/view-context/api/model/smartLinkMigrationStatus.d.ts +39 -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 +6 -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 +4 -0
- package/lib/view-context/api/model/uploadWidgetType.d.ts +16 -0
- package/lib/view-context/api/model/uploadedFile.d.ts +2 -1
- package/lib/view-context/api/model/view.d.ts +8 -0
- package/lib/view-context/api/model/viewContext.d.ts +1 -0
- package/lib/view-context/api/model/viewData.d.ts +3 -0
- package/lib/view-context/api/model/viewEventHandler.d.ts +7 -1
- 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 +8 -2
- package/lib/view-context/projects.d.ts +10 -0
- 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 +42 -0
- package/lib/view-context/smart-ui-action/components/menu/menu.constants.d.ts +3 -0
- package/lib/view-context/smart-ui-action/components/menu/menu.service.d.ts +8 -0
- package/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.d.ts +30 -0
- 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/components/upload-widget/voice-record-widget/voice-record-widget.component.d.ts +43 -0
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +6 -4
- 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 +10 -11
- 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 +49 -0
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +28 -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.component.d.ts +2 -0
- 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.interceptor.d.ts +5 -1
- package/lib/view-context/smart-view-context.model.d.ts +7 -2
- package/lib/view-context/smart-view-context.module.d.ts +74 -58
- package/lib/view-context/smart-view-context.service.d.ts +59 -9
- 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 +18 -19
- 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/smartbit4all-ng-client-5.0.20.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/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
|
@@ -0,0 +1,1038 @@
|
|
|
1
|
+
import { COMMA, ENTER } from '@angular/cdk/keycodes';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { Validators } from '@angular/forms';
|
|
4
|
+
import { deepEqual } from 'fast-equals';
|
|
5
|
+
import moment from 'moment';
|
|
6
|
+
import { Subject, distinctUntilChanged, map, startWith, takeUntil } from 'rxjs';
|
|
7
|
+
import { IconPosition, UiActionButtonType, } from '../../../view-context/api';
|
|
8
|
+
import { COMPONENT_LIBRARY, ComponentLibrary, } from '../../../view-context/utility/componentLibrary';
|
|
9
|
+
import { SmartStyleUtility } from '../../../view-context/utility/smart-style-utility';
|
|
10
|
+
import { SmartFormWidgetDirection, SmartFormWidgetType, SmartWidgetHintPositionEnum, } from '../../api/model/models';
|
|
11
|
+
import { SmartFormTextFieldButtonIconPosition, } from '../../smartform.model';
|
|
12
|
+
import { SmartFileEditorComponent } from '../components/smart-file-editor/smart-file-editor.component';
|
|
13
|
+
import { SmartMultiFileEditorComponent } from '../components/smart-multi-file-editor/smart-multi-file-editor.component';
|
|
14
|
+
import { SmartSubject } from '../../../smart-subject/projects';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../../services/smartform.service";
|
|
17
|
+
import * as i2 from "../../../component-factory-service/projects";
|
|
18
|
+
import * as i3 from "@angular/platform-browser";
|
|
19
|
+
import * as i4 from "@angular/common";
|
|
20
|
+
import * as i5 from "@angular/material/button";
|
|
21
|
+
import * as i6 from "primeng/api";
|
|
22
|
+
import * as i7 from "@angular/material/icon";
|
|
23
|
+
import * as i8 from "../../../smart-icon/smart-icon/smart-icon.component";
|
|
24
|
+
import * as i9 from "@angular/material/chips";
|
|
25
|
+
import * as i10 from "@angular/forms";
|
|
26
|
+
import * as i11 from "@angular/material/form-field";
|
|
27
|
+
import * as i12 from "@angular/material/checkbox";
|
|
28
|
+
import * as i13 from "@angular/material/select";
|
|
29
|
+
import * as i14 from "@angular/material/core";
|
|
30
|
+
import * as i15 from "@angular/material/input";
|
|
31
|
+
import * as i16 from "@angular/cdk/text-field";
|
|
32
|
+
import * as i17 from "@angular/material/datepicker";
|
|
33
|
+
import * as i18 from "@angular/material/radio";
|
|
34
|
+
import * as i19 from "@angular/material/slide-toggle";
|
|
35
|
+
import * as i20 from "@angular/material/autocomplete";
|
|
36
|
+
import * as i21 from "ngx-quill";
|
|
37
|
+
import * as i22 from "@angular/youtube-player";
|
|
38
|
+
import * as i23 from "primeng/inputtext";
|
|
39
|
+
import * as i24 from "primeng/messages";
|
|
40
|
+
import * as i25 from "primeng/overlaypanel";
|
|
41
|
+
import * as i26 from "primeng/dropdown";
|
|
42
|
+
import * as i27 from "primeng/multiselect";
|
|
43
|
+
import * as i28 from "primeng/inputswitch";
|
|
44
|
+
import * as i29 from "primeng/inputnumber";
|
|
45
|
+
import * as i30 from "primeng/inputtextarea";
|
|
46
|
+
import * as i31 from "primeng/floatlabel";
|
|
47
|
+
import * as i32 from "primeng/chips";
|
|
48
|
+
import * as i33 from "primeng/calendar";
|
|
49
|
+
import * as i34 from "primeng/checkbox";
|
|
50
|
+
import * as i35 from "primeng/inputmask";
|
|
51
|
+
import * as i36 from "primeng/editor";
|
|
52
|
+
import * as i37 from "../../../view-context/smart-ui-action/ui-action-toolbar.component";
|
|
53
|
+
import * as i38 from "./trackCaps.directive";
|
|
54
|
+
import * as i39 from "../directives/comparable-dropdown.directive";
|
|
55
|
+
import * as i40 from "../directives/comparable-multiselect.directive";
|
|
56
|
+
import * as i41 from "./sortable-widget/sortable-widget.component";
|
|
57
|
+
import * as i42 from "../components/smart-month-picker/smart-month-picker.component";
|
|
58
|
+
import * as i43 from "../components/smart-file-editor/smart-file-editor.component";
|
|
59
|
+
import * as i44 from "../components/smart-multi-file-editor/smart-multi-file-editor.component";
|
|
60
|
+
import * as i45 from "../components/smart-voice-recorder/smart-voice-recorder.component";
|
|
61
|
+
import * as i46 from "../../../view-context/smart-ui-action/ui-action-button/ui-action-button.component";
|
|
62
|
+
import * as i47 from "../../highlightMacthingString-pipe";
|
|
63
|
+
import * as i48 from "../../../view-context/utility/componentLibrary";
|
|
64
|
+
export class SmartWidgetSettings {
|
|
65
|
+
static { this.useUtc = false; }
|
|
66
|
+
}
|
|
67
|
+
export class SmartformwidgetComponent {
|
|
68
|
+
constructor(service, cfService, sanitizer, compLib, changeDetector) {
|
|
69
|
+
this.service = service;
|
|
70
|
+
this.cfService = cfService;
|
|
71
|
+
this.sanitizer = sanitizer;
|
|
72
|
+
this.compLib = compLib;
|
|
73
|
+
this.changeDetector = changeDetector;
|
|
74
|
+
this._destroy$ = new Subject();
|
|
75
|
+
this.hidePassword = true;
|
|
76
|
+
this.errorMessages = [];
|
|
77
|
+
this.valueCleared = new EventEmitter();
|
|
78
|
+
this.smartFormWidgetType = SmartFormWidgetType;
|
|
79
|
+
this.hasError = false;
|
|
80
|
+
this.toHighlight = '';
|
|
81
|
+
this.isEnterPressed = false;
|
|
82
|
+
this.isDatePickerRequired = false;
|
|
83
|
+
this.SmartWidgetHintPosition = SmartWidgetHintPositionEnum;
|
|
84
|
+
this.componentLibrary = ComponentLibrary;
|
|
85
|
+
this.emptyQuillToolbar = {
|
|
86
|
+
toolbar: false,
|
|
87
|
+
};
|
|
88
|
+
this._hasJustChanged = false;
|
|
89
|
+
this.hasCreated = false;
|
|
90
|
+
this.addOnBlur = true;
|
|
91
|
+
this.separatorKeysCodes = [ENTER, COMMA];
|
|
92
|
+
this.emptySeparatorKeysCodes = [];
|
|
93
|
+
this.dorpdownOpening = true;
|
|
94
|
+
this.calendarOpening = false;
|
|
95
|
+
}
|
|
96
|
+
ngOnInit() {
|
|
97
|
+
if (this.widgetInstance.type === SmartFormWidgetType.CONTAINER &&
|
|
98
|
+
this.widgetInstance.valueList) {
|
|
99
|
+
this.widgetInstance.valueList = this.service.filterWidgetsByVisibility(this.widgetInstance.valueList);
|
|
100
|
+
}
|
|
101
|
+
this.form.valueChanges.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
102
|
+
this.getErrorMessage(this.widgetInstance);
|
|
103
|
+
});
|
|
104
|
+
this.onBlur?.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
105
|
+
this.getErrorMessage(this.widgetInstance);
|
|
106
|
+
if (this.compLib === this.componentLibrary.PRIMENG) {
|
|
107
|
+
this.getControlMessages(this.widgetInstance.key);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// handle initial error message from server
|
|
111
|
+
this.getErrorMessage(this.widgetInstance);
|
|
112
|
+
// this.getControlMessages(this.widgetInstance.key!);
|
|
113
|
+
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR &&
|
|
114
|
+
this.widgetInstance.indicator) {
|
|
115
|
+
if (this.widgetInstance.indicator?.indicatorLength) {
|
|
116
|
+
this.indicatorItems = new Array(this.widgetInstance.indicator.indicatorLength);
|
|
117
|
+
}
|
|
118
|
+
this.form.controls[this.widgetInstance.indicator.indicateProperty].valueChanges
|
|
119
|
+
.pipe(takeUntil(this._destroy$))
|
|
120
|
+
.subscribe((value) => {
|
|
121
|
+
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR) {
|
|
122
|
+
this.widgetInstance.indicator.indicatorValue =
|
|
123
|
+
this.widgetInstance.indicator.changeIndicatorStatus(value);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_PICKER) {
|
|
128
|
+
if (this.widgetInstance.value) {
|
|
129
|
+
this.defaultDate = new Date(this.widgetInstance.value);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD &&
|
|
133
|
+
this.widgetInstance.selection) {
|
|
134
|
+
if (this.onValueChange == undefined) {
|
|
135
|
+
this.onValueChange = new SmartSubject(this._destroy$);
|
|
136
|
+
}
|
|
137
|
+
this.filteredOptions = this.onValueChange.pipe(startWith(''), map((value) => this._filter(value || '')), takeUntil(this._destroy$));
|
|
138
|
+
}
|
|
139
|
+
if (this.widgetInstance.type === SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
140
|
+
let videoId = this.parseYoutubeUrl(this.widgetInstance.link);
|
|
141
|
+
if (videoId)
|
|
142
|
+
this.widgetInstance.videoId = videoId;
|
|
143
|
+
const tag = document.createElement('script');
|
|
144
|
+
tag.src = 'https://www.youtube.com/iframe_api';
|
|
145
|
+
document.body.appendChild(tag);
|
|
146
|
+
}
|
|
147
|
+
let formControls = Object.keys(this.form.controls).filter((key) => key === this.widgetInstance.key || key.startsWith(`${this.widgetInstance.key}.`));
|
|
148
|
+
formControls.map((key) => {
|
|
149
|
+
this.form.controls[key].valueChanges
|
|
150
|
+
.pipe(distinctUntilChanged(), takeUntil(this._destroy$))
|
|
151
|
+
.subscribe((value) => {
|
|
152
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS &&
|
|
153
|
+
this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
154
|
+
const valueChange = {
|
|
155
|
+
key,
|
|
156
|
+
value,
|
|
157
|
+
kind: this.getSophisticatedEventKind(),
|
|
158
|
+
};
|
|
159
|
+
this.sophisticatedValueChange.next(valueChange);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
getSophisticatedEventKind() {
|
|
165
|
+
return this.widgetInstance.type === SmartFormWidgetType.SELECT ||
|
|
166
|
+
this.widgetInstance.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
167
|
+
this.widgetInstance.type === SmartFormWidgetType.RADIO_BUTTON
|
|
168
|
+
? 'selection'
|
|
169
|
+
: 'basic';
|
|
170
|
+
}
|
|
171
|
+
parseYoutubeUrl(url) {
|
|
172
|
+
url.replace('/shorts/', '/watch?v=');
|
|
173
|
+
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
|
|
174
|
+
var match = url.match(regExp);
|
|
175
|
+
return match && match[7].length == 11 ? match[7] : false;
|
|
176
|
+
}
|
|
177
|
+
get hasJustChanged() {
|
|
178
|
+
return this._hasJustChanged;
|
|
179
|
+
}
|
|
180
|
+
set hasJustChanged(hasJustChanged) {
|
|
181
|
+
this._hasJustChanged = hasJustChanged;
|
|
182
|
+
new Promise((resolve) => setTimeout(resolve, 250)).then(() => {
|
|
183
|
+
this._hasJustChanged = false;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
onDatePickerBlur(event) {
|
|
187
|
+
event.stopPropagation();
|
|
188
|
+
this.handleBlurEvent(this.widgetInstance);
|
|
189
|
+
this.handleDateChanged(this.form.controls[this.widgetInstance.key].value);
|
|
190
|
+
}
|
|
191
|
+
onTimePickerBlur(event) {
|
|
192
|
+
event.stopPropagation();
|
|
193
|
+
this.handleBlurEvent(this.widgetInstance);
|
|
194
|
+
this.handleTimeChanged(this.form.controls[`${this.widgetInstance.key}-time`].value);
|
|
195
|
+
}
|
|
196
|
+
ngAfterViewInit() {
|
|
197
|
+
if (this.widgetInstance.type === SmartFormWidgetType.COMPONENT) {
|
|
198
|
+
this.customComponentRef = this.cfService.createComponent(this.customComponentVcRef, this.widgetInstance.component, this.widgetInstance.input);
|
|
199
|
+
}
|
|
200
|
+
if (this.compLib === this.componentLibrary.MATERIAL) {
|
|
201
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER ||
|
|
202
|
+
this.widgetInstance.type === SmartFormWidgetType.MONTH_PICKER) {
|
|
203
|
+
this.isDatePickerRequired = !!this.widgetInstance.validators?.some((smartValidator) => smartValidator.validator === Validators.required);
|
|
204
|
+
let validators = [];
|
|
205
|
+
if (this.widgetInstance.validators) {
|
|
206
|
+
validators = this.widgetInstance.validators?.map((validator) => {
|
|
207
|
+
return validator.validator;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
this.hasCreated = true;
|
|
211
|
+
this.form.controls[this.widgetInstance.key].valueChanges
|
|
212
|
+
.pipe(takeUntil(this._destroy$))
|
|
213
|
+
.subscribe((_moment) => {
|
|
214
|
+
this.handleDateChanged(_moment);
|
|
215
|
+
});
|
|
216
|
+
this.form.controls[`${this.widgetInstance.key}-time`].valueChanges
|
|
217
|
+
.pipe(takeUntil(this._destroy$))
|
|
218
|
+
.subscribe((timeValue) => {
|
|
219
|
+
this.handleTimeChanged(timeValue);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_PICKER) {
|
|
225
|
+
this.form.controls[this.widgetInstance.key].valueChanges
|
|
226
|
+
.pipe(takeUntil(this._destroy$))
|
|
227
|
+
.subscribe((timeValue) => {
|
|
228
|
+
if (timeValue) {
|
|
229
|
+
this.defaultDate = new Date(timeValue);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this.defaultDate = undefined;
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_BOX &&
|
|
238
|
+
this.compLib === this.componentLibrary.PRIMENG &&
|
|
239
|
+
this.widgetInstance.textBoxProperties?.maxRows &&
|
|
240
|
+
this.sb4Textarea) {
|
|
241
|
+
var textarea = this.sb4Textarea.nativeElement;
|
|
242
|
+
var style = getComputedStyle(textarea);
|
|
243
|
+
var maxLines = this.widgetInstance.textBoxProperties.maxRows;
|
|
244
|
+
var lineHeight = parseInt(style.getPropertyValue('--sb4-textarea-line-height')) || 20;
|
|
245
|
+
var paddingTop = parseFloat(style.paddingTop) || 0;
|
|
246
|
+
var paddingBottom = parseFloat(style.paddingBottom) || 0;
|
|
247
|
+
var verticalExtras = paddingTop + paddingBottom;
|
|
248
|
+
textarea.style.height = 'auto';
|
|
249
|
+
textarea.style.maxHeight = `${lineHeight * maxLines + verticalExtras}px`;
|
|
250
|
+
}
|
|
251
|
+
if (this.widgetInstance.type === SmartFormWidgetType.FILE_UPLOADER && this.fileUploader) {
|
|
252
|
+
this.toolbar = this.fileUploader.toolbar;
|
|
253
|
+
}
|
|
254
|
+
if (this.widgetInstance.type === SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
255
|
+
this.multiFileUploader) {
|
|
256
|
+
this.toolbar = this.multiFileUploader.toolbar;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
handleDateChanged(_moment) {
|
|
260
|
+
const isDateFocused = document.activeElement === this.dateInputChild?.nativeElement;
|
|
261
|
+
const isTimeFocused = document.activeElement === this.timeInputChild?.nativeElement;
|
|
262
|
+
const dateFormControl = this.form.controls[this.widgetInstance.key];
|
|
263
|
+
const timeFormControl = this.form.controls[`${this.widgetInstance.key}-time`];
|
|
264
|
+
if (!this.isDatePickerRequired &&
|
|
265
|
+
timeFormControl.hasValidator(Validators.required) &&
|
|
266
|
+
!_moment) {
|
|
267
|
+
timeFormControl.removeValidators(Validators.required);
|
|
268
|
+
timeFormControl.setValue('');
|
|
269
|
+
}
|
|
270
|
+
else if (!this.isDatePickerRequired &&
|
|
271
|
+
!timeFormControl.hasValidator(Validators.required) &&
|
|
272
|
+
_moment) {
|
|
273
|
+
timeFormControl.addValidators(Validators.required);
|
|
274
|
+
if (timeFormControl.value === '') {
|
|
275
|
+
const now = new Date();
|
|
276
|
+
timeFormControl.setValue(now.getHours() + ':' + now.getMinutes());
|
|
277
|
+
timeFormControl.markAsUntouched();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (!_moment || isDateFocused || isTimeFocused) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (this.hasJustChanged) {
|
|
284
|
+
this.hasJustChanged = false;
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const timeValue = timeFormControl.value || '00:00';
|
|
288
|
+
this.hasJustChanged = true;
|
|
289
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
290
|
+
this.setDateFormControl(dateFormControl, _moment, timeValue);
|
|
291
|
+
this.widgetInstance.value = dateFormControl.value;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
handleTimeChanged(timeValue) {
|
|
295
|
+
const isFocused = document.activeElement === this.timeInputChild?.nativeElement;
|
|
296
|
+
const dateFormControl = this.form.controls[this.widgetInstance.key];
|
|
297
|
+
const timeFormControl = this.form.controls[`${this.widgetInstance.key}-time`];
|
|
298
|
+
if (!this.isDatePickerRequired &&
|
|
299
|
+
dateFormControl.hasValidator(Validators.required) &&
|
|
300
|
+
!timeValue) {
|
|
301
|
+
dateFormControl.removeValidators(Validators.required);
|
|
302
|
+
dateFormControl.setValue(dateFormControl.value ?? '');
|
|
303
|
+
}
|
|
304
|
+
else if (!this.isDatePickerRequired &&
|
|
305
|
+
!dateFormControl.hasValidator(Validators.required) &&
|
|
306
|
+
timeValue) {
|
|
307
|
+
dateFormControl.setValidators(Validators.required);
|
|
308
|
+
}
|
|
309
|
+
// if (isFocused) {
|
|
310
|
+
// return;
|
|
311
|
+
// }
|
|
312
|
+
if (this.hasJustChanged) {
|
|
313
|
+
this.hasJustChanged = false;
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (!timeValue) {
|
|
317
|
+
if (timeFormControl.hasValidator(Validators.required)) {
|
|
318
|
+
timeFormControl.markAsDirty();
|
|
319
|
+
}
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
let _moment = dateFormControl.value;
|
|
323
|
+
if (!_moment) {
|
|
324
|
+
_moment = moment(); // or moment().startOf('day') if you prefer
|
|
325
|
+
}
|
|
326
|
+
this.hasJustChanged = true;
|
|
327
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
328
|
+
this.setDateFormControl(dateFormControl, _moment, timeValue);
|
|
329
|
+
this.widgetInstance.value = dateFormControl.value;
|
|
330
|
+
this.onValueChange?.next(this.widgetInstance);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
setDateFormControl(dateFormControl, _moment, timeValue) {
|
|
334
|
+
if (_moment) {
|
|
335
|
+
let hour = timeValue.substring(0, 2);
|
|
336
|
+
let min = timeValue.substring(3, 5);
|
|
337
|
+
const newMoment = moment(_moment).set({
|
|
338
|
+
hour: +hour,
|
|
339
|
+
minute: +min,
|
|
340
|
+
second: 0,
|
|
341
|
+
millisecond: 0,
|
|
342
|
+
});
|
|
343
|
+
dateFormControl.setValue(newMoment);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
getTime() {
|
|
347
|
+
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
348
|
+
return this.widgetInstance.value.toISOString().split('T')[1].substring(0, 5);
|
|
349
|
+
}
|
|
350
|
+
return '';
|
|
351
|
+
}
|
|
352
|
+
ngOnDestroy() {
|
|
353
|
+
this._destroy$.next();
|
|
354
|
+
this._destroy$.complete();
|
|
355
|
+
}
|
|
356
|
+
onKeydown() {
|
|
357
|
+
this.isEnterPressed = true;
|
|
358
|
+
new Promise((resolve) => setTimeout(resolve, 500)).then(() => {
|
|
359
|
+
this.isEnterPressed = false;
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
togglePasswordVisibility(event) {
|
|
363
|
+
if (!this.isEnterPressed) {
|
|
364
|
+
this.hidePassword = !this.hidePassword;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
getNgClass() {
|
|
368
|
+
return SmartStyleUtility.getNgClasses(this.widgetInstance.style);
|
|
369
|
+
}
|
|
370
|
+
getStyle() {
|
|
371
|
+
if (!this.widgetInstance.style) {
|
|
372
|
+
this.widgetInstance.style = {
|
|
373
|
+
classesToAdd: [],
|
|
374
|
+
classesToRemove: [],
|
|
375
|
+
style: {},
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
if (!('width' in this.widgetInstance.style.style) && 'minWidth' in this.widgetInstance) {
|
|
379
|
+
this.widgetInstance.style.style['width'] = `${this.widgetInstance.minWidth}px`;
|
|
380
|
+
}
|
|
381
|
+
return SmartStyleUtility.getNgStyles(this.widgetInstance.style);
|
|
382
|
+
}
|
|
383
|
+
getLabelNgClass() {
|
|
384
|
+
if ('labelStyle' in this.widgetInstance) {
|
|
385
|
+
return SmartStyleUtility.getNgClasses(this.widgetInstance.labelStyle);
|
|
386
|
+
}
|
|
387
|
+
return {};
|
|
388
|
+
}
|
|
389
|
+
getLabelStyle() {
|
|
390
|
+
if ('labelStyle' in this.widgetInstance) {
|
|
391
|
+
return SmartStyleUtility.getNgStyles(this.widgetInstance.labelStyle);
|
|
392
|
+
}
|
|
393
|
+
return {};
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Change handler for the potentially present Quill editor, enforcing max length limits if
|
|
397
|
+
* necessary.
|
|
398
|
+
*
|
|
399
|
+
* @param change the {@link ContentChange} the Quill editor emits
|
|
400
|
+
* @returns {@code void}
|
|
401
|
+
*/
|
|
402
|
+
onRichTextEditorContentChanged(change) {
|
|
403
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (!this.widgetInstance.maxLength) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
410
|
+
// unremovable new-line character at the end of its content.
|
|
411
|
+
const maxLength = this.widgetInstance.maxLength + 1;
|
|
412
|
+
if (change.text.length <= maxLength) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const insertOpCount = change.delta.ops?.filter((it) => !!it.insert).length ?? 0;
|
|
416
|
+
if (insertOpCount > 0) {
|
|
417
|
+
this.quill?.quillEditor.setContents(change.oldDelta, 'silent');
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
onPrimeRichTextEditorContentChanged(change) {
|
|
421
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (!this.widgetInstance.maxLength) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
428
|
+
// unremovable new-line character at the end of its content.
|
|
429
|
+
const maxLength = this.widgetInstance.maxLength + 1;
|
|
430
|
+
if (change.textValue.length <= maxLength) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Calculates the number of remaining user-space characters allowed to be entered into the Quill
|
|
436
|
+
* editor.
|
|
437
|
+
*
|
|
438
|
+
* <p>
|
|
439
|
+
* The real length of the editor's content may be much longer - as it is persisted as an HTML
|
|
440
|
+
* document fragment behind the scenes. This method is concerned by the number of characters the
|
|
441
|
+
* user perceives.
|
|
442
|
+
*
|
|
443
|
+
* @returns the {@link number} of remaining permitted characters the user may input, or {@code -1}
|
|
444
|
+
* if the leeway is not interpreted in the component's current state
|
|
445
|
+
*/
|
|
446
|
+
getRichTextEditorLengthLeeway() {
|
|
447
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
448
|
+
return -1;
|
|
449
|
+
}
|
|
450
|
+
if (!this.widgetInstance.maxLength) {
|
|
451
|
+
return -1;
|
|
452
|
+
}
|
|
453
|
+
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
454
|
+
// unremovable new-line character at the end of its content.
|
|
455
|
+
const maxLength = this.widgetInstance.maxLength + 1;
|
|
456
|
+
if (this.quill) {
|
|
457
|
+
// this is the intended path (user input):
|
|
458
|
+
return maxLength - this.quill.quillEditor.getText().length;
|
|
459
|
+
}
|
|
460
|
+
// fallback to the raw HTML content:
|
|
461
|
+
return maxLength - this.form.controls[this.widgetInstance.key].value.length;
|
|
462
|
+
}
|
|
463
|
+
add(event) {
|
|
464
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
const value = (event.value || '').trim();
|
|
468
|
+
if (this.setTextFieldChipsValue(value)) {
|
|
469
|
+
const valueChange = {
|
|
470
|
+
key: this.widgetInstance.key,
|
|
471
|
+
value: this.form.controls[this.widgetInstance.key].value,
|
|
472
|
+
kind: 'selection',
|
|
473
|
+
};
|
|
474
|
+
this.sophisticatedValueChange.next(valueChange);
|
|
475
|
+
}
|
|
476
|
+
// Clear the input value
|
|
477
|
+
event.chipInput.clear();
|
|
478
|
+
this.form.controls[this.widgetInstance.key].markAsTouched();
|
|
479
|
+
}
|
|
480
|
+
remove(value) {
|
|
481
|
+
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
482
|
+
this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
483
|
+
const index = this.form.controls[this.widgetInstance.key].value.indexOf(value);
|
|
484
|
+
if (index >= 0) {
|
|
485
|
+
this.form.controls[this.widgetInstance.key].value.splice(index, 1);
|
|
486
|
+
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
487
|
+
const valueChange = {
|
|
488
|
+
key: this.widgetInstance.key,
|
|
489
|
+
value: this.form.controls[this.widgetInstance.key].value,
|
|
490
|
+
kind: 'selection',
|
|
491
|
+
};
|
|
492
|
+
this.sophisticatedValueChange.next(valueChange);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
selected(event, widgetInstance) {
|
|
497
|
+
let value = event.option.viewValue;
|
|
498
|
+
if (this.setTextFieldChipsValue(value)) {
|
|
499
|
+
if (widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
500
|
+
widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
501
|
+
const valueChange = {
|
|
502
|
+
key: widgetInstance.key,
|
|
503
|
+
value: this.form.controls[widgetInstance.key].value,
|
|
504
|
+
kind: 'selection',
|
|
505
|
+
};
|
|
506
|
+
this.sophisticatedValueChange.next(valueChange);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
setTextFieldChipsValue(value) {
|
|
511
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS) {
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
if (value) {
|
|
515
|
+
if ((this.widgetInstance.maxValues &&
|
|
516
|
+
this.widgetInstance.value.length < this.widgetInstance.maxValues) ||
|
|
517
|
+
!this.widgetInstance.maxValues) {
|
|
518
|
+
if (!this.form.controls[this.widgetInstance.key].value) {
|
|
519
|
+
let values = new Array();
|
|
520
|
+
this.widgetInstance.value = values;
|
|
521
|
+
this.form.controls[this.widgetInstance.key].setValue(values);
|
|
522
|
+
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
523
|
+
}
|
|
524
|
+
this.form.controls[this.widgetInstance.key].value.push(value);
|
|
525
|
+
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
526
|
+
return true;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
getDirection() {
|
|
532
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
533
|
+
this.widgetInstance.type !== SmartFormWidgetType.CHECK_BOX &&
|
|
534
|
+
this.widgetInstance.type !== SmartFormWidgetType.RADIO_BUTTON) {
|
|
535
|
+
return '';
|
|
536
|
+
}
|
|
537
|
+
if (this.widgetInstance.direction === undefined) {
|
|
538
|
+
return 'direction-row';
|
|
539
|
+
}
|
|
540
|
+
else if (this.widgetInstance.direction === SmartFormWidgetDirection.COL) {
|
|
541
|
+
return 'direction-col';
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
return 'direction-row';
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
smartFormTextFieldButtonIconPosition() {
|
|
548
|
+
return SmartFormTextFieldButtonIconPosition;
|
|
549
|
+
}
|
|
550
|
+
getType() {
|
|
551
|
+
return SmartFormWidgetType;
|
|
552
|
+
}
|
|
553
|
+
getWidgetLabel(widget) {
|
|
554
|
+
if (widget.type === SmartFormWidgetType.CONTAINER) {
|
|
555
|
+
return '';
|
|
556
|
+
}
|
|
557
|
+
if (widget.label === '') {
|
|
558
|
+
return widget.label;
|
|
559
|
+
}
|
|
560
|
+
let isRequired = false;
|
|
561
|
+
if (widget.type !== SmartFormWidgetType.LABEL &&
|
|
562
|
+
widget.type !== SmartFormWidgetType.TIME &&
|
|
563
|
+
widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
564
|
+
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
565
|
+
widget.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
566
|
+
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
567
|
+
widget.type !== SmartFormWidgetType.SVG &&
|
|
568
|
+
widget.type !== SmartFormWidgetType.DIV &&
|
|
569
|
+
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
570
|
+
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
571
|
+
widget.type !== SmartFormWidgetType.COMPONENT) {
|
|
572
|
+
isRequired = widget.validators?.length ? this.fieldIsRequired() && !!widget.showLabel : false;
|
|
573
|
+
}
|
|
574
|
+
else if (widget.type === SmartFormWidgetType.LABEL) {
|
|
575
|
+
isRequired = widget.markAsRequired ? true : false;
|
|
576
|
+
}
|
|
577
|
+
return `${widget.label}${isRequired ? ' *' : ''}`;
|
|
578
|
+
}
|
|
579
|
+
sanitizeHtml(value) {
|
|
580
|
+
let safeValue = value ?? '';
|
|
581
|
+
return this.sanitizer.bypassSecurityTrustHtml(safeValue);
|
|
582
|
+
}
|
|
583
|
+
fieldIsRequired() {
|
|
584
|
+
let value = false;
|
|
585
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
586
|
+
this.widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
587
|
+
this.widgetInstance.type !== SmartFormWidgetType.TIME &&
|
|
588
|
+
this.widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
589
|
+
this.widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
590
|
+
this.widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
591
|
+
this.widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
592
|
+
this.widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
593
|
+
this.widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
594
|
+
this.widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
595
|
+
this.widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
596
|
+
this.widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
597
|
+
this.widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
598
|
+
this.widgetInstance.validators?.forEach((validator) => {
|
|
599
|
+
if (validator.validator == Validators.required)
|
|
600
|
+
value = true;
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
return value;
|
|
604
|
+
}
|
|
605
|
+
hasCustomError(widget, validator) {
|
|
606
|
+
if (widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
607
|
+
widget.type !== SmartFormWidgetType.LABEL &&
|
|
608
|
+
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
609
|
+
if (this.form.controls[widget.key] && this.form.controls[widget.key].errors) {
|
|
610
|
+
let hasError = Object.keys(this.form.controls[widget.key].errors).length
|
|
611
|
+
? this.form.controls[widget.key]?.dirty ||
|
|
612
|
+
(this.form.controls[widget.key]?.touched &&
|
|
613
|
+
validator &&
|
|
614
|
+
(this.form.controls[widget.key]?.errors)[validator.name])
|
|
615
|
+
: false;
|
|
616
|
+
if ((validator && hasError && !this.errorKey) ||
|
|
617
|
+
(validator && hasError && this.errorKey === validator.name)) {
|
|
618
|
+
this.hasError = true;
|
|
619
|
+
this.errorKey = validator.name;
|
|
620
|
+
}
|
|
621
|
+
else if (!hasError && validator && this.errorKey === validator.name) {
|
|
622
|
+
this.hasError = false;
|
|
623
|
+
this.errorKey = undefined;
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
hasError = false;
|
|
627
|
+
}
|
|
628
|
+
return hasError;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return false;
|
|
632
|
+
}
|
|
633
|
+
getErrorMessage(widgetInstance) {
|
|
634
|
+
let errorMessage;
|
|
635
|
+
let errorIcon;
|
|
636
|
+
let errorIconColor;
|
|
637
|
+
let validator;
|
|
638
|
+
if (widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
639
|
+
widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
640
|
+
widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
641
|
+
widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
642
|
+
widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
643
|
+
widgetInstance.type !== SmartFormWidgetType.RECORDING_UPLOADER &&
|
|
644
|
+
widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
645
|
+
widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
646
|
+
widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
647
|
+
widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
648
|
+
widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
649
|
+
widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
650
|
+
widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
651
|
+
if (this.form.controls[widgetInstance.key] && this.form.controls[widgetInstance.key].errors) {
|
|
652
|
+
if (this.errorKey &&
|
|
653
|
+
!Object.keys(this.form.controls[widgetInstance.key].errors).includes(this.errorKey)) {
|
|
654
|
+
this.errorKey = undefined;
|
|
655
|
+
}
|
|
656
|
+
for (let index = 0; index < Object.keys(this.form.controls[widgetInstance.key].errors).length; index++) {
|
|
657
|
+
const errorKey = Object.keys(this.form.controls[widgetInstance.key].errors)[index];
|
|
658
|
+
let customValidatorOnWidget = widgetInstance.validators?.filter((validator) => validator.name === errorKey);
|
|
659
|
+
if (customValidatorOnWidget && customValidatorOnWidget.length) {
|
|
660
|
+
errorMessage = customValidatorOnWidget[0].errorMessage;
|
|
661
|
+
errorIcon = customValidatorOnWidget[0].icon;
|
|
662
|
+
errorIconColor = customValidatorOnWidget[0].iconColor;
|
|
663
|
+
validator = customValidatorOnWidget[0];
|
|
664
|
+
break;
|
|
665
|
+
}
|
|
666
|
+
let customValidatorOnForm = this.service.smartForm?.validators?.filter((validator) => validator.name === errorKey);
|
|
667
|
+
if (customValidatorOnForm && customValidatorOnForm.length) {
|
|
668
|
+
errorMessage = customValidatorOnForm[0].errorMessage;
|
|
669
|
+
validator = customValidatorOnForm[0];
|
|
670
|
+
break;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
if (this.hasCustomError(widgetInstance, validator)) {
|
|
675
|
+
widgetInstance.error = errorMessage;
|
|
676
|
+
widgetInstance.errorIcon = errorIcon;
|
|
677
|
+
widgetInstance.errorIconColor = errorIconColor;
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
if (widgetInstance.serverErrorMessage) {
|
|
681
|
+
widgetInstance.error = widgetInstance.serverErrorMessage;
|
|
682
|
+
widgetInstance.errorIcon = widgetInstance.serverErrorIcon;
|
|
683
|
+
widgetInstance.errorIconColor = widgetInstance.serverErrorColor;
|
|
684
|
+
return true;
|
|
685
|
+
}
|
|
686
|
+
widgetInstance.error = undefined;
|
|
687
|
+
}
|
|
688
|
+
return false;
|
|
689
|
+
}
|
|
690
|
+
getIndicatorItemClass(index) {
|
|
691
|
+
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR) {
|
|
692
|
+
if (this.widgetInstance.indicator.indicatorValue >= index) {
|
|
693
|
+
return `smart-indicator-${index}`;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return '';
|
|
697
|
+
}
|
|
698
|
+
getIndicatorStatusLabelColor() {
|
|
699
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
700
|
+
return '';
|
|
701
|
+
}
|
|
702
|
+
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
703
|
+
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
704
|
+
return `smart-indicator-label-${this.widgetInstance.indicator.indicatorLength - 1}`;
|
|
705
|
+
}
|
|
706
|
+
return `smart-indicator-label-${value}`;
|
|
707
|
+
}
|
|
708
|
+
getIndicatorStatusLabel() {
|
|
709
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
710
|
+
return '';
|
|
711
|
+
}
|
|
712
|
+
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
713
|
+
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
714
|
+
return this.widgetInstance.indicator.indicatorStatusLabels[this.widgetInstance.indicator.indicatorLength - 1];
|
|
715
|
+
}
|
|
716
|
+
return this.widgetInstance.indicator.indicatorStatusLabels[value];
|
|
717
|
+
}
|
|
718
|
+
upload(event) {
|
|
719
|
+
let type = this.widgetInstance.type;
|
|
720
|
+
if (type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
721
|
+
type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
722
|
+
type !== SmartFormWidgetType.RECORDING_UPLOADER) {
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
let params = {
|
|
726
|
+
...event.uiAction.params,
|
|
727
|
+
_files: event.files,
|
|
728
|
+
param: '_files',
|
|
729
|
+
};
|
|
730
|
+
event.uiAction.params = params;
|
|
731
|
+
this.smartComponent.executeUiAction(event.uiAction);
|
|
732
|
+
}
|
|
733
|
+
executeUiAction(uiAction) {
|
|
734
|
+
let type = this.widgetInstance.type;
|
|
735
|
+
if (type !== SmartFormWidgetType.MULTI_FILE_UPLOADER) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
this.smartComponent.executeUiAction(uiAction);
|
|
739
|
+
}
|
|
740
|
+
getButtonType(descriptor) {
|
|
741
|
+
switch (descriptor.type) {
|
|
742
|
+
case 'NORMAL':
|
|
743
|
+
return 'mat-mdc-button';
|
|
744
|
+
case 'FLAT':
|
|
745
|
+
return 'mat-mdc-flat-button';
|
|
746
|
+
case 'RAISED':
|
|
747
|
+
return 'mat-mdc-raised-button';
|
|
748
|
+
case 'STROKED':
|
|
749
|
+
return 'mat-mdc-stroked-button';
|
|
750
|
+
case 'ICON':
|
|
751
|
+
return 'mat-mdc-icon-button';
|
|
752
|
+
case 'MINI_FAB':
|
|
753
|
+
return 'mat-mdc-mini-fab';
|
|
754
|
+
case 'FAB':
|
|
755
|
+
return 'mat-mdc-fab';
|
|
756
|
+
default:
|
|
757
|
+
console.log(`Unhandled action button type case: ${descriptor.type}`);
|
|
758
|
+
return `mat-button`;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
isOnlyIcon(descriptor) {
|
|
762
|
+
return (descriptor.type === 'ICON' || descriptor.type === 'MINI_FAB' || descriptor.type === 'FAB');
|
|
763
|
+
}
|
|
764
|
+
onButtonClicked(instance) {
|
|
765
|
+
if (instance.uiAction) {
|
|
766
|
+
instance.callback(instance.uiAction);
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
instance.callback(instance.key);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
_filter(value) {
|
|
773
|
+
let filterValue = value.target?.value;
|
|
774
|
+
this.toHighlight = filterValue;
|
|
775
|
+
if (!filterValue) {
|
|
776
|
+
filterValue = '';
|
|
777
|
+
this.toHighlight = filterValue;
|
|
778
|
+
}
|
|
779
|
+
filterValue = filterValue.toLowerCase();
|
|
780
|
+
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD &&
|
|
781
|
+
this.widgetInstance.valueList) {
|
|
782
|
+
const result = filterValue
|
|
783
|
+
? this.widgetInstance.valueList.filter((option) => option.label.toLowerCase().includes(filterValue))
|
|
784
|
+
: this.widgetInstance.valueList;
|
|
785
|
+
if (result.length === 0 && this.widgetInstance.valueList.length !== 0) {
|
|
786
|
+
// there could be values after the filter operation but we found none:
|
|
787
|
+
this.widgetInstance.error = this.widgetInstance.filterErrorMessage;
|
|
788
|
+
}
|
|
789
|
+
else {
|
|
790
|
+
// we either found values, or there were no values to begin with:
|
|
791
|
+
this.widgetInstance.error = undefined;
|
|
792
|
+
}
|
|
793
|
+
return result;
|
|
794
|
+
}
|
|
795
|
+
return [];
|
|
796
|
+
}
|
|
797
|
+
dateFilter(d) {
|
|
798
|
+
return true;
|
|
799
|
+
}
|
|
800
|
+
getMatrixDisplayValue(question, key) {
|
|
801
|
+
this.widgetInstance.value[key].find((value) => {
|
|
802
|
+
if (value.code == question.code)
|
|
803
|
+
return question.displayValue;
|
|
804
|
+
else
|
|
805
|
+
return question.code;
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
handleYearMonthPicked(yearMonthValue) {
|
|
809
|
+
this.setDateFormControl(this.form.controls[this.widgetInstance.key], yearMonthValue, '00:00');
|
|
810
|
+
}
|
|
811
|
+
compareItems(o1, o2) {
|
|
812
|
+
function convert(obj) {
|
|
813
|
+
if (obj && typeof obj === 'string') {
|
|
814
|
+
return obj.replace(/\.v[0-9]+$/, '');
|
|
815
|
+
}
|
|
816
|
+
return obj;
|
|
817
|
+
}
|
|
818
|
+
// calling this.truncateUri didn't work
|
|
819
|
+
// TODO: use widget.selection.parameter for ignoreUriVersion / strictUriComparison;
|
|
820
|
+
let v1 = convert(o1);
|
|
821
|
+
let v2 = convert(o2);
|
|
822
|
+
return deepEqual(v1, v2);
|
|
823
|
+
}
|
|
824
|
+
truncateUri(uri) {
|
|
825
|
+
if (uri && typeof uri === 'string') {
|
|
826
|
+
return uri.replace(/\.v[0-9]+$/, '');
|
|
827
|
+
}
|
|
828
|
+
return uri;
|
|
829
|
+
}
|
|
830
|
+
removeMatrixRow(question) {
|
|
831
|
+
console.log(question);
|
|
832
|
+
this.widgetInstance.button?.callback(this.widgetInstance, question);
|
|
833
|
+
}
|
|
834
|
+
isToolbarPresent() {
|
|
835
|
+
if (this.widgetInstance.type == SmartFormWidgetType.TEXT_FIELD ||
|
|
836
|
+
this.widgetInstance.type == SmartFormWidgetType.SELECT ||
|
|
837
|
+
this.widgetInstance.type == SmartFormWidgetType.TEXT_FIELD_LOOKUP ||
|
|
838
|
+
this.widgetInstance.type == SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
839
|
+
this.widgetInstance.type == SmartFormWidgetType.FILE_UPLOADER ||
|
|
840
|
+
this.widgetInstance.type == SmartFormWidgetType.MULTI_FILE_UPLOADER) {
|
|
841
|
+
return this.widgetInstance.toolbarId !== undefined && this.widgetInstance.toolbarId !== null;
|
|
842
|
+
}
|
|
843
|
+
return false;
|
|
844
|
+
}
|
|
845
|
+
getChipsValue(value) {
|
|
846
|
+
if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
|
|
847
|
+
if ('name' in value) {
|
|
848
|
+
return value['name'];
|
|
849
|
+
}
|
|
850
|
+
if ('displayValue' in value) {
|
|
851
|
+
return value['displayValue'];
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
return value;
|
|
855
|
+
}
|
|
856
|
+
getOptions(items) {
|
|
857
|
+
let values = [];
|
|
858
|
+
items.map((item) => {
|
|
859
|
+
if (item.type === SmartFormWidgetType.ITEM_GROUP) {
|
|
860
|
+
item.valueList.map((value) => {
|
|
861
|
+
values.push(value);
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
else if (item.type === SmartFormWidgetType.ITEM) {
|
|
865
|
+
values.push(item);
|
|
866
|
+
}
|
|
867
|
+
});
|
|
868
|
+
return values;
|
|
869
|
+
}
|
|
870
|
+
get clearButtonDescriptor() {
|
|
871
|
+
return {
|
|
872
|
+
title: '',
|
|
873
|
+
color: 'primary',
|
|
874
|
+
type: UiActionButtonType.RAISED,
|
|
875
|
+
icon: this.compLib === ComponentLibrary.PRIMENG ? 'times' : 'close',
|
|
876
|
+
iconPosition: IconPosition.PRE,
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
clearField(key) {
|
|
880
|
+
this.form.controls[key].setValue('');
|
|
881
|
+
this.onBlur?.next(this.widgetInstance);
|
|
882
|
+
}
|
|
883
|
+
onTextareaChange(value) {
|
|
884
|
+
const ta = this.sb4Textarea?.nativeElement;
|
|
885
|
+
if (!ta)
|
|
886
|
+
return;
|
|
887
|
+
if (document.activeElement === ta) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
requestAnimationFrame(() => {
|
|
891
|
+
ta.style.height = 'auto';
|
|
892
|
+
ta.style.height = `${ta.scrollHeight}px`;
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
handleBlurEvent(eventData) {
|
|
896
|
+
this.onBlur?.next(eventData);
|
|
897
|
+
this.blurSophisticatedValueChange.next({
|
|
898
|
+
key: this.widgetInstance.key,
|
|
899
|
+
kind: this.getSophisticatedEventKind(),
|
|
900
|
+
value: this.form.value[this.widgetInstance.key],
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
onDropDownShow() {
|
|
904
|
+
this.dorpdownOpening = true;
|
|
905
|
+
}
|
|
906
|
+
onDropDownInput() {
|
|
907
|
+
if (this.dorpdownOpening == true) {
|
|
908
|
+
this.dorpdownOpening = false;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
safeDropDownBlur(event) {
|
|
912
|
+
// We do not use the first blur event after the calendar picker opens,
|
|
913
|
+
// as it "eats" the first click
|
|
914
|
+
if (this.dorpdownOpening) {
|
|
915
|
+
this.dorpdownOpening = false;
|
|
916
|
+
return;
|
|
917
|
+
}
|
|
918
|
+
this.handleBlurEvent(event);
|
|
919
|
+
}
|
|
920
|
+
onCalendarShow() {
|
|
921
|
+
this.calendarOpening = true;
|
|
922
|
+
}
|
|
923
|
+
onCalendarInput() {
|
|
924
|
+
if (this.calendarOpening == true) {
|
|
925
|
+
this.calendarOpening = false;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
safeCalendarBlur(event) {
|
|
929
|
+
// We do not use the first blur event after the calendar picker opens,
|
|
930
|
+
// as it "eats" the first click
|
|
931
|
+
if (this.calendarOpening) {
|
|
932
|
+
this.calendarOpening = false;
|
|
933
|
+
return;
|
|
934
|
+
}
|
|
935
|
+
this.handleBlurEvent(event);
|
|
936
|
+
}
|
|
937
|
+
convertToLocalDateTime(value) {
|
|
938
|
+
if (!value)
|
|
939
|
+
return null;
|
|
940
|
+
let parsed = new Date(value);
|
|
941
|
+
if (isNaN(parsed.getTime())) {
|
|
942
|
+
console.error('Invalid Date:', value);
|
|
943
|
+
return null;
|
|
944
|
+
}
|
|
945
|
+
return new Date(parsed.getFullYear(), parsed.getMonth(), parsed.getDate(), parsed.getHours(), parsed.getMinutes(), parsed.getSeconds());
|
|
946
|
+
}
|
|
947
|
+
getControlMessages(controlName) {
|
|
948
|
+
const control = this.form.controls[controlName];
|
|
949
|
+
const errors = this.form.controls[controlName]?.errors ?? {};
|
|
950
|
+
this.errorMessages = Object.keys(errors)
|
|
951
|
+
.filter((key) => typeof errors[key] === 'string')
|
|
952
|
+
.map((key) => ({
|
|
953
|
+
severity: 'error',
|
|
954
|
+
detail: errors[key],
|
|
955
|
+
}));
|
|
956
|
+
if (this.errorMessages.length === 0) {
|
|
957
|
+
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
958
|
+
this.widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
959
|
+
this.widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
960
|
+
this.widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
961
|
+
this.widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
962
|
+
this.widgetInstance.type !== SmartFormWidgetType.RECORDING_UPLOADER &&
|
|
963
|
+
this.widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
964
|
+
this.widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
965
|
+
this.widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
966
|
+
this.widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
967
|
+
this.widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
968
|
+
this.widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
969
|
+
this.widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
970
|
+
if (Object.keys(errors).length > 0 && this.widgetInstance.serverErrorMessage != null) {
|
|
971
|
+
this.errorMessages.push({
|
|
972
|
+
severity: 'error',
|
|
973
|
+
detail: this.widgetInstance.serverErrorMessage,
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
isHtml(text) {
|
|
980
|
+
return /<[a-z][\s\S]*>/i.test(text);
|
|
981
|
+
}
|
|
982
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartformwidgetComponent, deps: [{ token: i1.SmartFormService }, { token: i2.ComponentFactoryService }, { token: i3.DomSanitizer }, { token: COMPONENT_LIBRARY }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
983
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: { form: "form", widgetInstance: "widgetInstance", onBlur: "onBlur", onValueChange: "onValueChange", labelColor: "labelColor", sophisticatedValueChange: "sophisticatedValueChange", blurSophisticatedValueChange: "blurSophisticatedValueChange" }, outputs: { valueCleared: "valueCleared" }, viewQueries: [{ propertyName: "chipInputChild", first: true, predicate: ["chipInput"], descendants: true }, { propertyName: "customComponentVcRef", first: true, predicate: ["customComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "quill", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "sb4Textarea", first: true, predicate: ["sb4Textarea"], descendants: true }, { propertyName: "fileUploader", first: true, predicate: SmartFileEditorComponent, descendants: true }, { propertyName: "multiFileUploader", first: true, predicate: SmartMultiFileEditorComponent, descendants: true }, { propertyName: "dateInputChild", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "timeInputChild", first: true, predicate: ["timeInput"], descendants: true }, { propertyName: "childrenWidgetsQL", predicate: SmartformwidgetComponent, descendants: true }], ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\n <div class=\"container prime\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer textFieldContainer\">\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\n <input\n *ngIf=\"!widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n pInputText\n formControlName=\"text\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <p-inputMask\n *ngIf=\"widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [mask]=\"widgetInstance.mask\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div class=\"textFieldButtons\">\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n >\n </smart-ui-action-toolbar>\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-inputNumber\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n inputId=\"minmax\"\n mode=\"decimal\"\n [max]=\"widgetInstance.maxValues ?? null\"\n [minFractionDigits]=\"0\"\n [maxFractionDigits]=\"5\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n </div>\n <div>\n <div class=\"widgetContent\">\n <p-editor\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [modules]=\"\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\n \"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [disabled]=\"widgetInstance.isReadonly ?? false\"\n [maxLength]=\"widgetInstance.maxLength\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\n (onTextChange)=\"handleBlurEvent($event)\"\n />\n </div>\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\n Currently not implemented\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [showTime]=\"true\"\n [showClear]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n hourFormat=\"24\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n >\n </p-calendar>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-dropdown\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n />\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-multiSelect\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onPanelShow)=\"onDropDownShow()\"\n (onBlur)=\"safeDropDownBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onPanelHide)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\n <p-floatLabel>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n pInputTextarea\n [autoResize]=\"true\"\n cols=\"30\"\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\" \"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (ngModelChange)=\"onTextareaChange($event)\"\n ></textarea>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n [for]=\"widgetInstance.key\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-chips\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\n [max]=\"0\"\n [maxLength]=\"0\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\n </p-chips>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-voice-recorder\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\n class=\"widgetContainer imageContainer\"\n >\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties!.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\n class=\"widgetContainer toggle-col\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\n {{ getWidgetLabel(widgetInstance) }}\n </label>\n <p-inputSwitch\n formControlName=\"{{ widgetInstance.key }}\"\n [(ngModel)]=\"widgetInstance.value\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\n (onChange)=\"onValueChange?.next($event)\"\n (onChange)=\"handleBlurEvent($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n [binary]=\"true\"\n [label]=\"widgetInstance.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [ngModel]=\"checkbox.value\"\n [binary]=\"true\"\n [label]=\"checkbox.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"container material\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n\n <div\n (capsLock)=\"capsOn = $event\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n\n <input\n *ngIf=\"!widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [attr.inputmode]=\"\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\n \"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n (keydown.enter)=\"onKeydown()\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n />\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\n <input\n *ngIf=\"widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (click)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\n [matAutocomplete]=\"textFieldAuto\"\n (keydown.enter)=\"onKeydown()\"\n />\n <button\n *ngIf=\"widgetInstance.isPassword\"\n mat-icon-button\n matSuffix\n (click)=\"togglePasswordVisibility($event)\"\n >\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\n </mat-option>\n </mat-autocomplete>\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\n {{ widgetInstance.capsLockWarning }}\n </span>\n\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <span matPrefix>\n <smart-icon\n *ngIf=\"capsOn && widgetInstance.isPassword\"\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\n color=\"warn\"\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n ></smart-icon>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div class=\"textFieldButtons\">\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n [color]=\"widgetInstance.textFieldButton.iconColor\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n [type]=\"'number'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [min]=\"widgetInstance.minValues ?? null\"\n [max]=\"widgetInstance.maxValues ?? null\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <span matPrefix>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\n </smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip-row\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ value }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input\n #chipInput\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n [readonly]=\"widgetInstance.isReadonly\"\n [matAutocomplete]=\"chipAuto\"\n (matChipInputTokenEnd)=\"add($event)\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n <mat-autocomplete\n #chipAuto=\"matAutocomplete\"\n (optionSelected)=\"selected($event, widgetInstance)\"\n >\n <mat-option\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let item of widgetInstance.valueList\"\n [value]=\"item.value\"\n >\n {{ item.label }}\n </mat-option>\n </mat-autocomplete>\n </mat-chip-grid>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ getChipsValue(value) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipListLookup\"\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\n [matChipInputAddOnBlur]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n </mat-chip-grid>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n cols=\"30\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n ></textarea>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n (change)=\"onValueChange?.next(widgetInstance)\"\n >\n {{ widgetInstance.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [value]=\"checkbox.value\"\n (change)=\"onValueChange?.next(checkbox)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n >\n {{ checkbox.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-radio-group\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n [attr.data-testid]=\"widgetInstance.key\"\n aria-label=\"{{ widgetInstance.label }}\"\n appearance=\"outline\"\n formControlName=\"{{ widgetInstance.key }}\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <div [ngClass]=\"getDirection()\">\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\n <img\n *ngIf=\"radio.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"radio-item-image\"\n [src]=\"radio.imageUrl\"\n />\n <mat-radio-button\n class=\"selecatbleObject\"\n value=\"{{ radio.value }}\"\n [ngClass]=\"getDirection()\"\n (change)=\"onValueChange?.next(radio.value)\"\n [disabled]=\"widgetInstance.isDisabled\"\n >\n {{ radio.label }}\n </mat-radio-button>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n <div class=\"radio-icon\">\n <smart-icon\n *ngIf=\"widgetInstance.icon\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n >\n </smart-icon>\n </div>\n </div>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"datePicker widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (change)=\"handleBlurEvent(widgetInstance)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <!-- <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <mat-form-field\n class=\"input widgetContent\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"1\"\n [stepSecond]=\"10\"\n [touchUi]=\"false\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n [disableMinute]=\"false\"\n [hideTime]=\"false\"\n >\n </ngx-mat-datetime-picker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n (blur)=\"onBlur?.next(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div> -->\n\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\n <div class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <lib-smart-month-picker\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (valueChange)=\"handleYearMonthPicked($event)\"\n ></lib-smart-month-picker>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"dateTimePickerContainer\">\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n #dateInput\n matInput\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (blur)=\"onDatePickerBlur($event)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"hasCreated\"\n class=\"input widgetContent time\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <input\n #timeInput\n [formControlName]=\"widgetInstance.key + '-time'\"\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\n [id]=\"widgetInstance.key\"\n [type]=\"'time'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n (blur)=\"onTimePickerBlur($event)\"\n matInput\n />\n </mat-form-field>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon>\n {{ innerOption.label }}\n </mat-option>\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n multiple\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon\n >{{ innerOption.label }}</mat-option\n >\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'time'\"\n [value]=\"getTime()\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <mat-slide-toggle\n formControlName=\"{{ widgetInstance.key }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n value=\"{{ widgetInstance.value }}\"\n (change)=\"onValueChange?.next($event)\"\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\n ><span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"smartIndicator widgetContent\">\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\n <div\n *ngFor=\"let item of indicatorItems; let i = index\"\n class=\"indicatorItem\"\n [ngClass]=\"getIndicatorItemClass(i)\"\n ></div>\n </div>\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\n {{ getIndicatorStatusLabel() }}\n </p>\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-voice-recorder\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n </div>\n }\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\n <div class=\"widgetContainer imageContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties?.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [(ngModel)]=\"widgetInstance.value\"\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\n <hr\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n />\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <button\n mat-button\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\n (click)=\"onButtonClicked(widgetInstance)\"\n >\n <div\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\n ></div>\n <ng-template #iconOnly>\n <smart-icon\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n <ng-template #text>\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n {{ widgetInstance.uiActionDescriptor?.title }}\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n </button>\n </div>\n </div>\n\n <div class=\"widgetContainer\">\n <h4\n class=\"labelContainer\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"widgetContent\">\n <ng-template #customComponent></ng-template>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <quill-editor\n #quillEditor\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [maxLength]=\"widgetInstance.maxLength\"\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\n ></quill-editor>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n class=\"rich-text-editor-leeway-counter\"\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\n >\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n\n <table class=\"matrixTable widgetContent\">\n <tr>\n <th></th>\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\n {{ option.displayValue }}\n </th>\n </tr>\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\n <th class=\"questionLabel\">\n <label>{{ question.displayValue }}</label>\n </th>\n\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\n <mat-radio-group\n *ngIf=\"!widgetInstance.isMultiple\"\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\n [name]=\"'q' + i\"\n >\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\n </mat-radio-group>\n <div *ngIf=\"widgetInstance.isMultiple\">\n <mat-checkbox\n [formControlName]=\"\n widgetInstance.key + '.data.' + question.code + '.' + option.code\n \"\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\n [checked]=\"true\"\n ></mat-checkbox>\n </div>\n </td>\n <br />\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\n ><smart-icon icon=\"close\"></smart-icon\n ></button>\n </tr>\n </table>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <youtube-player\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n videoId=\"{{ widgetInstance.videoId }}\"\n [width]=\"widgetInstance.width\"\n [height]=\"widgetInstance.height\"\n [startSeconds]=\"widgetInstance.startSeconds\"\n [endSeconds]=\"widgetInstance.endSeconds\"\n ></youtube-player>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n </div>\n}\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.material .smart-form-widget-label{font-weight:700}.material .mat-mdc-form-field-subscript-wrapper{display:none}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i11.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i14.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i16.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i18.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i18.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i19.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i20.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i20.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i21.QuillEditorComponent, selector: "quill-editor" }, { kind: "component", type: i22.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "disableCookies", "showBeforeIframeApiLoads"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }, { kind: "directive", type: i23.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i24.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "component", type: i25.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i26.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i27.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i28.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "component", type: i29.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "directive", type: i30.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "component", type: i31.FloatLabel, selector: "p-floatLabel" }, { kind: "component", type: i32.Chips, selector: "p-chips", inputs: ["style", "styleClass", "disabled", "field", "placeholder", "max", "maxLength", "ariaLabel", "ariaLabelledBy", "tabindex", "inputId", "allowDuplicate", "caseSensitiveDuplication", "inputStyle", "inputStyleClass", "addOnTab", "addOnBlur", "separator", "showClear", "autofocus", "variant"], outputs: ["onAdd", "onRemove", "onFocus", "onBlur", "onChipClick", "onClear"] }, { kind: "component", type: i33.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i34.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "component", type: i35.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "component", type: i36.Editor, selector: "p-editor", inputs: ["style", "styleClass", "placeholder", "formats", "modules", "bounds", "scrollingContainer", "debug", "readonly"], outputs: ["onInit", "onTextChange", "onSelectionChange"] }, { kind: "component", type: i37.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: ["form", "widgetInstance", "onBlur", "onValueChange", "labelColor", "sophisticatedValueChange", "blurSophisticatedValueChange"], outputs: ["valueCleared"] }, { kind: "directive", type: i38.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { kind: "directive", type: i39.ComparableDropdownDirective, selector: "p-dropdown", inputs: ["compareWith"] }, { kind: "directive", type: i40.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i41.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { kind: "component", type: i42.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }, { kind: "component", type: i43.SmartFileEditorComponent, selector: "smart-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i44.SmartMultiFileEditorComponent, selector: "smart-multi-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent", "fileEvent"] }, { kind: "component", type: i45.SmartVoiceRecorderComponent, selector: "smart-voice-recorder", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i46.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i47.HighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
984
|
+
}
|
|
985
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartformwidgetComponent, decorators: [{
|
|
986
|
+
type: Component,
|
|
987
|
+
args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (compLib === componentLibrary.PRIMENG) {\n <div class=\"container prime\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer textFieldContainer\">\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\n <input\n *ngIf=\"!widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n pInputText\n formControlName=\"text\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <p-inputMask\n *ngIf=\"widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [mask]=\"widgetInstance.mask\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div class=\"textFieldButtons\">\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n >\n </smart-ui-action-toolbar>\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-inputNumber\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n inputId=\"minmax\"\n mode=\"decimal\"\n [max]=\"widgetInstance.maxValues ?? null\"\n [minFractionDigits]=\"0\"\n [maxFractionDigits]=\"5\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n </div>\n <div>\n <div class=\"widgetContent\">\n <p-editor\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [modules]=\"\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\n \"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [disabled]=\"widgetInstance.isReadonly ?? false\"\n [maxLength]=\"widgetInstance.maxLength\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\n (onTextChange)=\"handleBlurEvent($event)\"\n />\n </div>\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\n Currently not implemented\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [showTime]=\"true\"\n [showClear]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n hourFormat=\"24\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n >\n </p-calendar>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-dropdown\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n />\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-multiSelect\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onPanelShow)=\"onDropDownShow()\"\n (onBlur)=\"safeDropDownBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onPanelHide)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\n <p-floatLabel>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n pInputTextarea\n [autoResize]=\"true\"\n cols=\"30\"\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\" \"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (ngModelChange)=\"onTextareaChange($event)\"\n ></textarea>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n [for]=\"widgetInstance.key\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-chips\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\n [max]=\"0\"\n [maxLength]=\"0\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\n </p-chips>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-voice-recorder\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\n class=\"widgetContainer imageContainer\"\n >\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties!.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\n class=\"widgetContainer toggle-col\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\n {{ getWidgetLabel(widgetInstance) }}\n </label>\n <p-inputSwitch\n formControlName=\"{{ widgetInstance.key }}\"\n [(ngModel)]=\"widgetInstance.value\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\n (onChange)=\"onValueChange?.next($event)\"\n (onChange)=\"handleBlurEvent($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n [binary]=\"true\"\n [label]=\"widgetInstance.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [ngModel]=\"checkbox.value\"\n [binary]=\"true\"\n [label]=\"checkbox.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"container material\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n\n <div\n (capsLock)=\"capsOn = $event\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n\n <input\n *ngIf=\"!widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [attr.inputmode]=\"\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\n \"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n (keydown.enter)=\"onKeydown()\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n />\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\n <input\n *ngIf=\"widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (click)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\n [matAutocomplete]=\"textFieldAuto\"\n (keydown.enter)=\"onKeydown()\"\n />\n <button\n *ngIf=\"widgetInstance.isPassword\"\n mat-icon-button\n matSuffix\n (click)=\"togglePasswordVisibility($event)\"\n >\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\n </mat-option>\n </mat-autocomplete>\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\n {{ widgetInstance.capsLockWarning }}\n </span>\n\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <span matPrefix>\n <smart-icon\n *ngIf=\"capsOn && widgetInstance.isPassword\"\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\n color=\"warn\"\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n ></smart-icon>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div class=\"textFieldButtons\">\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n [color]=\"widgetInstance.textFieldButton.iconColor\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n [type]=\"'number'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [min]=\"widgetInstance.minValues ?? null\"\n [max]=\"widgetInstance.maxValues ?? null\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <span matPrefix>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\n </smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip-row\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ value }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input\n #chipInput\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n [readonly]=\"widgetInstance.isReadonly\"\n [matAutocomplete]=\"chipAuto\"\n (matChipInputTokenEnd)=\"add($event)\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n <mat-autocomplete\n #chipAuto=\"matAutocomplete\"\n (optionSelected)=\"selected($event, widgetInstance)\"\n >\n <mat-option\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let item of widgetInstance.valueList\"\n [value]=\"item.value\"\n >\n {{ item.label }}\n </mat-option>\n </mat-autocomplete>\n </mat-chip-grid>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ getChipsValue(value) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipListLookup\"\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\n [matChipInputAddOnBlur]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n </mat-chip-grid>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n cols=\"30\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n ></textarea>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n (change)=\"onValueChange?.next(widgetInstance)\"\n >\n {{ widgetInstance.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [value]=\"checkbox.value\"\n (change)=\"onValueChange?.next(checkbox)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n >\n {{ checkbox.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-radio-group\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n [attr.data-testid]=\"widgetInstance.key\"\n aria-label=\"{{ widgetInstance.label }}\"\n appearance=\"outline\"\n formControlName=\"{{ widgetInstance.key }}\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <div [ngClass]=\"getDirection()\">\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\n <img\n *ngIf=\"radio.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"radio-item-image\"\n [src]=\"radio.imageUrl\"\n />\n <mat-radio-button\n class=\"selecatbleObject\"\n value=\"{{ radio.value }}\"\n [ngClass]=\"getDirection()\"\n (change)=\"onValueChange?.next(radio.value)\"\n [disabled]=\"widgetInstance.isDisabled\"\n >\n {{ radio.label }}\n </mat-radio-button>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n <div class=\"radio-icon\">\n <smart-icon\n *ngIf=\"widgetInstance.icon\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n >\n </smart-icon>\n </div>\n </div>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"datePicker widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (change)=\"handleBlurEvent(widgetInstance)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <!-- <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <mat-form-field\n class=\"input widgetContent\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"1\"\n [stepSecond]=\"10\"\n [touchUi]=\"false\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n [disableMinute]=\"false\"\n [hideTime]=\"false\"\n >\n </ngx-mat-datetime-picker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n (blur)=\"onBlur?.next(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div> -->\n\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\n <div class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <lib-smart-month-picker\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (valueChange)=\"handleYearMonthPicked($event)\"\n ></lib-smart-month-picker>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"dateTimePickerContainer\">\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n #dateInput\n matInput\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (blur)=\"onDatePickerBlur($event)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"hasCreated\"\n class=\"input widgetContent time\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <input\n #timeInput\n [formControlName]=\"widgetInstance.key + '-time'\"\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\n [id]=\"widgetInstance.key\"\n [type]=\"'time'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n (blur)=\"onTimePickerBlur($event)\"\n matInput\n />\n </mat-form-field>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <div\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon>\n {{ innerOption.label }}\n </mat-option>\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n multiple\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon\n >{{ innerOption.label }}</mat-option\n >\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'time'\"\n [value]=\"getTime()\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <mat-slide-toggle\n formControlName=\"{{ widgetInstance.key }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n value=\"{{ widgetInstance.value }}\"\n (change)=\"onValueChange?.next($event)\"\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\n ><span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"smartIndicator widgetContent\">\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\n <div\n *ngFor=\"let item of indicatorItems; let i = index\"\n class=\"indicatorItem\"\n [ngClass]=\"getIndicatorItemClass(i)\"\n ></div>\n </div>\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\n {{ getIndicatorStatusLabel() }}\n </p>\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-voice-recorder\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n </div>\n }\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\n <div class=\"widgetContainer imageContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties?.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [(ngModel)]=\"widgetInstance.value\"\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\n <hr\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n />\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <button\n mat-button\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\n (click)=\"onButtonClicked(widgetInstance)\"\n >\n <div\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\n ></div>\n <ng-template #iconOnly>\n <smart-icon\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n <ng-template #text>\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n {{ widgetInstance.uiActionDescriptor?.title }}\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n </button>\n </div>\n </div>\n\n <div class=\"widgetContainer\">\n <h4\n class=\"labelContainer\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"widgetContent\">\n <ng-template #customComponent></ng-template>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <quill-editor\n #quillEditor\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [maxLength]=\"widgetInstance.maxLength\"\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\n ></quill-editor>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n class=\"rich-text-editor-leeway-counter\"\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\n >\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n\n <table class=\"matrixTable widgetContent\">\n <tr>\n <th></th>\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\n {{ option.displayValue }}\n </th>\n </tr>\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\n <th class=\"questionLabel\">\n <label>{{ question.displayValue }}</label>\n </th>\n\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\n <mat-radio-group\n *ngIf=\"!widgetInstance.isMultiple\"\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\n [name]=\"'q' + i\"\n >\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\n </mat-radio-group>\n <div *ngIf=\"widgetInstance.isMultiple\">\n <mat-checkbox\n [formControlName]=\"\n widgetInstance.key + '.data.' + question.code + '.' + option.code\n \"\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\n [checked]=\"true\"\n ></mat-checkbox>\n </div>\n </td>\n <br />\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\n ><smart-icon icon=\"close\"></smart-icon\n ></button>\n </tr>\n </table>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <youtube-player\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n videoId=\"{{ widgetInstance.videoId }}\"\n [width]=\"widgetInstance.width\"\n [height]=\"widgetInstance.height\"\n [startSeconds]=\"widgetInstance.startSeconds\"\n [endSeconds]=\"widgetInstance.endSeconds\"\n ></youtube-player>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n </div>\n}\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.material .smart-form-widget-label{font-weight:700}.material .mat-mdc-form-field-subscript-wrapper{display:none}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"] }]
|
|
988
|
+
}], ctorParameters: () => [{ type: i1.SmartFormService }, { type: i2.ComponentFactoryService }, { type: i3.DomSanitizer }, { type: i48.ComponentLibrary, decorators: [{
|
|
989
|
+
type: Inject,
|
|
990
|
+
args: [COMPONENT_LIBRARY]
|
|
991
|
+
}] }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
|
|
992
|
+
type: Input
|
|
993
|
+
}], widgetInstance: [{
|
|
994
|
+
type: Input
|
|
995
|
+
}], onBlur: [{
|
|
996
|
+
type: Input
|
|
997
|
+
}], onValueChange: [{
|
|
998
|
+
type: Input
|
|
999
|
+
}], labelColor: [{
|
|
1000
|
+
type: Input
|
|
1001
|
+
}], sophisticatedValueChange: [{
|
|
1002
|
+
type: Input
|
|
1003
|
+
}], blurSophisticatedValueChange: [{
|
|
1004
|
+
type: Input
|
|
1005
|
+
}], valueCleared: [{
|
|
1006
|
+
type: Output
|
|
1007
|
+
}], chipInputChild: [{
|
|
1008
|
+
type: ViewChild,
|
|
1009
|
+
args: ['chipInput']
|
|
1010
|
+
}], customComponentVcRef: [{
|
|
1011
|
+
type: ViewChild,
|
|
1012
|
+
args: ['customComponent', { read: ViewContainerRef }]
|
|
1013
|
+
}], quill: [{
|
|
1014
|
+
type: ViewChild,
|
|
1015
|
+
args: ['quillEditor']
|
|
1016
|
+
}], toolbar: [{
|
|
1017
|
+
type: ViewChild,
|
|
1018
|
+
args: ['toolbar']
|
|
1019
|
+
}], childrenWidgetsQL: [{
|
|
1020
|
+
type: ViewChildren,
|
|
1021
|
+
args: [SmartformwidgetComponent]
|
|
1022
|
+
}], sb4Textarea: [{
|
|
1023
|
+
type: ViewChild,
|
|
1024
|
+
args: ['sb4Textarea']
|
|
1025
|
+
}], fileUploader: [{
|
|
1026
|
+
type: ViewChild,
|
|
1027
|
+
args: [SmartFileEditorComponent]
|
|
1028
|
+
}], multiFileUploader: [{
|
|
1029
|
+
type: ViewChild,
|
|
1030
|
+
args: [SmartMultiFileEditorComponent]
|
|
1031
|
+
}], dateInputChild: [{
|
|
1032
|
+
type: ViewChild,
|
|
1033
|
+
args: ['dateInput']
|
|
1034
|
+
}], timeInputChild: [{
|
|
1035
|
+
type: ViewChild,
|
|
1036
|
+
args: ['timeInput']
|
|
1037
|
+
}] } });
|
|
1038
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSS9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBYyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUYsT0FBTyxFQUNMLFlBQVksRUFFWixrQkFBa0IsR0FHbkIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3RG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c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQVNpQixjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVc7Z0JBV3RCLG9CQUFvQjtzQkFEbkIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPOUIsS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxhQUFhO2dCQVNGLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHcEIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLHdCQUF3QjtnQkFPWixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ2EsWUFBWTtzQkFBaEQsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBQ08saUJBQWlCO3NCQUExRCxTQUFTO3VCQUFDLDZCQUE2QjtnQkFxSWhCLGNBQWM7c0JBQXJDLFNBQVM7dUJBQUMsV0FBVztnQkFDRSxjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ2Zhc3QtZXF1YWxzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IENvbnRlbnRDaGFuZ2UsIFF1aWxsRWRpdG9yQ29tcG9uZW50LCBRdWlsbE1vZHVsZXMgfSBmcm9tICduZ3gtcXVpbGwnO1xuaW1wb3J0IHsgRWRpdG9yVGV4dENoYW5nZUV2ZW50IH0gZnJvbSAncHJpbWVuZy9lZGl0b3InO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50LWZhY3Rvcnktc2VydmljZS9wcm9qZWN0cyc7XG5pbXBvcnQge1xuICBJY29uUG9zaXRpb24sXG4gIFVpQWN0aW9uLFxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXG4gIFVpQWN0aW9uRGVzY3JpcHRvcixcbiAgVWlBY3Rpb25VcGxvYWREZXNjcmlwdG9yLFxufSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvYXBpJztcbmltcG9ydCB7IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC9zbWFydC11aS1hY3Rpb24vdWktYWN0aW9uLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIENPTVBPTkVOVF9MSUJSQVJZLFxuICBDb21wb25lbnRMaWJyYXJ5LFxufSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvdXRpbGl0eS9jb21wb25lbnRMaWJyYXJ5JztcbmltcG9ydCB7IFNtYXJ0U3R5bGVVdGlsaXR5IH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvc21hcnQtc3R5bGUtdXRpbGl0eSc7XG5pbXBvcnQge1xuICBTbWFydEZvcm1XaWRnZXREaXJlY3Rpb24sXG4gIFNtYXJ0Rm9ybVdpZGdldFR5cGUsXG4gIFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bSxcbn0gZnJvbSAnLi4vLi4vYXBpL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBTbWFydEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc21hcnRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgU21hcnRCdXR0b24sXG4gIFNtYXJ0Rm9ybVdpZGdldCxcbiAgU21hcnRJdGVtLFxuICBTbWFydEl0ZW1zLFxuICBTbWFydE1hdHJpeCxcbn0gZnJvbSAnLi4vLi4vc21hcnRmb3JtLmZvcm0tbW9kZWwnO1xuaW1wb3J0IHtcbiAgU21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uLFxuICBTbWFydFZhbGlkYXRvcixcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxuICBWYWx1ZSxcbn0gZnJvbSAnLi4vLi4vc21hcnRmb3JtLm1vZGVsJztcbmltcG9ydCB7IFNtYXJ0RmlsZUVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc21hcnQtZmlsZS1lZGl0b3Ivc21hcnQtZmlsZS1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNtYXJ0TXVsdGlGaWxlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zbWFydC1tdWx0aS1maWxlLWVkaXRvci9zbWFydC1tdWx0aS1maWxlLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFNtYXJ0U3ViamVjdCB9IGZyb20gJy4uLy4uLy4uL3NtYXJ0LXN1YmplY3QvcHJvamVjdHMnO1xuZXhwb3J0IGNsYXNzIFNtYXJ0V2lkZ2V0U2V0dGluZ3Mge1xuICBwdWJsaWMgc3RhdGljIHVzZVV0YyA9IGZhbHNlO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc21hcnRmb3Jtd2lkZ2V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQuY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTbWFydGZvcm13aWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBoaWRlUGFzc3dvcmQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHNtYXJ0Q29tcG9uZW50OiBhbnk7XG5cbiAgZXJyb3JNZXNzYWdlczogTWVzc2FnZVtdID0gW107XG5cbiAgQElucHV0KCkgZm9ybSE6IFVudHlwZWRGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIHdpZGdldEluc3RhbmNlITogU21hcnRGb3JtV2lkZ2V0PGFueT47XG4gIEBJbnB1dCgpIG9uQmx1cj86IFN1YmplY3Q8YW55PjtcbiAgQElucHV0KCkgb25WYWx1ZUNoYW5nZT86IFN1YmplY3Q8YW55PjtcbiAgQElucHV0KCkgbGFiZWxDb2xvcj86IHN0cmluZztcbiAgQElucHV0KCkgc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlITogU3ViamVjdDxTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2U+O1xuICBASW5wdXQoKSBibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlITogU3ViamVjdDxTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2U+O1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBldmVudD86IGFueTtcbiAgICBrZXk6IGFueTtcbiAgfT4oKTtcblxuICBzbWFydEZvcm1XaWRnZXRUeXBlID0gU21hcnRGb3JtV2lkZ2V0VHlwZTtcblxuICBjYXBzT246IGFueTtcblxuICBAVmlld0NoaWxkKCdjaGlwSW5wdXQnKSBjaGlwSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgZmlsdGVyZWRWYWx1ZUxpc3Q/OiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPjtcblxuICBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBlcnJvcktleT86IHN0cmluZztcblxuICBpbmRpY2F0b3JJdGVtcz86IGFueVtdO1xuICBkZWZhdWx0RGF0ZT86IERhdGU7XG4gIC8vIGN1c3RvbUNvbXBvbmVudFxuICBAVmlld0NoaWxkKCdjdXN0b21Db21wb25lbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgY3VzdG9tQ29tcG9uZW50VmNSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xuICBjdXN0b21Db21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8YW55PjtcblxuICBmaWx0ZXJlZE9wdGlvbnM/OiBPYnNlcnZhYmxlPFNtYXJ0SXRlbTxhbnk+W10+O1xuICB0b0hpZ2hsaWdodDogc3RyaW5nID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgncXVpbGxFZGl0b3InKSBxdWlsbD86IFF1aWxsRWRpdG9yQ29tcG9uZW50O1xuXG4gIGlzRW50ZXJQcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNEYXRlUGlja2VyUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBTbWFydFdpZGdldEhpbnRQb3NpdGlvbiA9IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bTtcblxuICAvLyB0b29sYmFyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGRyZW4oU21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50KVxuICBjaGlsZHJlbldpZGdldHNRTD86IFF1ZXJ5TGlzdDxTbWFydGZvcm13aWRnZXRDb21wb25lbnQ+O1xuICBjb21wb25lbnRMaWJyYXJ5ID0gQ29tcG9uZW50TGlicmFyeTtcbiAgZW1wdHlRdWlsbFRvb2xiYXI6IFF1aWxsTW9kdWxlcyA9IHtcbiAgICB0b29sYmFyOiBmYWxzZSxcbiAgfTtcblxuICBAVmlld0NoaWxkKCdzYjRUZXh0YXJlYScpIHNiNFRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChTbWFydEZpbGVFZGl0b3JDb21wb25lbnQpIGZpbGVVcGxvYWRlciE6IFNtYXJ0RmlsZUVkaXRvckNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZChTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudCkgbXVsdGlGaWxlVXBsb2FkZXI/OiBTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNtYXJ0Rm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgcHVibGljIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcbiAgICApIHtcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0ID0gdGhpcy5zZXJ2aWNlLmZpbHRlcldpZGdldHNCeVZpc2liaWxpdHkoXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICAgIH0pO1xuICAgIHRoaXMub25CbHVyPy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcbiAgICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbE1lc3NhZ2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5ISk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gaGFuZGxlIGluaXRpYWwgZXJyb3IgbWVzc2FnZSBmcm9tIHNlcnZlclxuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICAgIC8vIHRoaXMuZ2V0Q29udHJvbE1lc3NhZ2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5ISk7XG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3JcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvcj8uaW5kaWNhdG9yTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9ySXRlbXMgPSBuZXcgQXJyYXk8YW55Pih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvci5pbmRpY2F0b3JMZW5ndGgpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0ZVByb3BlcnR5XS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUgPVxuICAgICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuY2hhbmdlSW5kaWNhdG9yU3RhdHVzKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVIpIHtcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdERhdGUgPSBuZXcgRGF0ZSh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cbiAgICApIHtcbiAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2UgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9uVmFsdWVDaGFuZ2UhLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICAgIG1hcCgodmFsdWUpID0+IHRoaXMuX2ZpbHRlcih2YWx1ZSB8fCAnJykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVIpIHtcbiAgICAgIGxldCB2aWRlb0lkID0gdGhpcy5wYXJzZVlvdXR1YmVVcmwodGhpcy53aWRnZXRJbnN0YW5jZS5saW5rISk7XG4gICAgICBpZiAodmlkZW9JZCkgdGhpcy53aWRnZXRJbnN0YW5jZS52aWRlb0lkID0gdmlkZW9JZDtcbiAgICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gICAgICB0YWcuc3JjID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YWcpO1xuICAgIH1cblxuICAgIGxldCBmb3JtQ29udHJvbHM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5maWx0ZXIoXG4gICAgICAoa2V5OiBzdHJpbmcpID0+XG4gICAgICAgIGtleSA9PT0gdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkgfHwga2V5LnN0YXJ0c1dpdGgoYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LmApXG4gICAgKTtcblxuICAgIGZvcm1Db250cm9scy5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTICYmXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U29waGlzdGljYXRlZEV2ZW50S2luZCgpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh2YWx1ZUNoYW5nZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U29waGlzdGljYXRlZEV2ZW50S2luZCgpOiAnc2VsZWN0aW9uJyB8ICdiYXNpYycge1xuICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFIHx8XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXG4gICAgICA/ICdzZWxlY3Rpb24nXG4gICAgICA6ICdiYXNpYyc7XG4gIH1cblxuICBwYXJzZVlvdXR1YmVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICB1cmwucmVwbGFjZSgnL3Nob3J0cy8nLCAnL3dhdGNoP3Y9Jyk7XG5cbiAgICB2YXIgcmVnRXhwID0gL14uKigoeW91dHUuYmVcXC8pfCh2XFwvKXwoXFwvdVxcL1xcd1xcLyl8KGVtYmVkXFwvKXwod2F0Y2hcXD8pKVxcPz92Pz0/KFteIyY/XSopLiovO1xuICAgIHZhciBtYXRjaCA9IHVybC5tYXRjaChyZWdFeHApO1xuXG4gICAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzddLmxlbmd0aCA9PSAxMSA/IG1hdGNoWzddIDogZmFsc2U7XG4gIH1cblxuICBfaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgaGFzSnVzdENoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0p1c3RDaGFuZ2VkO1xuICB9XG4gIHNldCBoYXNKdXN0Q2hhbmdlZChoYXNKdXN0Q2hhbmdlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2hhc0p1c3RDaGFuZ2VkID0gaGFzSnVzdENoYW5nZWQ7XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjUwKSkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9oYXNKdXN0Q2hhbmdlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgaGFzQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVJbnB1dCcpIGRhdGVJbnB1dENoaWxkPzogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGltZUlucHV0JykgdGltZUlucHV0Q2hpbGQ/OiBFbGVtZW50UmVmO1xuXG4gIG9uRGF0ZVBpY2tlckJsdXIoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQodGhpcy53aWRnZXRJbnN0YW5jZSk7XG4gICAgdGhpcy5oYW5kbGVEYXRlQ2hhbmdlZCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXS52YWx1ZSk7XG4gIH1cblxuICBvblRpbWVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICAgIHRoaXMuaGFuZGxlVGltZUNoYW5nZWQodGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF0udmFsdWUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UKSB7XG4gICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFJlZiA9IHRoaXMuY2ZTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRWY1JlZiEsXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuY29tcG9uZW50LFxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmlucHV0XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuTUFURVJJQUwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIgfHxcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1PTlRIX1BJQ0tFUlxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgPSAhIXRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8uc29tZShcbiAgICAgICAgICAoc21hcnRWYWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiBzbWFydFZhbGlkYXRvci52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycyA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8ubWFwKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChfbW9tZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0ZUNoYW5nZWQoX21vbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodGltZVZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVGltZUNoYW5nZWQodGltZVZhbHVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUikge1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodGltZVZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmICh0aW1lVmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKHRpbWVWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmRlZmF1bHREYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0JPWCAmJlxuICAgICAgdGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORyAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcz8ubWF4Um93cyAmJlxuICAgICAgdGhpcy5zYjRUZXh0YXJlYVxuICAgICkge1xuICAgICAgdmFyIHRleHRhcmVhID0gdGhpcy5zYjRUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xuICAgICAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0ZXh0YXJlYSk7XG5cbiAgICAgIHZhciBtYXhMaW5lcyA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudGV4dEJveFByb3BlcnRpZXMubWF4Um93cztcbiAgICAgIHZhciBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zYjQtdGV4dGFyZWEtbGluZS1oZWlnaHQnKSkgfHwgMjA7XG5cbiAgICAgIHZhciBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSB8fCAwO1xuICAgICAgdmFyIHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDA7XG5cbiAgICAgIHZhciB2ZXJ0aWNhbEV4dHJhcyA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tO1xuXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBgJHtsaW5lSGVpZ2h0ICogbWF4TGluZXMgKyB2ZXJ0aWNhbEV4dHJhc31weGA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmIHRoaXMuZmlsZVVwbG9hZGVyKSB7XG4gICAgICB0aGlzLnRvb2xiYXIgPSB0aGlzLmZpbGVVcGxvYWRlci50b29sYmFyO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXG4gICAgICB0aGlzLm11bHRpRmlsZVVwbG9hZGVyXG4gICAgKSB7XG4gICAgICB0aGlzLnRvb2xiYXIgPSB0aGlzLm11bHRpRmlsZVVwbG9hZGVyLnRvb2xiYXI7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRGF0ZUNoYW5nZWQoX21vbWVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaXNEYXRlRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZGF0ZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaXNUaW1lRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGltZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZGF0ZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV07XG4gICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF07XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcbiAgICAgICFfbW9tZW50XG4gICAgKSB7XG4gICAgICB0aW1lRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXG4gICAgICAhdGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxuICAgICAgX21vbWVudFxuICAgICkge1xuICAgICAgdGltZUZvcm1Db250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICAgIGlmICh0aW1lRm9ybUNvbnRyb2wudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZShub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aW1lRm9ybUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfbW9tZW50IHx8IGlzRGF0ZUZvY3VzZWQgfHwgaXNUaW1lRm9jdXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0p1c3RDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZVZhbHVlID0gdGltZUZvcm1Db250cm9sLnZhbHVlIHx8ICcwMDowMCc7XG4gICAgdGhpcy5oYXNKdXN0Q2hhbmdlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIpIHtcbiAgICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbCwgX21vbWVudCwgdGltZVZhbHVlKTtcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUgPSBkYXRlRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVGltZUNoYW5nZWQodGltZVZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpc0ZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRpbWVJbnB1dENoaWxkPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdO1xuICAgIGNvbnN0IHRpbWVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdO1xuXG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcbiAgICAgICF0aW1lVmFsdWVcbiAgICApIHtcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKGRhdGVGb3JtQ29udHJvbC52YWx1ZSA/PyAnJyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXG4gICAgICAhZGF0ZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxuICAgICAgdGltZVZhbHVlXG4gICAgKSB7XG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoaXNGb2N1c2VkKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuXG4gICAgaWYgKHRoaXMuaGFzSnVzdENoYW5nZWQpIHtcbiAgICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRpbWVWYWx1ZSkge1xuICAgICAgaWYgKHRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgdGltZUZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IF9tb21lbnQgPSBkYXRlRm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIV9tb21lbnQpIHtcbiAgICAgIF9tb21lbnQgPSBtb21lbnQoKTsgLy8gb3IgbW9tZW50KCkuc3RhcnRPZignZGF5JykgaWYgeW91IHByZWZlclxuICAgIH1cblxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xuICAgICAgdGhpcy5zZXREYXRlRm9ybUNvbnRyb2woZGF0ZUZvcm1Db250cm9sLCBfbW9tZW50LCB0aW1lVmFsdWUpO1xuXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gZGF0ZUZvcm1Db250cm9sLnZhbHVlO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbDogYW55LCBfbW9tZW50OiBhbnksIHRpbWVWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKF9tb21lbnQpIHtcbiAgICAgIGxldCBob3VyID0gdGltZVZhbHVlLnN1YnN0cmluZygwLCAyKTtcbiAgICAgIGxldCBtaW4gPSB0aW1lVmFsdWUuc3Vic3RyaW5nKDMsIDUpO1xuXG4gICAgICBjb25zdCBuZXdNb21lbnQgPSBtb21lbnQoX21vbWVudCkuc2V0KHtcbiAgICAgICAgaG91cjogK2hvdXIsXG4gICAgICAgIG1pbnV0ZTogK21pbixcbiAgICAgICAgc2Vjb25kOiAwLFxuICAgICAgICBtaWxsaXNlY29uZDogMCxcbiAgICAgIH0pO1xuXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUobmV3TW9tZW50KTtcbiAgICB9XG4gIH1cblxuICBnZXRUaW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMV0uc3Vic3RyaW5nKDAsIDUpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uS2V5ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRW50ZXJQcmVzc2VkID0gdHJ1ZTtcblxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5pc0VudGVyUHJlc3NlZCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNFbnRlclByZXNzZWQpIHtcbiAgICAgIHRoaXMuaGlkZVBhc3N3b3JkID0gIXRoaXMuaGlkZVBhc3N3b3JkO1xuICAgIH1cbiAgfVxuXG4gIGdldE5nQ2xhc3MoKTogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ0NsYXNzZXModGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSk7XG4gIH1cblxuICBnZXRTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHtcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpIHtcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUgPSB7XG4gICAgICAgIGNsYXNzZXNUb0FkZDogW10sXG4gICAgICAgIGNsYXNzZXNUb1JlbW92ZTogW10sXG4gICAgICAgIHN0eWxlOiB7fSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCEoJ3dpZHRoJyBpbiB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlLnN0eWxlKSAmJiAnbWluV2lkdGgnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUuc3R5bGVbJ3dpZHRoJ10gPSBgJHt0aGlzLndpZGdldEluc3RhbmNlLm1pbldpZHRofXB4YDtcbiAgICB9XG4gICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nU3R5bGVzKHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpO1xuICB9XG5cbiAgZ2V0TGFiZWxOZ0NsYXNzKCk6IHsgW2NsYXNzTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICBpZiAoJ2xhYmVsU3R5bGUnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ0NsYXNzZXModGhpcy53aWRnZXRJbnN0YW5jZS5sYWJlbFN0eWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBnZXRMYWJlbFN0eWxlKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH0ge1xuICAgIGlmICgnbGFiZWxTdHlsZScgaW4gdGhpcy53aWRnZXRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nU3R5bGVzKHRoaXMud2lkZ2V0SW5zdGFuY2UubGFiZWxTdHlsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSBoYW5kbGVyIGZvciB0aGUgcG90ZW50aWFsbHkgcHJlc2VudCBRdWlsbCBlZGl0b3IsIGVuZm9yY2luZyBtYXggbGVuZ3RoIGxpbWl0cyBpZlxuICAgKiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFuZ2UgdGhlIHtAbGluayBDb250ZW50Q2hhbmdlfSB0aGUgUXVpbGwgZWRpdG9yIGVtaXRzXG4gICAqIEByZXR1cm5zIHtAY29kZSB2b2lkfVxuICAgKi9cbiAgb25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKGNoYW5nZTogQ29udGVudENoYW5nZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXG4gICAgLy8gdW5yZW1vdmFibGUgbmV3LWxpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRlbnQuXG4gICAgY29uc3QgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCArIDE7XG4gICAgaWYgKGNoYW5nZS50ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnNlcnRPcENvdW50OiBudW1iZXIgPSBjaGFuZ2UuZGVsdGEub3BzPy5maWx0ZXIoKGl0KSA9PiAhIWl0Lmluc2VydCkubGVuZ3RoID8/IDA7XG4gICAgaWYgKGluc2VydE9wQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLnF1aWxsPy5xdWlsbEVkaXRvci5zZXRDb250ZW50cyhjaGFuZ2Uub2xkRGVsdGEsICdzaWxlbnQnKTtcbiAgICB9XG4gIH1cblxuICBvblByaW1lUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZChjaGFuZ2U6IEVkaXRvclRleHRDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xuICAgIGlmIChjaGFuZ2UudGV4dFZhbHVlLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyB1c2VyLXNwYWNlIGNoYXJhY3RlcnMgYWxsb3dlZCB0byBiZSBlbnRlcmVkIGludG8gdGhlIFF1aWxsXG4gICAqIGVkaXRvci5cbiAgICpcbiAgICogPHA+XG4gICAqIFRoZSByZWFsIGxlbmd0aCBvZiB0aGUgZWRpdG9yJ3MgY29udGVudCBtYXkgYmUgbXVjaCBsb25nZXIgLSBhcyBpdCBpcyBwZXJzaXN0ZWQgYXMgYW4gSFRNTFxuICAgKiBkb2N1bWVudCBmcmFnbWVudCBiZWhpbmQgdGhlIHNjZW5lcy4gVGhpcyBtZXRob2QgaXMgY29uY2VybmVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGVcbiAgICogdXNlciBwZXJjZWl2ZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSB7QGxpbmsgbnVtYmVyfSBvZiByZW1haW5pbmcgcGVybWl0dGVkIGNoYXJhY3RlcnMgdGhlIHVzZXIgbWF5IGlucHV0LCBvciB7QGNvZGUgLTF9XG4gICAqICAgICAgICAgIGlmIHRoZSBsZWV3YXkgaXMgbm90IGludGVycHJldGVkIGluIHRoZSBjb21wb25lbnQncyBjdXJyZW50IHN0YXRlXG4gICAqL1xuICBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXG4gICAgLy8gdW5yZW1vdmFibGUgbmV3LWxpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRlbnQuXG4gICAgY29uc3QgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCArIDE7XG4gICAgaWYgKHRoaXMucXVpbGwpIHtcbiAgICAgIC8vIHRoaXMgaXMgdGhlIGludGVuZGVkIHBhdGggKHVzZXIgaW5wdXQpOlxuICAgICAgcmV0dXJuIG1heExlbmd0aCAtIHRoaXMucXVpbGwucXVpbGxFZGl0b3IuZ2V0VGV4dCgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBmYWxsYmFjayB0byB0aGUgcmF3IEhUTUwgY29udGVudDpcbiAgICByZXR1cm4gbWF4TGVuZ3RoIC0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5sZW5ndGg7XG4gIH1cblxuICBhZGRPbkJsdXIgPSB0cnVlO1xuICByZWFkb25seSBzZXBhcmF0b3JLZXlzQ29kZXMgPSBbRU5URVIsIENPTU1BXSBhcyBjb25zdDtcbiAgcmVhZG9ubHkgZW1wdHlTZXBhcmF0b3JLZXlzQ29kZXMgPSBbXSBhcyBjb25zdDtcblxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAodGhpcy5zZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcbiAgICAgICAga2V5OiB0aGlzLndpZGdldEluc3RhbmNlLmtleSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXG4gICAgICAgIGtpbmQ6ICdzZWxlY3Rpb24nLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xuICAgIH1cbiAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWVcbiAgICBldmVudC5jaGlwSW5wdXQhLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cblxuICByZW1vdmUodmFsdWU6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmluZGV4T2YodmFsdWUpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xuICAgICAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNlbGVjdGVkKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCB3aWRnZXRJbnN0YW5jZTogU21hcnRGb3JtV2lkZ2V0PGFueT4pOiB2b2lkIHtcbiAgICBsZXQgdmFsdWUgPSBldmVudC5vcHRpb24udmlld1ZhbHVlO1xuICAgIGlmICh0aGlzLnNldFRleHRGaWVsZENoaXBzVmFsdWUodmFsdWUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxuICAgICAgICB3aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcbiAgICAgICAgICBrZXk6IHdpZGdldEluc3RhbmNlLmtleSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlcyAmJlxuICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUhLmxlbmd0aCA8IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzKSB8fFxuICAgICAgICAhdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXNcbiAgICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUpIHtcbiAgICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEFycmF5PE9iamVjdD4oKTtcbiAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gdmFsdWVzO1xuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0uc2V0VmFsdWUodmFsdWVzKTtcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERpcmVjdGlvbigpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1ggJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cbiAgICApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuZGlyZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnZGlyZWN0aW9uLXJvdyc7XG4gICAgfSBlbHNlIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmRpcmVjdGlvbiA9PT0gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTCkge1xuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tY29sJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tcm93JztcbiAgICB9XG4gIH1cblxuICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKTogdHlwZW9mIFNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbiB7XG4gICAgcmV0dXJuIFNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbjtcbiAgfVxuXG4gIGdldFR5cGUoKTogdHlwZW9mIFNtYXJ0Rm9ybVdpZGdldFR5cGUge1xuICAgIHJldHVybiBTbWFydEZvcm1XaWRnZXRUeXBlO1xuICB9XG5cbiAgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHN0cmluZyB7XG4gICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAod2lkZ2V0LmxhYmVsID09PSAnJykge1xuICAgICAgcmV0dXJuIHdpZGdldC5sYWJlbDtcbiAgICB9XG4gICAgbGV0IGlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVElNRSAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UXG4gICAgKSB7XG4gICAgICBpc1JlcXVpcmVkID0gd2lkZ2V0LnZhbGlkYXRvcnM/Lmxlbmd0aCA/IHRoaXMuZmllbGRJc1JlcXVpcmVkKCkgJiYgISF3aWRnZXQuc2hvd0xhYmVsIDogZmFsc2U7XG4gICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCkge1xuICAgICAgaXNSZXF1aXJlZCA9IHdpZGdldC5tYXJrQXNSZXF1aXJlZCA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3dpZGdldC5sYWJlbH0ke2lzUmVxdWlyZWQgPyAnIConIDogJyd9YDtcbiAgfVxuXG4gIHNhbml0aXplSHRtbCh2YWx1ZT86IHN0cmluZyk6IFNhZmVIdG1sIHwgbnVsbCB7XG4gICAgbGV0IHNhZmVWYWx1ZSA9IHZhbHVlID8/ICcnO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChzYWZlVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWVsZElzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVElNRSAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcbiAgICApIHtcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8uZm9yRWFjaCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xuICAgICAgICBpZiAodmFsaWRhdG9yLnZhbGlkYXRvciA9PSBWYWxpZGF0b3JzLnJlcXVpcmVkKSB2YWx1ZSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGhhc0N1c3RvbUVycm9yKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4sIHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XSAmJiB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0uZXJyb3JzKSB7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XS5lcnJvcnMhKS5sZW5ndGhcbiAgICAgICAgICA/IHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XT8uZGlydHkgfHxcbiAgICAgICAgICAgICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0/LnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdG9yICYmXG4gICAgICAgICAgICAgICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0/LmVycm9ycykhW3ZhbGlkYXRvci5uYW1lXSlcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHZhbGlkYXRvciAmJiBoYXNFcnJvciAmJiAhdGhpcy5lcnJvcktleSkgfHxcbiAgICAgICAgICAodmFsaWRhdG9yICYmIGhhc0Vycm9yICYmIHRoaXMuZXJyb3JLZXkgPT09IHZhbGlkYXRvci5uYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ID0gdmFsaWRhdG9yLm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIHZhbGlkYXRvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSkge1xuICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2Uod2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogYm9vbGVhbiB7XG4gICAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICAgIGxldCBlcnJvckljb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3JJY29uQ29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcjtcbiAgICBpZiAoXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJFQ09SRElOR19VUExPQURFUiAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldICYmIHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5lcnJvcktleSAmJlxuICAgICAgICAgICFPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5pbmNsdWRlcyh0aGlzLmVycm9yS2V5ISlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgaW5kZXggPCBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5sZW5ndGg7XG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycyEpW2luZGV4XTtcbiAgICAgICAgICBsZXQgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgPSB3aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5maWx0ZXIoXG4gICAgICAgICAgICAodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4gdmFsaWRhdG9yLm5hbWUgPT09IGVycm9yS2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgJiYgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXS5lcnJvck1lc3NhZ2UhO1xuICAgICAgICAgICAgZXJyb3JJY29uID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbjtcbiAgICAgICAgICAgIGVycm9ySWNvbkNvbG9yID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbkNvbG9yO1xuICAgICAgICAgICAgdmFsaWRhdG9yID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGN1c3RvbVZhbGlkYXRvck9uRm9ybSA9IHRoaXMuc2VydmljZS5zbWFydEZvcm0/LnZhbGlkYXRvcnM/LmZpbHRlcihcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjdXN0b21WYWxpZGF0b3JPbkZvcm0gJiYgY3VzdG9tVmFsaWRhdG9yT25Gb3JtLmxlbmd0aCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25Gb3JtWzBdLmVycm9yTWVzc2FnZSE7XG4gICAgICAgICAgICB2YWxpZGF0b3IgPSBjdXN0b21WYWxpZGF0b3JPbkZvcm1bMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzQ3VzdG9tRXJyb3Iod2lkZ2V0SW5zdGFuY2UsIHZhbGlkYXRvciEpKSB7XG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9yID0gZXJyb3JNZXNzYWdlITtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gZXJyb3JJY29uO1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA9IGVycm9ySWNvbkNvbG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZSkge1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gd2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JJY29uO1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA9IHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yQ29sb3I7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yVmFsdWUgPj0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItJHtpbmRleH1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUpO1xuICAgIGlmICh2YWx1ZSA+IHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3RoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxfWA7XG4gICAgfVxuICAgIHJldHVybiBgc21hcnQtaW5kaWNhdG9yLWxhYmVsLSR7dmFsdWV9YDtcbiAgfVxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlKTtcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JTdGF0dXNMYWJlbHNbXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclN0YXR1c0xhYmVsc1t2YWx1ZV07XG4gIH1cblxuICB1cGxvYWQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCB0eXBlID0gdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXG4gICAgICB0eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcbiAgICAgIHR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkVDT1JESU5HX1VQTE9BREVSXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgIC4uLmV2ZW50LnVpQWN0aW9uLnBhcmFtcyxcbiAgICAgIF9maWxlczogZXZlbnQuZmlsZXMsXG4gICAgICBwYXJhbTogJ19maWxlcycsXG4gICAgfTtcbiAgICBldmVudC51aUFjdGlvbi5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICB0aGlzLnNtYXJ0Q29tcG9uZW50LmV4ZWN1dGVVaUFjdGlvbihldmVudC51aUFjdGlvbik7XG4gIH1cblxuICBleGVjdXRlVWlBY3Rpb24odWlBY3Rpb246IFVpQWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHR5cGUgPSB0aGlzLndpZGdldEluc3RhbmNlLnR5cGU7XG4gICAgaWYgKHR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNtYXJ0Q29tcG9uZW50LmV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbik7XG4gIH1cblxuICBnZXRCdXR0b25UeXBlKGRlc2NyaXB0b3I6IGFueSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChkZXNjcmlwdG9yLnR5cGUpIHtcbiAgICAgIGNhc2UgJ05PUk1BTCc6XG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1idXR0b24nO1xuICAgICAgY2FzZSAnRkxBVCc6XG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1mbGF0LWJ1dHRvbic7XG4gICAgICBjYXNlICdSQUlTRUQnOlxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtcmFpc2VkLWJ1dHRvbic7XG4gICAgICBjYXNlICdTVFJPS0VEJzpcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLXN0cm9rZWQtYnV0dG9uJztcbiAgICAgIGNhc2UgJ0lDT04nOlxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtaWNvbi1idXR0b24nO1xuICAgICAgY2FzZSAnTUlOSV9GQUInOlxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtbWluaS1mYWInO1xuICAgICAgY2FzZSAnRkFCJzpcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWZhYic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmxvZyhgVW5oYW5kbGVkIGFjdGlvbiBidXR0b24gdHlwZSBjYXNlOiAke2Rlc2NyaXB0b3IudHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBtYXQtYnV0dG9uYDtcbiAgICB9XG4gIH1cblxuICBpc09ubHlJY29uKGRlc2NyaXB0b3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBkZXNjcmlwdG9yLnR5cGUgPT09ICdJQ09OJyB8fCBkZXNjcmlwdG9yLnR5cGUgPT09ICdNSU5JX0ZBQicgfHwgZGVzY3JpcHRvci50eXBlID09PSAnRkFCJ1xuICAgICk7XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrZWQoaW5zdGFuY2U6IFNtYXJ0QnV0dG9uKTogdm9pZCB7XG4gICAgaWYgKGluc3RhbmNlLnVpQWN0aW9uKSB7XG4gICAgICBpbnN0YW5jZS5jYWxsYmFjayhpbnN0YW5jZS51aUFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLmNhbGxiYWNrKGluc3RhbmNlLmtleSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyKHZhbHVlOiBJbnB1dEV2ZW50KTogU21hcnRJdGVtPGFueT5bXSB7XG4gICAgbGV0IGZpbHRlclZhbHVlID0gKHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU7XG4gICAgdGhpcy50b0hpZ2hsaWdodCA9IGZpbHRlclZhbHVlO1xuXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuICAgICAgZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIHRoaXMudG9IaWdobGlnaHQgPSBmaWx0ZXJWYWx1ZTtcbiAgICB9XG4gICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XG4gICAgKSB7XG4gICAgICBjb25zdCByZXN1bHQ6IFNtYXJ0SXRlbTxhbnk+W10gPSBmaWx0ZXJWYWx1ZVxuICAgICAgICA/IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0LmZpbHRlcigob3B0aW9uOiBTbWFydEl0ZW08YW55PikgPT5cbiAgICAgICAgICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKVxuICAgICAgICAgIClcbiAgICAgICAgOiB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdDtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwICYmIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSB2YWx1ZXMgYWZ0ZXIgdGhlIGZpbHRlciBvcGVyYXRpb24gYnV0IHdlIGZvdW5kIG5vbmU6XG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB0aGlzLndpZGdldEluc3RhbmNlLmZpbHRlckVycm9yTWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHdlIGVpdGhlciBmb3VuZCB2YWx1ZXMsIG9yIHRoZXJlIHdlcmUgbm8gdmFsdWVzIHRvIGJlZ2luIHdpdGg6XG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGRhdGVGaWx0ZXIoZDogRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldE1hdHJpeERpc3BsYXlWYWx1ZShxdWVzdGlvbjogVmFsdWUsIGtleTogc3RyaW5nKSB7XG4gICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UgYXMgU21hcnRNYXRyaXgpLnZhbHVlW2tleV0uZmluZCgodmFsdWU6IFZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUuY29kZSA9PSBxdWVzdGlvbi5jb2RlKSByZXR1cm4gcXVlc3Rpb24uZGlzcGxheVZhbHVlO1xuICAgICAgZWxzZSByZXR1cm4gcXVlc3Rpb24uY29kZTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZVllYXJNb250aFBpY2tlZCh5ZWFyTW9udGhWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXREYXRlRm9ybUNvbnRyb2wodGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0sIHllYXJNb250aFZhbHVlLCAnMDA6MDAnKTtcbiAgfVxuXG4gIGNvbXBhcmVJdGVtcyhvMTogYW55LCBvMjogYW55KTogYm9vbGVhbiB7XG4gICAgZnVuY3Rpb24gY29udmVydChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBvYmoucmVwbGFjZSgvXFwudlswLTldKyQvLCAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvLyBjYWxsaW5nIHRoaXMudHJ1bmNhdGVVcmkgZGlkbid0IHdvcmtcbiAgICAvLyBUT0RPOiB1c2Ugd2lkZ2V0LnNlbGVjdGlvbi5wYXJhbWV0ZXIgZm9yIGlnbm9yZVVyaVZlcnNpb24gLyBzdHJpY3RVcmlDb21wYXJpc29uO1xuXG4gICAgbGV0IHYxID0gY29udmVydChvMSk7XG4gICAgbGV0IHYyID0gY29udmVydChvMik7XG4gICAgcmV0dXJuIGRlZXBFcXVhbCh2MSwgdjIpO1xuICB9XG5cbiAgdHJ1bmNhdGVVcmkodXJpOiBhbnkpOiBhbnkge1xuICAgIGlmICh1cmkgJiYgdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB1cmkucmVwbGFjZSgvXFwudlswLTldKyQvLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB1cmk7XG4gIH1cblxuICByZW1vdmVNYXRyaXhSb3cocXVlc3Rpb246IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHF1ZXN0aW9uKTtcbiAgICAodGhpcy53aWRnZXRJbnN0YW5jZSBhcyBTbWFydE1hdHJpeCkuYnV0dG9uPy5jYWxsYmFjayh0aGlzLndpZGdldEluc3RhbmNlLCBxdWVzdGlvbik7XG4gIH1cblxuICBpc1Rvb2xiYXJQcmVzZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgfHxcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVCB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVAgfHxcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUlxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkICE9PSB1bmRlZmluZWQgJiYgdGhpcy53aWRnZXRJbnN0YW5jZS50b29sYmFySWQgIT09IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXRDaGlwc1ZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKCduYW1lJyBpbiB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVbJ25hbWUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZGlzcGxheVZhbHVlJyBpbiB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVbJ2Rpc3BsYXlWYWx1ZSddO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZ2V0T3B0aW9ucyhpdGVtczogU21hcnRJdGVtczxhbnk+W10pIHtcbiAgICBsZXQgdmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNX0dST1VQKSB7XG4gICAgICAgIGl0ZW0udmFsdWVMaXN0Lm1hcCgodmFsdWU6IFNtYXJ0SXRlbTxhbnk+KSA9PiB7XG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklURU0pIHtcbiAgICAgICAgdmFsdWVzLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZ2V0IGNsZWFyQnV0dG9uRGVzY3JpcHRvcigpOiBVaUFjdGlvbkRlc2NyaXB0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogJycsXG4gICAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLlJBSVNFRCxcbiAgICAgIGljb246IHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HID8gJ3RpbWVzJyA6ICdjbG9zZScsXG4gICAgICBpY29uUG9zaXRpb246IEljb25Qb3NpdGlvbi5QUkUsXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyRmllbGQoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5vbkJsdXI/Lm5leHQodGhpcy53aWRnZXRJbnN0YW5jZSk7XG4gIH1cblxuICBvblRleHRhcmVhQ2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YSA9IHRoaXMuc2I0VGV4dGFyZWE/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF0YSkgcmV0dXJuO1xuXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRhLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRhLnN0eWxlLmhlaWdodCA9IGAke3RhLnNjcm9sbEhlaWdodH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVCbHVyRXZlbnQoZXZlbnREYXRhOiBhbnkpIHtcbiAgICB0aGlzLm9uQmx1cj8ubmV4dChldmVudERhdGEpO1xuICAgIHRoaXMuYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHtcbiAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhLFxuICAgICAga2luZDogdGhpcy5nZXRTb3BoaXN0aWNhdGVkRXZlbnRLaW5kKCksXG4gICAgICB2YWx1ZTogdGhpcy5mb3JtLnZhbHVlW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0sXG4gICAgfSk7XG4gIH1cblxuICBkb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xuICBvbkRyb3BEb3duU2hvdygpIHtcbiAgICB0aGlzLmRvcnBkb3duT3BlbmluZyA9IHRydWU7XG4gIH1cbiAgb25Ecm9wRG93bklucHV0KCkge1xuICAgIGlmICh0aGlzLmRvcnBkb3duT3BlbmluZyA9PSB0cnVlKSB7XG4gICAgICB0aGlzLmRvcnBkb3duT3BlbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNhZmVEcm9wRG93bkJsdXIoZXZlbnQ6IGFueSkge1xuICAgIC8vIFdlIGRvIG5vdCB1c2UgdGhlIGZpcnN0IGJsdXIgZXZlbnQgYWZ0ZXIgdGhlIGNhbGVuZGFyIHBpY2tlciBvcGVucyxcbiAgICAvLyBhcyBpdCBcImVhdHNcIiB0aGUgZmlyc3QgY2xpY2tcblxuICAgIGlmICh0aGlzLmRvcnBkb3duT3BlbmluZykge1xuICAgICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUJsdXJFdmVudChldmVudCk7XG4gIH1cblxuICBjYWxlbmRhck9wZW5pbmcgPSBmYWxzZTtcbiAgb25DYWxlbmRhclNob3coKSB7XG4gICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSB0cnVlO1xuICB9XG4gIG9uQ2FsZW5kYXJJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzYWZlQ2FsZW5kYXJCbHVyKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXG4gICAgLy8gYXMgaXQgXCJlYXRzXCIgdGhlIGZpcnN0IGNsaWNrXG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJPcGVuaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgY29udmVydFRvTG9jYWxEYXRlVGltZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgICBpZiAoaXNOYU4ocGFyc2VkLmdldFRpbWUoKSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgRGF0ZTonLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICBwYXJzZWQuZ2V0RnVsbFllYXIoKSxcbiAgICAgIHBhcnNlZC5nZXRNb250aCgpLFxuICAgICAgcGFyc2VkLmdldERhdGUoKSxcbiAgICAgIHBhcnNlZC5nZXRIb3VycygpLFxuICAgICAgcGFyc2VkLmdldE1pbnV0ZXMoKSxcbiAgICAgIHBhcnNlZC5nZXRTZWNvbmRzKClcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29udHJvbE1lc3NhZ2VzKGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXTtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZvcm0uY29udHJvbHNbY29udHJvbE5hbWVdPy5lcnJvcnMgPz8ge307XG5cbiAgICB0aGlzLmVycm9yTWVzc2FnZXMgPSBPYmplY3Qua2V5cyhlcnJvcnMpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHR5cGVvZiBlcnJvcnNba2V5XSA9PT0gJ3N0cmluZycpXG4gICAgICAubWFwKChrZXkpID0+ICh7XG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBkZXRhaWw6IGVycm9yc1trZXldLFxuICAgICAgfSkpO1xuXG4gICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkVDT1JESU5HX1VQTE9BREVSICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxuICAgICAgKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDAgJiYgdGhpcy53aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvck1lc3NhZ2UgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgZGV0YWlsOiB0aGlzLndpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzSHRtbCh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gLzxbYS16XVtcXHNcXFNdKj4vaS50ZXN0KHRleHQpO1xuICB9XG59XG4iLCJAaWYgKGNvbXBMaWIgPT09IGNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIHByaW1lXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPGRpdlxuICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxuICAgICAgY2xhc3M9XCJjb250YWluZXJcIlxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB3aWRnZXRJbnN0YW5jZS5pc1Zpc2libGVcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUlwiXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCJcbiAgICAgID5cbiAgICAgICAgPHNtYXJ0Zm9ybXdpZGdldFxuICAgICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCJcbiAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcbiAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0XCJcbiAgICAgICAgICBjbGFzcz1cImNvbnRhaW5lci1pdGVtXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXQuY3NzQ2xhc3MgPz8gJydcIlxuICAgICAgICAgIFtvbkJsdXJdPVwib25CbHVyXCJcbiAgICAgICAgICBbb25WYWx1ZUNoYW5nZV09XCJvblZhbHVlQ2hhbmdlXCJcbiAgICAgICAgICBbc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXT1cInNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVwiXG4gICAgICAgICAgW2JsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwiYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyB3aWRnZXQua2V5IH19XCJcbiAgICAgICAgICBbbGFiZWxDb2xvcl09XCJsYWJlbENvbG9yXCJcbiAgICAgICAgPjwvc21hcnRmb3Jtd2lkZ2V0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXIgdGV4dEZpZWxkQ29udGFpbmVyXCI+XG4gICAgICAgICAgPHAtZmxvYXRMYWJlbCBbbmdDbGFzc109XCJ7IGhhc1Rvb2xiYXI6IGlzVG9vbGJhclByZXNlbnQoKSB9XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2UubWFza1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gKGhpZGVQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpIDogJycgfX1cIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRleHRcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHAtaW5wdXRNYXNrXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UubWFza1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIFttYXNrXT1cIndpZGdldEluc3RhbmNlLm1hc2tcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAob25CbHVyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRGaWVsZEJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxuICAgICAgICAgICAgICAjdG9vbGJhclxuICAgICAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dEZpZWxkVG9vbGJhclwiXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnRleHRGaWVsZFByb3BlcnRpZXM/LmNsZWFyYWJsZSkge1xuICAgICAgICAgICAgICA8dWktYWN0aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJCdXR0b25cIlxuICAgICAgICAgICAgICAgIFthZGRCYXNpY0NsYXNzZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNsZWFyQnV0dG9uRGVzY3JpcHRvclwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cImNsZWFyRmllbGQod2lkZ2V0SW5zdGFuY2Uua2V5KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAhPSAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTlVNQkVSXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgaW5wdXRJZD1cIm1pbm1heFwiXG4gICAgICAgICAgICAgIG1vZGU9XCJkZWNpbWFsXCJcbiAgICAgICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXG4gICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIwXCJcbiAgICAgICAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cIjVcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAob25CbHVyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XG4gICAgICAgICAgICA8cC1lZGl0b3JcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seSA9PSB0cnVlID8gJ2Rpc2FibGVkRWRpdG9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW21vZHVsZXNdPVwiXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCA/IGVtcHR5UXVpbGxUb29sYmFyIDogd2lkZ2V0SW5zdGFuY2UucXVpbGxNb2R1bGVzXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHkgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIndpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvblRleHRDaGFuZ2UpPVwib25QcmltZVJpY2hUZXh0RWRpdG9yQ29udGVudENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvblRleHRDaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByaW1lLWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU09SVEFCTEVcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxuICAgICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XG4gICAgICAgICAgPGxpYi1zb3J0YWJsZS13aWRnZXRcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxuICAgICAgICAgID48L2xpYi1zb3J0YWJsZS13aWRnZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbaWNvbkRpc3BsYXldPVwiJ2lucHV0J1wiXG4gICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW21pbkRhdGVdPVwiXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5taW5EYXRlID8/IG51bGwpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFttYXhEYXRlXT1cIlxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWF4RGF0ZSA/PyBudWxsKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAob25TaG93KT1cIm9uQ2FsZW5kYXJTaG93KClcIlxuICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbkNhbGVuZGFySW5wdXQoKVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2FmZUNhbGVuZGFyQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbG9zZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJ5eS1tbS1kZFwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1PTlRIX1BJQ0tFUikge1xuICAgICAgICBDdXJyZW50bHkgbm90IGltcGxlbWVudGVkXG4gICAgICB9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFtpY29uRGlzcGxheV09XCInaW5wdXQnXCJcbiAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFttaW5EYXRlXT1cIlxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWluRGF0ZSA/PyBudWxsKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgaG91ckZvcm1hdD1cIjI0XCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgKG9uU2hvdyk9XCJvbkNhbGVuZGFyU2hvdygpXCJcbiAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25DYWxlbmRhcklucHV0KClcIlxuICAgICAgICAgICAgICAob25CbHVyKT1cInNhZmVDYWxlbmRhckJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xvc2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICBkYXRlRm9ybWF0PVwieXktbW0tZGRcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9ucyh3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QpXCJcbiAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmltZS1lcnJvclwiPlxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEVcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb25zKHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdClcIlxuICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAob25QYW5lbFNob3cpPVwib25Ecm9wRG93blNob3coKVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2FmZURyb3BEb3duQmx1cigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAob25QYW5lbEhpZGUpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gZWxlbSBraXbDoWxhc3p0dmFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1hcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIGNsYXNzPVwic2I0LXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgI3NiNFRleHRhcmVhXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRhcmVhXG4gICAgICAgICAgICAgIFthdXRvUmVzaXplXT1cInRydWVcIlxuICAgICAgICAgICAgICBjb2xzPVwiMzBcIlxuICAgICAgICAgICAgICBbcm93c109XCJ3aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcz8ubWluUm93cyA/PyAxXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIgXCJcbiAgICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UZXh0YXJlYUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgICBbZm9yXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtbWVzc2FnZXNcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtY2hpcHNcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyB3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIDogZmFsc2VcIlxuICAgICAgICAgICAgICBbbWF4XT1cIjBcIlxuICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjBcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPiB7eyBnZXRDaGlwc1ZhbHVlKGl0ZW0pIH19IDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3AtY2hpcHM+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgICAgICN0b29sYmFyXG4gICAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxuICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMXCJcbiAgICAgICAgY2xhc3M9XCJsYWJlbCB3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZSBsYWJlbENvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS53aWRnZXREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPHA+e3sgd2lkZ2V0SW5zdGFuY2Uud2lkZ2V0RGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJFQ09SRElOR19VUExPQURFUikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICAgIDxzbWFydC12b2ljZS1yZWNvcmRlclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHNtYXJ0LWZpbGUtZWRpdG9yXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcbiAgICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICAgIDxzbWFydC1tdWx0aS1maWxlLWVkaXRvclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZpbGVFdmVudCk9XCJleGVjdXRlVWlBY3Rpb24oJGV2ZW50LnVpQWN0aW9uKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgaW1hZ2VDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuXG4gICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS5pbWFnZVByb3BlcnRpZXMhLmltYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmltYWdlQ3NzID8/ICcnIH19XCJcbiAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVE9HR0xFXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgdG9nZ2xlLWNvbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbCBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCIgW2Zvcl09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIj5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHAtaW5wdXRTd2l0Y2hcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgbmFtZT1cInt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hlY2tib3ggb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0taW1hZ2VcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjaGVja2JveC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY2hlY2tib3gubGFiZWxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2XCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNWR1wiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgIDxoNFxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwod2lkZ2V0SW5zdGFuY2UudmFsdWUpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59IEBlbHNlIHtcbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBtYXRlcmlhbFwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxkaXZcbiAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcbiAgICAgIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxzbWFydGZvcm13aWRnZXRcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgd2lkZ2V0IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXG4gICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldFwiXG4gICAgICAgICAgY2xhc3M9XCJjb250YWluZXItaXRlbVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0LmNzc0NsYXNzID8/ICcnXCJcbiAgICAgICAgICBbb25CbHVyXT1cIm9uQmx1clwiXG4gICAgICAgICAgW29uVmFsdWVDaGFuZ2VdPVwib25WYWx1ZUNoYW5nZVwiXG4gICAgICAgICAgW3NvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZV09XCJzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcIlxuICAgICAgICAgIGNsYXNzPVwie3sgd2lkZ2V0LmtleSB9fVwiXG4gICAgICAgICAgW2xhYmVsQ29sb3JdPVwibGFiZWxDb2xvclwiXG4gICAgICAgID48L3NtYXJ0Zm9ybXdpZGdldD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIChjYXBzTG9jayk9XCJjYXBzT24gPSAkZXZlbnRcIlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB0ZXh0RmllbGQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cblxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmlucHV0bW9kZV09XCJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlID8gd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAndGV4dCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gKGhpZGVQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpIDogJycgfX1cIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwie3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIH19XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDwhLS0gW21hc2tdPVwid2lkZ2V0SW5zdGFuY2UubWFzayA/PyAnJ1wiIC0tPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW3R5cGVdPVwiJ3N0cmluZydcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICcnIH19XCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwidGV4dEZpZWxkQXV0b1wiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbktleWRvd24oKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzUGFzc3dvcmRcIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IGhpZGVQYXNzd29yZCA/ICd2aXNpYmlsaXR5X29mZicgOiAndmlzaWJpbGl0eScgfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZXh0RmllbGRBdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvbi5sYWJlbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5sYWJlbCB8IGhpZ2hsaWdodDogdG9IaWdobGlnaHRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCIgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmNhcHNMb2NrV2FybmluZ0ljb24gPz8gJ2tleWJvYXJkX2NhcHNsb2NrJ1wiXG4gICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uICYmIHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0RmllbGRCdXR0b25zXCI+XG4gICAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnRleHRGaWVsZFByb3BlcnRpZXM/LmNsZWFyYWJsZSkge1xuICAgICAgICAgICAgICA8dWktYWN0aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJCdXR0b25cIlxuICAgICAgICAgICAgICAgIFthZGRCYXNpY0NsYXNzZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNsZWFyQnV0dG9uRGVzY3JpcHRvclwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cImNsZWFyRmllbGQod2lkZ2V0SW5zdGFuY2Uua2V5KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXG4gICAgICAgICAgICAjdG9vbGJhclxuICAgICAgICAgICAgKm5nSWY9XCJpc1Rvb2xiYXJQcmVzZW50KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b25cIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cInt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jb2xvciB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNhbGxiYWNrKHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxuICAgICAgICAgICAgICAgICAgc21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uKCkuUFJFICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uQ29sb3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0NoYXJhY3RlckxpbWl0U3VmZml4ICYmIHdpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcbiAgICAgICAgICAgID57e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggLSBmb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcbiAgICAgICAgICA+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcbiAgICAgICAgICBcIlxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxuICAgICAgICA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9OVU1CRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dEZpZWxkIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBbbWluXT1cIndpZGdldEluc3RhbmNlLm1pblZhbHVlcyA/PyBudWxsXCJcbiAgICAgICAgICAgIFttYXhdPVwid2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzID8/IG51bGxcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UucHJlZml4IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY2FsbGJhY2sod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0IGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiPlxuICAgICAgICAgICAgPG1hdC1jaGlwLXJvd1xuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2NoaXBJbnB1dFxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJjaGlwQXV0b1wiXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQsIHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwTGlzdExvb2t1cCBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRDaGlwc1ZhbHVlKHZhbHVlKSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdExvb2t1cFwiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJlbXB0eVNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxuICAgICAgICAgICAgI3Rvb2xiYXJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgY2xhc3M9XCJzYjQtdGV4dGFyZWFcIlxuICAgICAgICAgICAgI3NiNFRleHRhcmVhXG4gICAgICAgICAgICBjb2xzPVwiMzBcIlxuICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCJ3aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcz8ubWluUm93cyA/PyAxXCJcbiAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1heFJvd3NdPVwid2lkZ2V0SW5zdGFuY2UudGV4dEJveFByb3BlcnRpZXM/Lm1heFJvd3MgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgYWxpZ249XCJlbmRcIlxuICAgICAgICAgICAgPnt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLm1heExlbmd0aCAtIGZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5sZW5ndGhcbiAgICAgICAgICAgIH19PC9tYXQtaGludFxuICAgICAgICAgID5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1oaW50XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZS5oaW50IHx8IHdpZGdldEluc3RhbmNlLmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxuICAgICAgICAgIFwiXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInJhZGlvTGFiZWxcIiAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMlwiXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0tY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWltYWdlXCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY2hlY2tib3gudmFsdWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHJhZGlvLXNlY3Rpb24gd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWl0ZW0tY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IHJhZGlvIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyYWRpby5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicmFkaW8taXRlbS1pbWFnZVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJyYWRpby5pbWFnZVVybFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJhZGlvLnZhbHVlIH19XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHJhZGlvLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgcmFkaW8ubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1pY29uXCI+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSXCJcbiAgICAgICAgY2xhc3M9XCJkYXRlUGlja2VyIHdpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCBkYXRlIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXIgKGNsb3NlZCk9XCJoYW5kbGVCbHVyRXZlbnQod2lkZ2V0SW5zdGFuY2UpXCI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgW21pbl09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcIlxuICAgICAgICAgICAgW21heF09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XG4gICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIDxkaXZcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsXCI+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnRcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCIkYW55KHBpY2tlcilcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgPG5neC1tYXQtZGF0ZXRpbWUtcGlja2VyXG4gICAgICAgICAgI3BpY2tlclxuICAgICAgICAgIFtzaG93U3Bpbm5lcnNdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgICAgICBbc3RlcEhvdXJdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBNaW51dGVdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBTZWNvbmRdPVwiMTBcIlxuICAgICAgICAgIFt0b3VjaFVpXT1cImZhbHNlXCJcbiAgICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICBbZW5hYmxlTWVyaWRpYW5dPVwiZmFsc2VcIlxuICAgICAgICAgIFtkaXNhYmxlTWludXRlXT1cImZhbHNlXCJcbiAgICAgICAgICBbaGlkZVRpbWVdPVwiZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5NT05USF9QSUNLRVIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bGliLXNtYXJ0LW1vbnRoLXBpY2tlclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlWWVhck1vbnRoUGlja2VkKCRldmVudClcIlxuICAgICAgICAgID48L2xpYi1zbWFydC1tb250aC1waWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVBpY2tlckNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFttaW5dPVwiY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5taW5EYXRlID8/IG51bGwpXCJcbiAgICAgICAgICAgICAgW21heF09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcIlxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZVBpY2tlckJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gbWF0U3VmZml4PlxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaWNvbiAmJlxuICAgICAgICAgICAgICAgICghd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uIHx8IHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BPU1QnKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxuICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XG4gICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgICAqbmdJZj1cImhhc0NyZWF0ZWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHRpbWVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjdGltZUlucHV0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy10aW1lJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RpbWUnXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uVGltZVBpY2tlckJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCFcIlxuICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyID8gd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgOiAnJyB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlubmVyT3B0aW9uIG9mIG9wdGlvbi52YWx1ZUxpc3RcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbm5lck9wdGlvbi5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlubmVyT3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpbm5lck9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgICAgICAge3sgaW5uZXJPcHRpb24ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm9wdGlvbi5pY29uQ29sb3JcIlxuICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb25cbiAgICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxuICAgICAgICAgICAgI3Rvb2xiYXJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dEZpZWxkVG9vbGJhclwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxuICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXG4gICAgICAgICAgXCJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRVwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCFcIlxuICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyID8gd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgOiAnJyB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlubmVyT3B0aW9uIG9mIG9wdGlvbi52YWx1ZUxpc3RcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbm5lck9wdGlvbi5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlubmVyT3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpbm5lck9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXG4gICAgICAgICAgICAgICAgICA+e3sgaW5uZXJPcHRpb24ubGFiZWwgfX08L21hdC1vcHRpb25cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm9wdGlvbi5pY29uQ29sb3JcIlxuICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb25cbiAgICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXG4gICAgICAgICAgICAjdG9vbGJhclxuICAgICAgICAgICAgKm5nSWY9XCJpc1Rvb2xiYXJQcmVzZW50KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcbiAgICAgICAgICBcIlxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxuICAgICAgICA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUxcIlxuICAgICAgICBjbGFzcz1cImxhYmVsIHdpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRpdGxlIGxhYmVsQ29udGFpbmVyXCIgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICA8cD57eyB3aWRnZXRJbnN0YW5jZS53aWRnZXREZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRJTUVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgdGltZSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VGltZSgpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVE9HR0xFXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCAge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICB2YWx1ZT1cInt7IHdpZGdldEluc3RhbmNlLnZhbHVlIH19XCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIndpZGdldEluc3RhbmNlLnRvZ2dsZUxhYmVsUG9zaXRpb24gPz8gJ2JlZm9yZSdcIlxuICAgICAgICAgICAgPnt7ICF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgPyB3aWRnZXRJbnN0YW5jZS5sYWJlbCA6ICcnIH19PC9tYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgICAgPjxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgIDxoNFxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gbGFiZWxDb250YWluZXIge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0SW5kaWNhdG9yIHdpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5kaWNhdG9ySXRlbXMge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaW5kaWNhdG9ySXRlbXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImluZGljYXRvckl0ZW1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JJdGVtQ2xhc3MoaSlcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIFtuZ0NsYXNzXT1cImdldEluZGljYXRvclN0YXR1c0xhYmVsQ29sb3IoKVwiPlxuICAgICAgICAgICAge3sgZ2V0SW5kaWNhdG9yU3RhdHVzTGFiZWwoKSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SRUNPUkRJTkdfVVBMT0FERVIpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XG4gICAgICAgICAgICA8c21hcnQtdm9pY2UtcmVjb3JkZXJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxuICAgICAgICAgICAgICAodXBsb2FkRmlsZXNFdmVudCk9XCJ1cGxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8c21hcnQtZmlsZS1lZGl0b3JcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxuICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPHNtYXJ0LW11bHRpLWZpbGUtZWRpdG9yXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcbiAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChmaWxlRXZlbnQpPVwiZXhlY3V0ZVVpQWN0aW9uKCRldmVudC51aUFjdGlvbilcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lciBpbWFnZUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cblxuICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcbiAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzbWFydERpdlwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TVkdcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKHdpZGdldEluc3RhbmNlLnZhbHVlKVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aHJcbiAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2aWRlciB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT05cIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0QnV0dG9uVHlwZSh3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrZWQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNPbmx5SWNvbih3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpOyB0aGVuIGljb25Pbmx5OyBlbHNlIHRleHRcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpY29uT25seT5cbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yIS5pY29uIVwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uY29sb3JcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGV4dD5cbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy50aXRsZSB9fVxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb24gJiZcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblBvc2l0aW9uID09PSAnUE9TVCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGg0XG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJiB3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbUNvbXBvbmVudD48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFRcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8cXVpbGwtZWRpdG9yXG4gICAgICAgICAgICAjcXVpbGxFZGl0b3JcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFttb2R1bGVzXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyBlbXB0eVF1aWxsVG9vbGJhciA6IHdpZGdldEluc3RhbmNlLnF1aWxsTW9kdWxlc1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwid2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgW21heExlbmd0aF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgKG9uQ29udGVudENoYW5nZWQpPVwib25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgID48L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgYWxpZ249XCJlbmRcIlxuICAgICAgICAgICAgY2xhc3M9XCJyaWNoLXRleHQtZWRpdG9yLWxlZXdheS1jb3VudGVyXCJcbiAgICAgICAgICAgID57eyBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpIH19PC9tYXQtaGludFxuICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU09SVEFCTEVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgPjwvbGliLXNvcnRhYmxlLXdpZGdldD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVhcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XG4gICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dGFibGUgY2xhc3M9XCJtYXRyaXhUYWJsZSB3aWRnZXRDb250ZW50XCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJvcHRpb25MYWJlbFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uc1wiPlxuICAgICAgICAgICAge3sgb3B0aW9uLmRpc3BsYXlWYWx1ZSB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUucm93czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInF1ZXN0aW9uTGFiZWxcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgfX08L2xhYmVsPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJzZWxlY3RUZFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uczsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBxdWVzdGlvbi5jb2RlXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ3EnICsgaVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24uY29kZVwiPiA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCI+XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy5kYXRhLicgKyBxdWVzdGlvbi5jb2RlICsgJy4nICsgb3B0aW9uLmNvZGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVsnZGF0YSddW3F1ZXN0aW9uLmNvZGVdW29wdGlvbi5jb2RlXVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uKVwiXG4gICAgICAgICAgICA+PHNtYXJ0LWljb24gaWNvbj1cImNsb3NlXCI+PC9zbWFydC1pY29uXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgPGg0XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHlvdXR1YmUtcGxheWVyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICB2aWRlb0lkPVwie3sgd2lkZ2V0SW5zdGFuY2UudmlkZW9JZCB9fVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXRJbnN0YW5jZS53aWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwid2lkZ2V0SW5zdGFuY2UuaGVpZ2h0XCJcbiAgICAgICAgW3N0YXJ0U2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5zdGFydFNlY29uZHNcIlxuICAgICAgICBbZW5kU2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5lbmRTZWNvbmRzXCJcbiAgICAgID48L3lvdXR1YmUtcGxheWVyPlxuICAgICAgPG1hdC1oaW50XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8IHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcbiAgICAgICAgXCJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufVxuIl19
|