@smartbit4all/ng-client 6.0.32 → 7.0.0

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