@smartbit4all/ng-client 5.0.21 → 6.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.
Files changed (677) hide show
  1. package/README.md +386 -386
  2. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +17 -0
  3. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +35 -0
  4. package/esm2022/lib/component-factory-service/projects.mjs +6 -0
  5. package/esm2022/lib/session/api/api/api.mjs +4 -0
  6. package/esm2022/lib/session/api/api/session.service.mjs +306 -0
  7. package/esm2022/lib/session/api/configuration.mjs +91 -0
  8. package/esm2022/lib/session/api/encoder.mjs +19 -0
  9. package/esm2022/lib/session/api/index.mjs +3 -0
  10. package/esm2022/lib/session/api/model/accountInfo.mjs +13 -0
  11. package/esm2022/lib/session/api/model/apiError.mjs +13 -0
  12. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +13 -0
  13. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +2 -0
  14. package/esm2022/lib/session/api/model/models.mjs +9 -0
  15. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +13 -0
  16. package/esm2022/lib/session/api/model/session.mjs +2 -0
  17. package/esm2022/lib/session/api/model/sessionInfoData.mjs +2 -0
  18. package/esm2022/lib/session/api/model/userActivityLog.mjs +13 -0
  19. package/esm2022/lib/session/api/param.mjs +2 -0
  20. package/esm2022/lib/session/api/variables.mjs +9 -0
  21. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +225 -0
  22. package/esm2022/lib/session/projects.mjs +13 -0
  23. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +2 -0
  24. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +214 -0
  25. package/esm2022/lib/session/smart-default-error-ui.service.mjs +134 -0
  26. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +109 -0
  27. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +44 -0
  28. package/esm2022/lib/session/smart-session-handler.service.mjs +7 -0
  29. package/esm2022/lib/session/smart-session.module.mjs +58 -0
  30. package/esm2022/lib/session/smart-session.service.mjs +284 -0
  31. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +39 -0
  32. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +63 -0
  33. package/esm2022/lib/shared/projects.mjs +4 -0
  34. package/esm2022/lib/shared/shared.module.mjs +19 -0
  35. package/esm2022/lib/shared/smart-tooltip.directive.mjs +58 -0
  36. package/esm2022/lib/shared/smarttable.date-pipe.mjs +43 -0
  37. package/esm2022/lib/smart-client/projects.mjs +4 -0
  38. package/esm2022/lib/smart-client/smart-component-api-client.mjs +934 -0
  39. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +79 -0
  40. package/esm2022/lib/smart-client/smart.component.mjs +88 -0
  41. package/esm2022/lib/smart-client/smart.service.mjs +71 -0
  42. package/esm2022/lib/smart-component-layout/api/api/api.mjs +4 -0
  43. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +133 -0
  44. package/esm2022/lib/smart-component-layout/api/api.module.mjs +40 -0
  45. package/esm2022/lib/smart-component-layout/api/configuration.mjs +91 -0
  46. package/esm2022/lib/smart-component-layout/api/encoder.mjs +19 -0
  47. package/esm2022/lib/smart-component-layout/api/index.mjs +7 -0
  48. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +18 -0
  49. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +22 -0
  50. package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +2 -0
  51. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +17 -0
  52. package/esm2022/lib/smart-component-layout/api/model/models.mjs +9 -0
  53. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +2 -0
  54. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +2 -0
  55. package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +17 -0
  56. package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +2 -0
  57. package/esm2022/lib/smart-component-layout/api/param.mjs +2 -0
  58. package/esm2022/lib/smart-component-layout/api/variables.mjs +9 -0
  59. package/esm2022/lib/smart-component-layout/projects.mjs +8 -0
  60. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +169 -0
  61. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +436 -0
  62. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +57 -0
  63. package/esm2022/lib/smart-diagram/api/api/api.mjs +4 -0
  64. package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +141 -0
  65. package/esm2022/lib/smart-diagram/api/api.module.mjs +40 -0
  66. package/esm2022/lib/smart-diagram/api/configuration.mjs +91 -0
  67. package/esm2022/lib/smart-diagram/api/encoder.mjs +19 -0
  68. package/esm2022/lib/smart-diagram/api/index.mjs +7 -0
  69. package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +13 -0
  70. package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +2 -0
  71. package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +13 -0
  72. package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +2 -0
  73. package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +2 -0
  74. package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +2 -0
  75. package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +2 -0
  76. package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +18 -0
  77. package/esm2022/lib/smart-diagram/api/model/labelText.mjs +2 -0
  78. package/esm2022/lib/smart-diagram/api/model/models.mjs +10 -0
  79. package/esm2022/lib/smart-diagram/api/param.mjs +2 -0
  80. package/esm2022/lib/smart-diagram/api/variables.mjs +9 -0
  81. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +312 -0
  82. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +359 -0
  83. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +40 -0
  84. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +10 -0
  85. package/esm2022/lib/smart-diagram/projects.mjs +5 -0
  86. package/esm2022/lib/smart-dialog/projects.mjs +8 -0
  87. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +54 -0
  88. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +16 -0
  89. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +46 -0
  90. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +86 -0
  91. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +101 -0
  92. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +12 -0
  93. package/esm2022/lib/smart-expandable-section/projects.mjs +8 -0
  94. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +57 -0
  95. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +14 -0
  96. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +17 -0
  97. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +2 -0
  98. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +8 -0
  99. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +2 -0
  100. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +2 -0
  101. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +20 -0
  102. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +2 -0
  103. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +2 -0
  104. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +28 -0
  105. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +2 -0
  106. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +2 -0
  107. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +32 -0
  108. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +18 -0
  109. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +16 -0
  110. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +2 -0
  111. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +13 -0
  112. package/esm2022/lib/smart-filter/api/value/model/value.mjs +13 -0
  113. package/esm2022/lib/smart-filter/projects.mjs +9 -0
  114. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +14 -0
  115. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +166 -0
  116. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +45 -0
  117. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +36 -0
  118. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +31 -0
  119. package/esm2022/lib/smart-filter/smart-filter.model.mjs +13 -0
  120. package/esm2022/lib/smart-filter/smart-filter.module.mjs +33 -0
  121. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +198 -0
  122. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +91 -0
  123. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +19 -0
  124. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +17 -0
  125. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +13 -0
  126. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +2 -0
  127. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +8 -0
  128. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +2 -0
  129. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +7 -0
  130. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +2 -0
  131. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +20 -0
  132. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +2 -0
  133. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +2 -0
  134. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +2 -0
  135. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +28 -0
  136. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +2 -0
  137. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +2 -0
  138. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +32 -0
  139. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +19 -0
  140. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +17 -0
  141. package/esm2022/lib/smart-filter-editor/api/param.mjs +2 -0
  142. package/esm2022/lib/smart-filter-editor/api/variables.mjs +9 -0
  143. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +15 -0
  144. package/esm2022/lib/smart-filter-editor/project.mjs +8 -0
  145. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +73 -0
  146. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +40 -0
  147. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +294 -0
  148. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +2 -0
  149. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +69 -0
  150. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +63 -0
  151. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +24 -0
  152. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +57 -0
  153. package/esm2022/lib/smart-form/api/api/api.mjs +4 -0
  154. package/esm2022/lib/smart-form/api/api/default.service.mjs +133 -0
  155. package/esm2022/lib/smart-form/api/api.module.mjs +40 -0
  156. package/esm2022/lib/smart-form/api/configuration.mjs +91 -0
  157. package/esm2022/lib/smart-form/api/encoder.mjs +19 -0
  158. package/esm2022/lib/smart-form/api/index.mjs +7 -0
  159. package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +13 -0
  160. package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +2 -0
  161. package/esm2022/lib/smart-form/api/model/imageProperties.mjs +2 -0
  162. package/esm2022/lib/smart-form/api/model/models.mjs +19 -0
  163. package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +2 -0
  164. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +13 -0
  165. package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +7 -0
  166. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +14 -0
  167. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +22 -0
  168. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +17 -0
  169. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +49 -0
  170. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +2 -0
  171. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +2 -0
  172. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +2 -0
  173. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +18 -0
  174. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +13 -0
  175. package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +13 -0
  176. package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +13 -0
  177. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +21 -0
  178. package/esm2022/lib/smart-form/api/param.mjs +2 -0
  179. package/esm2022/lib/smart-form/api/variables.mjs +9 -0
  180. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +20 -0
  181. package/esm2022/lib/smart-form/projects.mjs +18 -0
  182. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +753 -0
  183. package/esm2022/lib/smart-form/services/smartform.service.mjs +683 -0
  184. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +15 -0
  185. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +193 -0
  186. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +2 -0
  187. package/esm2022/lib/smart-form/smartform.component.mjs +190 -0
  188. package/esm2022/lib/smart-form/smartform.form-model.mjs +2 -0
  189. package/esm2022/lib/smart-form/smartform.model.mjs +38 -0
  190. package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +179 -0
  191. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +83 -0
  192. package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +170 -0
  193. package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +151 -0
  194. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +35 -0
  195. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +79 -0
  196. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +1038 -0
  197. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +78 -0
  198. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +31 -0
  199. package/esm2022/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.mjs +98 -0
  200. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +2 -0
  201. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +18 -0
  202. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +19 -0
  203. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +13 -0
  204. package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +2 -0
  205. package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +2 -0
  206. package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +13 -0
  207. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +2 -0
  208. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +2 -0
  209. package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +54 -0
  210. package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +40 -0
  211. package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +40 -0
  212. package/esm2022/lib/smart-generic-pages/projects.mjs +13 -0
  213. package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +80 -0
  214. package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +116 -0
  215. package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +77 -0
  216. package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +93 -0
  217. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +4 -0
  218. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +514 -0
  219. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +40 -0
  220. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +91 -0
  221. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +19 -0
  222. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +7 -0
  223. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +17 -0
  224. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +2 -0
  225. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +20 -0
  226. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +2 -0
  227. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +2 -0
  228. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +2 -0
  229. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +2 -0
  230. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +13 -0
  231. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +18 -0
  232. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +17 -0
  233. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +2 -0
  234. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +2 -0
  235. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +2 -0
  236. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +8 -0
  237. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +15 -0
  238. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +2 -0
  239. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +9 -0
  240. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +20 -0
  241. package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +47 -0
  242. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +72 -0
  243. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +200 -0
  244. package/esm2022/lib/smart-grid/models/model.mjs +29 -0
  245. package/esm2022/lib/smart-grid/projects.mjs +9 -0
  246. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +65 -0
  247. package/esm2022/lib/smart-grid/smart-grid.component.mjs +1035 -0
  248. package/esm2022/lib/smart-grid/smart-grid.module.mjs +103 -0
  249. package/esm2022/lib/smart-grid/smart-grid.service.mjs +92 -0
  250. package/esm2022/lib/smart-icon/projects.mjs +9 -0
  251. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +95 -0
  252. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +40 -0
  253. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +37 -0
  254. package/esm2022/lib/smart-icon/smart-icon.module.mjs +26 -0
  255. package/esm2022/lib/smart-icon/smart-icon.service.mjs +93 -0
  256. package/esm2022/lib/smart-map/abstract-map.mjs +112 -0
  257. package/esm2022/lib/smart-map/api/api/api.mjs +4 -0
  258. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +312 -0
  259. package/esm2022/lib/smart-map/api/api.module.mjs +40 -0
  260. package/esm2022/lib/smart-map/api/configuration.mjs +91 -0
  261. package/esm2022/lib/smart-map/api/encoder.mjs +19 -0
  262. package/esm2022/lib/smart-map/api/index.mjs +7 -0
  263. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +13 -0
  264. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +2 -0
  265. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +2 -0
  266. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +17 -0
  267. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +2 -0
  268. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +19 -0
  269. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +2 -0
  270. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +2 -0
  271. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +2 -0
  272. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +18 -0
  273. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +2 -0
  274. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +2 -0
  275. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +2 -0
  276. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +2 -0
  277. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +17 -0
  278. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +18 -0
  279. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +2 -0
  280. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +17 -0
  281. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +2 -0
  282. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +2 -0
  283. package/esm2022/lib/smart-map/api/model/models.mjs +21 -0
  284. package/esm2022/lib/smart-map/api/param.mjs +2 -0
  285. package/esm2022/lib/smart-map/api/variables.mjs +9 -0
  286. package/esm2022/lib/smart-map/api-default/api-default.mjs +2 -0
  287. package/esm2022/lib/smart-map/impl/google-map.mjs +224 -0
  288. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +422 -0
  289. package/esm2022/lib/smart-map/projects.mjs +9 -0
  290. package/esm2022/lib/smart-map/smart-map.component.mjs +222 -0
  291. package/esm2022/lib/smart-map/smart-map.module.mjs +22 -0
  292. package/esm2022/lib/smart-map/smart-map.types.mjs +2 -0
  293. package/esm2022/lib/smart-navbar/projects.mjs +8 -0
  294. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +61 -0
  295. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +6 -0
  296. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +63 -0
  297. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +14 -0
  298. package/esm2022/lib/smart-navigation/projects.mjs +6 -0
  299. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +2 -0
  300. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +18 -0
  301. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +27 -0
  302. package/esm2022/lib/smart-ng-client.module.mjs +130 -0
  303. package/esm2022/lib/smart-ng-client.service.mjs +19 -0
  304. package/esm2022/lib/smart-subject/projects.mjs +5 -0
  305. package/esm2022/lib/smart-subject/smart-subject.mjs +21 -0
  306. package/esm2022/lib/smart-tab-group/projects.mjs +5 -0
  307. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +22 -0
  308. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +43 -0
  309. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +15 -0
  310. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +52 -0
  311. package/esm2022/lib/smart-table/projects.mjs +8 -0
  312. package/esm2022/lib/smart-table/smarttable.component.mjs +98 -0
  313. package/esm2022/lib/smart-table/smarttable.model.mjs +177 -0
  314. package/esm2022/lib/smart-table/smarttable.module.mjs +109 -0
  315. package/esm2022/lib/smart-table/smarttable.service.mjs +14 -0
  316. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +42 -0
  317. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +23 -0
  318. package/esm2022/lib/smart-table/tables/table.mjs +573 -0
  319. package/esm2022/lib/smart-tree/projects.mjs +9 -0
  320. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +292 -0
  321. package/esm2022/lib/smart-tree/smarttree.component.mjs +187 -0
  322. package/esm2022/lib/smart-tree/smarttree.model.mjs +7 -0
  323. package/esm2022/lib/smart-tree/smarttree.module.mjs +60 -0
  324. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +6 -0
  325. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +2 -0
  326. package/esm2022/lib/smart-tree/smarttree.service.mjs +47 -0
  327. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +1190 -0
  328. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +91 -0
  329. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +19 -0
  330. package/esm2022/lib/smart-tree/tree-api/param.mjs +2 -0
  331. package/esm2022/lib/smart-tree/tree-api/variables.mjs +9 -0
  332. package/esm2022/lib/smart-validation/named-validator.service.mjs +115 -0
  333. package/esm2022/lib/smart-validation/projects.mjs +4 -0
  334. package/esm2022/lib/smart-validation/smart-validation.module.mjs +24 -0
  335. package/esm2022/lib/smart-validation/smart-validation.types.mjs +4 -0
  336. package/esm2022/lib/view-context/api/api/api.mjs +4 -0
  337. package/esm2022/lib/view-context/api/api/view.service.mjs +903 -0
  338. package/esm2022/lib/view-context/api/api-default/binaryData.mjs +2 -0
  339. package/esm2022/lib/view-context/api/api-default/invocationError.mjs +2 -0
  340. package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +2 -0
  341. package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +2 -0
  342. package/esm2022/lib/view-context/api/api.module.mjs +40 -0
  343. package/esm2022/lib/view-context/api/configuration.mjs +91 -0
  344. package/esm2022/lib/view-context/api/encoder.mjs +19 -0
  345. package/esm2022/lib/view-context/api/index.mjs +7 -0
  346. package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +2 -0
  347. package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +13 -0
  348. package/esm2022/lib/view-context/api/model/clipboardData.mjs +13 -0
  349. package/esm2022/lib/view-context/api/model/closeResult.mjs +18 -0
  350. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +2 -0
  351. package/esm2022/lib/view-context/api/model/componentModel.mjs +2 -0
  352. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +13 -0
  353. package/esm2022/lib/view-context/api/model/dataChange.mjs +2 -0
  354. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +2 -0
  355. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +21 -0
  356. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +13 -0
  357. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +13 -0
  358. package/esm2022/lib/view-context/api/model/iconPosition.mjs +21 -0
  359. package/esm2022/lib/view-context/api/model/imageResource.mjs +8 -0
  360. package/esm2022/lib/view-context/api/model/link.mjs +20 -0
  361. package/esm2022/lib/view-context/api/model/messageData.mjs +2 -0
  362. package/esm2022/lib/view-context/api/model/messageOption.mjs +2 -0
  363. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +18 -0
  364. package/esm2022/lib/view-context/api/model/messageResult.mjs +2 -0
  365. package/esm2022/lib/view-context/api/model/messageTextType.mjs +17 -0
  366. package/esm2022/lib/view-context/api/model/messageType.mjs +19 -0
  367. package/esm2022/lib/view-context/api/model/models.mjs +63 -0
  368. package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +13 -0
  369. package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +2 -0
  370. package/esm2022/lib/view-context/api/model/namedValidator.mjs +19 -0
  371. package/esm2022/lib/view-context/api/model/openPendingData.mjs +2 -0
  372. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +2 -0
  373. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +2 -0
  374. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +24 -0
  375. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +2 -0
  376. package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +8 -0
  377. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +13 -0
  378. package/esm2022/lib/view-context/api/model/style.mjs +13 -0
  379. package/esm2022/lib/view-context/api/model/uiAction.mjs +2 -0
  380. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +2 -0
  381. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +27 -0
  382. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +13 -0
  383. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +2 -0
  384. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +2 -0
  385. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +2 -0
  386. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +2 -0
  387. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +20 -0
  388. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +21 -0
  389. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +13 -0
  390. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +13 -0
  391. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +22 -0
  392. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +2 -0
  393. package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +18 -0
  394. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +2 -0
  395. package/esm2022/lib/view-context/api/model/valueSet.mjs +2 -0
  396. package/esm2022/lib/view-context/api/model/view.mjs +2 -0
  397. package/esm2022/lib/view-context/api/model/viewApiError.mjs +13 -0
  398. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +2 -0
  399. package/esm2022/lib/view-context/api/model/viewContext.mjs +2 -0
  400. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +2 -0
  401. package/esm2022/lib/view-context/api/model/viewContextData.mjs +2 -0
  402. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +2 -0
  403. package/esm2022/lib/view-context/api/model/viewData.mjs +2 -0
  404. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +8 -0
  405. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +13 -0
  406. package/esm2022/lib/view-context/api/model/viewState.mjs +22 -0
  407. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +2 -0
  408. package/esm2022/lib/view-context/api/model/viewType.mjs +18 -0
  409. package/esm2022/lib/view-context/api/param.mjs +2 -0
  410. package/esm2022/lib/view-context/api/variables.mjs +9 -0
  411. package/esm2022/lib/view-context/default-view-components.token.mjs +9 -0
  412. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +20 -0
  413. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +93 -0
  414. package/esm2022/lib/view-context/projects.mjs +29 -0
  415. package/esm2022/lib/view-context/property-definition-data.mjs +2 -0
  416. package/esm2022/lib/view-context/reuse-router-slot.token.mjs +4 -0
  417. package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +57 -0
  418. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +199 -0
  419. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +72 -0
  420. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +21 -0
  421. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +30 -0
  422. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +198 -0
  423. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +95 -0
  424. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +134 -0
  425. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +12 -0
  426. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +256 -0
  427. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +77 -0
  428. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +54 -0
  429. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +60 -0
  430. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +106 -0
  431. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +60 -0
  432. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +132 -0
  433. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +58 -0
  434. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +33 -0
  435. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +215 -0
  436. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +319 -0
  437. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +185 -0
  438. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +7 -0
  439. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +235 -0
  440. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +77 -0
  441. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +35 -0
  442. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +74 -0
  443. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +63 -0
  444. package/esm2022/lib/view-context/smart-view-context.model.mjs +2 -0
  445. package/esm2022/lib/view-context/smart-view-context.module.mjs +397 -0
  446. package/esm2022/lib/view-context/smart-view-context.service.mjs +1074 -0
  447. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +41 -0
  448. package/esm2022/lib/view-context/utility/componentLibrary.mjs +9 -0
  449. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +44 -0
  450. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +68 -0
  451. package/esm2022/lib/view-context/value-api/api/api.mjs +4 -0
  452. package/esm2022/lib/view-context/value-api/api/value.service.mjs +138 -0
  453. package/esm2022/lib/view-context/value-api/api.module.mjs +40 -0
  454. package/esm2022/lib/view-context/value-api/configuration.mjs +91 -0
  455. package/esm2022/lib/view-context/value-api/encoder.mjs +19 -0
  456. package/esm2022/lib/view-context/value-api/index.mjs +7 -0
  457. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +13 -0
  458. package/esm2022/lib/view-context/value-api/model/models.mjs +11 -0
  459. package/esm2022/lib/view-context/value-api/model/value.mjs +13 -0
  460. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +2 -0
  461. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +2 -0
  462. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +2 -0
  463. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +13 -0
  464. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +24 -0
  465. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +2 -0
  466. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +2 -0
  467. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +19 -0
  468. package/esm2022/lib/view-context/value-api/param.mjs +2 -0
  469. package/esm2022/lib/view-context/value-api/variables.mjs +9 -0
  470. package/esm2022/lib/view-context/view-handler-resolution.mjs +21 -0
  471. package/esm2022/lib/view-context/view-op.mjs +41 -0
  472. package/esm2022/lib/view-context/view-slot-resolution.mjs +28 -0
  473. package/esm2022/projects.mjs +30 -0
  474. package/esm2022/smartbit4all-ng-client.mjs +5 -0
  475. package/fesm2022/smartbit4all-ng-client.mjs +8990 -4553
  476. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  477. package/lib/session/api/model/accountInfo.d.ts +2 -0
  478. package/lib/session/projects.d.ts +3 -0
  479. package/lib/session/smart-backend-bootstrap.config.d.ts +65 -0
  480. package/lib/session/smart-backend-bootstrap.service.d.ts +55 -0
  481. package/lib/session/smart-default-error-ui.service.d.ts +90 -0
  482. package/lib/session/smart-error-catching.interceptor.d.ts +4 -1
  483. package/lib/session/smart-session-handler.service.d.ts +2 -1
  484. package/lib/session/smart-session.service.d.ts +16 -1
  485. package/lib/session/smart-timer/smart-session-timer.component.d.ts +3 -1
  486. package/lib/smart-client/projects.d.ts +0 -1
  487. package/lib/smart-client/smart-component-api-client.d.ts +45 -19
  488. package/lib/smart-client/smart.component.d.ts +7 -5
  489. package/lib/smart-client/smart.service.d.ts +4 -5
  490. package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +3 -1
  491. package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +19 -0
  492. package/lib/smart-component-layout/api/model/models.d.ts +3 -0
  493. package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +2 -0
  494. package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +6 -0
  495. package/{src/lib/smart-chart/smart-chart/api/model/chartData.d.ts → lib/smart-component-layout/api/model/toolbarDirection.d.ts} +5 -6
  496. package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +16 -0
  497. package/lib/smart-component-layout/smart-component-layout-utility.d.ts +9 -1
  498. package/lib/smart-component-layout/smart-component-layout.component.d.ts +31 -5
  499. package/lib/smart-component-layout/smart-component-layout.module.d.ts +4 -1
  500. package/lib/smart-diagram/api/api/api.d.ts +3 -0
  501. package/lib/smart-diagram/api/api/diagramService.service.d.ts +36 -0
  502. package/lib/smart-diagram/api/encoder.d.ts +11 -0
  503. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramColor.d.ts +2 -2
  504. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataContainer.d.ts +2 -3
  505. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataItem.d.ts +3 -3
  506. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataSet.d.ts +4 -4
  507. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDescriptor.d.ts +13 -9
  508. package/{src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.d.ts → lib/smart-diagram/api/model/diagramModel.d.ts} +5 -4
  509. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramShape.d.ts +2 -2
  510. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/drawTime.d.ts +2 -2
  511. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/labelText.d.ts +2 -2
  512. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/models.d.ts +1 -2
  513. package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +33 -0
  514. package/lib/smart-diagram/component/smart-diagram.component.d.ts +43 -0
  515. package/lib/smart-diagram/component/smart-diagram.module.d.ts +11 -0
  516. package/lib/smart-diagram/component/smart-diagram.util.d.ts +1 -0
  517. package/lib/smart-diagram/projects.d.ts +4 -0
  518. package/lib/smart-dialog/smartdialog.model.d.ts +2 -1
  519. package/lib/smart-dialog/smartdialog.module.d.ts +1 -2
  520. package/lib/smart-dialog/smartdialog.service.d.ts +1 -3
  521. package/lib/smart-expandable-section/expandable-section.component.d.ts +3 -1
  522. package/lib/smart-expandable-section/expandable-section.model.d.ts +1 -0
  523. package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +2 -1
  524. package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +4 -2
  525. package/{src/lib/smart-chart/smart-chart/api/model/chartOrientation.d.ts → lib/smart-form/api/model/dateFieldProperties.d.ts} +6 -7
  526. package/lib/smart-form/api/model/fileUploaderProperties.d.ts +20 -0
  527. package/lib/smart-form/api/model/imageProperties.d.ts +15 -0
  528. package/lib/smart-form/api/model/models.d.ts +7 -0
  529. package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +19 -0
  530. package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +20 -0
  531. package/lib/smart-form/api/model/selectionDefinition.d.ts +17 -0
  532. package/lib/smart-form/api/model/smartFormWidgetType.d.ts +4 -1
  533. package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +5 -0
  534. package/lib/smart-form/api/model/textBoxProperties.d.ts +15 -0
  535. package/{src/lib/smart-chart/smart-chart/api/model/chartValue.d.ts → lib/smart-form/api/model/textFieldProperties.d.ts} +4 -6
  536. package/lib/smart-form/api/model/valueChangeMode.d.ts +3 -2
  537. package/lib/smart-form/projects.d.ts +3 -0
  538. package/lib/smart-form/services/smartform.layout-definition.service.d.ts +6 -2
  539. package/lib/smart-form/services/smartform.service.d.ts +3 -2
  540. package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +19 -3
  541. package/lib/smart-form/smartform.component.d.ts +3 -2
  542. package/lib/smart-form/smartform.form-model.d.ts +160 -11
  543. package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +54 -0
  544. package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +57 -0
  545. package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +50 -0
  546. package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +38 -7
  547. package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +21 -0
  548. package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +18 -0
  549. package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +54 -0
  550. package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +19 -0
  551. package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +24 -0
  552. package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +2 -0
  553. package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +27 -0
  554. package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +14 -0
  555. package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +17 -0
  556. package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +18 -0
  557. package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +12 -0
  558. package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +11 -0
  559. package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +11 -0
  560. package/lib/smart-generic-pages/projects.d.ts +9 -0
  561. package/lib/smart-generic-pages/search-page/search-page.component.d.ts +25 -0
  562. package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +19 -0
  563. package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +17 -0
  564. package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +25 -0
  565. package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +27 -6
  566. package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +4 -0
  567. package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +2 -2
  568. package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +2 -0
  569. package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +6 -0
  570. package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +21 -0
  571. package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +1 -0
  572. package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +1 -0
  573. package/lib/smart-grid/smart-grid-toolbar-util.d.ts +1 -0
  574. package/lib/smart-grid/smart-grid.component.d.ts +20 -6
  575. package/lib/smart-grid/smart-grid.module.d.ts +20 -21
  576. package/lib/smart-grid/smart-grid.service.d.ts +2 -0
  577. package/lib/smart-icon/projects.d.ts +2 -0
  578. package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +10 -4
  579. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +12 -0
  580. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +14 -0
  581. package/lib/smart-icon/smart-icon.module.d.ts +8 -5
  582. package/lib/smart-map/abstract-map.d.ts +1 -1
  583. package/lib/smart-navigation/smart-navigation.interface.d.ts +1 -7
  584. package/lib/smart-navigation/smart-navigation.service.d.ts +2 -8
  585. package/lib/smart-ng-client.module.d.ts +3 -4
  586. package/lib/smart-tab-group/projects.d.ts +0 -4
  587. package/lib/smart-tab-group/smart-tab-group.module.d.ts +5 -8
  588. package/lib/smart-table/tables/material-table/material-table.component.d.ts +2 -3
  589. package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +1 -2
  590. package/lib/smart-table/tables/table.d.ts +5 -5
  591. package/lib/smart-tree/smarttree-generic.service.d.ts +0 -1
  592. package/lib/smart-tree/smarttree.component.d.ts +1 -0
  593. package/lib/smart-tree/smarttree.model.d.ts +1 -0
  594. package/lib/smart-tree/smarttree.service.d.ts +1 -0
  595. package/lib/view-context/api/api/view.service.d.ts +14 -13
  596. package/lib/view-context/api/api-default/invocationRun.d.ts +2 -0
  597. package/lib/view-context/api/model/backgroundProcessInfo.d.ts +25 -0
  598. package/lib/view-context/api/model/componentModel.d.ts +5 -0
  599. package/lib/view-context/api/model/deviceInfo.d.ts +4 -0
  600. package/lib/view-context/api/model/iconPosition.d.ts +2 -1
  601. package/lib/view-context/api/model/imageResource.d.ts +2 -0
  602. package/lib/view-context/api/model/messageOption.d.ts +2 -0
  603. package/lib/view-context/api/model/models.d.ts +6 -0
  604. package/lib/view-context/api/model/multiComboBoxElement.d.ts +16 -0
  605. package/lib/view-context/api/model/multiComboBoxModel.d.ts +16 -0
  606. package/lib/view-context/api/model/namedValidator.d.ts +1 -0
  607. package/lib/view-context/api/model/smartLinkData.d.ts +3 -0
  608. package/lib/view-context/api/model/uiAction.d.ts +8 -0
  609. package/lib/view-context/api/model/uiActionDefinition.d.ts +19 -0
  610. package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +18 -0
  611. package/lib/view-context/api/model/uiActionDescriptor.d.ts +4 -0
  612. package/lib/view-context/api/model/uiActionRequest.d.ts +3 -0
  613. package/lib/view-context/api/model/uiActionSchedule.d.ts +14 -0
  614. package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +2 -0
  615. package/lib/view-context/api/model/view.d.ts +7 -0
  616. package/lib/view-context/api/model/viewContext.d.ts +1 -0
  617. package/lib/view-context/api/model/viewData.d.ts +2 -0
  618. package/lib/view-context/api/model/viewEventHandler.d.ts +5 -0
  619. package/lib/view-context/api/model/viewPlaceholder.d.ts +1 -0
  620. package/lib/view-context/default-view-components.token.d.ts +18 -0
  621. package/lib/view-context/message-dialog/message-dialog.component.d.ts +1 -0
  622. package/lib/view-context/projects.d.ts +8 -3
  623. package/lib/view-context/reuse-router-slot.token.d.ts +3 -0
  624. package/lib/view-context/smart-embedded-slot.directive.d.ts +20 -0
  625. package/lib/view-context/smart-ui-action/components/menu/menu.component.d.ts +6 -2
  626. package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +32 -0
  627. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +40 -0
  628. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +3 -0
  629. package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/voice-record-widget/voice-record-widget.component.d.ts +15 -6
  630. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +1 -2
  631. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +2 -16
  632. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +3 -3
  633. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +1 -2
  634. package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +13 -0
  635. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +14 -7
  636. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +27 -3
  637. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +4 -3
  638. package/lib/view-context/smart-view-context-dialog.service.d.ts +1 -3
  639. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +1 -2
  640. package/lib/view-context/smart-view-context.model.d.ts +7 -2
  641. package/lib/view-context/smart-view-context.module.d.ts +74 -65
  642. package/lib/view-context/smart-view-context.service.d.ts +55 -8
  643. package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +3 -1
  644. package/lib/view-context/view-handler-resolution.d.ts +11 -0
  645. package/lib/view-context/view-op.d.ts +18 -0
  646. package/lib/view-context/view-slot-resolution.d.ts +27 -0
  647. package/package.json +16 -18
  648. package/projects.d.ts +2 -0
  649. package/smartbit4all-ng-client-6.0.1.tgz +0 -0
  650. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -686
  651. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +0 -1
  652. package/lib/smart-client/smart-authentication.service.d.ts +0 -15
  653. package/lib/smart-tab-group/smart-tab-group.component.d.ts +0 -21
  654. package/lib/smart-tab-group/smart-tab-group.service.d.ts +0 -6
  655. package/lib/smart-tab-group/tab-content/tab-content.component.d.ts +0 -14
  656. package/lib/smart-tab-group/tab-group-simplified/tab-group.component.d.ts +0 -29
  657. package/lib/smart-tab-group/tabTile.model.d.ts +0 -8
  658. package/lib/view-context/smart-ui-action/components/action-badge/action-badge.component.d.ts +0 -12
  659. package/smartbit4all-ng-client-5.0.21.tgz +0 -0
  660. package/src/lib/smart-chart/index.d.ts +0 -5
  661. package/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.d.ts +0 -37
  662. package/src/lib/smart-chart/smart-chart/api/model/chartType.d.ts +0 -21
  663. package/src/lib/smart-chart/smart-chart/api/model/models.d.ts +0 -6
  664. package/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.d.ts +0 -16
  665. package/src/lib/smart-chart/smart-chart/default-chart-options.provider.d.ts +0 -31
  666. package/src/lib/smart-chart/smart-chart/smart-chart.component.d.ts +0 -33
  667. package/src/lib/smart-chart/smart-chart/smart-chart.module.d.ts +0 -11
  668. package/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.d.ts +0 -1
  669. package/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.d.ts +0 -21
  670. package/src/lib/smart-chart/smart-chart-projects.d.ts +0 -5
  671. package/src/lib/smart-chart/view-context/utility/componentLibrary.d.ts +0 -6
  672. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/api.module.d.ts +0 -0
  673. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/configuration.d.ts +0 -0
  674. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/index.d.ts +0 -0
  675. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/param.d.ts +0 -0
  676. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/variables.d.ts +0 -0
  677. /package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/photo-capture-widget/photo-capture-widget.component.d.ts +0 -0
@@ -0,0 +1,934 @@
1
+ import { ChangeDetectorRef } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { DynamicDialogConfig } from 'primeng/dynamicdialog';
5
+ import { SmartComponentLayoutUtility, } from '../smart-component-layout/projects';
6
+ import { SmartDiagramComponent } from '../smart-diagram/projects';
7
+ import { SmartFilterEditorContentComponent } from '../smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component';
8
+ import { SmartFormWidgetType, ValueChangeMode, } from '../smart-form/projects';
9
+ import { SmartGridComponent } from '../smart-grid/projects';
10
+ import { SmartMapComponent } from '../smart-map/smart-map.component';
11
+ import { SmartSubject } from '../smart-subject/projects';
12
+ import { SmarttreeGenericService, SmarttreeService, } from '../smart-tree/projects';
13
+ import { DataChangeKind, SmartViewContextService, UiActionDescriptorService, UiActionService, } from '../view-context/projects';
14
+ import { SmartStyleUtility } from '../view-context/utility/smart-style-utility';
15
+ import { SmartBackendBootstrapService, ViewContextRebuiltError, } from '../session/smart-backend-bootstrap.service';
16
+ export class SmartComponentApiClient {
17
+ get uuid() {
18
+ return this._uuid;
19
+ }
20
+ set uuid(uuid) {
21
+ if (this._uuid === uuid) {
22
+ return;
23
+ }
24
+ let firstUuid = true;
25
+ if (this.uuid) {
26
+ this.viewContext.unfollow(this.uuid);
27
+ firstUuid = false;
28
+ }
29
+ this._uuid = uuid;
30
+ if (this.getSmartComponentLayoutsQL()) {
31
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
32
+ SmartComponentLayoutUtility.setUuid(comp, uuid);
33
+ });
34
+ }
35
+ this.getWidgets().forEach((ref, key) => {
36
+ if (ref instanceof SmartGridComponent) {
37
+ ref.uuid = this.componentModelLoaded ? uuid : undefined;
38
+ }
39
+ else if (ref instanceof SmartFilterEditorContentComponent) {
40
+ ref.service.config.uuid = this.componentModelLoaded ? uuid : undefined;
41
+ }
42
+ else if (ref instanceof SmartDiagramComponent) {
43
+ ref.uuid = this.componentModelLoaded ? uuid : undefined;
44
+ // } else if (ref instanceof SmartMapComponent) {
45
+ // ref.uuid = this.componentModelLoaded ? uuid : undefined;
46
+ }
47
+ else if (!ref && !firstUuid) {
48
+ console.error(`Provided reference for ${key} is undefined on uuid change.`);
49
+ }
50
+ });
51
+ if (uuid) {
52
+ this.viewContext.follow(this._uuid, this.detectChange);
53
+ this.onUuidResolved(uuid);
54
+ }
55
+ }
56
+ get model() {
57
+ return this._model;
58
+ }
59
+ set model(model) {
60
+ this._model = model;
61
+ this.initComponentByModel();
62
+ }
63
+ get data() {
64
+ return this._data;
65
+ }
66
+ set data(model) {
67
+ this._data = model;
68
+ this.dataChanged.next();
69
+ }
70
+ get smartTreeService() {
71
+ return this._smartTreeService;
72
+ }
73
+ set smartTreeService(smartTreeService) {
74
+ if (this._smartTreeService !== undefined) {
75
+ throw Error('The default tree has already set up!');
76
+ }
77
+ this._smartTreeService = smartTreeService;
78
+ }
79
+ get useQueryLists() {
80
+ return this._useQueryLists;
81
+ }
82
+ set useQueryLists(value) {
83
+ if (value !== true) {
84
+ console.error('useQueryLists cannot be set');
85
+ return;
86
+ }
87
+ this._useQueryLists = true;
88
+ }
89
+ constructor(inject, pageName, _componentName, element, renderer) {
90
+ this.inject = inject;
91
+ this.pageName = pageName;
92
+ this._componentName = _componentName;
93
+ this.element = element;
94
+ this.renderer = renderer;
95
+ this._destroy$ = new Subject();
96
+ this.detectChange = new SmartSubject(this._destroy$);
97
+ this.componentModelLoaded = false;
98
+ this.uiActionModels = [];
99
+ this.dataChanged = new SmartSubject(this._destroy$);
100
+ // Contained Widgets
101
+ this.widgets = new Map();
102
+ this.formWidgets = new Map();
103
+ this._useQueryLists = true;
104
+ this.sendModelOnWidgetAction = false;
105
+ this.inmediateDataChangeKeys = [];
106
+ this.blurDataChangeKeys = [];
107
+ this.dataChangeActionHandlers = new Map();
108
+ this.filterModelChangeSubjects = new Map();
109
+ // check and calculate pageName
110
+ if (!this.pageName && !this._componentName) {
111
+ throw new Error('pageName or componentName must be specified!');
112
+ }
113
+ this.viewContext = inject.get(SmartViewContextService);
114
+ this.bootstrap = inject.get(SmartBackendBootstrapService);
115
+ if (this._componentName) {
116
+ let pageNameForComponent = this.viewContext.getPageNameOfComponent(this._componentName);
117
+ if (!this.pageName) {
118
+ this.pageName = pageNameForComponent;
119
+ }
120
+ else if (this.pageName !== pageNameForComponent) {
121
+ throw new Error(`pageName (${pageName}) and componentName (${_componentName}) doesn't match!`);
122
+ }
123
+ }
124
+ // from this point we have this.pageName
125
+ this.detectChange.subscribe((change) => {
126
+ this.handleChanges(change);
127
+ });
128
+ this.uiActionService = inject.get(UiActionService);
129
+ this.uiActionDescriptorService = inject.get(UiActionDescriptorService);
130
+ }
131
+ _ngOnInit() {
132
+ this.run();
133
+ }
134
+ _ngOnDestroy() {
135
+ this.viewContext.unfollow(this.uuid);
136
+ this.widgets.clear();
137
+ this.formWidgets.clear();
138
+ this.dataChangeActionHandlers.clear();
139
+ this.filterModelChangeSubjects.clear();
140
+ this._destroy$.next();
141
+ this._destroy$.complete();
142
+ }
143
+ /**
144
+ * Called whenever this component's uuid is set to a non-null value (it may
145
+ * fire more than once if the uuid changes). Default: no-op.
146
+ * Consumers that resolved their uuid in the constructor (e.g. filter config)
147
+ * override this to defer that wiring until the uuid is injected — required for
148
+ * dynamic default components whose uuid is not known at construction. (#28870)
149
+ */
150
+ onUuidResolved(uuid) { }
151
+ _ngAfterViewInit() {
152
+ this.changeDetector = this.inject.get(ChangeDetectorRef);
153
+ if (this.useQueryLists) {
154
+ if (!this.getSmartComponentLayoutsQL()) {
155
+ console.warn('SmartComponentLayoutsQL not available!');
156
+ }
157
+ else {
158
+ this.handleQueryList(this.getSmartComponentLayoutsQL(), (comp) => {
159
+ if (this.uuid && this.uuid !== comp.uuid) {
160
+ comp.updateUuid(this.uuid);
161
+ }
162
+ SmartComponentLayoutUtility.getGrids(comp).forEach((grid) => this.setupGridServices(grid));
163
+ if (comp.smartComponentLayout) {
164
+ this.initActions();
165
+ this.handleLayoutUploadCallback(comp);
166
+ }
167
+ });
168
+ // for handling embedded forms
169
+ this.handleQueryList(this.getSmartComponentLayoutsQL(), (form) => {
170
+ this.handleDataChangeSubscriptions();
171
+ this.handleLayoutUploadCallback(form);
172
+ });
173
+ }
174
+ if (!this.getSmartFormsQL()) {
175
+ console.warn('getSmartFormsQL not available!');
176
+ }
177
+ else {
178
+ this.handleQueryList(this.getSmartFormsQL(), (form) => {
179
+ this.handleDataChangeSubscriptions();
180
+ this.handleUploadCallback(form);
181
+ });
182
+ }
183
+ if (!this.getSmartGridsQL()) {
184
+ console.warn('SmartGridsQL not available!');
185
+ }
186
+ else {
187
+ this.handleQueryList(this.getSmartGridsQL(), (grid) => {
188
+ if (grid) {
189
+ if (grid.smartGrid) {
190
+ this.setupGridServices(grid);
191
+ grid.setupToolbar();
192
+ if (grid.toolbar || grid.headerToolbar) {
193
+ this.initActions();
194
+ }
195
+ }
196
+ if (this.uuid && this.uuid !== grid.uuid) {
197
+ grid.uuid = this.uuid;
198
+ }
199
+ }
200
+ });
201
+ }
202
+ if (!this.getSmartMapQL()) {
203
+ console.warn('SmartMapsQL is not available!');
204
+ }
205
+ else {
206
+ this.handleQueryList(this.getSmartMapQL(), (map) => {
207
+ map.viewContextService = this.viewContext;
208
+ if (this.uuid && this.uuid !== map.uuid) {
209
+ map.uuid = this.uuid;
210
+ }
211
+ });
212
+ }
213
+ if (!this.getSmartFilterEditorContentComponentsQL()) {
214
+ console.warn('SmartFilterEditorContentComponentsQL not available!');
215
+ }
216
+ else {
217
+ this.handleQueryList(this.getSmartFilterEditorContentComponentsQL(), (filterComp) => {
218
+ if (filterComp) {
219
+ if (filterComp.service) {
220
+ this.setupFilterServices(filterComp);
221
+ let service = filterComp.service;
222
+ let identifier = service.config.identifier;
223
+ if (identifier && !this.filterModelChangeSubjects.has(identifier)) {
224
+ this.filterModelChangeSubjects.set(identifier, service.modelChanged);
225
+ service.modelChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
226
+ if (this.getAllFilterUiActionToolbars().length > 0) {
227
+ this.initActions();
228
+ }
229
+ });
230
+ }
231
+ }
232
+ }
233
+ });
234
+ }
235
+ }
236
+ }
237
+ setupGridServices(grid) {
238
+ if (grid.smartGrid) {
239
+ if (!grid.smartGrid.uiActionService) {
240
+ grid.smartGrid.uiActionService = this.uiActionService;
241
+ }
242
+ if (!grid.smartGrid.uiActionDescriptorService) {
243
+ grid.smartGrid.uiActionDescriptorService = this.uiActionDescriptorService;
244
+ }
245
+ if (!grid.smartGrid.serviceToUse) {
246
+ grid.smartGrid.serviceToUse = this;
247
+ }
248
+ if (!grid.smartGrid.viewContextService) {
249
+ grid.smartGrid.viewContextService = this.viewContext;
250
+ }
251
+ }
252
+ }
253
+ setupFilterServices(filterComp) {
254
+ if (filterComp.service) {
255
+ let service = filterComp.service;
256
+ service.parentSmartComponent = this;
257
+ if (this.uuid && this.uuid !== service.config.uuid) {
258
+ service.config.uuid = this.uuid;
259
+ }
260
+ }
261
+ }
262
+ handleQueryListSimple(ql, handler) {
263
+ handler();
264
+ ql.changes.pipe(takeUntil(this._destroy$)).subscribe(() => handler());
265
+ }
266
+ handleQueryList(ql, handler) {
267
+ ql.forEach((el) => handler(el));
268
+ ql.changes
269
+ .pipe(takeUntil(this._destroy$))
270
+ .subscribe((list) => list.forEach((el) => handler(el)));
271
+ }
272
+ getWidgets() {
273
+ if (this.useQueryLists) {
274
+ let widgets = new Map();
275
+ this.getAllSmartGridComponents()
276
+ .filter((grid) => (grid?.smartGrid?.gridIdentifier ? true : false))
277
+ .forEach((grid) => widgets.set(grid.smartGrid.gridIdentifier, grid));
278
+ // Key trees by their treeId (set in the service constructor), NOT by
279
+ // smartTreeModel.identifier (only set after the first successful syncTree). A tree
280
+ // that exists but has not finished its initial download would otherwise be absent
281
+ // from the widget map, so a push update could not resolve it
282
+ // ("Provided reference for <treeId> is undefined"). treeId equals the backend
283
+ // widget identifier, so push routing matches regardless of download timing. (#28361)
284
+ this.getAllSmartTreeComponents()
285
+ .filter((tree) => !!tree?.treeId)
286
+ .forEach((tree) => widgets.set(tree.treeId, tree));
287
+ this.getAllSmartFilterEditorContentComponents()
288
+ .filter((filter) => (filter.service.config.identifier ? true : false))
289
+ .forEach((filter) => widgets.set(filter.service.config.identifier, filter));
290
+ this.getAllSmartMapComponents()
291
+ .filter((map) => !!map.identifier)
292
+ .forEach((map) => widgets.set(map.identifier, map));
293
+ this.getAllSmartDiagramComponents()
294
+ .filter((diagram) => !!diagram.identifier)
295
+ .forEach((diagram) => widgets.set(diagram.identifier, diagram));
296
+ return widgets;
297
+ }
298
+ return this.widgets;
299
+ }
300
+ initComponentByModel() {
301
+ SmartStyleUtility.applyStyle(this.model?.style, this.element, this.renderer);
302
+ SmartStyleUtility.applyStyle(this.model?.parentStyle, this.element, this.renderer, true);
303
+ this.initData();
304
+ if (this.useQueryLists) {
305
+ this.getAllSmartFormComponents()?.forEach((form) => {
306
+ if (form.smartForm) {
307
+ form.smartForm.componentModel = this.model;
308
+ // uses data, valueSets, constraints
309
+ form.constructForm();
310
+ this.handleUploadCallback(form);
311
+ }
312
+ });
313
+ }
314
+ this.changeDetector?.detectChanges();
315
+ this.initActions();
316
+ // TODO: layout, widgets
317
+ }
318
+ getAllSmartFormComponents() {
319
+ let forms = this.getSmartFormsQL()?.toArray() ?? [];
320
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
321
+ forms.push(...SmartComponentLayoutUtility.getForms(comp));
322
+ });
323
+ return forms;
324
+ }
325
+ getAllSmartGridComponents() {
326
+ let grids = this.getSmartGridsQL()?.toArray() ?? [];
327
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
328
+ grids.push(...SmartComponentLayoutUtility.getGrids(comp));
329
+ });
330
+ return grids;
331
+ }
332
+ getAllSmartMapComponents() {
333
+ const maps = this.getSmartMapQL()?.toArray() ?? [];
334
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
335
+ maps.push(...SmartComponentLayoutUtility.getMaps(comp));
336
+ });
337
+ return maps;
338
+ }
339
+ getAllSmartDiagramComponents() {
340
+ const maps = this.getSmartDiagramQL()?.toArray() ?? [];
341
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
342
+ maps.push(...SmartComponentLayoutUtility.getDiagrams(comp));
343
+ });
344
+ return maps;
345
+ }
346
+ getAllSmartTreeComponents() {
347
+ let trees = this.getSmartTreesQL()
348
+ ?.toArray()
349
+ .map((tree) => tree.treeService) ?? [];
350
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
351
+ trees.push(...SmartComponentLayoutUtility.getTrees(comp));
352
+ });
353
+ return trees;
354
+ }
355
+ getAllSmartFilterEditorContentComponents() {
356
+ let filters = this.getSmartFilterEditorContentComponentsQL()?.toArray() ?? [];
357
+ return filters;
358
+ }
359
+ getAllSmartUiActionToolbars() {
360
+ let toolbars = this.getSmartUiActionToolbarsQL()?.toArray() ?? [];
361
+ this.getAllSmartGridComponents()?.forEach((grid) => {
362
+ if (grid.toolbar) {
363
+ toolbars.push(grid.toolbar);
364
+ }
365
+ if (grid.headerToolbar) {
366
+ toolbars.push(grid.headerToolbar);
367
+ }
368
+ });
369
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
370
+ toolbars.push(...SmartComponentLayoutUtility.getToolbars(comp));
371
+ });
372
+ this.getAllSmartFormComponents()
373
+ ?.flatMap((form) => form.getToolbars())
374
+ .filter((toolbar) => toolbar !== undefined || toolbar !== null)
375
+ .forEach((toolbar) => toolbars.push(toolbar));
376
+ this.getAllFilterUiActionToolbars().forEach((toolbar) => toolbars.push(toolbar));
377
+ return toolbars;
378
+ }
379
+ getAllFilterUiActionToolbars() {
380
+ return this.getAllSmartFilterEditorContentComponents()
381
+ .flatMap((filter) => filter.simpleFilterRef?.instance !== undefined
382
+ ? filter.simpleFilterRef?.instance.getToolbars()
383
+ : filter.service.getComplexToolbars())
384
+ .filter((toolbar) => toolbar !== undefined || toolbar !== null)
385
+ .map((toolbar) => toolbar);
386
+ }
387
+ initData() {
388
+ if (this.model?.data) {
389
+ this.data = this.model?.data;
390
+ }
391
+ }
392
+ initActions() {
393
+ if (this.model?.actions) {
394
+ let uiActionModels = this.model?.actions.map((uiAction) => {
395
+ return {
396
+ serviceToUse: this,
397
+ uiAction,
398
+ };
399
+ });
400
+ const allToolbars = this.getAllSmartUiActionToolbars();
401
+ let toolbars = allToolbars.filter((toolbar) => toolbar.id);
402
+ let toolbarsWithoutId = this.getAllSmartUiActionToolbars().filter((toolbar) => toolbar.id === undefined || toolbar.id === null);
403
+ let toolbarModels = new Map();
404
+ toolbars.forEach((toolbar) => {
405
+ toolbarModels.set(toolbar.id, []);
406
+ });
407
+ let globalUiActionModels = [];
408
+ uiActionModels.forEach((action) => {
409
+ let actionModel = globalUiActionModels;
410
+ let toolbarId = action.uiAction.toolbar;
411
+ if (toolbarId && toolbarModels.has(toolbarId)) {
412
+ actionModel = toolbarModels.get(toolbarId);
413
+ }
414
+ if (!actionModel) {
415
+ actionModel = globalUiActionModels;
416
+ }
417
+ actionModel.push(action);
418
+ });
419
+ this.uiActionModels = globalUiActionModels;
420
+ this.setupAllToolbars(toolbars, toolbarsWithoutId, toolbarModels)
421
+ .then(() => {
422
+ this.changeDetector?.detectChanges();
423
+ })
424
+ .catch((error) => {
425
+ console.error('Error during setup:', error);
426
+ });
427
+ }
428
+ }
429
+ async setupAllToolbars(toolbars, toolbarsWithoutId, toolbarModels) {
430
+ const setupPromises = [];
431
+ toolbars.forEach((toolbar) => {
432
+ toolbar.uiActionModels = toolbarModels.get(toolbar.id);
433
+ setupPromises.push(toolbar.setUp());
434
+ });
435
+ toolbarsWithoutId.forEach((toolbar) => {
436
+ setupPromises.push(toolbar.setUp());
437
+ });
438
+ await Promise.all(setupPromises);
439
+ }
440
+ async run() {
441
+ try {
442
+ await this.bootstrap.whenReady();
443
+ await this.load();
444
+ }
445
+ catch (err) {
446
+ if (err instanceof ViewContextRebuiltError) {
447
+ // Normal flow: the viewcontext was rebuilt while we were queued in
448
+ // whenReady(). A fresh uuid arrives via uuidOfPageHasBeenChanged
449
+ // (NORMAL views) or the component is recreated by openView
450
+ // (EMBEDDED/DIALOG). Nothing to surface.
451
+ console.debug('Skipping load: viewcontext was rebuilt while waiting.');
452
+ return;
453
+ }
454
+ console.error('SmartBackendBootstrapService is not ready; skipping load.', err);
455
+ }
456
+ }
457
+ async load() {
458
+ this.componentModelLoaded = false;
459
+ // Slot-hosted views (NORMAL/EMBEDDED) get their uuid injected at creation. DIALOG views
460
+ // are NOT slot-hosted, so they still resolve their uuid via the pageName -> getUuidOfPage
461
+ // shim (set by openView's DIALOG branch). Part of the retained page-uuid shim (#28870).
462
+ const uuid = this._uuid ?? this.readDialogDataUuid() ?? this.viewContext.getUuidOfPage(this.pageName);
463
+ // console.log('[Embedded] load()', {
464
+ // pageName: this.pageName,
465
+ // _uuid: this._uuid,
466
+ // resolvedUuid: uuid,
467
+ // });
468
+ // this.model = await this.viewContext.load(this.uuid);
469
+ const change = await this.viewContext.load2(uuid);
470
+ this.componentModelLoaded = true;
471
+ this.uuid = uuid;
472
+ this.model = change.result;
473
+ if (this.model.widgets) {
474
+ // grids are already loaded in setUuid()
475
+ this.handleChangeWidgets(this.model.widgets, true);
476
+ }
477
+ }
478
+ async executeUiAction(uiAction, options) {
479
+ const uiActionModel = {
480
+ serviceToUse: this,
481
+ uiAction: uiAction,
482
+ };
483
+ await this.uiActionService.execute(uiAction, uiActionModel, options);
484
+ }
485
+ addDataChangeActionHandler(key, valueChangeMode) {
486
+ const changeKeys = this.getChangeKeys(valueChangeMode);
487
+ if (!changeKeys.includes(key)) {
488
+ changeKeys.push(key);
489
+ }
490
+ }
491
+ getChangeKeys(valueChangeMode) {
492
+ return valueChangeMode === ValueChangeMode.IMMEDIATE_ACTION
493
+ ? this.inmediateDataChangeKeys
494
+ : this.blurDataChangeKeys;
495
+ }
496
+ removeDataChangeActionHandler(key) {
497
+ let inmediateIdx = this.inmediateDataChangeKeys.indexOf(key);
498
+ if (inmediateIdx >= 0) {
499
+ this.inmediateDataChangeKeys.splice(inmediateIdx, 1);
500
+ }
501
+ let blurIdx = this.blurDataChangeKeys.indexOf(key);
502
+ if (blurIdx >= 0) {
503
+ this.inmediateDataChangeKeys.splice(blurIdx, 1);
504
+ }
505
+ }
506
+ dataChangeActionHandler(event, valueChangeMode) {
507
+ const changeKeys = this.getChangeKeys(valueChangeMode);
508
+ if (changeKeys.includes(event.key)) {
509
+ this.executeUiAction({
510
+ code: event.key,
511
+ model: true,
512
+ params: {
513
+ item: event.value,
514
+ },
515
+ });
516
+ }
517
+ }
518
+ handleLayoutUploadCallback(comp) {
519
+ SmartComponentLayoutUtility.getForms(comp).forEach((form) => {
520
+ this.handleUploadCallback(form);
521
+ });
522
+ }
523
+ handleUploadCallback(form) {
524
+ form.smartWidgetsQL?.forEach((widget) => {
525
+ if (widget.widgetInstance.type === SmartFormWidgetType.FILE_UPLOADER ||
526
+ widget.widgetInstance.type === SmartFormWidgetType.MULTI_FILE_UPLOADER ||
527
+ widget.widgetInstance.type === SmartFormWidgetType.RECORDING_UPLOADER) {
528
+ widget.smartComponent = this;
529
+ }
530
+ });
531
+ }
532
+ handleFormSubscriptions(form) {
533
+ form.smartForm?.widgets.forEach((widget) => {
534
+ if (widget.key) {
535
+ if (widget.valueChangeMode === ValueChangeMode.IMMEDIATE_ACTION ||
536
+ widget.valueChangeMode === ValueChangeMode.BLUR) {
537
+ this.addDataChangeActionHandler(widget.key, widget.valueChangeMode);
538
+ }
539
+ else {
540
+ this.removeDataChangeActionHandler(widget.key);
541
+ }
542
+ }
543
+ });
544
+ if (!this.dataChangeActionHandlers.has(form)) {
545
+ let inmediateValueChangeSub = form.sophisticatedValueChange
546
+ .pipe(takeUntil(this._destroy$))
547
+ .subscribe((event) => {
548
+ this.dataChangeActionHandler(event, ValueChangeMode.IMMEDIATE_ACTION);
549
+ });
550
+ let blurValueChangeSub = form.blurSophisticatedValueChange
551
+ .pipe(takeUntil(this._destroy$))
552
+ .subscribe((event) => this.dataChangeActionHandler(event, ValueChangeMode.BLUR));
553
+ this.dataChangeActionHandlers.set(form, [inmediateValueChangeSub, blurValueChangeSub]);
554
+ }
555
+ }
556
+ handleDataChangeSubscriptions(formComponent) {
557
+ if (this.useQueryLists) {
558
+ let forms = !!formComponent ? [formComponent] : this.getAllSmartFormComponents();
559
+ forms.forEach((form) => this.handleFormSubscriptions(form));
560
+ // unsubscribe from removed forms
561
+ if (!formComponent) {
562
+ this.dataChangeActionHandlers.forEach((subs, form) => {
563
+ if (!forms.find((c) => c === form)) {
564
+ subs.forEach((sub) => sub.unsubscribe());
565
+ this.dataChangeActionHandlers.delete(form);
566
+ }
567
+ });
568
+ }
569
+ }
570
+ }
571
+ getInvalidFields() {
572
+ let aggregatedInvalidFields = {
573
+ invalidFieldKeys: [],
574
+ invalidFieldNames: [],
575
+ };
576
+ if (this.useQueryLists) {
577
+ this.getAllSmartFormComponents()?.forEach((form) => this.validateForm(form, aggregatedInvalidFields));
578
+ }
579
+ else {
580
+ this.formWidgets?.forEach((form) => this.validateForm(form, aggregatedInvalidFields));
581
+ }
582
+ return aggregatedInvalidFields;
583
+ }
584
+ validateForm(form, aggregatedInvalidFields) {
585
+ let invalidFieldsOfForm = form?.getInvalidFields();
586
+ if (invalidFieldsOfForm) {
587
+ invalidFieldsOfForm.invalidFieldKeys.forEach((key) => aggregatedInvalidFields.invalidFieldKeys.push(key));
588
+ invalidFieldsOfForm.invalidFieldNames.forEach((key) => aggregatedInvalidFields.invalidFieldNames.push(key));
589
+ }
590
+ }
591
+ //#region UseUiAction
592
+ getAdditionalParams(uiAction) {
593
+ return {
594
+ forTextArea: '',
595
+ forTextField: '',
596
+ };
597
+ }
598
+ getModel() {
599
+ return this.data;
600
+ }
601
+ submitForm(validate) {
602
+ this.submitForms(validate);
603
+ }
604
+ async performUiActionRequest(uiActionRequest, widgetId, nodeId) {
605
+ if (uiActionRequest.params['_files']) {
606
+ const param = uiActionRequest.params['param'];
607
+ const files = uiActionRequest.params['_files'];
608
+ const uploadDescriptor = uiActionRequest.params['_uploadDescriptor'];
609
+ const isMultiple = uiActionRequest.params['isMultiple'];
610
+ delete uiActionRequest.params['param'];
611
+ delete uiActionRequest.params['_files'];
612
+ delete uiActionRequest.params['_uploadDescriptor'];
613
+ delete uiActionRequest.params['isMultiple'];
614
+ // await this.sendModelToServer();
615
+ if (!isMultiple) {
616
+ await this.viewContext.performUploadAction(this.uuid, uiActionRequest, param, files[0]);
617
+ }
618
+ else if (uploadDescriptor != null && uploadDescriptor != undefined) {
619
+ let maxBatchFilesSize = uploadDescriptor.maxSize * 1024 * 1024;
620
+ let maxBatchSize = uploadDescriptor.maxBatchSize;
621
+ let currentBatchSize = 0;
622
+ let currentBatch = [];
623
+ const batches = [];
624
+ files.forEach((file) => {
625
+ const wouldExceedSize = currentBatchSize + file.size > maxBatchFilesSize;
626
+ const wouldExceedCount = typeof maxBatchSize === 'number' &&
627
+ maxBatchSize > 0 &&
628
+ currentBatch.length >= maxBatchSize;
629
+ if (wouldExceedSize || wouldExceedCount) {
630
+ batches.push(currentBatch);
631
+ currentBatch = [];
632
+ currentBatchSize = 0;
633
+ }
634
+ currentBatch.push(file);
635
+ currentBatchSize += file.size;
636
+ });
637
+ if (currentBatch.length) {
638
+ batches.push(currentBatch);
639
+ }
640
+ batches.forEach(async (batch) => await this.viewContext.performUploadMultipleAction(this.uuid, uiActionRequest, param, batch));
641
+ }
642
+ else {
643
+ await this.viewContext.performUploadMultipleAction(this.uuid, uiActionRequest, param, files);
644
+ }
645
+ }
646
+ else if (widgetId && nodeId) {
647
+ // await this.sendModelToServer();
648
+ this.addModelToWidgetAction(uiActionRequest);
649
+ await this.viewContext.performWidgetAction(this.uuid, widgetId, nodeId, uiActionRequest);
650
+ }
651
+ else if (widgetId) {
652
+ // await this.sendModelToServer();
653
+ this.addModelToWidgetAction(uiActionRequest);
654
+ await this.viewContext.performWidgetMainAction(this.uuid, widgetId, uiActionRequest);
655
+ }
656
+ else {
657
+ await this.viewContext.performAction(this.uuid, uiActionRequest);
658
+ }
659
+ }
660
+ addModelToWidgetAction(uiActionRequest) {
661
+ this.addModelToWidgetParams(uiActionRequest.params);
662
+ }
663
+ addModelToWidgetParams(params) {
664
+ if (this.sendModelOnWidgetAction) {
665
+ this.submitForm(false);
666
+ // mimic ComponentModel
667
+ params['clientPageModel'] = { data: this.getModel() };
668
+ }
669
+ }
670
+ // private async sendModelToServer() {
671
+ // this.submitForms(false);
672
+ // let dataChange = {
673
+ // kind: DataChangeKind.Widget,
674
+ // source: '',
675
+ // values: [['', this.getModel()]],
676
+ // };
677
+ // await this.viewContext.dataChanged(this.uuid!, dataChange);
678
+ // }
679
+ handleSpecificDemandsAsynchronously(uiAction, uiActionRequest) {
680
+ throw new Error('handleSpecificDemandsAsynchronously method not implemented.');
681
+ }
682
+ //#endregion
683
+ /**
684
+ * Submits all the registered forms in the SmartComponent
685
+ */
686
+ submitForms(validate) {
687
+ if (this.useQueryLists) {
688
+ this.getAllSmartFormComponents()?.forEach((form) => {
689
+ form?.submitForm(validate);
690
+ });
691
+ }
692
+ else {
693
+ this.formWidgets?.forEach((form) => {
694
+ form?.submitForm(validate);
695
+ });
696
+ }
697
+ }
698
+ addGrid(smartGrid, options, useAsDefaultGrid, componentReference) {
699
+ smartGrid.options = options;
700
+ smartGrid.uiActionService = this.uiActionService;
701
+ smartGrid.uiActionDescriptorService = this.uiActionDescriptorService;
702
+ smartGrid.serviceToUse = this;
703
+ smartGrid.viewContextService = this.viewContext;
704
+ if (!this.useQueryLists) {
705
+ this.widgets.set(smartGrid.gridIdentifier, componentReference);
706
+ }
707
+ else {
708
+ console.warn(`Added smartGrid when useQueryLists === true (${smartGrid.gridIdentifier})`);
709
+ }
710
+ if (useAsDefaultGrid) {
711
+ this.smartGrid = smartGrid;
712
+ return this.smartGrid;
713
+ }
714
+ return smartGrid;
715
+ }
716
+ addForm(smartFormId, smartForm, componentReference) {
717
+ if (!this.useQueryLists) {
718
+ this.formWidgets.set(smartFormId, componentReference);
719
+ }
720
+ else {
721
+ console.warn(`Added smartForm when useQueryLists === true (${smartFormId})`);
722
+ }
723
+ // if (this.sendDataChanges && componentReference) {
724
+ // smartForm.useOnValueChangeEvent = true;
725
+ // componentReference.sophisticatedValueChange
726
+ // .pipe(takeUntil(this._destroy$))
727
+ // .subscribe((valueChange: SophisticatedValueChange) => {
728
+ // this.handleValueChanges(valueChange);
729
+ // });
730
+ // }
731
+ return smartForm;
732
+ }
733
+ setUpDefaultTree(treeId) {
734
+ this.smartTreeService = this.createTreeService(treeId);
735
+ }
736
+ createTreeService(treeId) {
737
+ const treeService = new SmarttreeGenericService(this.inject, this.pageName, treeId);
738
+ // In the useQueryLists model the tree is routed via the SmartTreeComponent
739
+ // QueryList + treeId (see getWidgets), so no manual widgets.set is needed; the
740
+ // legacy non-QueryList path still registers it explicitly.
741
+ if (!this.useQueryLists) {
742
+ this.widgets.set(treeId, treeService);
743
+ }
744
+ return treeService;
745
+ }
746
+ addFileUploader(uiActionCode, fileFormats, maxSizeMb, isMultiple) {
747
+ return {
748
+ uiActionCode,
749
+ smartComponent: this,
750
+ fileFormats,
751
+ isMultiple,
752
+ maxSizeMb,
753
+ };
754
+ }
755
+ /**
756
+ * For dialog-hosted default components, the view uuid is passed through the
757
+ * dialog data (MAT_DIALOG_DATA for Material, DynamicDialogConfig.data for
758
+ * PrimeNG). Returns undefined for slot-hosted components (no dialog data). (#28870)
759
+ */
760
+ readDialogDataUuid() {
761
+ const matData = this.inject.get(MAT_DIALOG_DATA, null);
762
+ if (matData?.uuid) {
763
+ return matData.uuid;
764
+ }
765
+ const primeConfig = this.inject.get(DynamicDialogConfig, null);
766
+ return primeConfig?.data?.uuid;
767
+ }
768
+ // #region handle changes
769
+ handleValueChanges(valueChange) {
770
+ let dataChange;
771
+ if (valueChange.key.includes('.')) {
772
+ const source = valueChange.key.split('.')[0];
773
+ const valueKey = valueChange.key.split('.')[1];
774
+ dataChange = {
775
+ kind: valueChange.kind === 'basic' ? DataChangeKind.WIDGET : DataChangeKind.SELECTION,
776
+ source,
777
+ values: [[valueKey, valueChange.value]],
778
+ };
779
+ }
780
+ else {
781
+ dataChange = {
782
+ kind: valueChange.kind === 'basic' ? DataChangeKind.WIDGET : DataChangeKind.SELECTION,
783
+ source: valueChange.key,
784
+ values: [[valueChange.key, valueChange.value]],
785
+ };
786
+ }
787
+ this.viewContext.dataChanged(this.uuid, dataChange);
788
+ }
789
+ handleChanges(change) {
790
+ try {
791
+ if (!this.componentModelLoaded) {
792
+ // initial load
793
+ return;
794
+ }
795
+ if (change.changedWidgets) {
796
+ this.handleChangeWidgets(change.changedWidgets);
797
+ }
798
+ let dataChangeHasBeenNexted = false;
799
+ if (change.changes) {
800
+ const changes = change.changes;
801
+ Object.keys(changes).map((changeKey) => {
802
+ if (changeKey.startsWith('data.')) {
803
+ this.handleDataChange(changes, changeKey);
804
+ }
805
+ else if (changeKey.startsWith('layouts.') && this.model?.layouts) {
806
+ this.handleLayoutChange(changes, changeKey);
807
+ }
808
+ else if (changeKey.startsWith('componentLayouts.') && this.model?.layouts) {
809
+ this.handleComponentLayoutChange(changes, changeKey);
810
+ }
811
+ else if (changeKey.startsWith('valueSets.') && this.model?.valueSets) {
812
+ this.handleValueSetChange(changes, changeKey);
813
+ }
814
+ else if (changeKey === 'actions') {
815
+ this.handleActionChange(changes, changeKey);
816
+ }
817
+ else if (changeKey === 'constraints') {
818
+ this.handleConstraintChange(changes, changeKey);
819
+ }
820
+ else if (changeKey === '') {
821
+ this.model = changes[''];
822
+ dataChangeHasBeenNexted = true;
823
+ }
824
+ });
825
+ if (!dataChangeHasBeenNexted) {
826
+ this.dataChanged.next();
827
+ }
828
+ }
829
+ }
830
+ catch (error) {
831
+ console.error(error);
832
+ this.model = change.value;
833
+ }
834
+ if (!change.changedWidgets && !change.changes && change.value) {
835
+ this.model = change.value;
836
+ }
837
+ }
838
+ handleChangeWidgets(changedWidgets, skipLoad = false) {
839
+ let widgets = this.getWidgets();
840
+ changedWidgets.forEach((key) => {
841
+ const reference = widgets.get(key);
842
+ if (reference instanceof SmartGridComponent) {
843
+ this.setupGridServices(reference);
844
+ if (!skipLoad) {
845
+ reference.refresh();
846
+ }
847
+ }
848
+ else if (reference instanceof SmarttreeService) {
849
+ if (!skipLoad) {
850
+ reference.initialize();
851
+ }
852
+ }
853
+ else if (reference instanceof SmartFilterEditorContentComponent) {
854
+ this.setupFilterServices(reference);
855
+ //if (!skipLoad) { // filter is not loaded when setting uuid
856
+ reference.service.load();
857
+ //}
858
+ }
859
+ else if (reference instanceof SmartMapComponent) {
860
+ reference.load();
861
+ }
862
+ else if (reference instanceof SmartDiagramComponent) {
863
+ reference.load();
864
+ }
865
+ else if (!skipLoad && reference === undefined) {
866
+ console.error(`Provided reference for ${key} is undefined.`);
867
+ }
868
+ });
869
+ }
870
+ setValueDeeply(model, key, value) {
871
+ let splittedKeys = key.split('.');
872
+ let deepModel = [model];
873
+ let tempModel;
874
+ for (let index = 0; index < splittedKeys.length; index++) {
875
+ tempModel = deepModel[index];
876
+ if (typeof tempModel[splittedKeys[index]] !== 'string' &&
877
+ typeof tempModel[splittedKeys[index]] !== 'boolean' &&
878
+ typeof tempModel[splittedKeys[index]] !== 'number' &&
879
+ tempModel[splittedKeys[index]] !== undefined) {
880
+ deepModel.push(tempModel[splittedKeys[index]]);
881
+ }
882
+ if (index === splittedKeys.length - 1) {
883
+ let oldValue = tempModel[splittedKeys[index]];
884
+ // if (value === '' && (oldValue === null || oldValue === undefined) then don't change value.
885
+ if (value !== '' || (oldValue !== null && oldValue !== undefined)) {
886
+ tempModel[splittedKeys[index]] = value;
887
+ }
888
+ break;
889
+ }
890
+ }
891
+ }
892
+ handleDataChange(changes, changeKey) {
893
+ this.setValueDeeply(this.model, changeKey, changes[changeKey]);
894
+ if (this.useQueryLists) {
895
+ this.getAllSmartFormComponents()?.forEach((form) => {
896
+ form.refresh();
897
+ form.markAllWidgetsForChangeDetection();
898
+ });
899
+ }
900
+ else {
901
+ this.formWidgets.forEach((formComponent, key) => {
902
+ if (formComponent === undefined) {
903
+ console.error(`Provided form reference for ${key} is undefined.`);
904
+ }
905
+ else {
906
+ formComponent.refresh();
907
+ formComponent.markAllWidgetsForChangeDetection();
908
+ }
909
+ });
910
+ }
911
+ this.changeDetector.detectChanges();
912
+ }
913
+ handleLayoutChange(changes, changeKey) {
914
+ let layoutKey = changeKey.split('.')[1];
915
+ this.model.layouts[layoutKey] = changes[changeKey];
916
+ }
917
+ handleComponentLayoutChange(changes, changeKey) {
918
+ let layoutKey = changeKey.split('.')[1];
919
+ let componentLayouts = this.model.componentLayouts;
920
+ componentLayouts[layoutKey] = changes[changeKey];
921
+ }
922
+ handleValueSetChange(changes, changeKey) {
923
+ let valueSetKey = changeKey.split('.')[1];
924
+ this.model.valueSets[valueSetKey] = changes[changeKey];
925
+ }
926
+ handleActionChange(changes, changeKey) {
927
+ this.model.actions = changes[changeKey];
928
+ this.initActions();
929
+ }
930
+ handleConstraintChange(changes, changeKey) {
931
+ this.model.constraints = changes[changeKey];
932
+ }
933
+ }
934
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jbGllbnQvc21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFFTCwyQkFBMkIsR0FDNUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwwRkFBMEYsQ0FBQztBQUM3SSxPQUFPLEVBR0wsbUJBQW1CLEVBR25CLGVBQWUsR0FDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUlMLGNBQWMsRUFHZCx1QkFBdUIsRUFHdkIseUJBQXlCLEVBR3pCLGVBQWUsR0FJaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFP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Q0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUM3RSxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFNLENBQUMsU0FBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUMzRSxJQUFJLENBQUMsS0FBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUErQixFQUFFLFNBQWlCO1FBQy9FLElBQUksQ0FBQyxLQUFNLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xuaW1wb3J0IHtcbiAgU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQsXG4gIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eSxcbn0gZnJvbSAnLi4vc21hcnQtY29tcG9uZW50LWxheW91dC9wcm9qZWN0cyc7XG5pbXBvcnQgeyBTbWFydERpYWdyYW1Db21wb25lbnQgfSBmcm9tICcuLi9zbWFydC1kaWFncmFtL3Byb2plY3RzJztcbmltcG9ydCB7IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3Ivc21hcnQtZmlsdGVyLWVkaXRvci1jb250ZW50L3NtYXJ0LWZpbHRlci1lZGl0b3ItY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgU21hcnRGb3JtLFxuICBTbWFydEZvcm1JbnZhbGlkRmllbGRzLFxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxuICBTbWFydGZvcm1Db21wb25lbnQsXG4gIFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSxcbiAgVmFsdWVDaGFuZ2VNb2RlLFxufSBmcm9tICcuLi9zbWFydC1mb3JtL3Byb2plY3RzJztcbmltcG9ydCB7IEdyaWRPcHRpb25zLCBTbWFydEdyaWQsIFNtYXJ0R3JpZENvbXBvbmVudCB9IGZyb20gJy4uL3NtYXJ0LWdyaWQvcHJvamVjdHMnO1xuaW1wb3J0IHsgU21hcnRNYXBDb21wb25lbnQgfSBmcm9tICcuLi9zbWFydC1tYXAvc21hcnQtbWFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbWFydFN1YmplY3QgfSBmcm9tICcuLi9zbWFydC1zdWJqZWN0L3Byb2plY3RzJztcbmltcG9ydCB7XG4gIFNtYXJ0VHJlZUNvbXBvbmVudCxcbiAgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UsXG4gIFNtYXJ0dHJlZVNlcnZpY2UsXG59IGZyb20gJy4uL3NtYXJ0LXRyZWUvcHJvamVjdHMnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50TW9kZWwsXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxuICBEYXRhQ2hhbmdlLFxuICBEYXRhQ2hhbmdlS2luZCxcbiAgRXhlY3V0ZVVpQWN0aW9uT3B0aW9ucyxcbiAgU21hcnRUcmFuc2xhdGVTZXJ2aWNlLFxuICBTbWFydFZpZXdDb250ZXh0U2VydmljZSxcbiAgVWlBY3Rpb24sXG4gIFVpQWN0aW9uQWRkaXRpb25hbFBhcmFtcyxcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcbiAgVWlBY3Rpb25Nb2RlbCxcbiAgVWlBY3Rpb25SZXF1ZXN0LFxuICBVaUFjdGlvblNlcnZpY2UsXG4gIFVpQWN0aW9uU3BlY2lmaWNEZW1hbmRSZXNwb25zZSxcbiAgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50LFxuICBVc2VVaUFjdGlvbjIsXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9wcm9qZWN0cyc7XG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xuaW1wb3J0IHtcbiAgU21hcnRCYWNrZW5kQm9vdHN0cmFwU2VydmljZSxcbiAgVmlld0NvbnRleHRSZWJ1aWx0RXJyb3IsXG59IGZyb20gJy4uL3Nlc3Npb24vc21hcnQtYmFja2VuZC1ib290c3RyYXAuc2VydmljZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbWFydENvbXBvbmVudEFwaUNsaWVudDxUPiBpbXBsZW1lbnRzIFVzZVVpQWN0aW9uMiB7XG4gIHByb3RlY3RlZCBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgZGV0ZWN0Q2hhbmdlOiBTbWFydFN1YmplY3Q8Q29tcG9uZW50TW9kZWxDaGFuZ2U+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG5cbiAgcHJpdmF0ZSBfdXVpZD86IHN0cmluZztcblxuXG4gIHByb3RlY3RlZCBjb21wb25lbnRNb2RlbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCB1dWlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3V1aWQ7XG4gIH1cbiAgc2V0IHV1aWQodXVpZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX3V1aWQgPT09IHV1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGZpcnN0VXVpZDogYm9vbGVhbiA9IHRydWU7XG4gICAgaWYgKHRoaXMudXVpZCkge1xuICAgICAgdGhpcy52aWV3Q29udGV4dC51bmZvbGxvdyh0aGlzLnV1aWQpO1xuICAgICAgZmlyc3RVdWlkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3V1aWQgPSB1dWlkO1xuICAgIGlmICh0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCkpIHtcbiAgICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xuICAgICAgICBTbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuc2V0VXVpZChjb21wLCB1dWlkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmdldFdpZGdldHMoKS5mb3JFYWNoKChyZWYsIGtleSkgPT4ge1xuICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0R3JpZENvbXBvbmVudCkge1xuICAgICAgICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChyZWYgaW5zdGFuY2VvZiBTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnQpIHtcbiAgICAgICAgcmVmLnNlcnZpY2UuY29uZmlnLnV1aWQgPSB0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkID8gdXVpZCA6IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgU21hcnREaWFncmFtQ29tcG9uZW50KSB7XG4gICAgICAgIHJlZi51dWlkID0gdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA/IHV1aWQgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgU21hcnRNYXBDb21wb25lbnQpIHtcbiAgICAgICAgLy8gICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmICghcmVmICYmICFmaXJzdFV1aWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgUHJvdmlkZWQgcmVmZXJlbmNlIGZvciAke2tleX0gaXMgdW5kZWZpbmVkIG9uIHV1aWQgY2hhbmdlLmApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh1dWlkKSB7XG4gICAgICB0aGlzLnZpZXdDb250ZXh0LmZvbGxvdyh0aGlzLl91dWlkISwgdGhpcy5kZXRlY3RDaGFuZ2UpO1xuICAgICAgdGhpcy5vblV1aWRSZXNvbHZlZCh1dWlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9tb2RlbDogQ29tcG9uZW50TW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IG1vZGVsKCk6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gIH1cbiAgc2V0IG1vZGVsKG1vZGVsOiBDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG5cbiAgICB0aGlzLmluaXRDb21wb25lbnRCeU1vZGVsKCk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRhPzogVDtcblxuICBnZXQgZGF0YSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuICBzZXQgZGF0YShtb2RlbDogVCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2RhdGEgPSBtb2RlbDtcbiAgICB0aGlzLmRhdGFDaGFuZ2VkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB1aUFjdGlvbk1vZGVsczogVWlBY3Rpb25Nb2RlbFtdID0gW107XG5cbiAgcHVibGljIGRhdGFDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG5cbiAgLy8gR3JpZFxuICBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XG5cbiAgLy8gU2VydmljZXNcbiAgcHJvdGVjdGVkIHZpZXdDb250ZXh0OiBTbWFydFZpZXdDb250ZXh0U2VydmljZTtcbiAgcHJvdGVjdGVkIGJvb3RzdHJhcDogU21hcnRCYWNrZW5kQm9vdHN0cmFwU2VydmljZTtcbiAgcHJvdGVjdGVkIHVpQWN0aW9uU2VydmljZTogVWlBY3Rpb25TZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZTogVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZT86IFNtYXJ0VHJhbnNsYXRlU2VydmljZTtcblxuICAvLyBUcmVlXG4gIHByaXZhdGUgX3NtYXJ0VHJlZVNlcnZpY2U/OiBTbWFydHRyZWVHZW5lcmljU2VydmljZTtcblxuICBwdWJsaWMgZ2V0IHNtYXJ0VHJlZVNlcnZpY2UoKTogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zbWFydFRyZWVTZXJ2aWNlO1xuICB9XG4gIHB1YmxpYyBzZXQgc21hcnRUcmVlU2VydmljZShzbWFydFRyZWVTZXJ2aWNlOiBTbWFydHRyZWVHZW5lcmljU2VydmljZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9zbWFydFRyZWVTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKCdUaGUgZGVmYXVsdCB0cmVlIGhhcyBhbHJlYWR5IHNldCB1cCEnKTtcbiAgICB9XG4gICAgdGhpcy5fc21hcnRUcmVlU2VydmljZSA9IHNtYXJ0VHJlZVNlcnZpY2U7XG4gIH1cblxuICAvLyBDb250YWluZWQgV2lkZ2V0c1xuICB3aWRnZXRzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIFNtYXJ0R3JpZENvbXBvbmVudCB8IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIHwgU21hcnRNYXBDb21wb25lbnQgfCB1bmRlZmluZWRcbiAgPiA9IG5ldyBNYXAoKTtcblxuICBmb3JtV2lkZ2V0czogTWFwPHN0cmluZywgU21hcnRmb3JtQ29tcG9uZW50IHwgdW5kZWZpbmVkPiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIF91c2VRdWVyeUxpc3RzOiBib29sZWFuID0gdHJ1ZTtcblxuICBnZXQgdXNlUXVlcnlMaXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlUXVlcnlMaXN0cztcbiAgfVxuXG4gIHNldCB1c2VRdWVyeUxpc3RzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1c2VRdWVyeUxpc3RzIGNhbm5vdCBiZSBzZXQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdXNlUXVlcnlMaXN0cyA9IHRydWU7XG4gIH1cblxuICBzZW5kTW9kZWxPbldpZGdldEFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBibHVyRGF0YUNoYW5nZUtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJvdGVjdGVkIGRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycyA9IG5ldyBNYXA8U21hcnRmb3JtQ29tcG9uZW50LCBBcnJheTxTdWJzY3JpcHRpb24+PigpO1xuXG4gIHByb3RlY3RlZCBmaWx0ZXJNb2RlbENoYW5nZVN1YmplY3RzID0gbmV3IE1hcDxzdHJpbmcsIFN1YmplY3Q8dm9pZD4+KCk7XG5cbiAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yPzogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdDogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHBhZ2VOYW1lPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfY29tcG9uZW50TmFtZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgZWxlbWVudD86IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyPzogUmVuZGVyZXIyXG4gICkge1xuICAgIC8vIGNoZWNrIGFuZCBjYWxjdWxhdGUgcGFnZU5hbWVcbiAgICBpZiAoIXRoaXMucGFnZU5hbWUgJiYgIXRoaXMuX2NvbXBvbmVudE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFnZU5hbWUgb3IgY29tcG9uZW50TmFtZSBtdXN0IGJlIHNwZWNpZmllZCEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gaW5qZWN0LmdldChTbWFydFZpZXdDb250ZXh0U2VydmljZSk7XG4gICAgdGhpcy5ib290c3RyYXAgPSBpbmplY3QuZ2V0KFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UpO1xuICAgIGlmICh0aGlzLl9jb21wb25lbnROYW1lKSB7XG4gICAgICBsZXQgcGFnZU5hbWVGb3JDb21wb25lbnQgPSB0aGlzLnZpZXdDb250ZXh0LmdldFBhZ2VOYW1lT2ZDb21wb25lbnQodGhpcy5fY29tcG9uZW50TmFtZSk7XG4gICAgICBpZiAoIXRoaXMucGFnZU5hbWUpIHtcbiAgICAgICAgdGhpcy5wYWdlTmFtZSA9IHBhZ2VOYW1lRm9yQ29tcG9uZW50O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2VOYW1lICE9PSBwYWdlTmFtZUZvckNvbXBvbmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHBhZ2VOYW1lICgke3BhZ2VOYW1lfSkgYW5kIGNvbXBvbmVudE5hbWUgKCR7X2NvbXBvbmVudE5hbWV9KSBkb2Vzbid0IG1hdGNoIWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZnJvbSB0aGlzIHBvaW50IHdlIGhhdmUgdGhpcy5wYWdlTmFtZVxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKGNoYW5nZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVpQWN0aW9uU2VydmljZSA9IGluamVjdC5nZXQoVWlBY3Rpb25TZXJ2aWNlKTtcbiAgICB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgPSBpbmplY3QuZ2V0KFVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UpO1xuICB9XG5cbiAgX25nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucnVuKCk7XG4gIH1cbiAgX25nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudmlld0NvbnRleHQudW5mb2xsb3codGhpcy51dWlkISk7XG4gICAgdGhpcy53aWRnZXRzLmNsZWFyKCk7XG4gICAgdGhpcy5mb3JtV2lkZ2V0cy5jbGVhcigpO1xuICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5maWx0ZXJNb2RlbENoYW5nZVN1YmplY3RzLmNsZWFyKCk7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW5ldmVyIHRoaXMgY29tcG9uZW50J3MgdXVpZCBpcyBzZXQgdG8gYSBub24tbnVsbCB2YWx1ZSAoaXQgbWF5XG4gICAqIGZpcmUgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIHV1aWQgY2hhbmdlcykuIERlZmF1bHQ6IG5vLW9wLlxuICAgKiBDb25zdW1lcnMgdGhhdCByZXNvbHZlZCB0aGVpciB1dWlkIGluIHRoZSBjb25zdHJ1Y3RvciAoZS5nLiBmaWx0ZXIgY29uZmlnKVxuICAgKiBvdmVycmlkZSB0aGlzIHRvIGRlZmVyIHRoYXQgd2lyaW5nIHVudGlsIHRoZSB1dWlkIGlzIGluamVjdGVkIOKAlCByZXF1aXJlZCBmb3JcbiAgICogZHluYW1pYyBkZWZhdWx0IGNvbXBvbmVudHMgd2hvc2UgdXVpZCBpcyBub3Qga25vd24gYXQgY29uc3RydWN0aW9uLiAoIzI4ODcwKVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uVXVpZFJlc29sdmVkKHV1aWQ6IHN0cmluZyk6IHZvaWQge31cblxuICBfbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IgPSB0aGlzLmluamVjdC5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU21hcnRDb21wb25lbnRMYXlvdXRzUUwgbm90IGF2YWlsYWJsZSEnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKSEsIChjb21wKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnV1aWQgIT09IGNvbXAudXVpZCkge1xuICAgICAgICAgICAgY29tcC51cGRhdGVVdWlkKHRoaXMudXVpZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRHcmlkcyhjb21wKS5mb3JFYWNoKChncmlkKSA9PlxuICAgICAgICAgICAgdGhpcy5zZXR1cEdyaWRTZXJ2aWNlcyhncmlkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGNvbXAuc21hcnRDb21wb25lbnRMYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soY29tcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZm9yIGhhbmRsaW5nIGVtYmVkZGVkIGZvcm1zXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKSEsIChmb3JtKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVEYXRhQ2hhbmdlU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soZm9ybSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignZ2V0U21hcnRGb3Jtc1FMIG5vdCBhdmFpbGFibGUhJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpISwgKGZvcm0pID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2VTdWJzY3JpcHRpb25zKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVVcGxvYWRDYWxsYmFjayhmb3JtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZ2V0U21hcnRHcmlkc1FMKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydEdyaWRzUUwgbm90IGF2YWlsYWJsZSEnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRHcmlkc1FMKCkhLCAoZ3JpZCkgPT4ge1xuICAgICAgICAgIGlmIChncmlkKSB7XG4gICAgICAgICAgICBpZiAoZ3JpZC5zbWFydEdyaWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXR1cEdyaWRTZXJ2aWNlcyhncmlkKTtcbiAgICAgICAgICAgICAgZ3JpZC5zZXR1cFRvb2xiYXIoKTtcbiAgICAgICAgICAgICAgaWYgKGdyaWQudG9vbGJhciB8fCBncmlkLmhlYWRlclRvb2xiYXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRBY3Rpb25zKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBncmlkLnV1aWQpIHtcbiAgICAgICAgICAgICAgZ3JpZC51dWlkID0gdGhpcy51dWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5nZXRTbWFydE1hcFFMKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydE1hcHNRTCBpcyBub3QgYXZhaWxhYmxlIScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydE1hcFFMKCkhLCAobWFwKSA9PiB7XG4gICAgICAgICAgbWFwLnZpZXdDb250ZXh0U2VydmljZSA9IHRoaXMudmlld0NvbnRleHQ7XG4gICAgICAgICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnV1aWQgIT09IG1hcC51dWlkKSB7XG4gICAgICAgICAgICBtYXAudXVpZCA9IHRoaXMudXVpZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHNRTCgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMIG5vdCBhdmFpbGFibGUhJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHNRTCgpISwgKGZpbHRlckNvbXApID0+IHtcbiAgICAgICAgICBpZiAoZmlsdGVyQ29tcCkge1xuICAgICAgICAgICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldHVwRmlsdGVyU2VydmljZXMoZmlsdGVyQ29tcCk7XG4gICAgICAgICAgICAgIGxldCBzZXJ2aWNlID0gZmlsdGVyQ29tcC5zZXJ2aWNlO1xuICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IHNlcnZpY2UuY29uZmlnLmlkZW50aWZpZXI7XG4gICAgICAgICAgICAgIGlmIChpZGVudGlmaWVyICYmICF0aGlzLmZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNb2RlbENoYW5nZVN1YmplY3RzLnNldChpZGVudGlmaWVyLCBzZXJ2aWNlLm1vZGVsQ2hhbmdlZCk7XG4gICAgICAgICAgICAgICAgc2VydmljZS5tb2RlbENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QWxsRmlsdGVyVWlBY3Rpb25Ub29sYmFycygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0QWN0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0dXBHcmlkU2VydmljZXMoZ3JpZDogU21hcnRHcmlkQ29tcG9uZW50KSB7XG4gICAgaWYgKGdyaWQuc21hcnRHcmlkKSB7XG4gICAgICBpZiAoIWdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSkge1xuICAgICAgICBncmlkLnNtYXJ0R3JpZC51aUFjdGlvblNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uU2VydmljZTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSkge1xuICAgICAgICBncmlkLnNtYXJ0R3JpZC51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlO1xuICAgICAgfVxuICAgICAgaWYgKCFncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UpIHtcbiAgICAgICAgZ3JpZC5zbWFydEdyaWQuc2VydmljZVRvVXNlID0gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlKSB7XG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnZpZXdDb250ZXh0U2VydmljZSA9IHRoaXMudmlld0NvbnRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEZpbHRlclNlcnZpY2VzKGZpbHRlckNvbXA6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xuICAgIGlmIChmaWx0ZXJDb21wLnNlcnZpY2UpIHtcbiAgICAgIGxldCBzZXJ2aWNlID0gZmlsdGVyQ29tcC5zZXJ2aWNlO1xuICAgICAgc2VydmljZS5wYXJlbnRTbWFydENvbXBvbmVudCA9IHRoaXM7XG4gICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gc2VydmljZS5jb25maWcudXVpZCkge1xuICAgICAgICBzZXJ2aWNlLmNvbmZpZy51dWlkID0gdGhpcy51dWlkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVRdWVyeUxpc3RTaW1wbGU8VD4ocWw6IFF1ZXJ5TGlzdDxUPiwgaGFuZGxlcjogKCkgPT4gdm9pZCkge1xuICAgIGhhbmRsZXIoKTtcbiAgICBxbC5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IGhhbmRsZXIoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlUXVlcnlMaXN0PFQ+KHFsOiBRdWVyeUxpc3Q8VD4sIGhhbmRsZXI6IChlbDogVCkgPT4gdm9pZCkge1xuICAgIHFsLmZvckVhY2goKGVsKSA9PiBoYW5kbGVyKGVsKSk7XG4gICAgcWwuY2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxpc3QpID0+IChsaXN0IGFzIFF1ZXJ5TGlzdDxUPikuZm9yRWFjaCgoZWwpID0+IGhhbmRsZXIoZWwpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRGb3Jtc1FMKCk6IFF1ZXJ5TGlzdDxTbWFydGZvcm1Db21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEdyaWRzUUwoKTogUXVlcnlMaXN0PFNtYXJ0R3JpZENvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0VHJlZXNRTCgpOiBRdWVyeUxpc3Q8U21hcnRUcmVlQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCk6XG4gICAgfCBRdWVyeUxpc3Q8U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydFVpQWN0aW9uVG9vbGJhcnNRTCgpOiBRdWVyeUxpc3Q8VWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKTpcbiAgICB8IFF1ZXJ5TGlzdDxTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudD5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRNYXBRTCgpOiBRdWVyeUxpc3Q8U21hcnRNYXBDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydERpYWdyYW1RTCgpOiBRdWVyeUxpc3Q8U21hcnREaWFncmFtQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgZ2V0V2lkZ2V0cygpOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHwgU21hcnRHcmlkQ29tcG9uZW50XG4gICAgfCBTbWFydHRyZWVTZXJ2aWNlPGFueT5cbiAgICB8IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFxuICAgIHwgU21hcnRNYXBDb21wb25lbnRcbiAgICB8IFNtYXJ0RGlhZ3JhbUNvbXBvbmVudFxuICAgIHwgdW5kZWZpbmVkXG4gID4ge1xuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcbiAgICAgIGxldCB3aWRnZXRzOiBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgfCBTbWFydEdyaWRDb21wb25lbnRcbiAgICAgICAgfCBTbWFydHRyZWVTZXJ2aWNlPGFueT5cbiAgICAgICAgfCBTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRcbiAgICAgICAgfCBTbWFydE1hcENvbXBvbmVudFxuICAgICAgICB8IFNtYXJ0RGlhZ3JhbUNvbXBvbmVudFxuICAgICAgICB8IHVuZGVmaW5lZFxuICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRHcmlkQ29tcG9uZW50cygpXG4gICAgICAgIC5maWx0ZXIoKGdyaWQpID0+IChncmlkPy5zbWFydEdyaWQ/LmdyaWRJZGVudGlmaWVyID8gdHJ1ZSA6IGZhbHNlKSlcbiAgICAgICAgLmZvckVhY2goKGdyaWQpID0+IHdpZGdldHMuc2V0KGdyaWQuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciwgZ3JpZCkpO1xuICAgICAgLy8gS2V5IHRyZWVzIGJ5IHRoZWlyIHRyZWVJZCAoc2V0IGluIHRoZSBzZXJ2aWNlIGNvbnN0cnVjdG9yKSwgTk9UIGJ5XG4gICAgICAvLyBzbWFydFRyZWVNb2RlbC5pZGVudGlmaWVyIChvbmx5IHNldCBhZnRlciB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCBzeW5jVHJlZSkuIEEgdHJlZVxuICAgICAgLy8gdGhhdCBleGlzdHMgYnV0IGhhcyBub3QgZmluaXNoZWQgaXRzIGluaXRpYWwgZG93bmxvYWQgd291bGQgb3RoZXJ3aXNlIGJlIGFic2VudFxuICAgICAgLy8gZnJvbSB0aGUgd2lkZ2V0IG1hcCwgc28gYSBwdXNoIHVwZGF0ZSBjb3VsZCBub3QgcmVzb2x2ZSBpdFxuICAgICAgLy8gKFwiUHJvdmlkZWQgcmVmZXJlbmNlIGZvciA8dHJlZUlkPiBpcyB1bmRlZmluZWRcIikuIHRyZWVJZCBlcXVhbHMgdGhlIGJhY2tlbmRcbiAgICAgIC8vIHdpZGdldCBpZGVudGlmaWVyLCBzbyBwdXNoIHJvdXRpbmcgbWF0Y2hlcyByZWdhcmRsZXNzIG9mIGRvd25sb2FkIHRpbWluZy4gKCMyODM2MSlcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRUcmVlQ29tcG9uZW50cygpXG4gICAgICAgIC5maWx0ZXIoKHRyZWUpID0+ICEhdHJlZT8udHJlZUlkKVxuICAgICAgICAuZm9yRWFjaCgodHJlZSkgPT4gd2lkZ2V0cy5zZXQodHJlZS50cmVlSWQhLCB0cmVlKSk7XG4gICAgICB0aGlzLmdldEFsbFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHMoKVxuICAgICAgICAuZmlsdGVyKChmaWx0ZXIpID0+IChmaWx0ZXIuc2VydmljZS5jb25maWcuaWRlbnRpZmllciA/IHRydWUgOiBmYWxzZSkpXG4gICAgICAgIC5mb3JFYWNoKChmaWx0ZXIpID0+IHdpZGdldHMuc2V0KGZpbHRlci5zZXJ2aWNlLmNvbmZpZy5pZGVudGlmaWVyLCBmaWx0ZXIpKTtcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRNYXBDb21wb25lbnRzKClcbiAgICAgICAgLmZpbHRlcigobWFwKSA9PiAhIW1hcC5pZGVudGlmaWVyKVxuICAgICAgICAuZm9yRWFjaCgobWFwKSA9PiB3aWRnZXRzLnNldChtYXAuaWRlbnRpZmllciwgbWFwKSk7XG4gICAgICB0aGlzLmdldEFsbFNtYXJ0RGlhZ3JhbUNvbXBvbmVudHMoKVxuICAgICAgICAuZmlsdGVyKChkaWFncmFtKSA9PiAhIWRpYWdyYW0uaWRlbnRpZmllcilcbiAgICAgICAgLmZvckVhY2goKGRpYWdyYW0pID0+IHdpZGdldHMuc2V0KGRpYWdyYW0uaWRlbnRpZmllciwgZGlhZ3JhbSkpO1xuICAgICAgcmV0dXJuIHdpZGdldHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpZGdldHM7XG4gIH1cblxuICBpbml0Q29tcG9uZW50QnlNb2RlbCgpOiB2b2lkIHtcbiAgICBTbWFydFN0eWxlVXRpbGl0eS5hcHBseVN0eWxlKHRoaXMubW9kZWw/LnN0eWxlLCB0aGlzLmVsZW1lbnQsIHRoaXMucmVuZGVyZXIpO1xuICAgIFNtYXJ0U3R5bGVVdGlsaXR5LmFwcGx5U3R5bGUodGhpcy5tb2RlbD8ucGFyZW50U3R5bGUsIHRoaXMuZWxlbWVudCwgdGhpcy5yZW5kZXJlciwgdHJ1ZSk7XG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICAgIGlmIChmb3JtLnNtYXJ0Rm9ybSkge1xuICAgICAgICAgIGZvcm0uc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsID0gdGhpcy5tb2RlbDtcbiAgICAgICAgICAvLyB1c2VzIGRhdGEsIHZhbHVlU2V0cywgY29uc3RyYWludHNcbiAgICAgICAgICBmb3JtLmNvbnN0cnVjdEZvcm0oKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVVwbG9hZENhbGxiYWNrKGZvcm0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvcj8uZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcbiAgICAvLyBUT0RPOiBsYXlvdXQsIHdpZGdldHNcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKCk6IFNtYXJ0Zm9ybUNvbXBvbmVudFtdIHtcbiAgICBsZXQgZm9ybXM6IFNtYXJ0Zm9ybUNvbXBvbmVudFtdID0gdGhpcy5nZXRTbWFydEZvcm1zUUwoKT8udG9BcnJheSgpID8/IFtdO1xuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xuICAgICAgZm9ybXMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0Rm9ybXMoY29tcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmb3JtcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKCk6IFNtYXJ0R3JpZENvbXBvbmVudFtdIHtcbiAgICBsZXQgZ3JpZHM6IFNtYXJ0R3JpZENvbXBvbmVudFtdID0gdGhpcy5nZXRTbWFydEdyaWRzUUwoKT8udG9BcnJheSgpID8/IFtdO1xuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xuICAgICAgZ3JpZHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0R3JpZHMoY29tcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBncmlkcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydE1hcENvbXBvbmVudHMoKTogQXJyYXk8U21hcnRNYXBDb21wb25lbnQ+IHtcbiAgICBjb25zdCBtYXBzOiBBcnJheTxTbWFydE1hcENvbXBvbmVudD4gPSB0aGlzLmdldFNtYXJ0TWFwUUwoKT8udG9BcnJheSgpID8/IFtdO1xuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xuICAgICAgbWFwcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRNYXBzKGNvbXApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydERpYWdyYW1Db21wb25lbnRzKCk6IEFycmF5PFNtYXJ0RGlhZ3JhbUNvbXBvbmVudD4ge1xuICAgIGNvbnN0IG1hcHM6IEFycmF5PFNtYXJ0RGlhZ3JhbUNvbXBvbmVudD4gPSB0aGlzLmdldFNtYXJ0RGlhZ3JhbVFMKCk/LnRvQXJyYXkoKSA/PyBbXTtcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcbiAgICAgIG1hcHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0RGlhZ3JhbXMoY29tcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXBzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0VHJlZUNvbXBvbmVudHMoKTogU21hcnR0cmVlU2VydmljZTxhbnk+W10ge1xuICAgIGxldCB0cmVlczogU21hcnR0cmVlU2VydmljZTxhbnk+W10gPVxuICAgICAgdGhpcy5nZXRTbWFydFRyZWVzUUwoKVxuICAgICAgICA/LnRvQXJyYXkoKVxuICAgICAgICAubWFwKCh0cmVlKSA9PiB0cmVlLnRyZWVTZXJ2aWNlKSA/PyBbXTtcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcbiAgICAgIHRyZWVzLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldFRyZWVzKGNvbXApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJlZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50cygpOiBTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRbXSB7XG4gICAgbGV0IGZpbHRlcnM6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFtdID1cbiAgICAgIHRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydFVpQWN0aW9uVG9vbGJhcnMoKTogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50W10ge1xuICAgIGxldCB0b29sYmFyczogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50W10gPSB0aGlzLmdldFNtYXJ0VWlBY3Rpb25Ub29sYmFyc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcbiAgICB0aGlzLmdldEFsbFNtYXJ0R3JpZENvbXBvbmVudHMoKT8uZm9yRWFjaCgoZ3JpZCkgPT4ge1xuICAgICAgaWYgKGdyaWQudG9vbGJhcikge1xuICAgICAgICB0b29sYmFycy5wdXNoKGdyaWQudG9vbGJhcik7XG4gICAgICB9XG4gICAgICBpZiAoZ3JpZC5oZWFkZXJUb29sYmFyKSB7XG4gICAgICAgIHRvb2xiYXJzLnB1c2goZ3JpZC5oZWFkZXJUb29sYmFyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcbiAgICAgIHRvb2xiYXJzLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldFRvb2xiYXJzKGNvbXApKTtcbiAgICB9KTtcbiAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKVxuICAgICAgPy5mbGF0TWFwKChmb3JtKSA9PiBmb3JtLmdldFRvb2xiYXJzKCkpXG4gICAgICAuZmlsdGVyKCh0b29sYmFyKSA9PiB0b29sYmFyICE9PSB1bmRlZmluZWQgfHwgdG9vbGJhciAhPT0gbnVsbClcbiAgICAgIC5mb3JFYWNoKCh0b29sYmFyKSA9PiB0b29sYmFycy5wdXNoKHRvb2xiYXIgYXMgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50KSk7XG5cbiAgICB0aGlzLmdldEFsbEZpbHRlclVpQWN0aW9uVG9vbGJhcnMoKS5mb3JFYWNoKCh0b29sYmFyKSA9PiB0b29sYmFycy5wdXNoKHRvb2xiYXIpKTtcbiAgICByZXR1cm4gdG9vbGJhcnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWxsRmlsdGVyVWlBY3Rpb25Ub29sYmFycygpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50cygpXG4gICAgICAuZmxhdE1hcCgoZmlsdGVyKSA9PlxuICAgICAgICBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZS5nZXRUb29sYmFycygpXG4gICAgICAgICAgOiBmaWx0ZXIuc2VydmljZS5nZXRDb21wbGV4VG9vbGJhcnMoKVxuICAgICAgKVxuICAgICAgLmZpbHRlcigodG9vbGJhcikgPT4gdG9vbGJhciAhPT0gdW5kZWZpbmVkIHx8IHRvb2xiYXIgIT09IG51bGwpXG4gICAgICAubWFwKCh0b29sYmFyKSA9PiB0b29sYmFyIGFzIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCk7XG4gIH1cblxuICBpbml0RGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbD8uZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5tb2RlbD8uZGF0YSBhcyBhbnk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEFjdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWw/LmFjdGlvbnMpIHtcbiAgICAgIGxldCB1aUFjdGlvbk1vZGVscyA9IHRoaXMubW9kZWw/LmFjdGlvbnMubWFwKCh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMsXG4gICAgICAgICAgdWlBY3Rpb24sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFsbFRvb2xiYXJzID0gdGhpcy5nZXRBbGxTbWFydFVpQWN0aW9uVG9vbGJhcnMoKTtcbiAgICAgIGxldCB0b29sYmFycyA9IGFsbFRvb2xiYXJzLmZpbHRlcigodG9vbGJhcikgPT4gdG9vbGJhci5pZCk7XG4gICAgICBsZXQgdG9vbGJhcnNXaXRob3V0SWQgPSB0aGlzLmdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpLmZpbHRlcihcbiAgICAgICAgKHRvb2xiYXIpID0+IHRvb2xiYXIuaWQgPT09IHVuZGVmaW5lZCB8fCB0b29sYmFyLmlkID09PSBudWxsXG4gICAgICApO1xuICAgICAgbGV0IHRvb2xiYXJNb2RlbHMgPSBuZXcgTWFwPHN0cmluZywgVWlBY3Rpb25Nb2RlbFtdPigpO1xuICAgICAgdG9vbGJhcnMuZm9yRWFjaCgodG9vbGJhcikgPT4ge1xuICAgICAgICB0b29sYmFyTW9kZWxzLnNldCh0b29sYmFyLmlkISwgW10pO1xuICAgICAgfSk7XG4gICAgICBsZXQgZ2xvYmFsVWlBY3Rpb25Nb2RlbHM6IFVpQWN0aW9uTW9kZWxbXSA9IFtdO1xuICAgICAgdWlBY3Rpb25Nb2RlbHMuZm9yRWFjaCgoYWN0aW9uKSA9PiB7XG4gICAgICAgIGxldCBhY3Rpb25Nb2RlbDogVWlBY3Rpb25Nb2RlbFtdIHwgdW5kZWZpbmVkID0gZ2xvYmFsVWlBY3Rpb25Nb2RlbHM7XG4gICAgICAgIGxldCB0b29sYmFySWQgPSBhY3Rpb24udWlBY3Rpb24udG9vbGJhcjtcbiAgICAgICAgaWYgKHRvb2xiYXJJZCAmJiB0b29sYmFyTW9kZWxzLmhhcyh0b29sYmFySWQpKSB7XG4gICAgICAgICAgYWN0aW9uTW9kZWwgPSB0b29sYmFyTW9kZWxzLmdldCh0b29sYmFySWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aW9uTW9kZWwpIHtcbiAgICAgICAgICBhY3Rpb25Nb2RlbCA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbk1vZGVsLnB1c2goYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51aUFjdGlvbk1vZGVscyA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xuXG4gICAgICB0aGlzLnNldHVwQWxsVG9vbGJhcnModG9vbGJhcnMsIHRvb2xiYXJzV2l0aG91dElkLCB0b29sYmFyTW9kZWxzKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvcj8uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHNldHVwOicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2V0dXBBbGxUb29sYmFycyhcbiAgICB0b29sYmFyczogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50W10sXG4gICAgdG9vbGJhcnNXaXRob3V0SWQ6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdLFxuICAgIHRvb2xiYXJNb2RlbHM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uTW9kZWxbXT5cbiAgKSB7XG4gICAgY29uc3Qgc2V0dXBQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICB0b29sYmFycy5mb3JFYWNoKCh0b29sYmFyKSA9PiB7XG4gICAgICB0b29sYmFyLnVpQWN0aW9uTW9kZWxzID0gdG9vbGJhck1vZGVscy5nZXQodG9vbGJhci5pZCEpO1xuICAgICAgc2V0dXBQcm9taXNlcy5wdXNoKHRvb2xiYXIuc2V0VXAoKSk7XG4gICAgfSk7XG5cbiAgICB0b29sYmFyc1dpdGhvdXRJZC5mb3JFYWNoKCh0b29sYmFyKSA9PiB7XG4gICAgICBzZXR1cFByb21pc2VzLnB1c2godG9vbGJhci5zZXRVcCgpKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHNldHVwUHJvbWlzZXMpO1xuICB9XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC53aGVuUmVhZHkoKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFZpZXdDb250ZXh0UmVidWlsdEVycm9yKSB7XG4gICAgICAgIC8vIE5vcm1hbCBmbG93OiB0aGUgdmlld2NvbnRleHQgd2FzIHJlYnVpbHQgd2hpbGUgd2Ugd2VyZSBxdWV1ZWQgaW5cbiAgICAgICAgLy8gd2hlblJlYWR5KCkuIEEgZnJlc2ggdXVpZCBhcnJpdmVzIHZpYSB1dWlkT2ZQYWdlSGFzQmVlbkNoYW5nZWRcbiAgICAgICAgLy8gKE5PUk1BTCB2aWV3cykgb3IgdGhlIGNvbXBvbmVudCBpcyByZWNyZWF0ZWQgYnkgb3BlblZpZXdcbiAgICAgICAgLy8gKEVNQkVEREVEL0RJQUxPRykuIE5vdGhpbmcgdG8gc3VyZmFjZS5cbiAgICAgICAgY29uc29sZS5kZWJ1ZygnU2tpcHBpbmcgbG9hZDogdmlld2NvbnRleHQgd2FzIHJlYnVpbHQgd2hpbGUgd2FpdGluZy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignU21hcnRCYWNrZW5kQm9vdHN0cmFwU2VydmljZSBpcyBub3QgcmVhZHk7IHNraXBwaW5nIGxvYWQuJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPSBmYWxzZTtcbiAgICAvLyBTbG90LWhvc3RlZCB2aWV3cyAoTk9STUFML0VNQkVEREVEKSBnZXQgdGhlaXIgdXVpZCBpbmplY3RlZCBhdCBjcmVhdGlvbi4gRElBTE9HIHZpZXdzXG4gICAgLy8gYXJlIE5PVCBzbG90LWhvc3RlZCwgc28gdGhleSBzdGlsbCByZXNvbHZlIHRoZWlyIHV1aWQgdmlhIHRoZSBwYWdlTmFtZSAtPiBnZXRVdWlkT2ZQYWdlXG4gICAgLy8gc2hpbSAoc2V0IGJ5IG9wZW5WaWV3J3MgRElBTE9HIGJyYW5jaCkuIFBhcnQgb2YgdGhlIHJldGFpbmVkIHBhZ2UtdXVpZCBzaGltICgjMjg4NzApLlxuICAgIGNvbnN0IHV1aWQgPVxuICAgICAgdGhpcy5fdXVpZCA/PyB0aGlzLnJlYWREaWFsb2dEYXRhVXVpZCgpID8/IHRoaXMudmlld0NvbnRleHQuZ2V0VXVpZE9mUGFnZSh0aGlzLnBhZ2VOYW1lISk7XG4gICAgLy8gY29uc29sZS5sb2coJ1tFbWJlZGRlZF0gbG9hZCgpJywge1xuICAgIC8vICAgcGFnZU5hbWU6IHRoaXMucGFnZU5hbWUsXG4gICAgLy8gICBfdXVpZDogdGhpcy5fdXVpZCxcbiAgICAvLyAgIHJlc29sdmVkVXVpZDogdXVpZCxcbiAgICAvLyB9KTtcbiAgICAvLyB0aGlzLm1vZGVsID0gYXdhaXQgdGhpcy52aWV3Q29udGV4dC5sb2FkKHRoaXMudXVpZCk7XG4gICAgY29uc3QgY2hhbmdlID0gYXdhaXQgdGhpcy52aWV3Q29udGV4dC5sb2FkMih1dWlkKTtcbiAgICB0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnV1aWQgPSB1dWlkO1xuICAgIHRoaXMubW9kZWwgPSBjaGFuZ2UhLnJlc3VsdCEgYXMgQ29tcG9uZW50TW9kZWw7XG4gICAgaWYgKHRoaXMubW9kZWwud2lkZ2V0cykge1xuICAgICAgLy8gZ3JpZHMgYXJlIGFscmVhZHkgbG9hZGVkIGluIHNldFV1aWQoKVxuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VXaWRnZXRzKHRoaXMubW9kZWwud2lkZ2V0cywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVVpQWN0aW9uKHVpQWN0aW9uOiBVaUFjdGlvbiwgb3B0aW9ucz86IEV4ZWN1dGVVaUFjdGlvbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1aUFjdGlvbk1vZGVsID0ge1xuICAgICAgc2VydmljZVRvVXNlOiB0aGlzLFxuICAgICAgdWlBY3Rpb246IHVpQWN0aW9uLFxuICAgIH07XG4gICAgYXdhaXQgdGhpcy51aUFjdGlvblNlcnZpY2UuZXhlY3V0ZSh1aUFjdGlvbiwgdWlBY3Rpb25Nb2RlbCwgb3B0aW9ucyk7XG4gIH1cblxuICBhZGREYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihrZXk6IHN0cmluZywgdmFsdWVDaGFuZ2VNb2RlOiBWYWx1ZUNoYW5nZU1vZGUpIHtcbiAgICBjb25zdCBjaGFuZ2VLZXlzID0gdGhpcy5nZXRDaGFuZ2VLZXlzKHZhbHVlQ2hhbmdlTW9kZSk7XG4gICAgaWYgKCFjaGFuZ2VLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGNoYW5nZUtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDaGFuZ2VLZXlzKHZhbHVlQ2hhbmdlTW9kZTogVmFsdWVDaGFuZ2VNb2RlKSB7XG4gICAgcmV0dXJuIHZhbHVlQ2hhbmdlTW9kZSA9PT0gVmFsdWVDaGFuZ2VNb2RlLklNTUVESUFURV9BQ1RJT05cbiAgICAgID8gdGhpcy5pbm1lZGlhdGVEYXRhQ2hhbmdlS2V5c1xuICAgICAgOiB0aGlzLmJsdXJEYXRhQ2hhbmdlS2V5cztcbiAgfVxuXG4gIHJlbW92ZURhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGtleTogc3RyaW5nKSB7XG4gICAgbGV0IGlubWVkaWF0ZUlkeCA9IHRoaXMuaW5tZWRpYXRlRGF0YUNoYW5nZUtleXMuaW5kZXhPZihrZXkpO1xuICAgIGlmIChpbm1lZGlhdGVJZHggPj0gMCkge1xuICAgICAgdGhpcy5pbm1lZGlhdGVEYXRhQ2hhbmdlS2V5cy5zcGxpY2UoaW5tZWRpYXRlSWR4LCAxKTtcbiAgICB9XG5cbiAgICBsZXQgYmx1cklkeCA9IHRoaXMuYmx1ckRhdGFDaGFuZ2VLZXlzLmluZGV4T2Yoa2V5KTtcbiAgICBpZiAoYmx1cklkeCA+PSAwKSB7XG4gICAgICB0aGlzLmlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzLnNwbGljZShibHVySWR4LCAxKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIoXG4gICAgZXZlbnQ6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSxcbiAgICB2YWx1ZUNoYW5nZU1vZGU6IFZhbHVlQ2hhbmdlTW9kZVxuICApIHtcbiAgICBjb25zdCBjaGFuZ2VLZXlzID0gdGhpcy5nZXRDaGFuZ2VLZXlzKHZhbHVlQ2hhbmdlTW9kZSk7XG4gICAgaWYgKGNoYW5nZUtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgdGhpcy5leGVjdXRlVWlBY3Rpb24oe1xuICAgICAgICBjb2RlOiBldmVudC5rZXksXG4gICAgICAgIG1vZGVsOiB0cnVlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBpdGVtOiBldmVudC52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVMYXlvdXRVcGxvYWRDYWxsYmFjayhjb21wOiBTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudCkge1xuICAgIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRGb3Jtcyhjb21wKS5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVVwbG9hZENhbGxiYWNrKGZvcm0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVVwbG9hZENhbGxiYWNrKGZvcm06IFNtYXJ0Zm9ybUNvbXBvbmVudCkge1xuICAgIGZvcm0uc21hcnRXaWRnZXRzUUw/LmZvckVhY2goKHdpZGdldCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB3aWRnZXQud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSIHx8XG4gICAgICAgIHdpZGdldC53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgfHxcbiAgICAgICAgd2lkZ2V0LndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkVDT1JESU5HX1VQTE9BREVSXG4gICAgICApIHtcbiAgICAgICAgd2lkZ2V0LnNtYXJ0Q29tcG9uZW50ID0gdGhpcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVGb3JtU3Vic2NyaXB0aW9ucyhmb3JtOiBTbWFydGZvcm1Db21wb25lbnQpIHtcbiAgICBmb3JtLnNtYXJ0Rm9ybT8ud2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQpID0+IHtcbiAgICAgIGlmICh3aWRnZXQua2V5KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB3aWRnZXQudmFsdWVDaGFuZ2VNb2RlID09PSBWYWx1ZUNoYW5nZU1vZGUuSU1NRURJQVRFX0FDVElPTiB8fFxuICAgICAgICAgIHdpZGdldC52YWx1ZUNoYW5nZU1vZGUgPT09IFZhbHVlQ2hhbmdlTW9kZS5CTFVSXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuYWRkRGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIod2lkZ2V0LmtleSwgd2lkZ2V0LnZhbHVlQ2hhbmdlTW9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVEYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcih3aWRnZXQua2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMuaGFzKGZvcm0pKSB7XG4gICAgICBsZXQgaW5tZWRpYXRlVmFsdWVDaGFuZ2VTdWIgPSBmb3JtLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIoZXZlbnQsIFZhbHVlQ2hhbmdlTW9kZS5JTU1FRElBVEVfQUNUSU9OKTtcbiAgICAgICAgfSk7XG4gICAgICBsZXQgYmx1clZhbHVlQ2hhbmdlU3ViID0gZm9ybS5ibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGV2ZW50LCBWYWx1ZUNoYW5nZU1vZGUuQkxVUikpO1xuICAgICAgdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMuc2V0KGZvcm0sIFtpbm1lZGlhdGVWYWx1ZUNoYW5nZVN1YiwgYmx1clZhbHVlQ2hhbmdlU3ViXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZURhdGFDaGFuZ2VTdWJzY3JpcHRpb25zKGZvcm1Db21wb25lbnQ/OiBTbWFydGZvcm1Db21wb25lbnQpIHtcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XG4gICAgICBsZXQgZm9ybXMgPSAhIWZvcm1Db21wb25lbnQgPyBbZm9ybUNvbXBvbmVudF0gOiB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKTtcbiAgICAgIGZvcm1zLmZvckVhY2goKGZvcm0pID0+IHRoaXMuaGFuZGxlRm9ybVN1YnNjcmlwdGlvbnMoZm9ybSkpO1xuXG4gICAgICAvLyB1bnN1YnNjcmliZSBmcm9tIHJlbW92ZWQgZm9ybXNcbiAgICAgIGlmICghZm9ybUNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5mb3JFYWNoKChzdWJzLCBmb3JtKSA9PiB7XG4gICAgICAgICAgaWYgKCFmb3Jtcy5maW5kKChjKSA9PiBjID09PSBmb3JtKSkge1xuICAgICAgICAgICAgc3Vicy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmRlbGV0ZShmb3JtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEludmFsaWRGaWVsZHMoKTogU21hcnRGb3JtSW52YWxpZEZpZWxkcyB7XG4gICAgbGV0IGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzOiBTbWFydEZvcm1JbnZhbGlkRmllbGRzID0ge1xuICAgICAgaW52YWxpZEZpZWxkS2V5czogW10sXG4gICAgICBpbnZhbGlkRmllbGROYW1lczogW10sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PlxuICAgICAgICB0aGlzLnZhbGlkYXRlRm9ybShmb3JtLCBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybVdpZGdldHM/LmZvckVhY2goKGZvcm0pID0+IHRoaXMudmFsaWRhdGVGb3JtKGZvcm0sIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRm9ybShcbiAgICBmb3JtOiBTbWFydGZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQsXG4gICAgYWdncmVnYXRlZEludmFsaWRGaWVsZHM6IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHNcbiAgKSB7XG4gICAgbGV0IGludmFsaWRGaWVsZHNPZkZvcm0gPSBmb3JtPy5nZXRJbnZhbGlkRmllbGRzKCk7XG4gICAgaWYgKGludmFsaWRGaWVsZHNPZkZvcm0pIHtcbiAgICAgIGludmFsaWRGaWVsZHNPZkZvcm0uaW52YWxpZEZpZWxkS2V5cy5mb3JFYWNoKChrZXkpID0+XG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZEtleXMucHVzaChrZXkpXG4gICAgICApO1xuICAgICAgaW52YWxpZEZpZWxkc09mRm9ybS5pbnZhbGlkRmllbGROYW1lcy5mb3JFYWNoKChrZXkpID0+XG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZE5hbWVzLnB1c2goa2V5KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyNyZWdpb24gVXNlVWlBY3Rpb25cbiAgZ2V0QWRkaXRpb25hbFBhcmFtcyh1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkFkZGl0aW9uYWxQYXJhbXMge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JUZXh0QXJlYTogJycsXG4gICAgICBmb3JUZXh0RmllbGQ6ICcnLFxuICAgIH07XG4gIH1cbiAgZ2V0TW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0odmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdEZvcm1zKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm1VaUFjdGlvblJlcXVlc3QoXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QsXG4gICAgd2lkZ2V0SWQ/OiBzdHJpbmcsXG4gICAgbm9kZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ3BhcmFtJ107XG4gICAgICBjb25zdCBmaWxlcyA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddO1xuICAgICAgY29uc3QgdXBsb2FkRGVzY3JpcHRvciA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ191cGxvYWREZXNjcmlwdG9yJ107XG4gICAgICBjb25zdCBpc011bHRpcGxlID0gdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snaXNNdWx0aXBsZSddO1xuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ3BhcmFtJ107XG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX2ZpbGVzJ107XG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX3VwbG9hZERlc2NyaXB0b3InXTtcbiAgICAgIGRlbGV0ZSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydpc011bHRpcGxlJ107XG5cbiAgICAgIC8vIGF3YWl0IHRoaXMuc2VuZE1vZGVsVG9TZXJ2ZXIoKTtcblxuICAgICAgaWYgKCFpc011bHRpcGxlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVVwbG9hZEFjdGlvbih0aGlzLnV1aWQhLCB1aUFjdGlvblJlcXVlc3QsIHBhcmFtLCBmaWxlc1swXSk7XG4gICAgICB9IGVsc2UgaWYgKHVwbG9hZERlc2NyaXB0b3IgIT0gbnVsbCAmJiB1cGxvYWREZXNjcmlwdG9yICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgbWF4QmF0Y2hGaWxlc1NpemUgPSB1cGxvYWREZXNjcmlwdG9yLm1heFNpemUgKiAxMDI0ICogMTAyNDtcbiAgICAgICAgbGV0IG1heEJhdGNoU2l6ZSA9IHVwbG9hZERlc2NyaXB0b3IubWF4QmF0Y2hTaXplO1xuXG4gICAgICAgIGxldCBjdXJyZW50QmF0Y2hTaXplID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRCYXRjaDogYW55W10gPSBbXTtcbiAgICAgICAgY29uc3QgYmF0Y2hlczogYW55W11bXSA9IFtdO1xuXG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvdWxkRXhjZWVkU2l6ZSA9IGN1cnJlbnRCYXRjaFNpemUgKyBmaWxlLnNpemUgPiBtYXhCYXRjaEZpbGVzU2l6ZTtcblxuICAgICAgICAgIGNvbnN0IHdvdWxkRXhjZWVkQ291bnQgPVxuICAgICAgICAgICAgdHlwZW9mIG1heEJhdGNoU2l6ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIG1heEJhdGNoU2l6ZSA+IDAgJiZcbiAgICAgICAgICAgIGN1cnJlbnRCYXRjaC5sZW5ndGggPj0gbWF4QmF0Y2hTaXplO1xuXG4gICAgICAgICAgaWYgKHdvdWxkRXhjZWVkU2l6ZSB8fCB3b3VsZEV4Y2VlZENvdW50KSB7XG4gICAgICAgICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgICAgICAgICAgIGN1cnJlbnRCYXRjaCA9IFtdO1xuICAgICAgICAgICAgY3VycmVudEJhdGNoU2l6ZSA9IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudEJhdGNoLnB1c2goZmlsZSk7XG4gICAgICAgICAgY3VycmVudEJhdGNoU2l6ZSArPSBmaWxlLnNpemU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCkge1xuICAgICAgICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmF0Y2hlcy5mb3JFYWNoKFxuICAgICAgICAgIGFzeW5jIChiYXRjaCkgPT5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKFxuICAgICAgICAgICAgICB0aGlzLnV1aWQhLFxuICAgICAgICAgICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgICBiYXRjaFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oXG4gICAgICAgICAgdGhpcy51dWlkISxcbiAgICAgICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgICAgICAgcGFyYW0sXG4gICAgICAgICAgZmlsZXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHdpZGdldElkICYmIG5vZGVJZCkge1xuICAgICAgLy8gYXdhaXQgdGhpcy5zZW5kTW9kZWxUb1NlcnZlcigpO1xuICAgICAgdGhpcy5hZGRNb2RlbFRvV2lkZ2V0QWN0aW9uKHVpQWN0aW9uUmVxdWVzdCk7XG4gICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1XaWRnZXRBY3Rpb24odGhpcy51dWlkISwgd2lkZ2V0SWQsIG5vZGVJZCwgdWlBY3Rpb25SZXF1ZXN0KTtcbiAgICB9IGVsc2UgaWYgKHdpZGdldElkKSB7XG4gICAgICAvLyBhd2FpdCB0aGlzLnNlbmRNb2RlbFRvU2VydmVyKCk7XG4gICAgICB0aGlzLmFkZE1vZGVsVG9XaWRnZXRBY3Rpb24odWlBY3Rpb25SZXF1ZXN0KTtcbiAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVdpZGdldE1haW5BY3Rpb24odGhpcy51dWlkISwgd2lkZ2V0SWQsIHVpQWN0aW9uUmVxdWVzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybUFjdGlvbih0aGlzLnV1aWQhLCB1aUFjdGlvblJlcXVlc3QpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRNb2RlbFRvV2lkZ2V0QWN0aW9uKHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0KSB7XG4gICAgdGhpcy5hZGRNb2RlbFRvV2lkZ2V0UGFyYW1zKHVpQWN0aW9uUmVxdWVzdC5wYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIGFkZE1vZGVsVG9XaWRnZXRQYXJhbXMocGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VuZE1vZGVsT25XaWRnZXRBY3Rpb24pIHtcbiAgICAgIHRoaXMuc3VibWl0Rm9ybShmYWxzZSk7XG4gICAgICAvLyBtaW1pYyBDb21wb25lbnRNb2RlbFxuICAgICAgcGFyYW1zWydjbGllbnRQYWdlTW9kZWwnXSA9IHsgZGF0YTogdGhpcy5nZXRNb2RlbCgpIH07XG4gICAgfVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBhc3luYyBzZW5kTW9kZWxUb1NlcnZlcigpIHtcbiAgLy8gICB0aGlzLnN1Ym1pdEZvcm1zKGZhbHNlKTtcbiAgLy8gICBsZXQgZGF0YUNoYW5nZSA9IHtcbiAgLy8gICAgIGtpbmQ6IERhdGFDaGFuZ2VLaW5kLldpZGdldCxcbiAgLy8gICAgIHNvdXJjZTogJycsXG4gIC8vICAgICB2YWx1ZXM6IFtbJycsIHRoaXMuZ2V0TW9kZWwoKV1dLFxuICAvLyAgIH07XG4gIC8vICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5kYXRhQ2hhbmdlZCh0aGlzLnV1aWQhLCBkYXRhQ2hhbmdlKTtcbiAgLy8gfVxuXG4gIGhhbmRsZVNwZWNpZmljRGVtYW5kc0FzeW5jaHJvbm91c2x5KFxuICAgIHVpQWN0aW9uOiBVaUFjdGlvbixcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxuICApOiBQcm9taXNlPFVpQWN0aW9uU3BlY2lmaWNEZW1hbmRSZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignaGFuZGxlU3BlY2lmaWNEZW1hbmRzQXN5bmNocm9ub3VzbHkgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvKipcbiAgICogU3VibWl0cyBhbGwgdGhlIHJlZ2lzdGVyZWQgZm9ybXMgaW4gdGhlIFNtYXJ0Q29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgc3VibWl0Rm9ybXModmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICBmb3JtPy5zdWJtaXRGb3JtKHZhbGlkYXRlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1XaWRnZXRzPy5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICAgIGZvcm0/LnN1Ym1pdEZvcm0odmFsaWRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEdyaWQoXG4gICAgc21hcnRHcmlkOiBTbWFydEdyaWQsXG4gICAgb3B0aW9uczogR3JpZE9wdGlvbnMsXG4gICAgdXNlQXNEZWZhdWx0R3JpZD86IGJvb2xlYW4sXG4gICAgY29tcG9uZW50UmVmZXJlbmNlPzogU21hcnRHcmlkQ29tcG9uZW50XG4gICk6IFNtYXJ0R3JpZCB7XG4gICAgc21hcnRHcmlkLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHNtYXJ0R3JpZC51aUFjdGlvblNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uU2VydmljZTtcbiAgICBzbWFydEdyaWQudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSA9IHRoaXMudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZTtcbiAgICBzbWFydEdyaWQuc2VydmljZVRvVXNlID0gdGhpcztcbiAgICBzbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcblxuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XG4gICAgICB0aGlzLndpZGdldHMuc2V0KHNtYXJ0R3JpZC5ncmlkSWRlbnRpZmllciwgY29tcG9uZW50UmVmZXJlbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBBZGRlZCBzbWFydEdyaWQgd2hlbiB1c2VRdWVyeUxpc3RzID09PSB0cnVlICgke3NtYXJ0R3JpZC5ncmlkSWRlbnRpZmllcn0pYCk7XG4gICAgfVxuXG4gICAgaWYgKHVzZUFzRGVmYXVsdEdyaWQpIHtcbiAgICAgIHRoaXMuc21hcnRHcmlkID0gc21hcnRHcmlkO1xuICAgICAgcmV0dXJuIHRoaXMuc21hcnRHcmlkO1xuICAgIH1cblxuICAgIHJldHVybiBzbWFydEdyaWQ7XG4gIH1cblxuICBwdWJsaWMgYWRkRm9ybShcbiAgICBzbWFydEZvcm1JZDogc3RyaW5nLFxuICAgIHNtYXJ0Rm9ybTogU21hcnRGb3JtLFxuICAgIGNvbXBvbmVudFJlZmVyZW5jZT86IFNtYXJ0Zm9ybUNvbXBvbmVudFxuICApOiBTbWFydEZvcm0ge1xuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XG4gICAgICB0aGlzLmZvcm1XaWRnZXRzLnNldChzbWFydEZvcm1JZCwgY29tcG9uZW50UmVmZXJlbmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBBZGRlZCBzbWFydEZvcm0gd2hlbiB1c2VRdWVyeUxpc3RzID09PSB0cnVlICgke3NtYXJ0Rm9ybUlkfSlgKTtcbiAgICB9XG5cbiAgICAvLyBpZiAodGhpcy5zZW5kRGF0YUNoYW5nZXMgJiYgY29tcG9uZW50UmVmZXJlbmNlKSB7XG4gICAgLy8gICBzbWFydEZvcm0udXNlT25WYWx1ZUNoYW5nZUV2ZW50ID0gdHJ1ZTtcblxuICAgIC8vICAgY29tcG9uZW50UmVmZXJlbmNlLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVxuICAgIC8vICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgIC8vICAgICAuc3Vic2NyaWJlKCh2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlKSA9PiB7XG4gICAgLy8gICAgICAgdGhpcy5oYW5kbGVWYWx1ZUNoYW5nZXModmFsdWVDaGFuZ2UpO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gc21hcnRGb3JtO1xuICB9XG5cbiAgcHVibGljIHNldFVwRGVmYXVsdFRyZWUodHJlZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNtYXJ0VHJlZVNlcnZpY2UgPSB0aGlzLmNyZWF0ZVRyZWVTZXJ2aWNlKHRyZWVJZCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVHJlZVNlcnZpY2UodHJlZUlkOiBzdHJpbmcpOiBTbWFydHRyZWVHZW5lcmljU2VydmljZSB7XG4gICAgY29uc3QgdHJlZVNlcnZpY2UgPSBuZXcgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UodGhpcy5pbmplY3QsIHRoaXMucGFnZU5hbWUhLCB0cmVlSWQpO1xuICAgIC8vIEluIHRoZSB1c2VRdWVyeUxpc3RzIG1vZGVsIHRoZSB0cmVlIGlzIHJvdXRlZCB2aWEgdGhlIFNtYXJ0VHJlZUNvbXBvbmVudFxuICAgIC8vIFF1ZXJ5TGlzdCArIHRyZWVJZCAoc2VlIGdldFdpZGdldHMpLCBzbyBubyBtYW51YWwgd2lkZ2V0cy5zZXQgaXMgbmVlZGVkOyB0aGVcbiAgICAvLyBsZWdhY3kgbm9uLVF1ZXJ5TGlzdCBwYXRoIHN0aWxsIHJlZ2lzdGVycyBpdCBleHBsaWNpdGx5LlxuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XG4gICAgICB0aGlzLndpZGdldHMuc2V0KHRyZWVJZCwgdHJlZVNlcnZpY2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlVXBsb2FkZXIoXG4gICAgdWlBY3Rpb25Db2RlOiBzdHJpbmcsXG4gICAgZmlsZUZvcm1hdHM/OiBzdHJpbmdbXSxcbiAgICBtYXhTaXplTWI/OiBudW1iZXIsXG4gICAgaXNNdWx0aXBsZT86IGJvb2xlYW5cbiAgKTogU21hcnRDb21wb25lbnRGaWxlVXBsb2FkZXIge1xuICAgIHJldHVybiB7XG4gICAgICB1aUFjdGlvbkNvZGUsXG4gICAgICBzbWFydENvbXBvbmVudDogdGhpcyxcbiAgICAgIGZpbGVGb3JtYXRzLFxuICAgICAgaXNNdWx0aXBsZSxcbiAgICAgIG1heFNpemVNYixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBkaWFsb2ctaG9zdGVkIGRlZmF1bHQgY29tcG9uZW50cywgdGhlIHZpZXcgdXVpZCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAgICogZGlhbG9nIGRhdGEgKE1BVF9ESUFMT0dfREFUQSBmb3IgTWF0ZXJpYWwsIER5bmFtaWNEaWFsb2dDb25maWcuZGF0YSBmb3JcbiAgICogUHJpbWVORykuIFJldHVybnMgdW5kZWZpbmVkIGZvciBzbG90LWhvc3RlZCBjb21wb25lbnRzIChubyBkaWFsb2cgZGF0YSkuICgjMjg4NzApXG4gICAqL1xuICBwcml2YXRlIHJlYWREaWFsb2dEYXRhVXVpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdERhdGEgPSB0aGlzLmluamVjdC5nZXQ8YW55PihNQVRfRElBTE9HX0RBVEEsIG51bGwpO1xuICAgIGlmIChtYXREYXRhPy51dWlkKSB7XG4gICAgICByZXR1cm4gbWF0RGF0YS51dWlkO1xuICAgIH1cbiAgICBjb25zdCBwcmltZUNvbmZpZyA9IHRoaXMuaW5qZWN0LmdldDxEeW5hbWljRGlhbG9nQ29uZmlnIHwgbnVsbD4oRHluYW1pY0RpYWxvZ0NvbmZpZywgbnVsbCk7XG4gICAgcmV0dXJuIHByaW1lQ29uZmlnPy5kYXRhPy51dWlkO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBoYW5kbGUgY2hhbmdlc1xuICBwcml2YXRlIGhhbmRsZVZhbHVlQ2hhbmdlcyh2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlKTogdm9pZCB7XG4gICAgbGV0IGRhdGFDaGFuZ2U6IERhdGFDaGFuZ2U7XG4gICAgaWYgKHZhbHVlQ2hhbmdlLmtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB2YWx1ZUNoYW5nZS5rZXkuc3BsaXQoJy4nKVswXTtcbiAgICAgIGNvbnN0IHZhbHVlS2V5ID0gdmFsdWVDaGFuZ2Uua2V5LnNwbGl0KCcuJylbMV07XG4gICAgICBkYXRhQ2hhbmdlID0ge1xuICAgICAgICBraW5kOiB2YWx1ZUNoYW5nZS5raW5kID09PSAnYmFzaWMnID8gRGF0YUNoYW5nZUtpbmQuV0lER0VUIDogRGF0YUNoYW5nZUtpbmQuU0VMRUNUSU9OLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHZhbHVlczogW1t2YWx1ZUtleSwgdmFsdWVDaGFuZ2UudmFsdWVdXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFDaGFuZ2UgPSB7XG4gICAgICAgIGtpbmQ6IHZhbHVlQ2hhbmdlLmtpbmQgPT09ICdiYXNpYycgPyBEYXRhQ2hhbmdlS2luZC5XSURHRVQgOiBEYXRhQ2hhbmdlS2luZC5TRUxFQ1RJT04sXG4gICAgICAgIHNvdXJjZTogdmFsdWVDaGFuZ2Uua2V5LFxuICAgICAgICB2YWx1ZXM6IFtbdmFsdWVDaGFuZ2Uua2V5LCB2YWx1ZUNoYW5nZS52YWx1ZV1dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250ZXh0LmRhdGFDaGFuZ2VkKHRoaXMudXVpZCEsIGRhdGFDaGFuZ2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNoYW5nZXMoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQpIHtcbiAgICAgICAgLy8gaW5pdGlhbCBsb2FkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UuY2hhbmdlZFdpZGdldHMpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VXaWRnZXRzKGNoYW5nZS5jaGFuZ2VkV2lkZ2V0cyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhQ2hhbmdlSGFzQmVlbk5leHRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBjaGFuZ2UuY2hhbmdlcztcbiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcykubWFwKChjaGFuZ2VLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgnZGF0YS4nKSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRhQ2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgnbGF5b3V0cy4nKSAmJiB0aGlzLm1vZGVsPy5sYXlvdXRzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxheW91dENoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5LnN0YXJ0c1dpdGgoJ2NvbXBvbmVudExheW91dHMuJykgJiYgdGhpcy5tb2RlbD8ubGF5b3V0cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb21wb25lbnRMYXlvdXRDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleS5zdGFydHNXaXRoKCd2YWx1ZVNldHMuJykgJiYgdGhpcy5tb2RlbD8udmFsdWVTZXRzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVZhbHVlU2V0Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkgPT09ICdhY3Rpb25zJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb25DaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleSA9PT0gJ2NvbnN0cmFpbnRzJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25zdHJhaW50Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkgPT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gY2hhbmdlc1snJ10gYXMgQ29tcG9uZW50TW9kZWw7XG4gICAgICAgICAgICBkYXRhQ2hhbmdlSGFzQmVlbk5leHRlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWRhdGFDaGFuZ2VIYXNCZWVuTmV4dGVkKSB7XG4gICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLm1vZGVsID0gY2hhbmdlLnZhbHVlIGFzIENvbXBvbmVudE1vZGVsO1xuICAgIH1cblxuICAgIGlmICghY2hhbmdlLmNoYW5nZWRXaWRnZXRzICYmICFjaGFuZ2UuY2hhbmdlcyAmJiBjaGFuZ2UudmFsdWUpIHtcbiAgICAgIHRoaXMubW9kZWwgPSBjaGFuZ2UudmFsdWUgYXMgQ29tcG9uZW50TW9kZWw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNoYW5nZVdpZGdldHMoY2hhbmdlZFdpZGdldHM6IHN0cmluZ1tdLCBza2lwTG9hZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgbGV0IHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICBjaGFuZ2VkV2lkZ2V0cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0gd2lkZ2V0cy5nZXQoa2V5KTtcblxuICAgICAgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0R3JpZENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnNldHVwR3JpZFNlcnZpY2VzKHJlZmVyZW5jZSk7XG4gICAgICAgIGlmICghc2tpcExvYWQpIHtcbiAgICAgICAgICByZWZlcmVuY2UucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0dHJlZVNlcnZpY2UpIHtcbiAgICAgICAgaWYgKCFza2lwTG9hZCkge1xuICAgICAgICAgIHJlZmVyZW5jZS5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuc2V0dXBGaWx0ZXJTZXJ2aWNlcyhyZWZlcmVuY2UpO1xuICAgICAgICAvL2lmICghc2tpcExvYWQpIHsgLy8gZmlsdGVyIGlzIG5vdCBsb2FkZWQgd2hlbiBzZXR0aW5nIHV1aWRcbiAgICAgICAgcmVmZXJlbmNlLnNlcnZpY2UubG9hZCgpO1xuICAgICAgICAvL31cbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnRNYXBDb21wb25lbnQpIHtcbiAgICAgICAgcmVmZXJlbmNlLmxvYWQoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnREaWFncmFtQ29tcG9uZW50KSB7XG4gICAgICAgIHJlZmVyZW5jZS5sb2FkKCk7XG4gICAgICB9IGVsc2UgaWYgKCFza2lwTG9hZCAmJiByZWZlcmVuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCByZWZlcmVuY2UgZm9yICR7a2V5fSBpcyB1bmRlZmluZWQuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlRGVlcGx5KG1vZGVsOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xuXG4gICAgbGV0IGRlZXBNb2RlbDogYW55W10gPSBbbW9kZWxdO1xuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzcGxpdHRlZEtleXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdzdHJpbmcnICYmXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdib29sZWFuJyAmJlxuICAgICAgICB0eXBlb2YgdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGRlZXBNb2RlbC5wdXNoKHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleCA9PT0gc3BsaXR0ZWRLZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xuICAgICAgICAvLyBpZiAodmFsdWUgPT09ICcnICYmIChvbGRWYWx1ZSA9PT0gbnVsbCB8fCBvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB0aGVuIGRvbid0IGNoYW5nZSB2YWx1ZS5cbiAgICAgICAgaWYgKHZhbHVlICE9PSAnJyB8fCAob2xkVmFsdWUgIT09IG51bGwgJiYgb2xkVmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURhdGFDaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFZhbHVlRGVlcGx5KHRoaXMubW9kZWwsIGNoYW5nZUtleSwgY2hhbmdlc1tjaGFuZ2VLZXldKTtcblxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICAgIGZvcm0ucmVmcmVzaCgpO1xuICAgICAgICBmb3JtLm1hcmtBbGxXaWRnZXRzRm9yQ2hhbmdlRGV0ZWN0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtV2lkZ2V0cy5mb3JFYWNoKChmb3JtQ29tcG9uZW50OiBTbWFydGZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChmb3JtQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCBmb3JtIHJlZmVyZW5jZSBmb3IgJHtrZXl9IGlzIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtQ29tcG9uZW50LnJlZnJlc2goKTtcbiAgICAgICAgICBmb3JtQ29tcG9uZW50Lm1hcmtBbGxXaWRnZXRzRm9yQ2hhbmdlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yIS5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxheW91dENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBsYXlvdXRLZXkgPSBjaGFuZ2VLZXkuc3BsaXQoJy4nKVsxXTtcbiAgICB0aGlzLm1vZGVsIS5sYXlvdXRzW2xheW91dEtleV0gPSBjaGFuZ2VzW2NoYW5nZUtleV07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbXBvbmVudExheW91dENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBsYXlvdXRLZXkgPSBjaGFuZ2VLZXkuc3BsaXQoJy4nKVsxXTtcbiAgICBsZXQgY29tcG9uZW50TGF5b3V0czogeyBba2V5OiBzdHJpbmddOiBPYmplY3QgfSA9IHRoaXMubW9kZWwhLmNvbXBvbmVudExheW91dHMgYXMge1xuICAgICAgW2tleTogc3RyaW5nXTogT2JqZWN0O1xuICAgIH07XG4gICAgY29tcG9uZW50TGF5b3V0c1tsYXlvdXRLZXldID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVWYWx1ZVNldENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCB2YWx1ZVNldEtleSA9IGNoYW5nZUtleS5zcGxpdCgnLicpWzFdO1xuICAgIHRoaXMubW9kZWwhLnZhbHVlU2V0cyFbdmFsdWVTZXRLZXldID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBY3Rpb25DaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsIS5hY3Rpb25zID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xuICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29uc3RyYWludENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwhLmNvbnN0cmFpbnRzID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q29tcG9uZW50RmlsZVVwbG9hZGVyIHtcbiAgdWlBY3Rpb25Db2RlOiBzdHJpbmc7XG4gIG1heFNpemVNYj86IG51bWJlcjtcbiAgZmlsZUZvcm1hdHM/OiBzdHJpbmdbXTtcbiAgaXNNdWx0aXBsZT86IGJvb2xlYW47XG4gIHNtYXJ0Q29tcG9uZW50OiBTbWFydENvbXBvbmVudEFwaUNsaWVudDxhbnk+O1xufVxuIl19