@smartbit4all/ng-client 6.0.35 → 7.0.1
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/MIGRATION-7.0.md +1722 -0
- package/README.md +199 -386
- package/WIDGETS.md +206 -0
- package/fesm2022/smartbit4all-ng-client.mjs +15013 -17559
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/package.json +15 -18
- package/smartbit4all-ng-client-7.0.1.tgz +0 -0
- package/types/smartbit4all-ng-client.d.ts +10350 -0
- package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
- package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
- package/esm2022/lib/component-factory-service/projects.mjs +0 -6
- package/esm2022/lib/session/api/api/api.mjs +0 -4
- package/esm2022/lib/session/api/api/session.service.mjs +0 -306
- package/esm2022/lib/session/api/configuration.mjs +0 -91
- package/esm2022/lib/session/api/encoder.mjs +0 -19
- package/esm2022/lib/session/api/index.mjs +0 -3
- package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
- package/esm2022/lib/session/api/model/apiError.mjs +0 -13
- package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
- package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
- package/esm2022/lib/session/api/model/models.mjs +0 -9
- package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
- package/esm2022/lib/session/api/model/session.mjs +0 -2
- package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
- package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
- package/esm2022/lib/session/api/param.mjs +0 -2
- package/esm2022/lib/session/api/variables.mjs +0 -9
- package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
- package/esm2022/lib/session/projects.mjs +0 -12
- package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +0 -2
- package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +0 -217
- package/esm2022/lib/session/smart-default-error-ui.service.mjs +0 -134
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -109
- package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -44
- package/esm2022/lib/session/smart-session-handler.service.mjs +0 -7
- package/esm2022/lib/session/smart-session.module.mjs +0 -58
- package/esm2022/lib/session/smart-session.service.mjs +0 -309
- package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -59
- package/esm2022/lib/shared/projects.mjs +0 -4
- package/esm2022/lib/shared/shared.module.mjs +0 -19
- package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
- package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
- package/esm2022/lib/smart-client/projects.mjs +0 -4
- package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -935
- package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -79
- package/esm2022/lib/smart-client/smart.component.mjs +0 -88
- package/esm2022/lib/smart-client/smart.service.mjs +0 -71
- package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
- package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
- package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -22
- package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -10
- package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/toolbarAlignment.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
- package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
- package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -169
- package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -438
- package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -57
- package/esm2022/lib/smart-diagram/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +0 -141
- package/esm2022/lib/smart-diagram/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-diagram/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-diagram/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-diagram/api/index.mjs +0 -7
- package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +0 -13
- package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +0 -13
- package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +0 -18
- package/esm2022/lib/smart-diagram/api/model/labelText.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/models.mjs +0 -10
- package/esm2022/lib/smart-diagram/api/param.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/variables.mjs +0 -9
- package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +0 -312
- package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +0 -359
- package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +0 -40
- package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +0 -10
- package/esm2022/lib/smart-diagram/projects.mjs +0 -5
- package/esm2022/lib/smart-dialog/projects.mjs +0 -8
- package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
- package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
- package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
- package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -86
- package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -101
- package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
- package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -57
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
- package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
- package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
- package/esm2022/lib/smart-filter/projects.mjs +0 -9
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -166
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
- package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
- package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
- package/esm2022/lib/smart-filter-editor/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
- package/esm2022/lib/smart-filter-editor/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/index.mjs +0 -7
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilder.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/model/models.mjs +0 -20
- package/esm2022/lib/smart-filter-editor/api/model/searchPageConfig.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
- package/esm2022/lib/smart-filter-editor/filter-utils.mjs +0 -3
- package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
- package/esm2022/lib/smart-filter-editor/project.mjs +0 -11
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/advanced-relation-button/advanced-relation-button.component.mjs +0 -27
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/advanced-smart-filter-expression-item/advanced-smart-filter-expression-item.component.mjs +0 -32
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/expression-editor-dialog/expression-editor-dialog.component.mjs +0 -29
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/expression-editor-dialog/expression-editor-dialog.service.mjs +0 -50
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -72
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -52
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -329
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -84
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -78
- package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
- package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
- package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-form/api/index.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/divProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/imageProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/models.mjs +0 -20
- package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -14
- package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
- package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
- package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -49
- package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
- package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -21
- package/esm2022/lib/smart-form/api/param.mjs +0 -2
- package/esm2022/lib/smart-form/api/variables.mjs +0 -9
- package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
- package/esm2022/lib/smart-form/projects.mjs +0 -18
- package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -754
- package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -683
- package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -193
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.component.mjs +0 -190
- package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
- package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +0 -179
- package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -83
- package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +0 -170
- package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +0 -151
- package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -35
- package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -1050
- package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
- package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
- package/esm2022/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.mjs +0 -98
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +0 -18
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +0 -19
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +0 -54
- package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +0 -40
- package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +0 -40
- package/esm2022/lib/smart-generic-pages/projects.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +0 -81
- package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +0 -116
- package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +0 -78
- package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +0 -93
- package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
- package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -514
- package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
- package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
- package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridRowLayoutDescriptor.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
- package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -16
- package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
- package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
- package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +0 -47
- package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -92
- package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -200
- package/esm2022/lib/smart-grid/models/model.mjs +0 -29
- package/esm2022/lib/smart-grid/projects.mjs +0 -9
- package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +0 -76
- package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -1074
- package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -103
- package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -92
- package/esm2022/lib/smart-icon/projects.mjs +0 -9
- package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -95
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +0 -33
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +0 -37
- package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -26
- package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -93
- package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
- package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
- package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-map/api/index.mjs +0 -7
- package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
- package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
- package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
- package/esm2022/lib/smart-map/api/param.mjs +0 -2
- package/esm2022/lib/smart-map/api/variables.mjs +0 -9
- package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
- package/esm2022/lib/smart-map/impl/google-map.mjs +0 -224
- package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -422
- package/esm2022/lib/smart-map/projects.mjs +0 -9
- package/esm2022/lib/smart-map/smart-map.component.mjs +0 -222
- package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
- package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
- package/esm2022/lib/smart-navbar/projects.mjs +0 -8
- package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
- package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
- package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
- package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
- package/esm2022/lib/smart-navigation/projects.mjs +0 -6
- package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
- package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
- package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -27
- package/esm2022/lib/smart-ng-client.module.mjs +0 -131
- package/esm2022/lib/smart-ng-client.service.mjs +0 -19
- package/esm2022/lib/smart-subject/projects.mjs +0 -5
- package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
- package/esm2022/lib/smart-tab-group/projects.mjs +0 -5
- package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -22
- package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
- package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
- package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
- package/esm2022/lib/smart-table/projects.mjs +0 -8
- package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
- package/esm2022/lib/smart-table/smarttable.model.mjs +0 -177
- package/esm2022/lib/smart-table/smarttable.module.mjs +0 -109
- package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
- package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -40
- package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
- package/esm2022/lib/smart-table/tables/table.mjs +0 -614
- package/esm2022/lib/smart-tree/projects.mjs +0 -9
- package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -292
- package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -188
- package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
- package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -64
- package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
- package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
- package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
- package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
- package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
- package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
- package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
- package/esm2022/lib/smart-validation/projects.mjs +0 -4
- package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
- package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
- package/esm2022/lib/theme/theme.service.mjs +0 -48
- package/esm2022/lib/view-context/api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/api/api/view.service.mjs +0 -1113
- package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/binaryData.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationError.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +0 -2
- package/esm2022/lib/view-context/api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/api/index.mjs +0 -7
- package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +0 -2
- package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +0 -13
- package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
- package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
- package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
- package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
- package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
- package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
- package/esm2022/lib/view-context/api/model/link.mjs +0 -20
- package/esm2022/lib/view-context/api/model/menuDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/menuOpenDirection.mjs +0 -23
- package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +0 -17
- package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
- package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
- package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
- package/esm2022/lib/view-context/api/model/models.mjs +0 -71
- package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +0 -13
- package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +0 -2
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
- package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/publishedViewData.mjs +0 -13
- package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
- package/esm2022/lib/view-context/api/model/shellProperty.mjs +0 -13
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +0 -8
- package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
- package/esm2022/lib/view-context/api/model/style.mjs +0 -13
- package/esm2022/lib/view-context/api/model/themeDefinition.mjs +0 -2
- package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
- package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
- package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +0 -18
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -2
- package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
- package/esm2022/lib/view-context/api/model/view.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -8
- package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
- package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
- package/esm2022/lib/view-context/api/param.mjs +0 -2
- package/esm2022/lib/view-context/api/variables.mjs +0 -9
- package/esm2022/lib/view-context/default-view-components.token.mjs +0 -9
- package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
- package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -93
- package/esm2022/lib/view-context/projects.mjs +0 -30
- package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
- package/esm2022/lib/view-context/reuse-router-slot.token.mjs +0 -4
- package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +0 -57
- package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +0 -254
- package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +0 -256
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +0 -62
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +0 -29
- package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
- package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +0 -198
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +0 -95
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +0 -134
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +0 -12
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +0 -256
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -77
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -54
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -106
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -58
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.mjs +0 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +0 -258
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -349
- package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -185
- package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -250
- package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -77
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -74
- package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -63
- package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
- package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -405
- package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -1079
- package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -41
- package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
- package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
- package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
- package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
- package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/value-api/index.mjs +0 -7
- package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
- package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
- package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
- package/esm2022/lib/view-context/value-api/param.mjs +0 -2
- package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
- package/esm2022/lib/view-context/view-handler-resolution.mjs +0 -21
- package/esm2022/lib/view-context/view-op.mjs +0 -41
- package/esm2022/lib/view-context/view-slot-resolution.mjs +0 -28
- package/esm2022/projects.mjs +0 -31
- package/esm2022/smartbit4all-ng-client.mjs +0 -5
- package/index.d.ts +0 -5
- package/lib/component-factory-service/component-factory-service.module.d.ts +0 -6
- package/lib/component-factory-service/component-factory-service.service.d.ts +0 -13
- package/lib/component-factory-service/projects.d.ts +0 -2
- package/lib/session/api/api/api.d.ts +0 -3
- package/lib/session/api/api/session.service.d.ts +0 -107
- package/lib/session/api/configuration.d.ts +0 -104
- package/lib/session/api/encoder.d.ts +0 -11
- package/lib/session/api/index.d.ts +0 -2
- package/lib/session/api/model/accountInfo.d.ts +0 -24
- package/lib/session/api/model/apiError.d.ts +0 -15
- package/lib/session/api/model/authenticationProviderData.d.ts +0 -17
- package/lib/session/api/model/getAuthenticationProvidersResponse.d.ts +0 -15
- package/lib/session/api/model/models.d.ts +0 -8
- package/lib/session/api/model/refreshSessionRequest.d.ts +0 -14
- package/lib/session/api/model/session.d.ts +0 -32
- package/lib/session/api/model/sessionInfoData.d.ts +0 -26
- package/lib/session/api/model/userActivityLog.d.ts +0 -33
- package/lib/session/api/param.d.ts +0 -37
- package/lib/session/api/variables.d.ts +0 -8
- package/lib/session/cookie-service/smart-cookie.service.d.ts +0 -129
- package/lib/session/projects.d.ts +0 -8
- package/lib/session/smart-backend-bootstrap.config.d.ts +0 -73
- package/lib/session/smart-backend-bootstrap.service.d.ts +0 -57
- package/lib/session/smart-default-error-ui.service.d.ts +0 -90
- package/lib/session/smart-error-catching.interceptor.d.ts +0 -21
- package/lib/session/smart-header-maintainer.interceptor.d.ts +0 -11
- package/lib/session/smart-session-handler.service.d.ts +0 -22
- package/lib/session/smart-session.module.d.ts +0 -12
- package/lib/session/smart-session.service.d.ts +0 -88
- package/lib/session/smart-timer/smart-session-timer.component.d.ts +0 -19
- package/lib/shared/projects.d.ts +0 -3
- package/lib/shared/shared.module.d.ts +0 -9
- package/lib/shared/smart-tooltip.directive.d.ts +0 -16
- package/lib/shared/smarttable.date-pipe.d.ts +0 -18
- package/lib/smart-client/projects.d.ts +0 -3
- package/lib/smart-client/smart-component-api-client.d.ts +0 -143
- package/lib/smart-client/smart-file-uploader/smart-file-uploader.component.d.ts +0 -25
- package/lib/smart-client/smart.component.d.ts +0 -35
- package/lib/smart-client/smart.service.d.ts +0 -29
- package/lib/smart-component-layout/api/api/api.d.ts +0 -3
- package/lib/smart-component-layout/api/api/default.service.d.ts +0 -33
- package/lib/smart-component-layout/api/api.module.d.ts +0 -11
- package/lib/smart-component-layout/api/configuration.d.ts +0 -104
- package/lib/smart-component-layout/api/encoder.d.ts +0 -11
- package/lib/smart-component-layout/api/index.d.ts +0 -6
- package/lib/smart-component-layout/api/model/componentType.d.ts +0 -16
- package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +0 -20
- package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +0 -19
- package/lib/smart-component-layout/api/model/layoutDirection.d.ts +0 -15
- package/lib/smart-component-layout/api/model/models.d.ts +0 -9
- package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +0 -32
- package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +0 -26
- package/lib/smart-component-layout/api/model/toolbarAlignment.d.ts +0 -15
- package/lib/smart-component-layout/api/model/toolbarDirection.d.ts +0 -15
- package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +0 -18
- package/lib/smart-component-layout/api/param.d.ts +0 -37
- package/lib/smart-component-layout/api/variables.d.ts +0 -8
- package/lib/smart-component-layout/projects.d.ts +0 -4
- package/lib/smart-component-layout/smart-component-layout-utility.d.ts +0 -25
- package/lib/smart-component-layout/smart-component-layout.component.d.ts +0 -93
- package/lib/smart-component-layout/smart-component-layout.module.d.ts +0 -17
- package/lib/smart-diagram/api/api/api.d.ts +0 -3
- package/lib/smart-diagram/api/api/diagramService.service.d.ts +0 -36
- package/lib/smart-diagram/api/api.module.d.ts +0 -11
- package/lib/smart-diagram/api/configuration.d.ts +0 -104
- package/lib/smart-diagram/api/encoder.d.ts +0 -11
- package/lib/smart-diagram/api/index.d.ts +0 -6
- package/lib/smart-diagram/api/model/diagramColor.d.ts +0 -17
- package/lib/smart-diagram/api/model/diagramDataContainer.d.ts +0 -19
- package/lib/smart-diagram/api/model/diagramDataItem.d.ts +0 -25
- package/lib/smart-diagram/api/model/diagramDataSet.d.ts +0 -22
- package/lib/smart-diagram/api/model/diagramDescriptor.d.ts +0 -57
- package/lib/smart-diagram/api/model/diagramModel.d.ts +0 -19
- package/lib/smart-diagram/api/model/diagramShape.d.ts +0 -30
- package/lib/smart-diagram/api/model/drawTime.d.ts +0 -18
- package/lib/smart-diagram/api/model/labelText.d.ts +0 -21
- package/lib/smart-diagram/api/model/models.d.ts +0 -9
- package/lib/smart-diagram/api/param.d.ts +0 -37
- package/lib/smart-diagram/api/variables.d.ts +0 -8
- package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +0 -33
- package/lib/smart-diagram/component/smart-diagram.component.d.ts +0 -43
- package/lib/smart-diagram/component/smart-diagram.module.d.ts +0 -11
- package/lib/smart-diagram/component/smart-diagram.util.d.ts +0 -1
- package/lib/smart-diagram/projects.d.ts +0 -4
- package/lib/smart-dialog/projects.d.ts +0 -4
- package/lib/smart-dialog/smartdialog.component.d.ts +0 -19
- package/lib/smart-dialog/smartdialog.model.d.ts +0 -68
- package/lib/smart-dialog/smartdialog.module.d.ts +0 -14
- package/lib/smart-dialog/smartdialog.service.d.ts +0 -28
- package/lib/smart-expandable-section/expandable-section.component.d.ts +0 -30
- package/lib/smart-expandable-section/expandable-section.model.d.ts +0 -43
- package/lib/smart-expandable-section/projects.d.ts +0 -4
- package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +0 -17
- package/lib/smart-expandable-section/smart-expandable-section.service.d.ts +0 -6
- package/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.d.ts +0 -15
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderField.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.d.ts +0 -36
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionData.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionDataType.d.ts +0 -18
- package/lib/smart-filter/api/filter/model/filterExpressionField.d.ts +0 -44
- package/lib/smart-filter/api/filter/model/filterExpressionFieldList.d.ts +0 -21
- package/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.d.ts +0 -26
- package/lib/smart-filter/api/filter/model/filterExpressionList.d.ts +0 -18
- package/lib/smart-filter/api/filter/model/filterExpressionOperandData.d.ts +0 -25
- package/lib/smart-filter/api/filter/model/filterExpressionOperation.d.ts +0 -30
- package/lib/smart-filter/api/filter/model/filterExpressionOrderBy.d.ts +0 -25
- package/lib/smart-filter/api/filter/model/model.d.ts +0 -15
- package/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.d.ts +0 -19
- package/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.d.ts +0 -18
- package/lib/smart-filter/api/value/model/value.d.ts +0 -29
- package/lib/smart-filter/projects.d.ts +0 -5
- package/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.d.ts +0 -8
- package/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.d.ts +0 -31
- package/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.d.ts +0 -18
- package/lib/smart-filter/smart-filter/smart-filter.component.d.ts +0 -15
- package/lib/smart-filter/smart-filter/smart-filter.service.d.ts +0 -16
- package/lib/smart-filter/smart-filter.model.d.ts +0 -25
- package/lib/smart-filter/smart-filter.module.d.ts +0 -15
- package/lib/smart-filter-editor/api/api/api.d.ts +0 -3
- package/lib/smart-filter-editor/api/api/filter.service.d.ts +0 -57
- package/lib/smart-filter-editor/api/api.module.d.ts +0 -11
- package/lib/smart-filter-editor/api/configuration.d.ts +0 -104
- package/lib/smart-filter-editor/api/encoder.d.ts +0 -11
- package/lib/smart-filter-editor/api/index.d.ts +0 -6
- package/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.d.ts +0 -15
- package/lib/smart-filter-editor/api/model/filterExpressionBuilder.d.ts +0 -16
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.d.ts +0 -16
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderField.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.d.ts +0 -36
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.d.ts +0 -38
- package/lib/smart-filter-editor/api/model/filterExpressionData.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionDataType.d.ts +0 -18
- package/lib/smart-filter-editor/api/model/filterExpressionField.d.ts +0 -44
- package/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.d.ts +0 -17
- package/lib/smart-filter-editor/api/model/filterExpressionFieldList.d.ts +0 -23
- package/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.d.ts +0 -26
- package/lib/smart-filter-editor/api/model/filterExpressionList.d.ts +0 -18
- package/lib/smart-filter-editor/api/model/filterExpressionOperandData.d.ts +0 -25
- package/lib/smart-filter-editor/api/model/filterExpressionOperation.d.ts +0 -30
- package/lib/smart-filter-editor/api/model/filterExpressionOrderBy.d.ts +0 -28
- package/lib/smart-filter-editor/api/model/models.d.ts +0 -19
- package/lib/smart-filter-editor/api/model/searchPageConfig.d.ts +0 -73
- package/lib/smart-filter-editor/api/model/smartFilterType.d.ts +0 -15
- package/lib/smart-filter-editor/api/param.d.ts +0 -37
- package/lib/smart-filter-editor/api/variables.d.ts +0 -8
- package/lib/smart-filter-editor/filter-utils.d.ts +0 -2
- package/lib/smart-filter-editor/filterExpressionBuilderApiActions.d.ts +0 -13
- package/lib/smart-filter-editor/project.d.ts +0 -10
- package/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/advanced-relation-button/advanced-relation-button.component.d.ts +0 -11
- package/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/advanced-smart-filter-expression-item/advanced-smart-filter-expression-item.component.d.ts +0 -11
- package/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/expression-editor-dialog/expression-editor-dialog.component.d.ts +0 -14
- package/lib/smart-filter-editor/smart-filter-editor-content/components/advanced/expression-editor-dialog/expression-editor-dialog.service.d.ts +0 -21
- package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.d.ts +0 -19
- package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.d.ts +0 -20
- package/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.d.ts +0 -50
- package/lib/smart-filter-editor/smart-filter-editor.model.d.ts +0 -4
- package/lib/smart-filter-editor/smart-filter-editor.module.d.ts +0 -21
- package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +0 -51
- package/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.d.ts +0 -9
- package/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.d.ts +0 -21
- package/lib/smart-form/api/api/api.d.ts +0 -3
- package/lib/smart-form/api/api/default.service.d.ts +0 -33
- package/lib/smart-form/api/api.module.d.ts +0 -11
- package/lib/smart-form/api/configuration.d.ts +0 -104
- package/lib/smart-form/api/encoder.d.ts +0 -11
- package/lib/smart-form/api/index.d.ts +0 -6
- package/lib/smart-form/api/model/dateFieldProperties.d.ts +0 -15
- package/lib/smart-form/api/model/divProperties.d.ts +0 -15
- package/lib/smart-form/api/model/fileUploaderProperties.d.ts +0 -20
- package/lib/smart-form/api/model/imageProperties.d.ts +0 -15
- package/lib/smart-form/api/model/models.d.ts +0 -19
- package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +0 -19
- package/lib/smart-form/api/model/propertyMapping.d.ts +0 -24
- package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +0 -20
- package/lib/smart-form/api/model/selectionDefinition.d.ts +0 -58
- package/lib/smart-form/api/model/smartFormInputMode.d.ts +0 -20
- package/lib/smart-form/api/model/smartFormWidgetDirection.d.ts +0 -15
- package/lib/smart-form/api/model/smartFormWidgetType.d.ts +0 -47
- package/lib/smart-form/api/model/smartLayoutDefinition.d.ts +0 -15
- package/lib/smart-form/api/model/smartMatrixModel.d.ts +0 -29
- package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +0 -125
- package/lib/smart-form/api/model/smartWidgetHint.d.ts +0 -19
- package/lib/smart-form/api/model/sortDefinition.d.ts +0 -15
- package/lib/smart-form/api/model/textBoxProperties.d.ts +0 -15
- package/lib/smart-form/api/model/textFieldProperties.d.ts +0 -14
- package/lib/smart-form/api/model/valueChangeMode.d.ts +0 -19
- package/lib/smart-form/api/param.d.ts +0 -37
- package/lib/smart-form/api/variables.d.ts +0 -8
- package/lib/smart-form/highlightMacthingString-pipe.d.ts +0 -7
- package/lib/smart-form/projects.d.ts +0 -14
- package/lib/smart-form/services/smartform.layout-definition.service.d.ts +0 -50
- package/lib/smart-form/services/smartform.service.d.ts +0 -52
- package/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.d.ts +0 -8
- package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +0 -38
- package/lib/smart-form/smartfileuploader/smartfileuploader.model.d.ts +0 -7
- package/lib/smart-form/smartform.component.d.ts +0 -43
- package/lib/smart-form/smartform.form-model.d.ts +0 -864
- package/lib/smart-form/smartform.model.d.ts +0 -126
- package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +0 -54
- package/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.d.ts +0 -29
- package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +0 -57
- package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +0 -50
- package/lib/smart-form/widgets/directives/comparable-dropdown.directive.d.ts +0 -10
- package/lib/smart-form/widgets/directives/comparable-multiselect.directive.d.ts +0 -10
- package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +0 -173
- package/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.d.ts +0 -24
- package/lib/smart-form/widgets/smartformwidget/trackCaps.directive.d.ts +0 -9
- package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +0 -21
- package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +0 -18
- package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +0 -54
- package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +0 -19
- package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +0 -24
- package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +0 -2
- package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +0 -27
- package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +0 -14
- package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +0 -17
- package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +0 -18
- package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +0 -12
- package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +0 -11
- package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +0 -11
- package/lib/smart-generic-pages/projects.d.ts +0 -9
- package/lib/smart-generic-pages/search-page/search-page.component.d.ts +0 -25
- package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +0 -19
- package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +0 -17
- package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +0 -25
- package/lib/smart-grid/api/grid-api/api/api.d.ts +0 -3
- package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +0 -182
- package/lib/smart-grid/api/grid-api/api.module.d.ts +0 -11
- package/lib/smart-grid/api/grid-api/configuration.d.ts +0 -104
- package/lib/smart-grid/api/grid-api/encoder.d.ts +0 -11
- package/lib/smart-grid/api/grid-api/index.d.ts +0 -6
- package/lib/smart-grid/api/grid-api/model/gridColumnContentType.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/model/gridColumnMeta.d.ts +0 -34
- package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +0 -44
- package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +0 -19
- package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +0 -36
- package/lib/smart-grid/api/grid-api/model/gridPage.d.ts +0 -26
- package/lib/smart-grid/api/grid-api/model/gridRow.d.ts +0 -47
- package/lib/smart-grid/api/grid-api/model/gridRowLayoutDescriptor.d.ts +0 -20
- package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +0 -24
- package/lib/smart-grid/api/grid-api/model/gridSelectionMode.d.ts +0 -16
- package/lib/smart-grid/api/grid-api/model/gridSelectionType.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/model/gridServerModel.d.ts +0 -22
- package/lib/smart-grid/api/grid-api/model/gridUpdateData.d.ts +0 -20
- package/lib/smart-grid/api/grid-api/model/gridView.d.ts +0 -21
- package/lib/smart-grid/api/grid-api/model/gridViewDescriptor.d.ts +0 -39
- package/lib/smart-grid/api/grid-api/model/models.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/param.d.ts +0 -37
- package/lib/smart-grid/api/grid-api/variables.d.ts +0 -8
- package/lib/smart-grid/components/expandable-grid/expandable-grid.component.d.ts +0 -10
- package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +0 -21
- package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +0 -26
- package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +0 -47
- package/lib/smart-grid/models/model.d.ts +0 -73
- package/lib/smart-grid/projects.d.ts +0 -5
- package/lib/smart-grid/smart-grid-toolbar-util.d.ts +0 -12
- package/lib/smart-grid/smart-grid.component.d.ts +0 -157
- package/lib/smart-grid/smart-grid.module.d.ts +0 -29
- package/lib/smart-grid/smart-grid.service.d.ts +0 -26
- package/lib/smart-icon/projects.d.ts +0 -5
- package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +0 -34
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +0 -10
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +0 -14
- package/lib/smart-icon/smart-icon.module.d.ts +0 -14
- package/lib/smart-icon/smart-icon.service.d.ts +0 -29
- package/lib/smart-map/abstract-map.d.ts +0 -37
- package/lib/smart-map/api/api/api.d.ts +0 -3
- package/lib/smart-map/api/api/geoMap.service.d.ts +0 -101
- package/lib/smart-map/api/api.module.d.ts +0 -11
- package/lib/smart-map/api/configuration.d.ts +0 -104
- package/lib/smart-map/api/encoder.d.ts +0 -11
- package/lib/smart-map/api/index.d.ts +0 -6
- package/lib/smart-map/api/model/gPSPosition.d.ts +0 -32
- package/lib/smart-map/api/model/gPSRoute.d.ts +0 -21
- package/lib/smart-map/api/model/geoMapChange.d.ts +0 -21
- package/lib/smart-map/api/model/geoMapDataLoadingMode.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapDataSourceDescriptor.d.ts +0 -52
- package/lib/smart-map/api/model/geoMapDataSourceType.d.ts +0 -17
- package/lib/smart-map/api/model/geoMapEditingSession.d.ts +0 -17
- package/lib/smart-map/api/model/geoMapInteraction.d.ts +0 -24
- package/lib/smart-map/api/model/geoMapItem.d.ts +0 -41
- package/lib/smart-map/api/model/geoMapItemKind.d.ts +0 -16
- package/lib/smart-map/api/model/geoMapLayer.d.ts +0 -19
- package/lib/smart-map/api/model/geoMapLayerChange.d.ts +0 -20
- package/lib/smart-map/api/model/geoMapLayerDescriptor.d.ts +0 -28
- package/lib/smart-map/api/model/geoMapModel.d.ts +0 -26
- package/lib/smart-map/api/model/geoMapOperationMode.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapSelectionMode.d.ts +0 -16
- package/lib/smart-map/api/model/geoMapServerModel.d.ts +0 -25
- package/lib/smart-map/api/model/geoMapTextType.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapViewState.d.ts +0 -27
- package/lib/smart-map/api/model/geoMapViewport.d.ts +0 -20
- package/lib/smart-map/api/model/models.d.ts +0 -20
- package/lib/smart-map/api/param.d.ts +0 -37
- package/lib/smart-map/api/variables.d.ts +0 -8
- package/lib/smart-map/api-default/api-default.d.ts +0 -2
- package/lib/smart-map/impl/google-map.d.ts +0 -23
- package/lib/smart-map/impl/leaflet-map.d.ts +0 -22
- package/lib/smart-map/projects.d.ts +0 -8
- package/lib/smart-map/smart-map.component.d.ts +0 -39
- package/lib/smart-map/smart-map.module.d.ts +0 -11
- package/lib/smart-map/smart-map.types.d.ts +0 -34
- package/lib/smart-navbar/projects.d.ts +0 -4
- package/lib/smart-navbar/smart-navbar.component.d.ts +0 -20
- package/lib/smart-navbar/smart-navbar.model.d.ts +0 -48
- package/lib/smart-navbar/smart-navbar.module.d.ts +0 -18
- package/lib/smart-navbar/smart-navbar.service.d.ts +0 -6
- package/lib/smart-navigation/projects.d.ts +0 -2
- package/lib/smart-navigation/smart-navigation.interface.d.ts +0 -5
- package/lib/smart-navigation/smart-navigation.module.d.ts +0 -6
- package/lib/smart-navigation/smart-navigation.service.d.ts +0 -12
- package/lib/smart-ng-client.module.d.ts +0 -25
- package/lib/smart-ng-client.service.d.ts +0 -10
- package/lib/smart-subject/projects.d.ts +0 -1
- package/lib/smart-subject/smart-subject.d.ts +0 -6
- package/lib/smart-tab-group/projects.d.ts +0 -1
- package/lib/smart-tab-group/smart-tab-group.module.d.ts +0 -10
- package/lib/smart-table/components/default-actions-popup/default-actions-popup.component.d.ts +0 -19
- package/lib/smart-table/components/loading/loading.component.d.ts +0 -8
- package/lib/smart-table/directives/mat-context-menu-trigger-for.directive.d.ts +0 -10
- package/lib/smart-table/projects.d.ts +0 -4
- package/lib/smart-table/smarttable.component.d.ts +0 -34
- package/lib/smart-table/smarttable.model.d.ts +0 -202
- package/lib/smart-table/smarttable.module.d.ts +0 -29
- package/lib/smart-table/smarttable.service.d.ts +0 -6
- package/lib/smart-table/tables/material-table/material-table.component.d.ts +0 -8
- package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +0 -8
- package/lib/smart-table/tables/table.d.ts +0 -98
- package/lib/smart-tree/projects.d.ts +0 -5
- package/lib/smart-tree/smarttree-generic.service.d.ts +0 -48
- package/lib/smart-tree/smarttree.component.d.ts +0 -43
- package/lib/smart-tree/smarttree.model.d.ts +0 -42
- package/lib/smart-tree/smarttree.module.d.ts +0 -16
- package/lib/smart-tree/smarttree.node.model.d.ts +0 -13
- package/lib/smart-tree/smarttree.service.d.ts +0 -25
- package/lib/smart-tree/smarttree.service.interface.d.ts +0 -43
- package/lib/smart-tree/tree-api/api/tree.service.d.ts +0 -336
- package/lib/smart-tree/tree-api/configuration.d.ts +0 -104
- package/lib/smart-tree/tree-api/encoder.d.ts +0 -11
- package/lib/smart-tree/tree-api/param.d.ts +0 -37
- package/lib/smart-tree/tree-api/variables.d.ts +0 -8
- package/lib/smart-validation/named-validator.service.d.ts +0 -17
- package/lib/smart-validation/projects.d.ts +0 -3
- package/lib/smart-validation/smart-validation.module.d.ts +0 -8
- package/lib/smart-validation/smart-validation.types.d.ts +0 -12
- package/lib/theme/theme.service.d.ts +0 -17
- package/lib/view-context/api/api/api.d.ts +0 -3
- package/lib/view-context/api/api/view.service.d.ts +0 -426
- package/lib/view-context/api/api-default/binaryContentData.d.ts +0 -2
- package/lib/view-context/api/api-default/binaryData.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationError.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationRequest.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationRun.d.ts +0 -2
- package/lib/view-context/api/api.module.d.ts +0 -11
- package/lib/view-context/api/configuration.d.ts +0 -104
- package/lib/view-context/api/encoder.d.ts +0 -11
- package/lib/view-context/api/index.d.ts +0 -6
- package/lib/view-context/api/model/backgroundProcessInfo.d.ts +0 -25
- package/lib/view-context/api/model/badgeDescriptor.d.ts +0 -15
- package/lib/view-context/api/model/clipboardData.d.ts +0 -20
- package/lib/view-context/api/model/closeResult.d.ts +0 -16
- package/lib/view-context/api/model/componentConstraint.d.ts +0 -31
- package/lib/view-context/api/model/componentModel.d.ts +0 -47
- package/lib/view-context/api/model/componentModelChange.d.ts +0 -29
- package/lib/view-context/api/model/dataChange.d.ts +0 -25
- package/lib/view-context/api/model/dataChangeEvent.d.ts +0 -31
- package/lib/view-context/api/model/dataChangeKind.d.ts +0 -19
- package/lib/view-context/api/model/deviceInfo.d.ts +0 -43
- package/lib/view-context/api/model/downloadedFile.d.ts +0 -19
- package/lib/view-context/api/model/iconPosition.d.ts +0 -18
- package/lib/view-context/api/model/imageResource.d.ts +0 -28
- package/lib/view-context/api/model/link.d.ts +0 -35
- package/lib/view-context/api/model/menuDescriptor.d.ts +0 -17
- package/lib/view-context/api/model/menuOpenDirection.d.ts +0 -21
- package/lib/view-context/api/model/menuTriggerType.d.ts +0 -15
- package/lib/view-context/api/model/messageData.d.ts +0 -29
- package/lib/view-context/api/model/messageOption.d.ts +0 -20
- package/lib/view-context/api/model/messageOptionType.d.ts +0 -16
- package/lib/view-context/api/model/messageResult.d.ts +0 -16
- package/lib/view-context/api/model/messageTextType.d.ts +0 -15
- package/lib/view-context/api/model/messageType.d.ts +0 -17
- package/lib/view-context/api/model/models.d.ts +0 -70
- package/lib/view-context/api/model/multiComboBoxElement.d.ts +0 -16
- package/lib/view-context/api/model/multiComboBoxModel.d.ts +0 -16
- package/lib/view-context/api/model/namedValidator.d.ts +0 -27
- package/lib/view-context/api/model/openPendingData.d.ts +0 -29
- package/lib/view-context/api/model/publishedViewData.d.ts +0 -14
- package/lib/view-context/api/model/serverRequestExecutionStat.d.ts +0 -40
- package/lib/view-context/api/model/serverRequestTrack.d.ts +0 -60
- package/lib/view-context/api/model/serverRequestType.d.ts +0 -22
- package/lib/view-context/api/model/shellProperty.d.ts +0 -15
- package/lib/view-context/api/model/smartLinkData.d.ts +0 -29
- package/lib/view-context/api/model/smartLinkMigrationStatus.d.ts +0 -39
- package/lib/view-context/api/model/statisticRecord.d.ts +0 -36
- package/lib/view-context/api/model/style.d.ts +0 -21
- package/lib/view-context/api/model/themeDefinition.d.ts +0 -22
- package/lib/view-context/api/model/themeDescriptor.d.ts +0 -16
- package/lib/view-context/api/model/themeShellDescriptor.d.ts +0 -17
- package/lib/view-context/api/model/uiAction.d.ts +0 -68
- package/lib/view-context/api/model/uiActionButtonDescriptor.d.ts +0 -25
- package/lib/view-context/api/model/uiActionButtonType.d.ts +0 -25
- package/lib/view-context/api/model/uiActionConstraint.d.ts +0 -22
- package/lib/view-context/api/model/uiActionDefinition.d.ts +0 -19
- package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +0 -18
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +0 -44
- package/lib/view-context/api/model/uiActionDialogDescriptor.d.ts +0 -23
- package/lib/view-context/api/model/uiActionFeedbackType.d.ts +0 -18
- package/lib/view-context/api/model/uiActionInputType.d.ts +0 -19
- package/lib/view-context/api/model/uiActionRequest.d.ts +0 -31
- package/lib/view-context/api/model/uiActionSchedule.d.ts +0 -14
- package/lib/view-context/api/model/uiActionTooltip.d.ts +0 -25
- package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +0 -27
- package/lib/view-context/api/model/uploadWidgetType.d.ts +0 -16
- package/lib/view-context/api/model/uploadedFile.d.ts +0 -20
- package/lib/view-context/api/model/valueSet.d.ts +0 -20
- package/lib/view-context/api/model/view.d.ts +0 -88
- package/lib/view-context/api/model/viewApiError.d.ts +0 -18
- package/lib/view-context/api/model/viewConstraint.d.ts +0 -18
- package/lib/view-context/api/model/viewContext.d.ts +0 -33
- package/lib/view-context/api/model/viewContextChange.d.ts +0 -24
- package/lib/view-context/api/model/viewContextData.d.ts +0 -25
- package/lib/view-context/api/model/viewContextUpdate.d.ts +0 -24
- package/lib/view-context/api/model/viewData.d.ts +0 -28
- package/lib/view-context/api/model/viewEventHandler.d.ts +0 -36
- package/lib/view-context/api/model/viewPlaceholder.d.ts +0 -22
- package/lib/view-context/api/model/viewState.d.ts +0 -20
- package/lib/view-context/api/model/viewStateUpdate.d.ts +0 -22
- package/lib/view-context/api/model/viewType.d.ts +0 -16
- package/lib/view-context/api/param.d.ts +0 -37
- package/lib/view-context/api/variables.d.ts +0 -8
- package/lib/view-context/default-view-components.token.d.ts +0 -18
- package/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.d.ts +0 -9
- package/lib/view-context/message-dialog/message-dialog.component.d.ts +0 -27
- package/lib/view-context/projects.d.ts +0 -26
- package/lib/view-context/property-definition-data.d.ts +0 -5
- package/lib/view-context/reuse-router-slot.token.d.ts +0 -3
- package/lib/view-context/smart-embedded-slot.directive.d.ts +0 -20
- package/lib/view-context/smart-ui-action/components/menu/click/menu.component.d.ts +0 -49
- package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +0 -50
- package/lib/view-context/smart-ui-action/components/menu/menu.constants.d.ts +0 -7
- package/lib/view-context/smart-ui-action/components/menu/menu.service.d.ts +0 -11
- package/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.d.ts +0 -13
- package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +0 -16
- package/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.d.ts +0 -30
- package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +0 -32
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +0 -40
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +0 -3
- package/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.d.ts +0 -43
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +0 -29
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.d.ts +0 -15
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +0 -36
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +0 -26
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.d.ts +0 -31
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +0 -28
- package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +0 -13
- package/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.d.ts +0 -5
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +0 -55
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +0 -73
- package/lib/view-context/smart-ui-action/ui-action.descriptor.service.d.ts +0 -23
- package/lib/view-context/smart-ui-action/ui-action.model.d.ts +0 -43
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +0 -42
- package/lib/view-context/smart-view-context-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.d.ts +0 -15
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-view-context.interceptor.d.ts +0 -17
- package/lib/view-context/smart-view-context.model.d.ts +0 -37
- package/lib/view-context/smart-view-context.module.d.ts +0 -86
- package/lib/view-context/smart-view-context.service.d.ts +0 -172
- package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +0 -16
- package/lib/view-context/utility/componentLibrary.d.ts +0 -6
- package/lib/view-context/utility/smart-object-utility.d.ts +0 -5
- package/lib/view-context/utility/smart-style-utility.d.ts +0 -12
- package/lib/view-context/value-api/api/api.d.ts +0 -3
- package/lib/view-context/value-api/api/value.service.d.ts +0 -35
- package/lib/view-context/value-api/api.module.d.ts +0 -11
- package/lib/view-context/value-api/configuration.d.ts +0 -104
- package/lib/view-context/value-api/encoder.d.ts +0 -11
- package/lib/view-context/value-api/index.d.ts +0 -6
- package/lib/view-context/value-api/model/genericValue.d.ts +0 -33
- package/lib/view-context/value-api/model/models.d.ts +0 -10
- package/lib/view-context/value-api/model/value.d.ts +0 -29
- package/lib/view-context/value-api/model/valueSetData.d.ts +0 -41
- package/lib/view-context/value-api/model/valueSetDefinition.d.ts +0 -16
- package/lib/view-context/value-api/model/valueSetDefinitionData.d.ts +0 -53
- package/lib/view-context/value-api/model/valueSetDefinitionIdentifier.d.ts +0 -21
- package/lib/view-context/value-api/model/valueSetDefinitionKind.d.ts +0 -22
- package/lib/view-context/value-api/model/valueSetExpression.d.ts +0 -18
- package/lib/view-context/value-api/model/valueSetOperand.d.ts +0 -25
- package/lib/view-context/value-api/model/valueSetOperation.d.ts +0 -17
- package/lib/view-context/value-api/param.d.ts +0 -37
- package/lib/view-context/value-api/variables.d.ts +0 -8
- package/lib/view-context/view-handler-resolution.d.ts +0 -11
- package/lib/view-context/view-op.d.ts +0 -18
- package/lib/view-context/view-slot-resolution.d.ts +0 -27
- package/projects.d.ts +0 -27
- package/smartbit4all-ng-client-6.0.35.tgz +0 -0
|
@@ -1,1050 +0,0 @@
|
|
|
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 "ngx-mask";
|
|
53
|
-
import * as i38 from "../../../view-context/smart-ui-action/ui-action-toolbar.component";
|
|
54
|
-
import * as i39 from "./trackCaps.directive";
|
|
55
|
-
import * as i40 from "../directives/comparable-dropdown.directive";
|
|
56
|
-
import * as i41 from "../directives/comparable-multiselect.directive";
|
|
57
|
-
import * as i42 from "./sortable-widget/sortable-widget.component";
|
|
58
|
-
import * as i43 from "../components/smart-month-picker/smart-month-picker.component";
|
|
59
|
-
import * as i44 from "../components/smart-file-editor/smart-file-editor.component";
|
|
60
|
-
import * as i45 from "../components/smart-multi-file-editor/smart-multi-file-editor.component";
|
|
61
|
-
import * as i46 from "../components/smart-voice-recorder/smart-voice-recorder.component";
|
|
62
|
-
import * as i47 from "../../../view-context/smart-ui-action/ui-action-button/ui-action-button.component";
|
|
63
|
-
import * as i48 from "../../highlightMacthingString-pipe";
|
|
64
|
-
import * as i49 from "../../../view-context/utility/componentLibrary";
|
|
65
|
-
export class SmartWidgetSettings {
|
|
66
|
-
static { this.useUtc = false; }
|
|
67
|
-
}
|
|
68
|
-
export class SmartformwidgetComponent {
|
|
69
|
-
constructor(service, cfService, sanitizer, compLib, changeDetector) {
|
|
70
|
-
this.service = service;
|
|
71
|
-
this.cfService = cfService;
|
|
72
|
-
this.sanitizer = sanitizer;
|
|
73
|
-
this.compLib = compLib;
|
|
74
|
-
this.changeDetector = changeDetector;
|
|
75
|
-
this._destroy$ = new Subject();
|
|
76
|
-
this.hidePassword = true;
|
|
77
|
-
this.errorMessages = [];
|
|
78
|
-
this.valueCleared = new EventEmitter();
|
|
79
|
-
this.smartFormWidgetType = SmartFormWidgetType;
|
|
80
|
-
this.hasError = false;
|
|
81
|
-
this.toHighlight = '';
|
|
82
|
-
this.isEnterPressed = false;
|
|
83
|
-
this.isDatePickerRequired = false;
|
|
84
|
-
this.SmartWidgetHintPosition = SmartWidgetHintPositionEnum;
|
|
85
|
-
this.componentLibrary = ComponentLibrary;
|
|
86
|
-
this.emptyQuillToolbar = {
|
|
87
|
-
toolbar: false,
|
|
88
|
-
};
|
|
89
|
-
this._hasJustChanged = false;
|
|
90
|
-
this.hasCreated = false;
|
|
91
|
-
this.addOnBlur = true;
|
|
92
|
-
this.separatorKeysCodes = [ENTER, COMMA];
|
|
93
|
-
this.emptySeparatorKeysCodes = [];
|
|
94
|
-
this.dorpdownOpening = true;
|
|
95
|
-
this.calendarOpening = false;
|
|
96
|
-
}
|
|
97
|
-
ngOnInit() {
|
|
98
|
-
if (this.widgetInstance.type === SmartFormWidgetType.CONTAINER &&
|
|
99
|
-
this.widgetInstance.valueList) {
|
|
100
|
-
this.widgetInstance.valueList = this.service.filterWidgetsByVisibility(this.widgetInstance.valueList);
|
|
101
|
-
}
|
|
102
|
-
this.form.valueChanges.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
103
|
-
this.getErrorMessage(this.widgetInstance);
|
|
104
|
-
});
|
|
105
|
-
this.onBlur?.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
106
|
-
this.getErrorMessage(this.widgetInstance);
|
|
107
|
-
if (this.compLib === this.componentLibrary.PRIMENG) {
|
|
108
|
-
this.getControlMessages(this.widgetInstance.key);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
// handle initial error message from server
|
|
112
|
-
this.getErrorMessage(this.widgetInstance);
|
|
113
|
-
// this.getControlMessages(this.widgetInstance.key!);
|
|
114
|
-
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR &&
|
|
115
|
-
this.widgetInstance.indicator) {
|
|
116
|
-
if (this.widgetInstance.indicator?.indicatorLength) {
|
|
117
|
-
this.indicatorItems = new Array(this.widgetInstance.indicator.indicatorLength);
|
|
118
|
-
}
|
|
119
|
-
this.form.controls[this.widgetInstance.indicator.indicateProperty].valueChanges
|
|
120
|
-
.pipe(takeUntil(this._destroy$))
|
|
121
|
-
.subscribe((value) => {
|
|
122
|
-
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR) {
|
|
123
|
-
this.widgetInstance.indicator.indicatorValue =
|
|
124
|
-
this.widgetInstance.indicator.changeIndicatorStatus(value);
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_PICKER) {
|
|
129
|
-
if (this.widgetInstance.value) {
|
|
130
|
-
this.defaultDate = new Date(this.widgetInstance.value);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD &&
|
|
134
|
-
this.widgetInstance.selection) {
|
|
135
|
-
if (this.onValueChange == undefined) {
|
|
136
|
-
this.onValueChange = new SmartSubject(this._destroy$);
|
|
137
|
-
}
|
|
138
|
-
this.filteredOptions = this.onValueChange.pipe(startWith(''), map((value) => this._filter(value || '')), takeUntil(this._destroy$));
|
|
139
|
-
}
|
|
140
|
-
if (this.widgetInstance.type === SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
141
|
-
let videoId = this.parseYoutubeUrl(this.widgetInstance.link);
|
|
142
|
-
if (videoId)
|
|
143
|
-
this.widgetInstance.videoId = videoId;
|
|
144
|
-
const tag = document.createElement('script');
|
|
145
|
-
tag.src = 'https://www.youtube.com/iframe_api';
|
|
146
|
-
document.body.appendChild(tag);
|
|
147
|
-
}
|
|
148
|
-
let formControls = Object.keys(this.form.controls).filter((key) => key === this.widgetInstance.key || key.startsWith(`${this.widgetInstance.key}.`));
|
|
149
|
-
formControls.map((key) => {
|
|
150
|
-
this.form.controls[key].valueChanges
|
|
151
|
-
.pipe(distinctUntilChanged(), takeUntil(this._destroy$))
|
|
152
|
-
.subscribe((value) => {
|
|
153
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS &&
|
|
154
|
-
this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
155
|
-
const valueChange = {
|
|
156
|
-
key,
|
|
157
|
-
value,
|
|
158
|
-
kind: this.getSophisticatedEventKind(),
|
|
159
|
-
};
|
|
160
|
-
this.sophisticatedValueChange.next(valueChange);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
getSophisticatedEventKind() {
|
|
166
|
-
return this.widgetInstance.type === SmartFormWidgetType.SELECT ||
|
|
167
|
-
this.widgetInstance.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
168
|
-
this.widgetInstance.type === SmartFormWidgetType.RADIO_BUTTON
|
|
169
|
-
? 'selection'
|
|
170
|
-
: 'basic';
|
|
171
|
-
}
|
|
172
|
-
parseYoutubeUrl(url) {
|
|
173
|
-
url.replace('/shorts/', '/watch?v=');
|
|
174
|
-
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
|
|
175
|
-
var match = url.match(regExp);
|
|
176
|
-
return match && match[7].length == 11 ? match[7] : false;
|
|
177
|
-
}
|
|
178
|
-
get hasJustChanged() {
|
|
179
|
-
return this._hasJustChanged;
|
|
180
|
-
}
|
|
181
|
-
set hasJustChanged(hasJustChanged) {
|
|
182
|
-
this._hasJustChanged = hasJustChanged;
|
|
183
|
-
new Promise((resolve) => setTimeout(resolve, 250)).then(() => {
|
|
184
|
-
this._hasJustChanged = false;
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
onDatePickerBlur(event) {
|
|
188
|
-
event.stopPropagation();
|
|
189
|
-
this.handleBlurEvent(this.widgetInstance);
|
|
190
|
-
this.handleDateChanged(this.form.controls[this.widgetInstance.key].value);
|
|
191
|
-
}
|
|
192
|
-
onTimePickerBlur(event) {
|
|
193
|
-
event.stopPropagation();
|
|
194
|
-
this.handleBlurEvent(this.widgetInstance);
|
|
195
|
-
this.handleTimeChanged(this.form.controls[`${this.widgetInstance.key}-time`].value);
|
|
196
|
-
}
|
|
197
|
-
ngAfterViewInit() {
|
|
198
|
-
if (this.widgetInstance.type === SmartFormWidgetType.COMPONENT) {
|
|
199
|
-
this.customComponentRef = this.cfService.createComponent(this.customComponentVcRef, this.widgetInstance.component, this.widgetInstance.input);
|
|
200
|
-
}
|
|
201
|
-
if (this.compLib === this.componentLibrary.MATERIAL) {
|
|
202
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER ||
|
|
203
|
-
this.widgetInstance.type === SmartFormWidgetType.MONTH_PICKER) {
|
|
204
|
-
this.isDatePickerRequired = !!this.widgetInstance.validators?.some((smartValidator) => smartValidator.validator === Validators.required);
|
|
205
|
-
let validators = [];
|
|
206
|
-
if (this.widgetInstance.validators) {
|
|
207
|
-
validators = this.widgetInstance.validators?.map((validator) => {
|
|
208
|
-
return validator.validator;
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
this.hasCreated = true;
|
|
212
|
-
this.form.controls[this.widgetInstance.key].valueChanges
|
|
213
|
-
.pipe(takeUntil(this._destroy$))
|
|
214
|
-
.subscribe((_moment) => {
|
|
215
|
-
this.handleDateChanged(_moment);
|
|
216
|
-
});
|
|
217
|
-
this.form.controls[`${this.widgetInstance.key}-time`].valueChanges
|
|
218
|
-
.pipe(takeUntil(this._destroy$))
|
|
219
|
-
.subscribe((timeValue) => {
|
|
220
|
-
this.handleTimeChanged(timeValue);
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_PICKER) {
|
|
226
|
-
this.form.controls[this.widgetInstance.key].valueChanges
|
|
227
|
-
.pipe(takeUntil(this._destroy$))
|
|
228
|
-
.subscribe((timeValue) => {
|
|
229
|
-
if (timeValue) {
|
|
230
|
-
this.defaultDate = new Date(timeValue);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
this.defaultDate = undefined;
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_BOX &&
|
|
239
|
-
this.compLib === this.componentLibrary.PRIMENG &&
|
|
240
|
-
this.widgetInstance.textBoxProperties?.maxRows &&
|
|
241
|
-
this.sb4Textarea) {
|
|
242
|
-
var textarea = this.sb4Textarea.nativeElement;
|
|
243
|
-
var style = getComputedStyle(textarea);
|
|
244
|
-
var maxLines = this.widgetInstance.textBoxProperties.maxRows;
|
|
245
|
-
var lineHeight = parseInt(style.getPropertyValue('--sb4-textarea-line-height')) || 20;
|
|
246
|
-
var paddingTop = parseFloat(style.paddingTop) || 0;
|
|
247
|
-
var paddingBottom = parseFloat(style.paddingBottom) || 0;
|
|
248
|
-
var verticalExtras = paddingTop + paddingBottom;
|
|
249
|
-
textarea.style.height = 'auto';
|
|
250
|
-
textarea.style.maxHeight = `${lineHeight * maxLines + verticalExtras}px`;
|
|
251
|
-
}
|
|
252
|
-
if (this.widgetInstance.type === SmartFormWidgetType.FILE_UPLOADER && this.fileUploader) {
|
|
253
|
-
this.toolbar = this.fileUploader.toolbar;
|
|
254
|
-
}
|
|
255
|
-
if (this.widgetInstance.type === SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
256
|
-
this.multiFileUploader) {
|
|
257
|
-
this.toolbar = this.multiFileUploader.toolbar;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
handleDateChanged(_moment) {
|
|
261
|
-
const isDateFocused = document.activeElement === this.dateInputChild?.nativeElement;
|
|
262
|
-
const isTimeFocused = document.activeElement === this.timeInputChild?.nativeElement;
|
|
263
|
-
const dateFormControl = this.form.controls[this.widgetInstance.key];
|
|
264
|
-
const timeFormControl = this.form.controls[`${this.widgetInstance.key}-time`];
|
|
265
|
-
if (!this.isDatePickerRequired &&
|
|
266
|
-
timeFormControl.hasValidator(Validators.required) &&
|
|
267
|
-
!_moment) {
|
|
268
|
-
timeFormControl.removeValidators(Validators.required);
|
|
269
|
-
timeFormControl.setValue('');
|
|
270
|
-
}
|
|
271
|
-
else if (!this.isDatePickerRequired &&
|
|
272
|
-
!timeFormControl.hasValidator(Validators.required) &&
|
|
273
|
-
_moment) {
|
|
274
|
-
timeFormControl.addValidators(Validators.required);
|
|
275
|
-
if (timeFormControl.value === '') {
|
|
276
|
-
const now = new Date();
|
|
277
|
-
timeFormControl.setValue(now.getHours() + ':' + now.getMinutes());
|
|
278
|
-
timeFormControl.markAsUntouched();
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
if (!_moment || isDateFocused || isTimeFocused) {
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
if (this.hasJustChanged) {
|
|
285
|
-
this.hasJustChanged = false;
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
const timeValue = timeFormControl.value || '00:00';
|
|
289
|
-
this.hasJustChanged = true;
|
|
290
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
291
|
-
this.setDateFormControl(dateFormControl, _moment, timeValue);
|
|
292
|
-
this.widgetInstance.value = dateFormControl.value;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
handleTimeChanged(timeValue) {
|
|
296
|
-
const isFocused = document.activeElement === this.timeInputChild?.nativeElement;
|
|
297
|
-
const dateFormControl = this.form.controls[this.widgetInstance.key];
|
|
298
|
-
const timeFormControl = this.form.controls[`${this.widgetInstance.key}-time`];
|
|
299
|
-
if (!this.isDatePickerRequired &&
|
|
300
|
-
dateFormControl.hasValidator(Validators.required) &&
|
|
301
|
-
!timeValue) {
|
|
302
|
-
dateFormControl.removeValidators(Validators.required);
|
|
303
|
-
dateFormControl.setValue(dateFormControl.value ?? '');
|
|
304
|
-
}
|
|
305
|
-
else if (!this.isDatePickerRequired &&
|
|
306
|
-
!dateFormControl.hasValidator(Validators.required) &&
|
|
307
|
-
timeValue) {
|
|
308
|
-
dateFormControl.setValidators(Validators.required);
|
|
309
|
-
}
|
|
310
|
-
// if (isFocused) {
|
|
311
|
-
// return;
|
|
312
|
-
// }
|
|
313
|
-
if (this.hasJustChanged) {
|
|
314
|
-
this.hasJustChanged = false;
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
if (!timeValue) {
|
|
318
|
-
if (timeFormControl.hasValidator(Validators.required)) {
|
|
319
|
-
timeFormControl.markAsDirty();
|
|
320
|
-
}
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
let _moment = dateFormControl.value;
|
|
324
|
-
if (!_moment) {
|
|
325
|
-
_moment = moment(); // or moment().startOf('day') if you prefer
|
|
326
|
-
}
|
|
327
|
-
this.hasJustChanged = true;
|
|
328
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
329
|
-
this.setDateFormControl(dateFormControl, _moment, timeValue);
|
|
330
|
-
this.widgetInstance.value = dateFormControl.value;
|
|
331
|
-
this.onValueChange?.next(this.widgetInstance);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
setDateFormControl(dateFormControl, _moment, timeValue) {
|
|
335
|
-
if (_moment) {
|
|
336
|
-
let hour = timeValue.substring(0, 2);
|
|
337
|
-
let min = timeValue.substring(3, 5);
|
|
338
|
-
const newMoment = moment(_moment).set({
|
|
339
|
-
hour: +hour,
|
|
340
|
-
minute: +min,
|
|
341
|
-
second: 0,
|
|
342
|
-
millisecond: 0,
|
|
343
|
-
});
|
|
344
|
-
dateFormControl.setValue(newMoment);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
getTime() {
|
|
348
|
-
if (this.widgetInstance.type === SmartFormWidgetType.DATE_TIME_PICKER) {
|
|
349
|
-
return this.widgetInstance.value.toISOString().split('T')[1].substring(0, 5);
|
|
350
|
-
}
|
|
351
|
-
return '';
|
|
352
|
-
}
|
|
353
|
-
ngOnDestroy() {
|
|
354
|
-
this._destroy$.next();
|
|
355
|
-
this._destroy$.complete();
|
|
356
|
-
}
|
|
357
|
-
onKeydown() {
|
|
358
|
-
this.isEnterPressed = true;
|
|
359
|
-
new Promise((resolve) => setTimeout(resolve, 500)).then(() => {
|
|
360
|
-
this.isEnterPressed = false;
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
togglePasswordVisibility(event) {
|
|
364
|
-
if (!this.isEnterPressed) {
|
|
365
|
-
this.hidePassword = !this.hidePassword;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
getNgClass() {
|
|
369
|
-
return SmartStyleUtility.getNgClasses(this.widgetInstance.style);
|
|
370
|
-
}
|
|
371
|
-
getStyle() {
|
|
372
|
-
if (!this.widgetInstance.style) {
|
|
373
|
-
this.widgetInstance.style = {
|
|
374
|
-
classesToAdd: [],
|
|
375
|
-
classesToRemove: [],
|
|
376
|
-
style: {},
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
if (!('width' in this.widgetInstance.style.style) && 'minWidth' in this.widgetInstance) {
|
|
380
|
-
this.widgetInstance.style.style['width'] = `${this.widgetInstance.minWidth}px`;
|
|
381
|
-
}
|
|
382
|
-
return SmartStyleUtility.getNgStyles(this.widgetInstance.style);
|
|
383
|
-
}
|
|
384
|
-
getLabelNgClass() {
|
|
385
|
-
if ('labelStyle' in this.widgetInstance) {
|
|
386
|
-
return SmartStyleUtility.getNgClasses(this.widgetInstance.labelStyle);
|
|
387
|
-
}
|
|
388
|
-
return {};
|
|
389
|
-
}
|
|
390
|
-
getLabelStyle() {
|
|
391
|
-
if ('labelStyle' in this.widgetInstance) {
|
|
392
|
-
return SmartStyleUtility.getNgStyles(this.widgetInstance.labelStyle);
|
|
393
|
-
}
|
|
394
|
-
return {};
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Change handler for the potentially present Quill editor, enforcing max length limits if
|
|
398
|
-
* necessary.
|
|
399
|
-
*
|
|
400
|
-
* @param change the {@link ContentChange} the Quill editor emits
|
|
401
|
-
* @returns {@code void}
|
|
402
|
-
*/
|
|
403
|
-
onRichTextEditorContentChanged(change) {
|
|
404
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
if (!this.widgetInstance.maxLength) {
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
411
|
-
// unremovable new-line character at the end of its content.
|
|
412
|
-
const maxLength = this.widgetInstance.maxLength + 1;
|
|
413
|
-
if (change.text.length <= maxLength) {
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
const insertOpCount = change.delta.ops?.filter((it) => !!it.insert).length ?? 0;
|
|
417
|
-
if (insertOpCount > 0) {
|
|
418
|
-
this.quill?.quillEditor.setContents(change.oldDelta, 'silent');
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
onPrimeRichTextEditorContentChanged(change) {
|
|
422
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
if (!this.widgetInstance.maxLength) {
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
429
|
-
// unremovable new-line character at the end of its content.
|
|
430
|
-
const maxLength = this.widgetInstance.maxLength + 1;
|
|
431
|
-
if (change.textValue.length <= maxLength) {
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
/**
|
|
436
|
-
* Calculates the number of remaining user-space characters allowed to be entered into the Quill
|
|
437
|
-
* editor.
|
|
438
|
-
*
|
|
439
|
-
* <p>
|
|
440
|
-
* The real length of the editor's content may be much longer - as it is persisted as an HTML
|
|
441
|
-
* document fragment behind the scenes. This method is concerned by the number of characters the
|
|
442
|
-
* user perceives.
|
|
443
|
-
*
|
|
444
|
-
* @returns the {@link number} of remaining permitted characters the user may input, or {@code -1}
|
|
445
|
-
* if the leeway is not interpreted in the component's current state
|
|
446
|
-
*/
|
|
447
|
-
getRichTextEditorLengthLeeway() {
|
|
448
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.RICH_TEXT) {
|
|
449
|
-
return -1;
|
|
450
|
-
}
|
|
451
|
-
if (!this.widgetInstance.maxLength) {
|
|
452
|
-
return -1;
|
|
453
|
-
}
|
|
454
|
-
// we are permitted a number one greater than the requested: The quill editor contains an
|
|
455
|
-
// unremovable new-line character at the end of its content.
|
|
456
|
-
const maxLength = this.widgetInstance.maxLength + 1;
|
|
457
|
-
if (this.quill) {
|
|
458
|
-
// this is the intended path (user input):
|
|
459
|
-
return maxLength - this.quill.quillEditor.getText().length;
|
|
460
|
-
}
|
|
461
|
-
// fallback to the raw HTML content:
|
|
462
|
-
return maxLength - this.form.controls[this.widgetInstance.key].value.length;
|
|
463
|
-
}
|
|
464
|
-
add(event) {
|
|
465
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
const value = (event.value || '').trim();
|
|
469
|
-
if (this.setTextFieldChipsValue(value)) {
|
|
470
|
-
const valueChange = {
|
|
471
|
-
key: this.widgetInstance.key,
|
|
472
|
-
value: this.form.controls[this.widgetInstance.key].value,
|
|
473
|
-
kind: 'selection',
|
|
474
|
-
};
|
|
475
|
-
this.sophisticatedValueChange.next(valueChange);
|
|
476
|
-
}
|
|
477
|
-
// Clear the input value
|
|
478
|
-
event.chipInput.clear();
|
|
479
|
-
this.form.controls[this.widgetInstance.key].markAsTouched();
|
|
480
|
-
}
|
|
481
|
-
remove(value) {
|
|
482
|
-
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
483
|
-
this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
484
|
-
const index = this.form.controls[this.widgetInstance.key].value.indexOf(value);
|
|
485
|
-
if (index >= 0) {
|
|
486
|
-
this.form.controls[this.widgetInstance.key].value.splice(index, 1);
|
|
487
|
-
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
488
|
-
const valueChange = {
|
|
489
|
-
key: this.widgetInstance.key,
|
|
490
|
-
value: this.form.controls[this.widgetInstance.key].value,
|
|
491
|
-
kind: 'selection',
|
|
492
|
-
};
|
|
493
|
-
this.sophisticatedValueChange.next(valueChange);
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
selected(event, widgetInstance) {
|
|
498
|
-
let value = event.option.viewValue;
|
|
499
|
-
if (this.setTextFieldChipsValue(value)) {
|
|
500
|
-
if (widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
501
|
-
widgetInstance.type === SmartFormWidgetType.TEXT_FIELD_LOOKUP) {
|
|
502
|
-
const valueChange = {
|
|
503
|
-
key: widgetInstance.key,
|
|
504
|
-
value: this.form.controls[widgetInstance.key].value,
|
|
505
|
-
kind: 'selection',
|
|
506
|
-
};
|
|
507
|
-
this.sophisticatedValueChange.next(valueChange);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
setTextFieldChipsValue(value) {
|
|
512
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.TEXT_FIELD_CHIPS) {
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
|
-
if (value) {
|
|
516
|
-
if ((this.widgetInstance.maxValues &&
|
|
517
|
-
this.widgetInstance.value.length < this.widgetInstance.maxValues) ||
|
|
518
|
-
!this.widgetInstance.maxValues) {
|
|
519
|
-
if (!this.form.controls[this.widgetInstance.key].value) {
|
|
520
|
-
let values = new Array();
|
|
521
|
-
this.widgetInstance.value = values;
|
|
522
|
-
this.form.controls[this.widgetInstance.key].setValue(values);
|
|
523
|
-
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
524
|
-
}
|
|
525
|
-
this.form.controls[this.widgetInstance.key].value.push(value);
|
|
526
|
-
this.form.controls[this.widgetInstance.key].updateValueAndValidity();
|
|
527
|
-
return true;
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
return false;
|
|
531
|
-
}
|
|
532
|
-
getDirection() {
|
|
533
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
534
|
-
this.widgetInstance.type !== SmartFormWidgetType.CHECK_BOX &&
|
|
535
|
-
this.widgetInstance.type !== SmartFormWidgetType.RADIO_BUTTON) {
|
|
536
|
-
return '';
|
|
537
|
-
}
|
|
538
|
-
if (this.widgetInstance.direction === undefined) {
|
|
539
|
-
return 'direction-row';
|
|
540
|
-
}
|
|
541
|
-
else if (this.widgetInstance.direction === SmartFormWidgetDirection.COL) {
|
|
542
|
-
return 'direction-col';
|
|
543
|
-
}
|
|
544
|
-
else {
|
|
545
|
-
return 'direction-row';
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
smartFormTextFieldButtonIconPosition() {
|
|
549
|
-
return SmartFormTextFieldButtonIconPosition;
|
|
550
|
-
}
|
|
551
|
-
getType() {
|
|
552
|
-
return SmartFormWidgetType;
|
|
553
|
-
}
|
|
554
|
-
getWidgetLabel(widget) {
|
|
555
|
-
if (widget.type === SmartFormWidgetType.CONTAINER) {
|
|
556
|
-
return '';
|
|
557
|
-
}
|
|
558
|
-
if (widget.label === '') {
|
|
559
|
-
return widget.label;
|
|
560
|
-
}
|
|
561
|
-
let isRequired = false;
|
|
562
|
-
if (widget.type !== SmartFormWidgetType.LABEL &&
|
|
563
|
-
widget.type !== SmartFormWidgetType.TIME &&
|
|
564
|
-
widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
565
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
566
|
-
widget.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
567
|
-
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
568
|
-
widget.type !== SmartFormWidgetType.SVG &&
|
|
569
|
-
widget.type !== SmartFormWidgetType.DIV &&
|
|
570
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
571
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
572
|
-
widget.type !== SmartFormWidgetType.COMPONENT) {
|
|
573
|
-
isRequired = widget.validators?.length ? this.fieldIsRequired() && !!widget.showLabel : false;
|
|
574
|
-
}
|
|
575
|
-
else if (widget.type === SmartFormWidgetType.LABEL) {
|
|
576
|
-
isRequired = widget.markAsRequired ? true : false;
|
|
577
|
-
}
|
|
578
|
-
return `${widget.label}${isRequired ? ' *' : ''}`;
|
|
579
|
-
}
|
|
580
|
-
sanitizeHtml(value) {
|
|
581
|
-
let safeValue = value ?? '';
|
|
582
|
-
return this.sanitizer.bypassSecurityTrustHtml(safeValue);
|
|
583
|
-
}
|
|
584
|
-
fieldIsRequired() {
|
|
585
|
-
let value = false;
|
|
586
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
587
|
-
this.widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
588
|
-
this.widgetInstance.type !== SmartFormWidgetType.TIME &&
|
|
589
|
-
this.widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
590
|
-
this.widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
591
|
-
this.widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
592
|
-
this.widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
593
|
-
this.widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
594
|
-
this.widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
595
|
-
this.widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
596
|
-
this.widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
597
|
-
this.widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
598
|
-
this.widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
599
|
-
this.widgetInstance.validators?.forEach((validator) => {
|
|
600
|
-
if (validator.validator == Validators.required)
|
|
601
|
-
value = true;
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
return value;
|
|
605
|
-
}
|
|
606
|
-
hasCustomError(widget, validator) {
|
|
607
|
-
if (widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
608
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
609
|
-
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
610
|
-
if (this.form.controls[widget.key] && this.form.controls[widget.key].errors) {
|
|
611
|
-
let hasError = Object.keys(this.form.controls[widget.key].errors).length
|
|
612
|
-
? this.form.controls[widget.key]?.dirty ||
|
|
613
|
-
(this.form.controls[widget.key]?.touched &&
|
|
614
|
-
validator &&
|
|
615
|
-
(this.form.controls[widget.key]?.errors)[validator.name])
|
|
616
|
-
: false;
|
|
617
|
-
if ((validator && hasError && !this.errorKey) ||
|
|
618
|
-
(validator && hasError && this.errorKey === validator.name)) {
|
|
619
|
-
this.hasError = true;
|
|
620
|
-
this.errorKey = validator.name;
|
|
621
|
-
}
|
|
622
|
-
else if (!hasError && validator && this.errorKey === validator.name) {
|
|
623
|
-
this.hasError = false;
|
|
624
|
-
this.errorKey = undefined;
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
hasError = false;
|
|
628
|
-
}
|
|
629
|
-
return hasError;
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
return false;
|
|
633
|
-
}
|
|
634
|
-
getErrorMessage(widgetInstance) {
|
|
635
|
-
let errorMessage;
|
|
636
|
-
let errorIcon;
|
|
637
|
-
let errorIconColor;
|
|
638
|
-
let validator;
|
|
639
|
-
if (widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
640
|
-
widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
641
|
-
widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
642
|
-
widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
643
|
-
widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
644
|
-
widgetInstance.type !== SmartFormWidgetType.RECORDING_UPLOADER &&
|
|
645
|
-
widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
646
|
-
widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
647
|
-
widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
648
|
-
widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
649
|
-
widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
650
|
-
widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
651
|
-
widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
652
|
-
if (this.form.controls[widgetInstance.key] && this.form.controls[widgetInstance.key].errors) {
|
|
653
|
-
if (this.errorKey &&
|
|
654
|
-
!Object.keys(this.form.controls[widgetInstance.key].errors).includes(this.errorKey)) {
|
|
655
|
-
this.errorKey = undefined;
|
|
656
|
-
}
|
|
657
|
-
for (let index = 0; index < Object.keys(this.form.controls[widgetInstance.key].errors).length; index++) {
|
|
658
|
-
const errorKey = Object.keys(this.form.controls[widgetInstance.key].errors)[index];
|
|
659
|
-
let customValidatorOnWidget = widgetInstance.validators?.filter((validator) => validator.name === errorKey);
|
|
660
|
-
if (customValidatorOnWidget && customValidatorOnWidget.length) {
|
|
661
|
-
errorMessage = customValidatorOnWidget[0].errorMessage;
|
|
662
|
-
errorIcon = customValidatorOnWidget[0].icon;
|
|
663
|
-
errorIconColor = customValidatorOnWidget[0].iconColor;
|
|
664
|
-
validator = customValidatorOnWidget[0];
|
|
665
|
-
break;
|
|
666
|
-
}
|
|
667
|
-
let customValidatorOnForm = this.service.smartForm?.validators?.filter((validator) => validator.name === errorKey);
|
|
668
|
-
if (customValidatorOnForm && customValidatorOnForm.length) {
|
|
669
|
-
errorMessage = customValidatorOnForm[0].errorMessage;
|
|
670
|
-
validator = customValidatorOnForm[0];
|
|
671
|
-
break;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
if (this.hasCustomError(widgetInstance, validator)) {
|
|
676
|
-
widgetInstance.error = errorMessage;
|
|
677
|
-
widgetInstance.errorIcon = errorIcon;
|
|
678
|
-
widgetInstance.errorIconColor = errorIconColor;
|
|
679
|
-
return true;
|
|
680
|
-
}
|
|
681
|
-
if (widgetInstance.serverErrorMessage) {
|
|
682
|
-
widgetInstance.error = widgetInstance.serverErrorMessage;
|
|
683
|
-
widgetInstance.errorIcon = widgetInstance.serverErrorIcon;
|
|
684
|
-
widgetInstance.errorIconColor = widgetInstance.serverErrorColor;
|
|
685
|
-
return true;
|
|
686
|
-
}
|
|
687
|
-
widgetInstance.error = undefined;
|
|
688
|
-
}
|
|
689
|
-
return false;
|
|
690
|
-
}
|
|
691
|
-
getIndicatorItemClass(index) {
|
|
692
|
-
if (this.widgetInstance.type === SmartFormWidgetType.INDICATOR) {
|
|
693
|
-
if (this.widgetInstance.indicator.indicatorValue >= index) {
|
|
694
|
-
return `smart-indicator-${index}`;
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
return '';
|
|
698
|
-
}
|
|
699
|
-
getIndicatorStatusLabelColor() {
|
|
700
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
701
|
-
return '';
|
|
702
|
-
}
|
|
703
|
-
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
704
|
-
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
705
|
-
return `smart-indicator-label-${this.widgetInstance.indicator.indicatorLength - 1}`;
|
|
706
|
-
}
|
|
707
|
-
return `smart-indicator-label-${value}`;
|
|
708
|
-
}
|
|
709
|
-
getIndicatorStatusLabel() {
|
|
710
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.INDICATOR) {
|
|
711
|
-
return '';
|
|
712
|
-
}
|
|
713
|
-
let value = Math.floor(this.widgetInstance.indicator.indicatorValue);
|
|
714
|
-
if (value > this.widgetInstance.indicator.indicatorLength - 1) {
|
|
715
|
-
return this.widgetInstance.indicator.indicatorStatusLabels[this.widgetInstance.indicator.indicatorLength - 1];
|
|
716
|
-
}
|
|
717
|
-
return this.widgetInstance.indicator.indicatorStatusLabels[value];
|
|
718
|
-
}
|
|
719
|
-
upload(event) {
|
|
720
|
-
let type = this.widgetInstance.type;
|
|
721
|
-
if (type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
722
|
-
type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
723
|
-
type !== SmartFormWidgetType.RECORDING_UPLOADER) {
|
|
724
|
-
return;
|
|
725
|
-
}
|
|
726
|
-
let params = {
|
|
727
|
-
...event.uiAction.params,
|
|
728
|
-
_files: event.files,
|
|
729
|
-
param: '_files',
|
|
730
|
-
};
|
|
731
|
-
event.uiAction.params = params;
|
|
732
|
-
this.smartComponent.executeUiAction(event.uiAction);
|
|
733
|
-
}
|
|
734
|
-
executeUiAction(uiAction) {
|
|
735
|
-
let type = this.widgetInstance.type;
|
|
736
|
-
if (type !== SmartFormWidgetType.MULTI_FILE_UPLOADER && type !== SmartFormWidgetType.DIV) {
|
|
737
|
-
return;
|
|
738
|
-
}
|
|
739
|
-
this.smartComponent.executeUiAction(uiAction);
|
|
740
|
-
}
|
|
741
|
-
getButtonType(descriptor) {
|
|
742
|
-
switch (descriptor.type) {
|
|
743
|
-
case 'NORMAL':
|
|
744
|
-
return 'mat-mdc-button';
|
|
745
|
-
case 'FLAT':
|
|
746
|
-
return 'mat-mdc-flat-button';
|
|
747
|
-
case 'RAISED':
|
|
748
|
-
return 'mat-mdc-raised-button';
|
|
749
|
-
case 'STROKED':
|
|
750
|
-
return 'mat-mdc-stroked-button';
|
|
751
|
-
case 'ICON':
|
|
752
|
-
return 'mat-mdc-icon-button';
|
|
753
|
-
case 'MINI_FAB':
|
|
754
|
-
return 'mat-mdc-mini-fab';
|
|
755
|
-
case 'FAB':
|
|
756
|
-
return 'mat-mdc-fab';
|
|
757
|
-
default:
|
|
758
|
-
console.log(`Unhandled action button type case: ${descriptor.type}`);
|
|
759
|
-
return `mat-button`;
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
isOnlyIcon(descriptor) {
|
|
763
|
-
return (descriptor.type === 'ICON' || descriptor.type === 'MINI_FAB' || descriptor.type === 'FAB');
|
|
764
|
-
}
|
|
765
|
-
onButtonClicked(instance) {
|
|
766
|
-
if (instance.uiAction) {
|
|
767
|
-
instance.callback(instance.uiAction);
|
|
768
|
-
}
|
|
769
|
-
else {
|
|
770
|
-
instance.callback(instance.key);
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
_filter(value) {
|
|
774
|
-
let filterValue = value.target?.value;
|
|
775
|
-
this.toHighlight = filterValue;
|
|
776
|
-
if (!filterValue) {
|
|
777
|
-
filterValue = '';
|
|
778
|
-
this.toHighlight = filterValue;
|
|
779
|
-
}
|
|
780
|
-
filterValue = filterValue.toLowerCase();
|
|
781
|
-
if (this.widgetInstance.type === SmartFormWidgetType.TEXT_FIELD &&
|
|
782
|
-
this.widgetInstance.valueList) {
|
|
783
|
-
const result = filterValue
|
|
784
|
-
? this.widgetInstance.valueList.filter((option) => option.label.toLowerCase().includes(filterValue))
|
|
785
|
-
: this.widgetInstance.valueList;
|
|
786
|
-
if (result.length === 0 && this.widgetInstance.valueList.length !== 0) {
|
|
787
|
-
// there could be values after the filter operation but we found none:
|
|
788
|
-
this.widgetInstance.error = this.widgetInstance.filterErrorMessage;
|
|
789
|
-
}
|
|
790
|
-
else {
|
|
791
|
-
// we either found values, or there were no values to begin with:
|
|
792
|
-
this.widgetInstance.error = undefined;
|
|
793
|
-
}
|
|
794
|
-
return result;
|
|
795
|
-
}
|
|
796
|
-
return [];
|
|
797
|
-
}
|
|
798
|
-
dateFilter(d) {
|
|
799
|
-
return true;
|
|
800
|
-
}
|
|
801
|
-
getMatrixDisplayValue(question, key) {
|
|
802
|
-
this.widgetInstance.value[key].find((value) => {
|
|
803
|
-
if (value.code == question.code)
|
|
804
|
-
return question.displayValue;
|
|
805
|
-
else
|
|
806
|
-
return question.code;
|
|
807
|
-
});
|
|
808
|
-
}
|
|
809
|
-
handleYearMonthPicked(yearMonthValue) {
|
|
810
|
-
this.setDateFormControl(this.form.controls[this.widgetInstance.key], yearMonthValue, '00:00');
|
|
811
|
-
}
|
|
812
|
-
compareItems(o1, o2) {
|
|
813
|
-
function convert(obj) {
|
|
814
|
-
if (obj && typeof obj === 'string') {
|
|
815
|
-
return obj.replace(/\.v[0-9]+$/, '');
|
|
816
|
-
}
|
|
817
|
-
return obj;
|
|
818
|
-
}
|
|
819
|
-
// calling this.truncateUri didn't work
|
|
820
|
-
// TODO: use widget.selection.parameter for ignoreUriVersion / strictUriComparison;
|
|
821
|
-
let v1 = convert(o1);
|
|
822
|
-
let v2 = convert(o2);
|
|
823
|
-
return deepEqual(v1, v2);
|
|
824
|
-
}
|
|
825
|
-
truncateUri(uri) {
|
|
826
|
-
if (uri && typeof uri === 'string') {
|
|
827
|
-
return uri.replace(/\.v[0-9]+$/, '');
|
|
828
|
-
}
|
|
829
|
-
return uri;
|
|
830
|
-
}
|
|
831
|
-
removeMatrixRow(question) {
|
|
832
|
-
console.log(question);
|
|
833
|
-
this.widgetInstance.button?.callback(this.widgetInstance, question);
|
|
834
|
-
}
|
|
835
|
-
isToolbarPresent() {
|
|
836
|
-
if (this.widgetInstance.type == SmartFormWidgetType.TEXT_FIELD ||
|
|
837
|
-
this.widgetInstance.type == SmartFormWidgetType.SELECT ||
|
|
838
|
-
this.widgetInstance.type == SmartFormWidgetType.TEXT_FIELD_LOOKUP ||
|
|
839
|
-
this.widgetInstance.type == SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
840
|
-
this.widgetInstance.type == SmartFormWidgetType.FILE_UPLOADER ||
|
|
841
|
-
this.widgetInstance.type == SmartFormWidgetType.MULTI_FILE_UPLOADER) {
|
|
842
|
-
return this.widgetInstance.toolbarId !== undefined && this.widgetInstance.toolbarId !== null;
|
|
843
|
-
}
|
|
844
|
-
return false;
|
|
845
|
-
}
|
|
846
|
-
getChipsValue(value) {
|
|
847
|
-
if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
|
|
848
|
-
if ('name' in value) {
|
|
849
|
-
return value['name'];
|
|
850
|
-
}
|
|
851
|
-
if ('displayValue' in value) {
|
|
852
|
-
return value['displayValue'];
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
return value;
|
|
856
|
-
}
|
|
857
|
-
getOptions(items) {
|
|
858
|
-
let values = [];
|
|
859
|
-
items.map((item) => {
|
|
860
|
-
if (item.type === SmartFormWidgetType.ITEM_GROUP) {
|
|
861
|
-
item.valueList.map((value) => {
|
|
862
|
-
values.push(value);
|
|
863
|
-
});
|
|
864
|
-
}
|
|
865
|
-
else if (item.type === SmartFormWidgetType.ITEM) {
|
|
866
|
-
values.push(item);
|
|
867
|
-
}
|
|
868
|
-
});
|
|
869
|
-
return values;
|
|
870
|
-
}
|
|
871
|
-
get clearButtonDescriptor() {
|
|
872
|
-
return {
|
|
873
|
-
title: '',
|
|
874
|
-
color: 'primary',
|
|
875
|
-
type: UiActionButtonType.RAISED,
|
|
876
|
-
icon: this.compLib === ComponentLibrary.PRIMENG ? 'times' : 'close',
|
|
877
|
-
iconPosition: IconPosition.PRE,
|
|
878
|
-
};
|
|
879
|
-
}
|
|
880
|
-
clearField(key) {
|
|
881
|
-
this.form.controls[key].setValue('');
|
|
882
|
-
this.onBlur?.next(this.widgetInstance);
|
|
883
|
-
}
|
|
884
|
-
onTextareaChange(value) {
|
|
885
|
-
const ta = this.sb4Textarea?.nativeElement;
|
|
886
|
-
if (!ta)
|
|
887
|
-
return;
|
|
888
|
-
if (document.activeElement === ta) {
|
|
889
|
-
return;
|
|
890
|
-
}
|
|
891
|
-
requestAnimationFrame(() => {
|
|
892
|
-
ta.style.height = 'auto';
|
|
893
|
-
ta.style.height = `${ta.scrollHeight}px`;
|
|
894
|
-
});
|
|
895
|
-
}
|
|
896
|
-
handleBlurEvent(eventData) {
|
|
897
|
-
this.onBlur?.next(eventData);
|
|
898
|
-
this.blurSophisticatedValueChange.next({
|
|
899
|
-
key: this.widgetInstance.key,
|
|
900
|
-
kind: this.getSophisticatedEventKind(),
|
|
901
|
-
value: this.form.value[this.widgetInstance.key],
|
|
902
|
-
});
|
|
903
|
-
}
|
|
904
|
-
onDropDownShow() {
|
|
905
|
-
this.dorpdownOpening = true;
|
|
906
|
-
}
|
|
907
|
-
onDropDownInput() {
|
|
908
|
-
if (this.dorpdownOpening == true) {
|
|
909
|
-
this.dorpdownOpening = false;
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
safeDropDownBlur(event) {
|
|
913
|
-
// We do not use the first blur event after the calendar picker opens,
|
|
914
|
-
// as it "eats" the first click
|
|
915
|
-
if (this.dorpdownOpening) {
|
|
916
|
-
this.dorpdownOpening = false;
|
|
917
|
-
return;
|
|
918
|
-
}
|
|
919
|
-
this.handleBlurEvent(event);
|
|
920
|
-
}
|
|
921
|
-
onCalendarShow() {
|
|
922
|
-
this.calendarOpening = true;
|
|
923
|
-
}
|
|
924
|
-
onCalendarInput() {
|
|
925
|
-
if (this.calendarOpening == true) {
|
|
926
|
-
this.calendarOpening = false;
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
safeCalendarBlur(event) {
|
|
930
|
-
// We do not use the first blur event after the calendar picker opens,
|
|
931
|
-
// as it "eats" the first click
|
|
932
|
-
if (this.calendarOpening) {
|
|
933
|
-
this.calendarOpening = false;
|
|
934
|
-
return;
|
|
935
|
-
}
|
|
936
|
-
this.handleBlurEvent(event);
|
|
937
|
-
}
|
|
938
|
-
convertToLocalDateTime(value) {
|
|
939
|
-
if (!value)
|
|
940
|
-
return null;
|
|
941
|
-
let parsed = new Date(value);
|
|
942
|
-
if (isNaN(parsed.getTime())) {
|
|
943
|
-
console.error('Invalid Date:', value);
|
|
944
|
-
return null;
|
|
945
|
-
}
|
|
946
|
-
return new Date(parsed.getFullYear(), parsed.getMonth(), parsed.getDate(), parsed.getHours(), parsed.getMinutes(), parsed.getSeconds());
|
|
947
|
-
}
|
|
948
|
-
getControlMessages(controlName) {
|
|
949
|
-
const control = this.form.controls[controlName];
|
|
950
|
-
const errors = this.form.controls[controlName]?.errors ?? {};
|
|
951
|
-
this.errorMessages = Object.keys(errors)
|
|
952
|
-
.filter((key) => typeof errors[key] === 'string')
|
|
953
|
-
.map((key) => ({
|
|
954
|
-
severity: 'error',
|
|
955
|
-
detail: errors[key],
|
|
956
|
-
}));
|
|
957
|
-
if (this.errorMessages.length === 0) {
|
|
958
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.CONTAINER &&
|
|
959
|
-
this.widgetInstance.type !== SmartFormWidgetType.LABEL &&
|
|
960
|
-
this.widgetInstance.type !== SmartFormWidgetType.INDICATOR &&
|
|
961
|
-
this.widgetInstance.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
962
|
-
this.widgetInstance.type !== SmartFormWidgetType.MULTI_FILE_UPLOADER &&
|
|
963
|
-
this.widgetInstance.type !== SmartFormWidgetType.RECORDING_UPLOADER &&
|
|
964
|
-
this.widgetInstance.type !== SmartFormWidgetType.IMAGE &&
|
|
965
|
-
this.widgetInstance.type !== SmartFormWidgetType.SVG &&
|
|
966
|
-
this.widgetInstance.type !== SmartFormWidgetType.DIV &&
|
|
967
|
-
this.widgetInstance.type !== SmartFormWidgetType.DIVIDER &&
|
|
968
|
-
this.widgetInstance.type !== SmartFormWidgetType.BUTTON &&
|
|
969
|
-
this.widgetInstance.type !== SmartFormWidgetType.COMPONENT &&
|
|
970
|
-
this.widgetInstance.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
971
|
-
if (Object.keys(errors).length > 0 && this.widgetInstance.serverErrorMessage != null) {
|
|
972
|
-
this.errorMessages.push({
|
|
973
|
-
severity: 'error',
|
|
974
|
-
detail: this.widgetInstance.serverErrorMessage,
|
|
975
|
-
});
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
isHtml(text) {
|
|
981
|
-
return /<[a-z][\s\S]*>/i.test(text);
|
|
982
|
-
}
|
|
983
|
-
onDivClick() {
|
|
984
|
-
if (this.widgetInstance.type !== SmartFormWidgetType.DIV)
|
|
985
|
-
return;
|
|
986
|
-
const onClick = this.widgetInstance.divProperties?.onClick;
|
|
987
|
-
if (!onClick) {
|
|
988
|
-
return;
|
|
989
|
-
}
|
|
990
|
-
else {
|
|
991
|
-
this.executeUiAction(this.widgetInstance.divProperties.onClick);
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
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 }); }
|
|
995
|
-
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) {\r\n <div class=\"container prime\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer textFieldContainer\">\r\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\r\n <input\r\n *ngIf=\"!widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n pInputText\r\n formControlName=\"text\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <p-inputMask\r\n *ngIf=\"widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [mask]=\"widgetInstance.mask\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div class=\"textFieldButtons\">\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n >\r\n </smart-ui-action-toolbar>\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-inputNumber\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n inputId=\"minmax\"\r\n mode=\"decimal\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n [minFractionDigits]=\"0\"\r\n [maxFractionDigits]=\"5\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"widgetContent\">\r\n <p-editor\r\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [disabled]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\r\n (onTextChange)=\"handleBlurEvent($event)\"\r\n />\r\n </div>\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n Currently not implemented\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"true\"\r\n [showClear]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n hourFormat=\"24\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n >\r\n </p-calendar>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n />\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-multiSelect\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onPanelShow)=\"onDropDownShow()\"\r\n (onBlur)=\"safeDropDownBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onPanelHide)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\r\n <p-floatLabel>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n pInputTextarea\r\n [autoResize]=\"true\"\r\n cols=\"30\"\r\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\" \"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (ngModelChange)=\"onTextareaChange($event)\"\r\n ></textarea>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n [for]=\"widgetInstance.key\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-chips\r\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\r\n [max]=\"0\"\r\n [maxLength]=\"0\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n >\r\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\r\n </p-chips>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\r\n class=\"widgetContainer imageContainer\"\r\n >\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties!.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\r\n class=\"widgetContainer toggle-col\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </label>\r\n <p-inputSwitch\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\r\n (onChange)=\"onValueChange?.next($event)\"\r\n (onChange)=\"handleBlurEvent($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [binary]=\"true\"\r\n [label]=\"widgetInstance.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n [binary]=\"true\"\r\n [label]=\"checkbox.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n >\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div class=\"container material\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n [mask]=\"widgetInstance.mask\"\r\n />\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n <div class=\"radio-icon\">\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties?.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n >\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key + '.data.' + question.code + '.' + option.code\r\n \"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n}\r\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,.time{width:100%}.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}.clickable{cursor:pointer}\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: "directive", type: i37.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "component", type: i38.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: i39.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { kind: "directive", type: i40.ComparableDropdownDirective, selector: "p-dropdown", inputs: ["compareWith"] }, { kind: "directive", type: i41.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i42.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { kind: "component", type: i43.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }, { kind: "component", type: i44.SmartFileEditorComponent, selector: "smart-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i45.SmartMultiFileEditorComponent, selector: "smart-multi-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent", "fileEvent"] }, { kind: "component", type: i46.SmartVoiceRecorderComponent, selector: "smart-voice-recorder", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i47.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i48.HighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
996
|
-
}
|
|
997
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartformwidgetComponent, decorators: [{
|
|
998
|
-
type: Component,
|
|
999
|
-
args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div class=\"container prime\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer textFieldContainer\">\r\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\r\n <input\r\n *ngIf=\"!widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n pInputText\r\n formControlName=\"text\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <p-inputMask\r\n *ngIf=\"widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [mask]=\"widgetInstance.mask\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div class=\"textFieldButtons\">\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n >\r\n </smart-ui-action-toolbar>\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-inputNumber\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n inputId=\"minmax\"\r\n mode=\"decimal\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n [minFractionDigits]=\"0\"\r\n [maxFractionDigits]=\"5\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"widgetContent\">\r\n <p-editor\r\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [disabled]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\r\n (onTextChange)=\"handleBlurEvent($event)\"\r\n />\r\n </div>\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n Currently not implemented\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"true\"\r\n [showClear]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n hourFormat=\"24\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n >\r\n </p-calendar>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n />\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-multiSelect\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onPanelShow)=\"onDropDownShow()\"\r\n (onBlur)=\"safeDropDownBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onPanelHide)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\r\n <p-floatLabel>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n pInputTextarea\r\n [autoResize]=\"true\"\r\n cols=\"30\"\r\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\" \"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (ngModelChange)=\"onTextareaChange($event)\"\r\n ></textarea>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n [for]=\"widgetInstance.key\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-chips\r\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\r\n [max]=\"0\"\r\n [maxLength]=\"0\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n >\r\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\r\n </p-chips>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\r\n class=\"widgetContainer imageContainer\"\r\n >\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties!.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\r\n class=\"widgetContainer toggle-col\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </label>\r\n <p-inputSwitch\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\r\n (onChange)=\"onValueChange?.next($event)\"\r\n (onChange)=\"handleBlurEvent($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [binary]=\"true\"\r\n [label]=\"widgetInstance.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n [binary]=\"true\"\r\n [label]=\"checkbox.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n >\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div class=\"container material\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n [mask]=\"widgetInstance.mask\"\r\n />\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n <div class=\"radio-icon\">\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MONTH_PICKER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <div\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.RECORDING_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-voice-recorder\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n </div>\r\n }\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties?.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [class.clickable]=\"!!widgetInstance.divProperties?.onClick\"\r\n [ngStyle]=\"getStyle()\"\r\n (click)=\"onDivClick()\"\r\n >\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key + '.data.' + question.code + '.' + option.code\r\n \"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n}\r\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,.time{width:100%}.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}.clickable{cursor:pointer}\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"] }]
|
|
1000
|
-
}], ctorParameters: () => [{ type: i1.SmartFormService }, { type: i2.ComponentFactoryService }, { type: i3.DomSanitizer }, { type: i49.ComponentLibrary, decorators: [{
|
|
1001
|
-
type: Inject,
|
|
1002
|
-
args: [COMPONENT_LIBRARY]
|
|
1003
|
-
}] }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
|
|
1004
|
-
type: Input
|
|
1005
|
-
}], widgetInstance: [{
|
|
1006
|
-
type: Input
|
|
1007
|
-
}], onBlur: [{
|
|
1008
|
-
type: Input
|
|
1009
|
-
}], onValueChange: [{
|
|
1010
|
-
type: Input
|
|
1011
|
-
}], labelColor: [{
|
|
1012
|
-
type: Input
|
|
1013
|
-
}], sophisticatedValueChange: [{
|
|
1014
|
-
type: Input
|
|
1015
|
-
}], blurSophisticatedValueChange: [{
|
|
1016
|
-
type: Input
|
|
1017
|
-
}], valueCleared: [{
|
|
1018
|
-
type: Output
|
|
1019
|
-
}], chipInputChild: [{
|
|
1020
|
-
type: ViewChild,
|
|
1021
|
-
args: ['chipInput']
|
|
1022
|
-
}], customComponentVcRef: [{
|
|
1023
|
-
type: ViewChild,
|
|
1024
|
-
args: ['customComponent', { read: ViewContainerRef }]
|
|
1025
|
-
}], quill: [{
|
|
1026
|
-
type: ViewChild,
|
|
1027
|
-
args: ['quillEditor']
|
|
1028
|
-
}], toolbar: [{
|
|
1029
|
-
type: ViewChild,
|
|
1030
|
-
args: ['toolbar']
|
|
1031
|
-
}], childrenWidgetsQL: [{
|
|
1032
|
-
type: ViewChildren,
|
|
1033
|
-
args: [SmartformwidgetComponent]
|
|
1034
|
-
}], sb4Textarea: [{
|
|
1035
|
-
type: ViewChild,
|
|
1036
|
-
args: ['sb4Textarea']
|
|
1037
|
-
}], fileUploader: [{
|
|
1038
|
-
type: ViewChild,
|
|
1039
|
-
args: [SmartFileEditorComponent]
|
|
1040
|
-
}], multiFileUploader: [{
|
|
1041
|
-
type: ViewChild,
|
|
1042
|
-
args: [SmartMultiFileEditorComponent]
|
|
1043
|
-
}], dateInputChild: [{
|
|
1044
|
-
type: ViewChild,
|
|
1045
|
-
args: ['dateInput']
|
|
1046
|
-
}], timeInputChild: [{
|
|
1047
|
-
type: ViewChild,
|
|
1048
|
-
args: ['timeInput']
|
|
1049
|
-
}] } });
|
|
1050
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSS9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBYyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUYsT0FBTyxFQUNMLFlBQVksRUFFWixrQkFBa0IsR0FHbkIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3RG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bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnZmFzdC1lcXVhbHMnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IENvbnRlbnRDaGFuZ2UsIFF1aWxsRWRpdG9yQ29tcG9uZW50LCBRdWlsbE1vZHVsZXMgfSBmcm9tICduZ3gtcXVpbGwnO1xyXG5pbXBvcnQgeyBFZGl0b3JUZXh0Q2hhbmdlRXZlbnQgfSBmcm9tICdwcmltZW5nL2VkaXRvcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50LWZhY3Rvcnktc2VydmljZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSWNvblBvc2l0aW9uLFxyXG4gIFVpQWN0aW9uLFxyXG4gIFVpQWN0aW9uQnV0dG9uVHlwZSxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXHJcbiAgVWlBY3Rpb25VcGxvYWREZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQgeyBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL3VpLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ09NUE9ORU5UX0xJQlJBUlksXHJcbiAgQ29tcG9uZW50TGlicmFyeSxcclxufSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvdXRpbGl0eS9jb21wb25lbnRMaWJyYXJ5JztcclxuaW1wb3J0IHsgU21hcnRTdHlsZVV0aWxpdHkgfSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvdXRpbGl0eS9zbWFydC1zdHlsZS11dGlsaXR5JztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm1XaWRnZXREaXJlY3Rpb24sXHJcbiAgU21hcnRGb3JtV2lkZ2V0VHlwZSxcclxuICBTbWFydFdpZGdldEhpbnRQb3NpdGlvbkVudW0sXHJcbn0gZnJvbSAnLi4vLi4vYXBpL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IFNtYXJ0Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zbWFydGZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgU21hcnRCdXR0b24sXHJcbiAgU21hcnRGb3JtV2lkZ2V0LFxyXG4gIFNtYXJ0SXRlbSxcclxuICBTbWFydEl0ZW1zLFxyXG4gIFNtYXJ0TWF0cml4LFxyXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24sXHJcbiAgU21hcnRWYWxpZGF0b3IsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlLFxyXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5tb2RlbCc7XHJcbmltcG9ydCB7IFNtYXJ0RmlsZUVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc21hcnQtZmlsZS1lZGl0b3Ivc21hcnQtZmlsZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU21hcnRNdWx0aUZpbGVFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NtYXJ0LW11bHRpLWZpbGUtZWRpdG9yL3NtYXJ0LW11bHRpLWZpbGUtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFNtYXJ0U3ViamVjdCB9IGZyb20gJy4uLy4uLy4uL3NtYXJ0LXN1YmplY3QvcHJvamVjdHMnO1xyXG5leHBvcnQgY2xhc3MgU21hcnRXaWRnZXRTZXR0aW5ncyB7XHJcbiAgcHVibGljIHN0YXRpYyB1c2VVdGMgPSBmYWxzZTtcclxufVxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NtYXJ0Zm9ybXdpZGdldCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NtYXJ0Zm9ybXdpZGdldC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5jc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgaGlkZVBhc3N3b3JkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgc21hcnRDb21wb25lbnQ6IGFueTtcclxuXHJcbiAgZXJyb3JNZXNzYWdlczogTWVzc2FnZVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIHdpZGdldEluc3RhbmNlITogU21hcnRGb3JtV2lkZ2V0PGFueT47XHJcbiAgQElucHV0KCkgb25CbHVyPzogU3ViamVjdDxhbnk+O1xyXG4gIEBJbnB1dCgpIG9uVmFsdWVDaGFuZ2U/OiBTdWJqZWN0PGFueT47XHJcbiAgQElucHV0KCkgbGFiZWxDb2xvcj86IHN0cmluZztcclxuICBASW5wdXQoKSBzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UhOiBTdWJqZWN0PFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZT47XHJcbiAgQElucHV0KCkgYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2xlYXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgZXZlbnQ/OiBhbnk7XHJcbiAgICBrZXk6IGFueTtcclxuICB9PigpO1xyXG5cclxuICBzbWFydEZvcm1XaWRnZXRUeXBlID0gU21hcnRGb3JtV2lkZ2V0VHlwZTtcclxuXHJcbiAgY2Fwc09uOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NoaXBJbnB1dCcpIGNoaXBJbnB1dENoaWxkPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgZmlsdGVyZWRWYWx1ZUxpc3Q/OiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPjtcclxuXHJcbiAgaGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlcnJvcktleT86IHN0cmluZztcclxuXHJcbiAgaW5kaWNhdG9ySXRlbXM/OiBhbnlbXTtcclxuICBkZWZhdWx0RGF0ZT86IERhdGU7XHJcbiAgLy8gY3VzdG9tQ29tcG9uZW50XHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tQ29tcG9uZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgY3VzdG9tQ29tcG9uZW50VmNSZWY/OiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIGN1c3RvbUNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xyXG5cclxuICBmaWx0ZXJlZE9wdGlvbnM/OiBPYnNlcnZhYmxlPFNtYXJ0SXRlbTxhbnk+W10+O1xyXG4gIHRvSGlnaGxpZ2h0OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQFZpZXdDaGlsZCgncXVpbGxFZGl0b3InKSBxdWlsbD86IFF1aWxsRWRpdG9yQ29tcG9uZW50O1xyXG5cclxuICBpc0VudGVyUHJlc3NlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0RhdGVQaWNrZXJSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBTbWFydFdpZGdldEhpbnRQb3NpdGlvbiA9IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bTtcclxuXHJcbiAgLy8gdG9vbGJhclxyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXInKSB0b29sYmFyPzogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKFNtYXJ0Zm9ybXdpZGdldENvbXBvbmVudClcclxuICBjaGlsZHJlbldpZGdldHNRTD86IFF1ZXJ5TGlzdDxTbWFydGZvcm13aWRnZXRDb21wb25lbnQ+O1xyXG4gIGNvbXBvbmVudExpYnJhcnkgPSBDb21wb25lbnRMaWJyYXJ5O1xyXG4gIGVtcHR5UXVpbGxUb29sYmFyOiBRdWlsbE1vZHVsZXMgPSB7XHJcbiAgICB0b29sYmFyOiBmYWxzZSxcclxuICB9O1xyXG5cclxuICBAVmlld0NoaWxkKCdzYjRUZXh0YXJlYScpIHNiNFRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKFNtYXJ0RmlsZUVkaXRvckNvbXBvbmVudCkgZmlsZVVwbG9hZGVyITogU21hcnRGaWxlRWRpdG9yQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoU21hcnRNdWx0aUZpbGVFZGl0b3JDb21wb25lbnQpIG11bHRpRmlsZVVwbG9hZGVyPzogU21hcnRNdWx0aUZpbGVFZGl0b3JDb21wb25lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEZvcm1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIEBJbmplY3QoQ09NUE9ORU5UX0xJQlJBUlkpIHB1YmxpYyBjb21wTGliOiBDb21wb25lbnRMaWJyYXJ5LFxyXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcclxuICAgICkge1xyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdCA9IHRoaXMuc2VydmljZS5maWx0ZXJXaWRnZXRzQnlWaXNpYmlsaXR5KFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMub25CbHVyPy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbE1lc3NhZ2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5ISk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gaGFuZGxlIGluaXRpYWwgZXJyb3IgbWVzc2FnZSBmcm9tIHNlcnZlclxyXG4gICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICAvLyB0aGlzLmdldENvbnRyb2xNZXNzYWdlcyh0aGlzLndpZGdldEluc3RhbmNlLmtleSEpO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yPy5pbmRpY2F0b3JMZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmluZGljYXRvckl0ZW1zID0gbmV3IEFycmF5PGFueT4odGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yTGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRlUHJvcGVydHldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlID1cclxuICAgICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuY2hhbmdlSW5kaWNhdG9yU3RhdHVzKHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSKSB7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnNlbGVjdGlvblxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2UgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLm9uVmFsdWVDaGFuZ2UhLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUikge1xyXG4gICAgICBsZXQgdmlkZW9JZCA9IHRoaXMucGFyc2VZb3V0dWJlVXJsKHRoaXMud2lkZ2V0SW5zdGFuY2UubGluayEpO1xyXG4gICAgICBpZiAodmlkZW9JZCkgdGhpcy53aWRnZXRJbnN0YW5jZS52aWRlb0lkID0gdmlkZW9JZDtcclxuICAgICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcblxyXG4gICAgICB0YWcuc3JjID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhZyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZvcm1Db250cm9sczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZpbHRlcihcclxuICAgICAgKGtleTogc3RyaW5nKSA9PlxyXG4gICAgICAgIGtleSA9PT0gdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkgfHwga2V5LnN0YXJ0c1dpdGgoYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LmApXHJcbiAgICApO1xyXG5cclxuICAgIGZvcm1Db250cm9scy5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1trZXldLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyAmJlxyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICBraW5kOiB0aGlzLmdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKTogJ3NlbGVjdGlvbicgfCAnYmFzaWMnIHtcclxuICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEUgfHxcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTlxyXG4gICAgICA/ICdzZWxlY3Rpb24nXHJcbiAgICAgIDogJ2Jhc2ljJztcclxuICB9XHJcblxyXG4gIHBhcnNlWW91dHViZVVybCh1cmw6IHN0cmluZykge1xyXG4gICAgdXJsLnJlcGxhY2UoJy9zaG9ydHMvJywgJy93YXRjaD92PScpO1xyXG5cclxuICAgIHZhciByZWdFeHAgPSAvXi4qKCh5b3V0dS5iZVxcLyl8KHZcXC8pfChcXC91XFwvXFx3XFwvKXwoZW1iZWRcXC8pfCh3YXRjaFxcPykpXFw/P3Y/PT8oW14jJj9dKikuKi87XHJcbiAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2gocmVnRXhwKTtcclxuXHJcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbN10ubGVuZ3RoID09IDExID8gbWF0Y2hbN10gOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIF9oYXNKdXN0Q2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBnZXQgaGFzSnVzdENoYW5nZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzSnVzdENoYW5nZWQ7XHJcbiAgfVxyXG4gIHNldCBoYXNKdXN0Q2hhbmdlZChoYXNKdXN0Q2hhbmdlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faGFzSnVzdENoYW5nZWQgPSBoYXNKdXN0Q2hhbmdlZDtcclxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDI1MCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLl9oYXNKdXN0Q2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYXNDcmVhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RhdGVJbnB1dCcpIGRhdGVJbnB1dENoaWxkPzogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0aW1lSW5wdXQnKSB0aW1lSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY7XHJcblxyXG4gIG9uRGF0ZVBpY2tlckJsdXIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICB0aGlzLmhhbmRsZURhdGVDaGFuZ2VkKHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9uVGltZVBpY2tlckJsdXIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICB0aGlzLmhhbmRsZVRpbWVDaGFuZ2VkKHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UKSB7XHJcbiAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50UmVmID0gdGhpcy5jZlNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KFxyXG4gICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50VmNSZWYhLFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuY29tcG9uZW50LFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5wdXRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5NQVRFUklBTCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIgfHxcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgPSAhIXRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8uc29tZShcclxuICAgICAgICAgIChzbWFydFZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHNtYXJ0VmFsaWRhdG9yLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgdmFsaWRhdG9ycyA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8ubWFwKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdG9yO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmhhc0NyZWF0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChfbW9tZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHRpbWVWYWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVGltZUNoYW5nZWQodGltZVZhbHVlKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0aW1lVmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGltZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IG5ldyBEYXRlKHRpbWVWYWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0JPWCAmJlxyXG4gICAgICB0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudGV4dEJveFByb3BlcnRpZXM/Lm1heFJvd3MgJiZcclxuICAgICAgdGhpcy5zYjRUZXh0YXJlYVxyXG4gICAgKSB7XHJcbiAgICAgIHZhciB0ZXh0YXJlYSA9IHRoaXMuc2I0VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcclxuICAgICAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0ZXh0YXJlYSk7XHJcblxyXG4gICAgICB2YXIgbWF4TGluZXMgPSB0aGlzLndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzLm1heFJvd3M7XHJcbiAgICAgIHZhciBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zYjQtdGV4dGFyZWEtbGluZS1oZWlnaHQnKSkgfHwgMjA7XHJcblxyXG4gICAgICB2YXIgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcclxuICAgICAgdmFyIHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDA7XHJcblxyXG4gICAgICB2YXIgdmVydGljYWxFeHRyYXMgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcclxuXHJcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgdGV4dGFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gYCR7bGluZUhlaWdodCAqIG1heExpbmVzICsgdmVydGljYWxFeHRyYXN9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJiB0aGlzLmZpbGVVcGxvYWRlcikge1xyXG4gICAgICB0aGlzLnRvb2xiYXIgPSB0aGlzLmZpbGVVcGxvYWRlci50b29sYmFyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgdGhpcy5tdWx0aUZpbGVVcGxvYWRlclxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudG9vbGJhciA9IHRoaXMubXVsdGlGaWxlVXBsb2FkZXIudG9vbGJhcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGVDaGFuZ2VkKF9tb21lbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNEYXRlRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZGF0ZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBpc1RpbWVGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdO1xyXG4gICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF07XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcclxuICAgICAgIV9tb21lbnRcclxuICAgICkge1xyXG4gICAgICB0aW1lRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgdGltZUZvcm1Db250cm9sLnNldFZhbHVlKCcnKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXHJcbiAgICAgICF0aW1lRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXHJcbiAgICAgIF9tb21lbnRcclxuICAgICkge1xyXG4gICAgICB0aW1lRm9ybUNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgIGlmICh0aW1lRm9ybUNvbnRyb2wudmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUobm93LmdldEhvdXJzKCkgKyAnOicgKyBub3cuZ2V0TWludXRlcygpKTtcclxuICAgICAgICB0aW1lRm9ybUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIV9tb21lbnQgfHwgaXNEYXRlRm9jdXNlZCB8fCBpc1RpbWVGb2N1c2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aW1lVmFsdWUgPSB0aW1lRm9ybUNvbnRyb2wudmFsdWUgfHwgJzAwOjAwJztcclxuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2wsIF9tb21lbnQsIHRpbWVWYWx1ZSk7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUgPSBkYXRlRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUaW1lQ2hhbmdlZCh0aW1lVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdO1xyXG4gICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXHJcbiAgICAgICF0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKGRhdGVGb3JtQ29udHJvbC52YWx1ZSA/PyAnJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxyXG4gICAgICAhZGF0ZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICB0aW1lVmFsdWVcclxuICAgICkge1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAoaXNGb2N1c2VkKSB7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRpbWVWYWx1ZSkge1xyXG4gICAgICBpZiAodGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xyXG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgX21vbWVudCA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcclxuXHJcbiAgICBpZiAoIV9tb21lbnQpIHtcclxuICAgICAgX21vbWVudCA9IG1vbWVudCgpOyAvLyBvciBtb21lbnQoKS5zdGFydE9mKCdkYXknKSBpZiB5b3UgcHJlZmVyXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oYXNKdXN0Q2hhbmdlZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIpIHtcclxuICAgICAgdGhpcy5zZXREYXRlRm9ybUNvbnRyb2woZGF0ZUZvcm1Db250cm9sLCBfbW9tZW50LCB0aW1lVmFsdWUpO1xyXG5cclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREYXRlRm9ybUNvbnRyb2woZGF0ZUZvcm1Db250cm9sOiBhbnksIF9tb21lbnQ6IGFueSwgdGltZVZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmIChfbW9tZW50KSB7XHJcbiAgICAgIGxldCBob3VyID0gdGltZVZhbHVlLnN1YnN0cmluZygwLCAyKTtcclxuICAgICAgbGV0IG1pbiA9IHRpbWVWYWx1ZS5zdWJzdHJpbmcoMywgNSk7XHJcblxyXG4gICAgICBjb25zdCBuZXdNb21lbnQgPSBtb21lbnQoX21vbWVudCkuc2V0KHtcclxuICAgICAgICBob3VyOiAraG91cixcclxuICAgICAgICBtaW51dGU6ICttaW4sXHJcbiAgICAgICAgc2Vjb25kOiAwLFxyXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5zZXRWYWx1ZShuZXdNb21lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VGltZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVsxXS5zdWJzdHJpbmcoMCwgNSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBvbktleWRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRW50ZXJQcmVzc2VkID0gdHJ1ZTtcclxuXHJcbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5pc0VudGVyUHJlc3NlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRW50ZXJQcmVzc2VkKSB7XHJcbiAgICAgIHRoaXMuaGlkZVBhc3N3b3JkID0gIXRoaXMuaGlkZVBhc3N3b3JkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TmdDbGFzcygpOiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdDbGFzc2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSB7XHJcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSA9IHtcclxuICAgICAgICBjbGFzc2VzVG9BZGQ6IFtdLFxyXG4gICAgICAgIGNsYXNzZXNUb1JlbW92ZTogW10sXHJcbiAgICAgICAgc3R5bGU6IHt9LFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKCd3aWR0aCcgaW4gdGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZS5zdHlsZSkgJiYgJ21pbldpZHRoJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUuc3R5bGVbJ3dpZHRoJ10gPSBgJHt0aGlzLndpZGdldEluc3RhbmNlLm1pbldpZHRofXB4YDtcclxuICAgIH1cclxuICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ1N0eWxlcyh0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKTtcclxuICB9XHJcblxyXG4gIGdldExhYmVsTmdDbGFzcygpOiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoJ2xhYmVsU3R5bGUnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nQ2xhc3Nlcyh0aGlzLndpZGdldEluc3RhbmNlLmxhYmVsU3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGdldExhYmVsU3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSB7XHJcbiAgICBpZiAoJ2xhYmVsU3R5bGUnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcclxuICAgICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nU3R5bGVzKHRoaXMud2lkZ2V0SW5zdGFuY2UubGFiZWxTdHlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIGhhbmRsZXIgZm9yIHRoZSBwb3RlbnRpYWxseSBwcmVzZW50IFF1aWxsIGVkaXRvciwgZW5mb3JjaW5nIG1heCBsZW5ndGggbGltaXRzIGlmXHJcbiAgICogbmVjZXNzYXJ5LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNoYW5nZSB0aGUge0BsaW5rIENvbnRlbnRDaGFuZ2V9IHRoZSBRdWlsbCBlZGl0b3IgZW1pdHNcclxuICAgKiBAcmV0dXJucyB7QGNvZGUgdm9pZH1cclxuICAgKi9cclxuICBvblJpY2hUZXh0RWRpdG9yQ29udGVudENoYW5nZWQoY2hhbmdlOiBDb250ZW50Q2hhbmdlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2UgYXJlIHBlcm1pdHRlZCBhIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSByZXF1ZXN0ZWQ6IFRoZSBxdWlsbCBlZGl0b3IgY29udGFpbnMgYW5cclxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxyXG4gICAgY29uc3QgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCArIDE7XHJcbiAgICBpZiAoY2hhbmdlLnRleHQubGVuZ3RoIDw9IG1heExlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zZXJ0T3BDb3VudDogbnVtYmVyID0gY2hhbmdlLmRlbHRhLm9wcz8uZmlsdGVyKChpdCkgPT4gISFpdC5pbnNlcnQpLmxlbmd0aCA/PyAwO1xyXG4gICAgaWYgKGluc2VydE9wQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMucXVpbGw/LnF1aWxsRWRpdG9yLnNldENvbnRlbnRzKGNoYW5nZS5vbGREZWx0YSwgJ3NpbGVudCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QcmltZVJpY2hUZXh0RWRpdG9yQ29udGVudENoYW5nZWQoY2hhbmdlOiBFZGl0b3JUZXh0Q2hhbmdlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXHJcbiAgICAvLyB1bnJlbW92YWJsZSBuZXctbGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBpdHMgY29udGVudC5cclxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xyXG4gICAgaWYgKGNoYW5nZS50ZXh0VmFsdWUubGVuZ3RoIDw9IG1heExlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHVzZXItc3BhY2UgY2hhcmFjdGVycyBhbGxvd2VkIHRvIGJlIGVudGVyZWQgaW50byB0aGUgUXVpbGxcclxuICAgKiBlZGl0b3IuXHJcbiAgICpcclxuICAgKiA8cD5cclxuICAgKiBUaGUgcmVhbCBsZW5ndGggb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgbWF5IGJlIG11Y2ggbG9uZ2VyIC0gYXMgaXQgaXMgcGVyc2lzdGVkIGFzIGFuIEhUTUxcclxuICAgKiBkb2N1bWVudCBmcmFnbWVudCBiZWhpbmQgdGhlIHNjZW5lcy4gVGhpcyBtZXRob2QgaXMgY29uY2VybmVkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGVcclxuICAgKiB1c2VyIHBlcmNlaXZlcy5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHRoZSB7QGxpbmsgbnVtYmVyfSBvZiByZW1haW5pbmcgcGVybWl0dGVkIGNoYXJhY3RlcnMgdGhlIHVzZXIgbWF5IGlucHV0LCBvciB7QGNvZGUgLTF9XHJcbiAgICogICAgICAgICAgaWYgdGhlIGxlZXdheSBpcyBub3QgaW50ZXJwcmV0ZWQgaW4gdGhlIGNvbXBvbmVudCdzIGN1cnJlbnQgc3RhdGVcclxuICAgKi9cclxuICBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHdlIGFyZSBwZXJtaXR0ZWQgYSBudW1iZXIgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkOiBUaGUgcXVpbGwgZWRpdG9yIGNvbnRhaW5zIGFuXHJcbiAgICAvLyB1bnJlbW92YWJsZSBuZXctbGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBpdHMgY29udGVudC5cclxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xyXG4gICAgaWYgKHRoaXMucXVpbGwpIHtcclxuICAgICAgLy8gdGhpcyBpcyB0aGUgaW50ZW5kZWQgcGF0aCAodXNlciBpbnB1dCk6XHJcbiAgICAgIHJldHVybiBtYXhMZW5ndGggLSB0aGlzLnF1aWxsLnF1aWxsRWRpdG9yLmdldFRleHQoKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sgdG8gdGhlIHJhdyBIVE1MIGNvbnRlbnQ6XHJcbiAgICByZXR1cm4gbWF4TGVuZ3RoIC0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBhZGRPbkJsdXIgPSB0cnVlO1xyXG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlcyA9IFtFTlRFUiwgQ09NTUFdIGFzIGNvbnN0O1xyXG4gIHJlYWRvbmx5IGVtcHR5U2VwYXJhdG9yS2V5c0NvZGVzID0gW10gYXMgY29uc3Q7XHJcblxyXG4gIGFkZChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcclxuICAgIGlmICh0aGlzLnNldFRleHRGaWVsZENoaXBzVmFsdWUodmFsdWUpKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAga2V5OiB0aGlzLndpZGdldEluc3RhbmNlLmtleSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZSxcclxuICAgICAgICBraW5kOiAnc2VsZWN0aW9uJyxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5zb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh2YWx1ZUNoYW5nZSk7XHJcbiAgICB9XHJcbiAgICAvLyBDbGVhciB0aGUgaW5wdXQgdmFsdWVcclxuICAgIGV2ZW50LmNoaXBJbnB1dCEuY2xlYXIoKTtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0ubWFya0FzVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKHZhbHVlOiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUuaW5kZXhPZih2YWx1ZSk7XHJcblxyXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xyXG4gICAgICAgICAga2V5OiB0aGlzLndpZGdldEluc3RhbmNlLmtleSxcclxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxyXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIHdpZGdldEluc3RhbmNlOiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHZvaWQge1xyXG4gICAgbGV0IHZhbHVlID0gZXZlbnQub3B0aW9uLnZpZXdWYWx1ZTtcclxuICAgIGlmICh0aGlzLnNldFRleHRGaWVsZENoaXBzVmFsdWUodmFsdWUpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAgICBrZXk6IHdpZGdldEluc3RhbmNlLmtleSxcclxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZSxcclxuICAgICAgICAgIGtpbmQ6ICdzZWxlY3Rpb24nLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh2YWx1ZUNoYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzICYmXHJcbiAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlIS5sZW5ndGggPCB0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlcykgfHxcclxuICAgICAgICAhdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXNcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlKSB7XHJcbiAgICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEFycmF5PE9iamVjdD4oKTtcclxuICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUgPSB2YWx1ZXM7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnNldFZhbHVlKHZhbHVlcyk7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlyZWN0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuZGlyZWN0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tcm93JztcclxuICAgIH0gZWxzZSBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5kaXJlY3Rpb24gPT09IFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbi5DT0wpIHtcclxuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tY29sJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnZGlyZWN0aW9uLXJvdyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKTogdHlwZW9mIFNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbiB7XHJcbiAgICByZXR1cm4gU21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0VHlwZSgpOiB0eXBlb2YgU21hcnRGb3JtV2lkZ2V0VHlwZSB7XHJcbiAgICByZXR1cm4gU21hcnRGb3JtV2lkZ2V0VHlwZTtcclxuICB9XHJcblxyXG4gIGdldFdpZGdldExhYmVsKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pOiBzdHJpbmcge1xyXG4gICAgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAod2lkZ2V0LmxhYmVsID09PSAnJykge1xyXG4gICAgICByZXR1cm4gd2lkZ2V0LmxhYmVsO1xyXG4gICAgfVxyXG4gICAgbGV0IGlzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVElNRSAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UXHJcbiAgICApIHtcclxuICAgICAgaXNSZXF1aXJlZCA9IHdpZGdldC52YWxpZGF0b3JzPy5sZW5ndGggPyB0aGlzLmZpZWxkSXNSZXF1aXJlZCgpICYmICEhd2lkZ2V0LnNob3dMYWJlbCA6IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCkge1xyXG4gICAgICBpc1JlcXVpcmVkID0gd2lkZ2V0Lm1hcmtBc1JlcXVpcmVkID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGAke3dpZGdldC5sYWJlbH0ke2lzUmVxdWlyZWQgPyAnIConIDogJyd9YDtcclxuICB9XHJcblxyXG4gIHNhbml0aXplSHRtbCh2YWx1ZT86IHN0cmluZyk6IFNhZmVIdG1sIHwgbnVsbCB7XHJcbiAgICBsZXQgc2FmZVZhbHVlID0gdmFsdWUgPz8gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoc2FmZVZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmllbGRJc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZhbHVlID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5mb3JFYWNoKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRvci52YWxpZGF0b3IgPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkgdmFsdWUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNDdXN0b21FcnJvcih3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0gJiYgdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGxldCBoYXNFcnJvciA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XS5lcnJvcnMhKS5sZW5ndGhcclxuICAgICAgICAgID8gdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy5kaXJ0eSB8fFxyXG4gICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yICYmXHJcbiAgICAgICAgICAgICAgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XT8uZXJyb3JzKSFbdmFsaWRhdG9yLm5hbWVdKVxyXG4gICAgICAgICAgOiBmYWxzZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAodmFsaWRhdG9yICYmIGhhc0Vycm9yICYmICF0aGlzLmVycm9yS2V5KSB8fFxyXG4gICAgICAgICAgKHZhbGlkYXRvciAmJiBoYXNFcnJvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHZhbGlkYXRvci5uYW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9yICYmIHZhbGlkYXRvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhc0Vycm9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2Uod2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBsZXQgZXJyb3JJY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICBsZXQgZXJyb3JJY29uQ29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGxldCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SRUNPUkRJTkdfVVBMT0FERVIgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XSAmJiB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ICYmXHJcbiAgICAgICAgICAhT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0uZXJyb3JzISkuaW5jbHVkZXModGhpcy5lcnJvcktleSEpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgIGluZGV4IDwgT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0uZXJyb3JzISkubGVuZ3RoO1xyXG4gICAgICAgICAgaW5kZXgrK1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JLZXkgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKVtpbmRleF07XHJcbiAgICAgICAgICBsZXQgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgPSB3aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgJiYgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGN1c3RvbVZhbGlkYXRvck9uV2lkZ2V0WzBdLmVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgICAgIGVycm9ySWNvbiA9IGN1c3RvbVZhbGlkYXRvck9uV2lkZ2V0WzBdLmljb247XHJcbiAgICAgICAgICAgIGVycm9ySWNvbkNvbG9yID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbkNvbG9yO1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgY3VzdG9tVmFsaWRhdG9yT25Gb3JtID0gdGhpcy5zZXJ2aWNlLnNtYXJ0Rm9ybT8udmFsaWRhdG9ycz8uZmlsdGVyKFxyXG4gICAgICAgICAgICAodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4gdmFsaWRhdG9yLm5hbWUgPT09IGVycm9yS2V5XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGN1c3RvbVZhbGlkYXRvck9uRm9ybSAmJiBjdXN0b21WYWxpZGF0b3JPbkZvcm0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGN1c3RvbVZhbGlkYXRvck9uRm9ybVswXS5lcnJvck1lc3NhZ2UhO1xyXG4gICAgICAgICAgICB2YWxpZGF0b3IgPSBjdXN0b21WYWxpZGF0b3JPbkZvcm1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuaGFzQ3VzdG9tRXJyb3Iod2lkZ2V0SW5zdGFuY2UsIHZhbGlkYXRvciEpKSB7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSBlcnJvck1lc3NhZ2UhO1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9ySWNvbiA9IGVycm9ySWNvbjtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA9IGVycm9ySWNvbkNvbG9yO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAod2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB3aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gd2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JJY29uO1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID0gd2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JDb2xvcjtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRJbmRpY2F0b3JJdGVtQ2xhc3MoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yVmFsdWUgPj0gaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci0ke2luZGV4fWA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGdldEluZGljYXRvclN0YXR1c0xhYmVsQ29sb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlKTtcclxuICAgIGlmICh2YWx1ZSA+IHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxKSB7XHJcbiAgICAgIHJldHVybiBgc21hcnQtaW5kaWNhdG9yLWxhYmVsLSR7dGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvckxlbmd0aCAtIDF9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgc21hcnQtaW5kaWNhdG9yLWxhYmVsLSR7dmFsdWV9YDtcclxuICB9XHJcbiAgZ2V0SW5kaWNhdG9yU3RhdHVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlKTtcclxuICAgIGlmICh2YWx1ZSA+IHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yU3RhdHVzTGFiZWxzW1xyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxXHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclN0YXR1c0xhYmVsc1t2YWx1ZV07XHJcbiAgfVxyXG5cclxuICB1cGxvYWQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IHR5cGUgPSB0aGlzLndpZGdldEluc3RhbmNlLnR5cGU7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgdHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgIHR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkVDT1JESU5HX1VQTE9BREVSXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgIC4uLmV2ZW50LnVpQWN0aW9uLnBhcmFtcyxcclxuICAgICAgX2ZpbGVzOiBldmVudC5maWxlcyxcclxuICAgICAgcGFyYW06ICdfZmlsZXMnLFxyXG4gICAgfTtcclxuICAgIGV2ZW50LnVpQWN0aW9uLnBhcmFtcyA9IHBhcmFtcztcclxuXHJcbiAgICB0aGlzLnNtYXJ0Q29tcG9uZW50LmV4ZWN1dGVVaUFjdGlvbihldmVudC51aUFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBleGVjdXRlVWlBY3Rpb24odWlBY3Rpb246IFVpQWN0aW9uKTogdm9pZCB7XHJcbiAgICBsZXQgdHlwZSA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZTtcclxuICAgIGlmICh0eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiYgdHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zbWFydENvbXBvbmVudC5leGVjdXRlVWlBY3Rpb24odWlBY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QnV0dG9uVHlwZShkZXNjcmlwdG9yOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChkZXNjcmlwdG9yLnR5cGUpIHtcclxuICAgICAgY2FzZSAnTk9STUFMJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtYnV0dG9uJztcclxuICAgICAgY2FzZSAnRkxBVCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWZsYXQtYnV0dG9uJztcclxuICAgICAgY2FzZSAnUkFJU0VEJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtcmFpc2VkLWJ1dHRvbic7XHJcbiAgICAgIGNhc2UgJ1NUUk9LRUQnOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1zdHJva2VkLWJ1dHRvbic7XHJcbiAgICAgIGNhc2UgJ0lDT04nOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1pY29uLWJ1dHRvbic7XHJcbiAgICAgIGNhc2UgJ01JTklfRkFCJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtbWluaS1mYWInO1xyXG4gICAgICBjYXNlICdGQUInOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1mYWInO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBVbmhhbmRsZWQgYWN0aW9uIGJ1dHRvbiB0eXBlIGNhc2U6ICR7ZGVzY3JpcHRvci50eXBlfWApO1xyXG4gICAgICAgIHJldHVybiBgbWF0LWJ1dHRvbmA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc09ubHlJY29uKGRlc2NyaXB0b3I6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZGVzY3JpcHRvci50eXBlID09PSAnSUNPTicgfHwgZGVzY3JpcHRvci50eXBlID09PSAnTUlOSV9GQUInIHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ0ZBQidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkJ1dHRvbkNsaWNrZWQoaW5zdGFuY2U6IFNtYXJ0QnV0dG9uKTogdm9pZCB7XHJcbiAgICBpZiAoaW5zdGFuY2UudWlBY3Rpb24pIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2UudWlBY3Rpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2Uua2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlcih2YWx1ZTogSW5wdXRFdmVudCk6IFNtYXJ0SXRlbTxhbnk+W10ge1xyXG4gICAgbGV0IGZpbHRlclZhbHVlID0gKHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU7XHJcbiAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogU21hcnRJdGVtPGFueT5bXSA9IGZpbHRlclZhbHVlXHJcbiAgICAgICAgPyB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdC5maWx0ZXIoKG9wdGlvbjogU21hcnRJdGVtPGFueT4pID0+XHJcbiAgICAgICAgICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3Q7XHJcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwICYmIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0Lmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIHZhbHVlcyBhZnRlciB0aGUgZmlsdGVyIG9wZXJhdGlvbiBidXQgd2UgZm91bmQgbm9uZTpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdGhpcy53aWRnZXRJbnN0YW5jZS5maWx0ZXJFcnJvck1lc3NhZ2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gd2UgZWl0aGVyIGZvdW5kIHZhbHVlcywgb3IgdGhlcmUgd2VyZSBubyB2YWx1ZXMgdG8gYmVnaW4gd2l0aDpcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmVycm9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgZGF0ZUZpbHRlcihkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBnZXRNYXRyaXhEaXNwbGF5VmFsdWUocXVlc3Rpb246IFZhbHVlLCBrZXk6IHN0cmluZykge1xyXG4gICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UgYXMgU21hcnRNYXRyaXgpLnZhbHVlW2tleV0uZmluZCgodmFsdWU6IFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZS5jb2RlID09IHF1ZXN0aW9uLmNvZGUpIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIGVsc2UgcmV0dXJuIHF1ZXN0aW9uLmNvZGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVllYXJNb250aFBpY2tlZCh5ZWFyTW9udGhWYWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXSwgeWVhck1vbnRoVmFsdWUsICcwMDowMCcpO1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZUl0ZW1zKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZ1bmN0aW9uIGNvbnZlcnQob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG4gICAgLy8gY2FsbGluZyB0aGlzLnRydW5jYXRlVXJpIGRpZG4ndCB3b3JrXHJcbiAgICAvLyBUT0RPOiB1c2Ugd2lkZ2V0LnNlbGVjdGlvbi5wYXJhbWV0ZXIgZm9yIGlnbm9yZVVyaVZlcnNpb24gLyBzdHJpY3RVcmlDb21wYXJpc29uO1xyXG5cclxuICAgIGxldCB2MSA9IGNvbnZlcnQobzEpO1xyXG4gICAgbGV0IHYyID0gY29udmVydChvMik7XHJcbiAgICByZXR1cm4gZGVlcEVxdWFsKHYxLCB2Mik7XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZVVyaSh1cmk6IGFueSk6IGFueSB7XHJcbiAgICBpZiAodXJpICYmIHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB1cmkucmVwbGFjZSgvXFwudlswLTldKyQvLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXJpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKHF1ZXN0aW9uKTtcclxuICAgICh0aGlzLndpZGdldEluc3RhbmNlIGFzIFNtYXJ0TWF0cml4KS5idXR0b24/LmNhbGxiYWNrKHRoaXMud2lkZ2V0SW5zdGFuY2UsIHF1ZXN0aW9uKTtcclxuICB9XHJcblxyXG4gIGlzVG9vbGJhclByZXNlbnQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgfHxcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVJcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS50b29sYmFySWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnRvb2xiYXJJZCAhPT0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0Q2hpcHNWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlWyduYW1lJ107XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdkaXNwbGF5VmFsdWUnIGluIHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlWydkaXNwbGF5VmFsdWUnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBnZXRPcHRpb25zKGl0ZW1zOiBTbWFydEl0ZW1zPGFueT5bXSkge1xyXG4gICAgbGV0IHZhbHVlczogYW55W10gPSBbXTtcclxuICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklURU1fR1JPVVApIHtcclxuICAgICAgICBpdGVtLnZhbHVlTGlzdC5tYXAoKHZhbHVlOiBTbWFydEl0ZW08YW55PikgPT4ge1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNKSB7XHJcbiAgICAgICAgdmFsdWVzLnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgY2xlYXJCdXR0b25EZXNjcmlwdG9yKCk6IFVpQWN0aW9uRGVzY3JpcHRvciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aXRsZTogJycsXHJcbiAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5SQUlTRUQsXHJcbiAgICAgIGljb246IHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HID8gJ3RpbWVzJyA6ICdjbG9zZScsXHJcbiAgICAgIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uLlBSRSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjbGVhckZpZWxkKGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS5zZXRWYWx1ZSgnJyk7XHJcbiAgICB0aGlzLm9uQmx1cj8ubmV4dCh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICB9XHJcblxyXG4gIG9uVGV4dGFyZWFDaGFuZ2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGEgPSB0aGlzLnNiNFRleHRhcmVhPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgdGEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgICB0YS5zdHlsZS5oZWlnaHQgPSBgJHt0YS5zY3JvbGxIZWlnaHR9cHhgO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCbHVyRXZlbnQoZXZlbnREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMub25CbHVyPy5uZXh0KGV2ZW50RGF0YSk7XHJcbiAgICB0aGlzLmJsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh7XHJcbiAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhLFxyXG4gICAgICBraW5kOiB0aGlzLmdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKSxcclxuICAgICAgdmFsdWU6IHRoaXMuZm9ybS52YWx1ZVt0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xyXG4gIG9uRHJvcERvd25TaG93KCkge1xyXG4gICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xyXG4gIH1cclxuICBvbkRyb3BEb3duSW5wdXQoKSB7XHJcbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmRvcnBkb3duT3BlbmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FmZURyb3BEb3duQmx1cihldmVudDogYW55KSB7XHJcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXHJcbiAgICAvLyBhcyBpdCBcImVhdHNcIiB0aGUgZmlyc3QgY2xpY2tcclxuXHJcbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcpIHtcclxuICAgICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyT3BlbmluZyA9IGZhbHNlO1xyXG4gIG9uQ2FsZW5kYXJTaG93KCkge1xyXG4gICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSB0cnVlO1xyXG4gIH1cclxuICBvbkNhbGVuZGFySW5wdXQoKSB7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyT3BlbmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FmZUNhbGVuZGFyQmx1cihldmVudDogYW55KSB7XHJcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXHJcbiAgICAvLyBhcyBpdCBcImVhdHNcIiB0aGUgZmlyc3QgY2xpY2tcclxuXHJcbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcpIHtcclxuICAgICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xyXG5cclxuICAgIGlmIChpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIERhdGU6JywgdmFsdWUpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IERhdGUoXHJcbiAgICAgIHBhcnNlZC5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBwYXJzZWQuZ2V0TW9udGgoKSxcclxuICAgICAgcGFyc2VkLmdldERhdGUoKSxcclxuICAgICAgcGFyc2VkLmdldEhvdXJzKCksXHJcbiAgICAgIHBhcnNlZC5nZXRNaW51dGVzKCksXHJcbiAgICAgIHBhcnNlZC5nZXRTZWNvbmRzKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sTWVzc2FnZXMoY29udHJvbE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tjb250cm9sTmFtZV07XHJcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZvcm0uY29udHJvbHNbY29udHJvbE5hbWVdPy5lcnJvcnMgPz8ge307XHJcblxyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXMoZXJyb3JzKVxyXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHR5cGVvZiBlcnJvcnNba2V5XSA9PT0gJ3N0cmluZycpXHJcbiAgICAgIC5tYXAoKGtleSkgPT4gKHtcclxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICBkZXRhaWw6IGVycm9yc1trZXldLFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SRUNPUkRJTkdfVVBMT0FERVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZXMucHVzaCh7XHJcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxyXG4gICAgICAgICAgICBkZXRhaWw6IHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JNZXNzYWdlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0h0bWwodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gLzxbYS16XVtcXHNcXFNdKj4vaS50ZXN0KHRleHQpO1xyXG4gIH1cclxuXHJcbiAgb25EaXZDbGljaygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWKSByZXR1cm47XHJcbiAgICBjb25zdCBvbkNsaWNrID0gdGhpcy53aWRnZXRJbnN0YW5jZS5kaXZQcm9wZXJ0aWVzPy5vbkNsaWNrO1xyXG5cclxuICAgIGlmICghb25DbGljaykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVVaUFjdGlvbih0aGlzLndpZGdldEluc3RhbmNlLmRpdlByb3BlcnRpZXMhLm9uQ2xpY2shKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGlmIChjb21wTGliID09PSBjb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIHByaW1lXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgY2xhc3M9XCJjb250YWluZXJcIlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzVmlzaWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHdpZGdldEluc3RhbmNlLmlzVmlzaWJsZVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzbWFydGZvcm13aWRnZXRcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCJcclxuICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldFwiXHJcbiAgICAgICAgICBjbGFzcz1cImNvbnRhaW5lci1pdGVtXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldC5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICBbb25CbHVyXT1cIm9uQmx1clwiXHJcbiAgICAgICAgICBbb25WYWx1ZUNoYW5nZV09XCJvblZhbHVlQ2hhbmdlXCJcclxuICAgICAgICAgIFtzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwic29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcclxuICAgICAgICAgIFtibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXT1cImJsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyB3aWRnZXQua2V5IH19XCJcclxuICAgICAgICAgIFtsYWJlbENvbG9yXT1cImxhYmVsQ29sb3JcIlxyXG4gICAgICAgID48L3NtYXJ0Zm9ybXdpZGdldD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXIgdGV4dEZpZWxkQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsIFtuZ0NsYXNzXT1cInsgaGFzVG9vbGJhcjogaXNUb29sYmFyUHJlc2VudCgpIH1cIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2UubWFza1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gKGhpZGVQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8cC1pbnB1dE1hc2tcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLm1hc2tcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbbWFza109XCJ3aWRnZXRJbnN0YW5jZS5tYXNrXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0RmllbGRCdXR0b25zXCI+XHJcbiAgICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1Rvb2xiYXJQcmVzZW50KClcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dEZpZWxkVG9vbGJhclwiXHJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRQcm9wZXJ0aWVzPy5jbGVhcmFibGUpIHtcclxuICAgICAgICAgICAgICA8dWktYWN0aW9uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhckJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbYWRkQmFzaWNDbGFzc2VzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNsZWFyQnV0dG9uRGVzY3JpcHRvclwiXHJcbiAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiY2xlYXJGaWVsZCh3aWRnZXRJbnN0YW5jZS5rZXkpXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAhPSAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9OVU1CRVJcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBpbnB1dElkPVwibWlubWF4XCJcclxuICAgICAgICAgICAgICBtb2RlPVwiZGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXHJcbiAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjBcIlxyXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCI1XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVFwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICAgICAgPHAtZWRpdG9yXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seSA9PSB0cnVlID8gJ2Rpc2FibGVkRWRpdG9yJyA6ICcnXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW21vZHVsZXNdPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkID8gZW1wdHlRdWlsbFRvb2xiYXIgOiB3aWRnZXRJbnN0YW5jZS5xdWlsbE1vZHVsZXNcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5ID8/IGZhbHNlXCJcclxuICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIndpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAob25UZXh0Q2hhbmdlKT1cIm9uUHJpbWVSaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChvblRleHRDaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByaW1lLWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TT1JUQUJMRVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICAgIDxsaWItc29ydGFibGUtd2lkZ2V0XHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcclxuICAgICAgICAgID48L2xpYi1zb3J0YWJsZS13aWRnZXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpY29uRGlzcGxheV09XCInaW5wdXQnXCJcclxuICAgICAgICAgICAgICBbc2hvd0ljb25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW21pbkRhdGVdPVwiXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFttYXhEYXRlXT1cIlxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5tYXhEYXRlID8/IG51bGwpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKG9uU2hvdyk9XCJvbkNhbGVuZGFyU2hvdygpXCJcclxuICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbkNhbGVuZGFySW5wdXQoKVwiXHJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzYWZlQ2FsZW5kYXJCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAob25DbG9zZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cInl5LW1tLWRkXCJcclxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1PTlRIX1BJQ0tFUikge1xyXG4gICAgICAgIEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWRcclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgPHAtY2FsZW5kYXJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW2ljb25EaXNwbGF5XT1cIidpbnB1dCdcIlxyXG4gICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbbWluRGF0ZV09XCJcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWluRGF0ZSA/PyBudWxsKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW21heERhdGVdPVwiXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIGhvdXJGb3JtYXQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAob25TaG93KT1cIm9uQ2FsZW5kYXJTaG93KClcIlxyXG4gICAgICAgICAgICAgIChvbklucHV0KT1cIm9uQ2FsZW5kYXJJbnB1dCgpXCJcclxuICAgICAgICAgICAgICAob25CbHVyKT1cInNhZmVDYWxlbmRhckJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChvbkNsb3NlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBkYXRlRm9ybWF0PVwieXktbW0tZGRcIlxyXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICA8cC1kcm9wZG93blxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb25zKHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdClcIlxyXG4gICAgICAgICAgICAgIFtjaGVja21hcmtdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByaW1lLWVycm9yXCI+XHJcbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtbWVzc2FnZXNcclxuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxyXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXHJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbnMod2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0KVwiXHJcbiAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKG9uUGFuZWxTaG93KT1cIm9uRHJvcERvd25TaG93KClcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2FmZURyb3BEb3duQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAob25DbGVhcik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG9uUGFuZWxIaWRlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGVsZW0ga2l2w6FsYXN6dHZhXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0JPWFwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIiBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICBjbGFzcz1cInNiNC10ZXh0YXJlYVwiXHJcbiAgICAgICAgICAgICAgI3NiNFRleHRhcmVhXHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dGFyZWFcclxuICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBjb2xzPVwiMzBcIlxyXG4gICAgICAgICAgICAgIFtyb3dzXT1cIndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5taW5Sb3dzID8/IDFcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiBcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UZXh0YXJlYUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgW2Zvcl09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtbWVzc2FnZXNcclxuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxyXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXHJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgPHAtY2hpcHNcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCA/IHdpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW21heF09XCIwXCJcclxuICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjBcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj4ge3sgZ2V0Q2hpcHNWYWx1ZShpdGVtKSB9fSA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtY2hpcHM+XHJcbiAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWwgd2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWxDb250YWluZXJcIiBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIDxwPnt7IHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlJFQ09SRElOR19VUExPQURFUikge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzbWFydC12b2ljZS1yZWNvcmRlclxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8c21hcnQtZmlsZS1lZGl0b3JcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzbWFydC1tdWx0aS1maWxlLWVkaXRvclxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChmaWxlRXZlbnQpPVwiZXhlY3V0ZVVpQWN0aW9uKCRldmVudC51aUFjdGlvbilcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0VcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyIGltYWdlQ29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuXHJcbiAgICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS5pbWFnZVByb3BlcnRpZXM/LmltYWdlKSB7XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS5pbWFnZVByb3BlcnRpZXMhLmltYWdlXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmltYWdlQ3NzID8/ICcnIH19XCJcclxuICAgICAgICAgICAgYWx0PVwiSW1hZ2VcIlxyXG4gICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICB9IEBlbHNlIGlmICh3aWRnZXRJbnN0YW5jZS52YWx1ZSkge1xyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuaW1hZ2VDc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgICBhbHQ9XCJJbWFnZVwiXHJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgdG9nZ2xlLWNvbFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxsYWJlbCBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCIgW2Zvcl09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIj5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPHAtaW5wdXRTd2l0Y2hcclxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIG5hbWU9XCJ7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cIlxyXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAob25DaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgY2hlY2tib3ggd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaGVja2JveC1zZWN0aW9uXCIgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LWl0ZW0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHAtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1lcnJvclwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzJcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxwLWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNoZWNrYm94LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY2hlY2tib3gubGFiZWxcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVikge1xyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwic21hcnREaXZcIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwoZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW2NsYXNzLmNsaWNrYWJsZV09XCIhIXdpZGdldEluc3RhbmNlLmRpdlByb3BlcnRpZXM/Lm9uQ2xpY2tcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib25EaXZDbGljaygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNWR1wiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKHdpZGdldEluc3RhbmNlLnZhbHVlKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG59IEBlbHNlIHtcclxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIG1hdGVyaWFsXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgY2xhc3M9XCJjb250YWluZXJcIlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzVmlzaWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHdpZGdldEluc3RhbmNlLmlzVmlzaWJsZVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzbWFydGZvcm13aWRnZXRcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCJcclxuICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldFwiXHJcbiAgICAgICAgICBjbGFzcz1cImNvbnRhaW5lci1pdGVtXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldC5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICBbb25CbHVyXT1cIm9uQmx1clwiXHJcbiAgICAgICAgICBbb25WYWx1ZUNoYW5nZV09XCJvblZhbHVlQ2hhbmdlXCJcclxuICAgICAgICAgIFtzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwic29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgd2lkZ2V0LmtleSB9fVwiXHJcbiAgICAgICAgICBbbGFiZWxDb2xvcl09XCJsYWJlbENvbG9yXCJcclxuICAgICAgICA+PC9zbWFydGZvcm13aWRnZXQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIChjYXBzTG9jayk9XCJjYXBzT24gPSAkZXZlbnRcIlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHRleHRGaWVsZCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cclxuXHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuaW5wdXRtb2RlXT1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmlucHV0TW9kZSA/IHdpZGdldEluc3RhbmNlLmlucHV0TW9kZS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJ3RleHQnXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgdHlwZT1cInt7IHdpZGdldEluc3RhbmNlLmlzUGFzc3dvcmQgPyAoaGlkZVBhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0JykgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uS2V5ZG93bigpXCJcclxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwie3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIH19XCJcclxuICAgICAgICAgICAgW21hc2tdPVwid2lkZ2V0SW5zdGFuY2UubWFza1wiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPCEtLSBbbWFza109XCJ3aWRnZXRJbnN0YW5jZS5tYXNrID8/ICcnXCIgLS0+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICcnIH19XCJcclxuICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJ0ZXh0RmllbGRBdXRvXCJcclxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCJcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+e3sgaGlkZVBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5JyB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZXh0RmllbGRBdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uLmxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQ6IHRvSGlnaGxpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiICpuZ0lmPVwiY2Fwc09uICYmIHdpZGdldEluc3RhbmNlLmlzUGFzc3dvcmRcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8c3BhbiBtYXRQcmVmaXg+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nSWNvbiA/PyAna2V5Ym9hcmRfY2Fwc2xvY2snXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaWNvbiAmJiB3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gPT09ICdQUkUnXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gbWF0U3VmZml4PlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaWNvbiAmJlxyXG4gICAgICAgICAgICAgICghd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uIHx8IHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BPU1QnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dEZpZWxkQnV0dG9uc1wiPlxyXG4gICAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnRleHRGaWVsZFByb3BlcnRpZXM/LmNsZWFyYWJsZSkge1xyXG4gICAgICAgICAgICAgIDx1aS1hY3Rpb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIFthZGRCYXNpY0NsYXNzZXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JdPVwiY2xlYXJCdXR0b25EZXNjcmlwdG9yXCJcclxuICAgICAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJjbGVhckZpZWxkKHdpZGdldEluc3RhbmNlLmtleSlcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJ7eyB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY29sb3IgfX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNhbGxiYWNrKHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICAgIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpLlBSRSAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgICAgPnt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aFxyXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgICA+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX05VTUJFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB0ZXh0RmllbGQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBbbWluXT1cIndpZGdldEluc3RhbmNlLm1pblZhbHVlcyA/PyBudWxsXCJcclxuICAgICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5wcmVmaXggfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2Uuc3VmZml4IH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jYWxsYmFjayh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFNcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcExpc3QgYXJpYS1sYWJlbD1cInt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hpcC1yb3dcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAjY2hpcElucHV0XHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiY2hpcEF1dG9cIlxyXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInNlbGVjdGVkKCRldmVudCwgd2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0TG9va3VwIGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoaXBcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldENoaXBzVmFsdWUodmFsdWUpIH19XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdExvb2t1cFwiXHJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cImVtcHR5U2VwYXJhdG9yS2V5c0NvZGVzXCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1hcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgY2xhc3M9XCJzYjQtdGV4dGFyZWFcIlxyXG4gICAgICAgICAgICAjc2I0VGV4dGFyZWFcclxuICAgICAgICAgICAgY29scz1cIjMwXCJcclxuICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxyXG4gICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5taW5Sb3dzID8/IDFcIlxyXG4gICAgICAgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5tYXhSb3dzID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXHJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgICAgPnt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aFxyXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlLmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2UuaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzJcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBjaGVja2JveC5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrYm94LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgcmFkaW8tc2VjdGlvbiB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8taXRlbS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgcmFkaW8gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJhZGlvLWl0ZW0taW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgW3NyY109XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcmFkaW8udmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHJhZGlvLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgcmFkaW8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWljb25cIj5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJkYXRlUGlja2VyIHdpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgZGF0ZSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXIgKGNsb3NlZCk9XCJoYW5kbGVCbHVyRXZlbnQod2lkZ2V0SW5zdGFuY2UpXCI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICBbbWluXT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWluRGF0ZSA/PyBudWxsKVwiXHJcbiAgICAgICAgICAgIFttYXhdPVwiY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5tYXhEYXRlID8/IG51bGwpXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5pY29uICYmXHJcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZGF0ZUZvcm1hdEhpbnQgfX1cclxuICAgICAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIDxkaXZcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcIlxyXG4gICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbFwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcclxuICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cIiRhbnkocGlja2VyKVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgIDxuZ3gtbWF0LWRhdGV0aW1lLXBpY2tlclxyXG4gICAgICAgICAgI3BpY2tlclxyXG4gICAgICAgICAgW3Nob3dTcGlubmVyc109XCJ0cnVlXCJcclxuICAgICAgICAgIFtzaG93U2Vjb25kc109XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc3RlcEhvdXJdPVwiMVwiXHJcbiAgICAgICAgICBbc3RlcE1pbnV0ZV09XCIxXCJcclxuICAgICAgICAgIFtzdGVwU2Vjb25kXT1cIjEwXCJcclxuICAgICAgICAgIFt0b3VjaFVpXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgICAgW2VuYWJsZU1lcmlkaWFuXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtkaXNhYmxlTWludXRlXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtoaWRlVGltZV09XCJmYWxzZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICBbbmd4TWF0RGF0ZXRpbWVQaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgIFtuZ3hNYXREYXRldGltZVBpY2tlckZpbHRlcl09XCJ3aWRnZXRJbnN0YW5jZS5maWx0ZXIgPz8gZGF0ZUZpbHRlclwiXHJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8bWF0LWhpbnQ+XHJcbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgIDwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bGliLXNtYXJ0LW1vbnRoLXBpY2tlclxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlWWVhck1vbnRoUGlja2VkKCRldmVudClcIlxyXG4gICAgICAgICAgPjwvbGliLXNtYXJ0LW1vbnRoLXBpY2tlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVRpbWVQaWNrZXJDb250YWluZXJcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgZGF0ZSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciAoY2xvc2VkKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAjZGF0ZUlucHV0XHJcbiAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbbWluXT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWluRGF0ZSA/PyBudWxsKVwiXHJcbiAgICAgICAgICAgICAgW21heF09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkRhdGVQaWNrZXJCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJ3aWRnZXRJbnN0YW5jZS5maWx0ZXIgPz8gZGF0ZUZpbHRlclwiXHJcbiAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2Uuc3VmZml4IH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaWNvbiAmJlxyXG4gICAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgICAgICA8L21hdC1oaW50PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAqbmdJZj1cImhhc0NyZWF0ZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgdGltZVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICN0aW1lSW5wdXRcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25UaW1lUGlja2VyQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQudmFsdWUpXCJcclxuICAgICAgICAgICAgKGNsb3NlZCk9XCJoYW5kbGVCbHVyRXZlbnQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcclxuICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyID8gd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgOiAnJyB9fVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTV9HUk9VUFwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlubmVyT3B0aW9uIG9mIG9wdGlvbi52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW5uZXJPcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW5uZXJPcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbm5lck9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpbm5lck9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaW5uZXJPcHRpb24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAge3sgaW5uZXJPcHRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJvcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJvcHRpb24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgID57eyBvcHRpb24ubGFiZWwgfX08L21hdC1vcHRpb25cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5pY29uICYmXHJcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAjdG9vbGJhclxyXG4gICAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dEZpZWxkVG9vbGJhclwiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkXCJcclxuICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxyXG4gICAgICAgID5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0XHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudC52YWx1ZSlcIlxyXG4gICAgICAgICAgICAoY2xvc2VkKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCFcIlxyXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgPyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA6ICcnIH19XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXBcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNX0dST1VQXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW5uZXJPcHRpb24gb2Ygb3B0aW9uLnZhbHVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpbm5lck9wdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbm5lck9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlubmVyT3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImlubmVyT3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpbm5lck9wdGlvbi5pY29uQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgID57eyBpbm5lck9wdGlvbi5sYWJlbCB9fTwvbWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTVwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cIm9wdGlvbi5pY29uQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgPnt7IG9wdGlvbi5sYWJlbCB9fTwvbWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWwgd2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWxDb250YWluZXJcIiBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIDxwPnt7IHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRJTUVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB0aW1lIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCIndGltZSdcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VGltZSgpXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCAge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3sgd2lkZ2V0SW5zdGFuY2UudmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIndpZGdldEluc3RhbmNlLnRvZ2dsZUxhYmVsUG9zaXRpb24gPz8gJ2JlZm9yZSdcIlxyXG4gICAgICAgICAgICA+e3sgIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbCA/IHdpZGdldEluc3RhbmNlLmxhYmVsIDogJycgfX08L21hdC1zbGlkZS10b2dnbGVcclxuICAgICAgICAgID48c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBsYWJlbENvbnRhaW5lciB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnRJbmRpY2F0b3Igd2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvckl0ZW1zIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCIgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpbmRpY2F0b3JJdGVtczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbmRpY2F0b3JJdGVtXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JJdGVtQ2xhc3MoaSlcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwIFtuZ0NsYXNzXT1cImdldEluZGljYXRvclN0YXR1c0xhYmVsQ29sb3IoKVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbCgpIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUkVDT1JESU5HX1VQTE9BREVSKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNtYXJ0LXZvaWNlLXJlY29yZGVyXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcclxuICAgICAgICAgICAgICAodXBsb2FkRmlsZXNFdmVudCk9XCJ1cGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUikge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICAgIDxzbWFydC1maWxlLWVkaXRvclxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHNtYXJ0LW11bHRpLWZpbGUtZWRpdG9yXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcclxuICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZmlsZUV2ZW50KT1cImV4ZWN1dGVVaUFjdGlvbigkZXZlbnQudWlBY3Rpb24pXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgaW1hZ2VDb250YWluZXJcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG5cclxuICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgIFtpbWFnZVJlc291cmNlXT1cIndpZGdldEluc3RhbmNlLmltYWdlUHJvcGVydGllcz8uaW1hZ2VcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgYWx0PVwiSW1hZ2VcIlxyXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmltYWdlQ3NzID8/ICcnIH19XCJcclxuICAgICAgICAgICAgICBhbHQ9XCJJbWFnZVwiXHJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2XCJcclxuICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSlcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwiISF3aWRnZXRJbnN0YW5jZS5kaXZQcm9wZXJ0aWVzPy5vbkNsaWNrXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uRGl2Q2xpY2soKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TVkdcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbCh3aWRnZXRJbnN0YW5jZS52YWx1ZSlcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8aHJcclxuICAgICAgICAgIGNsYXNzPVwic21hcnREaXZpZGVyIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0QnV0dG9uVHlwZSh3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uY29sb3JcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGlja2VkKHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzT25seUljb24od2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yKTsgdGhlbiBpY29uT25seTsgZWxzZSB0ZXh0XCJcclxuICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25Pbmx5PlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IhLmljb24hXCJcclxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RleHQ+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbiAmJlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IhLmljb24hXCJcclxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8udGl0bGUgfX1cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXHJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblBvc2l0aW9uID09PSAnUE9TVCdcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IhLmljb24hXCJcclxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09NUE9ORU5UICYmIHdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tQ29tcG9uZW50PjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgICA8cXVpbGwtZWRpdG9yXHJcbiAgICAgICAgICAgICNxdWlsbEVkaXRvclxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbbW9kdWxlc109XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkID8gZW1wdHlRdWlsbFRvb2xiYXIgOiB3aWRnZXRJbnN0YW5jZS5xdWlsbE1vZHVsZXNcIlxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwid2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICAgIFttYXhMZW5ndGhdPVwid2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgKG9uQ29udGVudENoYW5nZWQpPVwib25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgPjwvcXVpbGwtZWRpdG9yPlxyXG4gICAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dDaGFyYWN0ZXJMaW1pdFN1ZmZpeCAmJiB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgYWxpZ249XCJlbmRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInJpY2gtdGV4dC1lZGl0b3ItbGVld2F5LWNvdW50ZXJcIlxyXG4gICAgICAgICAgICA+e3sgZ2V0UmljaFRleHRFZGl0b3JMZW5ndGhMZWV3YXkoKSB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TT1JUQUJMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgICAgPGxpYi1zb3J0YWJsZS13aWRnZXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgICAgPjwvbGliLXNvcnRhYmxlLXdpZGdldD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1BVFJJWFwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwibWF0cml4VGFibGUgd2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgPHRoIGNsYXNzPVwib3B0aW9uTGFiZWxcIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlLmNvbHVtbnNcIj5cclxuICAgICAgICAgICAge3sgb3B0aW9uLmRpc3BsYXlWYWx1ZSB9fVxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUucm93czsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgPHRoIGNsYXNzPVwicXVlc3Rpb25MYWJlbFwiPlxyXG4gICAgICAgICAgICA8bGFiZWw+e3sgcXVlc3Rpb24uZGlzcGxheVZhbHVlIH19PC9sYWJlbD5cclxuICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwic2VsZWN0VGRcIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlLmNvbHVtbnM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLmlzTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgcXVlc3Rpb24uY29kZVwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ3EnICsgaVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbdmFsdWVdPVwib3B0aW9uLmNvZGVcIj4gPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzTXVsdGlwbGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLmRhdGEuJyArIHF1ZXN0aW9uLmNvZGUgKyAnLicgKyBvcHRpb24uY29kZVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVsnZGF0YSddW3F1ZXN0aW9uLmNvZGVdW29wdGlvbi5jb2RlXVwiXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uKVwiXHJcbiAgICAgICAgICAgID48c21hcnQtaWNvbiBpY29uPVwiY2xvc2VcIj48L3NtYXJ0LWljb25cclxuICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoNFxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx5b3V0dWJlLXBsYXllclxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgdmlkZW9JZD1cInt7IHdpZGdldEluc3RhbmNlLnZpZGVvSWQgfX1cIlxyXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXRJbnN0YW5jZS53aWR0aFwiXHJcbiAgICAgICAgW2hlaWdodF09XCJ3aWRnZXRJbnN0YW5jZS5oZWlnaHRcIlxyXG4gICAgICAgIFtzdGFydFNlY29uZHNdPVwid2lkZ2V0SW5zdGFuY2Uuc3RhcnRTZWNvbmRzXCJcclxuICAgICAgICBbZW5kU2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5lbmRTZWNvbmRzXCJcclxuICAgICAgPjwveW91dHViZS1wbGF5ZXI+XHJcbiAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgID5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
|