@scion/workbench 17.0.0-beta.6 → 17.0.0-beta.8

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 (314) hide show
  1. package/README.md +1 -1
  2. package/esm2022/lib/activation-instant.provider.mjs +3 -3
  3. package/esm2022/lib/common/asserts.util.mjs +2 -2
  4. package/esm2022/lib/common/class-list.mjs +61 -0
  5. package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
  6. package/esm2022/lib/common/filter-by-predicate.pipe.mjs +3 -3
  7. package/esm2022/lib/common/filter-by-text.pipe.mjs +3 -3
  8. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +6 -6
  9. package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
  10. package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
  11. package/esm2022/lib/common/null-if-empty.pipe.mjs +3 -3
  12. package/esm2022/lib/common/objects.util.mjs +34 -0
  13. package/esm2022/lib/common/typeof.pipe.mjs +3 -3
  14. package/esm2022/lib/common/uuid.util.mjs +17 -0
  15. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
  16. package/esm2022/lib/content-projection/content-projection.directive.mjs +3 -3
  17. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
  18. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
  19. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +3 -3
  20. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +3 -3
  21. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -3
  22. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
  23. package/esm2022/lib/dialog/movable.directive.mjs +3 -3
  24. package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
  25. package/esm2022/lib/dialog/workbench-dialog.component.mjs +3 -3
  26. package/esm2022/lib/dialog/workbench-dialog.mjs +1 -1
  27. package/esm2022/lib/dialog/workbench-dialog.options.mjs +1 -1
  28. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
  29. package/esm2022/lib/dialog/workbench-dialog.service.mjs +5 -5
  30. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +8 -26
  31. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +3 -3
  32. package/esm2022/lib/filter-field/filter-field.component.mjs +6 -6
  33. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +3 -3
  34. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -10
  35. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +7 -4
  36. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +11 -0
  37. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +11 -0
  38. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +11 -0
  39. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +11 -0
  40. package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +59 -0
  41. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +117 -0
  42. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +57 -0
  43. package/esm2022/lib/layout/workbench-layout.component.mjs +7 -4
  44. package/esm2022/lib/layout/workbench-layout.factory.mjs +4 -4
  45. package/esm2022/lib/layout/workbench-layout.mjs +1 -1
  46. package/esm2022/lib/layout/workbench-layout.model.mjs +5 -6
  47. package/esm2022/lib/layout/workbench-layout.service.mjs +3 -3
  48. package/esm2022/lib/layout/workbench-layouts.util.mjs +53 -16
  49. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +53 -21
  50. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +8 -5
  51. package/esm2022/lib/layout//311/265workbench-layout.mjs +382 -195
  52. package/esm2022/lib/logging/console-appender.service.mjs +3 -3
  53. package/esm2022/lib/logging/logger-names.mjs +8 -9
  54. package/esm2022/lib/logging/logger.mjs +3 -3
  55. package/esm2022/lib/logging/logging-support.mjs +4 -4
  56. package/esm2022/lib/logging/logging.model.mjs +3 -3
  57. package/esm2022/lib/logging//311/265logger.mjs +3 -3
  58. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +18 -20
  59. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
  60. package/esm2022/lib/message-box/workbench-message-box.component.mjs +3 -3
  61. package/esm2022/lib/message-box/workbench-message-box.options.mjs +1 -1
  62. package/esm2022/lib/message-box/workbench-message-box.service.mjs +5 -5
  63. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +5 -5
  64. package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +55 -0
  65. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +34 -22
  66. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
  67. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +3 -3
  68. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +53 -0
  69. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +85 -0
  70. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +140 -0
  71. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +122 -0
  72. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +11 -10
  73. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.mjs +3 -3
  74. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
  75. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
  76. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +30 -0
  77. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +130 -0
  78. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +18 -30
  79. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
  80. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +9 -31
  81. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +88 -144
  82. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +23 -0
  83. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +41 -0
  84. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +30 -0
  85. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +125 -0
  86. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +103 -0
  87. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +45 -47
  88. package/esm2022/lib/migration/workbench-migration.mjs +11 -0
  89. package/esm2022/lib/migration/workbench-migrator.mjs +38 -0
  90. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
  91. package/esm2022/lib/notification/notification-list.component.mjs +3 -3
  92. package/esm2022/lib/notification/notification.component.mjs +3 -3
  93. package/esm2022/lib/notification/notification.config.mjs +1 -1
  94. package/esm2022/lib/notification/notification.mjs +1 -1
  95. package/esm2022/lib/notification/notification.service.mjs +9 -9
  96. package/esm2022/lib/notification/text-notification.component.mjs +3 -3
  97. package/esm2022/lib/page-not-found/format-url.pipe.mjs +26 -0
  98. package/esm2022/lib/page-not-found/page-not-found.component.mjs +28 -0
  99. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +3 -3
  100. package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +3 -3
  101. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
  102. package/esm2022/lib/part/part-bar/part-bar.component.mjs +11 -8
  103. package/esm2022/lib/part/part-portal.pipe.mjs +3 -3
  104. package/esm2022/lib/part/part.component.mjs +7 -4
  105. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +3 -3
  106. package/esm2022/lib/part/view-context-menu/text.component.mjs +3 -3
  107. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +3 -3
  108. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +4 -4
  109. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +19 -19
  110. package/esm2022/lib/part/view-list/view-list.component.mjs +3 -3
  111. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +3 -3
  112. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +9 -9
  113. package/esm2022/lib/part/view-tab/view-tab.component.mjs +16 -13
  114. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -5
  115. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +9 -9
  116. package/esm2022/lib/part/workbench-part-action.registry.mjs +3 -3
  117. package/esm2022/lib/part/workbench-part.model.mjs +1 -1
  118. package/esm2022/lib/part/workbench-part.registry.mjs +3 -3
  119. package/esm2022/lib/part//311/265workbench-part.model.mjs +3 -3
  120. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +11 -0
  121. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +11 -0
  122. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +57 -0
  123. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +19 -51
  124. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +23 -18
  125. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +27 -42
  126. package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
  127. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +3 -3
  128. package/esm2022/lib/perspective/workbench-perspective.service.mjs +15 -10
  129. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +62 -0
  130. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +98 -78
  131. package/esm2022/lib/popup/popup.component.mjs +3 -3
  132. package/esm2022/lib/popup/popup.config.mjs +1 -1
  133. package/esm2022/lib/popup/popup.service.mjs +3 -3
  134. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +6 -6
  135. package/esm2022/lib/public_api.mjs +3 -2
  136. package/esm2022/lib/registry/workbench-object-registry.mjs +3 -3
  137. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +31 -0
  138. package/esm2022/lib/routing/public_api.mjs +1 -1
  139. package/esm2022/lib/routing/router.util.mjs +96 -71
  140. package/esm2022/lib/routing/routing.model.mjs +11 -0
  141. package/esm2022/lib/routing/url-segment-matcher.mjs +46 -0
  142. package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +58 -50
  143. package/esm2022/lib/routing/workbench-dialog-differ.mjs +51 -0
  144. package/esm2022/lib/routing/workbench-layout-differ.mjs +14 -17
  145. package/esm2022/lib/routing/workbench-navigational-states.mjs +11 -25
  146. package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
  147. package/esm2022/lib/routing/workbench-route-data.mjs +15 -14
  148. package/esm2022/lib/routing/workbench-router-link.directive.mjs +24 -33
  149. package/esm2022/lib/routing/workbench-router.service.mjs +13 -378
  150. package/esm2022/lib/routing/workbench-url-observer.service.mjs +65 -36
  151. package/esm2022/lib/routing//311/265location.mjs +3 -3
  152. package/esm2022/lib/routing//311/265workbench-router.service.mjs +317 -0
  153. package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
  154. package/esm2022/lib/startup/workbench-launcher.service.mjs +11 -11
  155. package/esm2022/lib/storage/workbench-storage.mjs +3 -3
  156. package/esm2022/lib/testing/public_api.mjs +2 -1
  157. package/esm2022/lib/testing/workbench-testing.module.mjs +13 -39
  158. package/esm2022/lib/testing/workbench.provider.mjs +60 -0
  159. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +3 -3
  160. package/esm2022/lib/view/public_api.mjs +2 -1
  161. package/esm2022/lib/view/view-move-handler.service.mjs +42 -62
  162. package/esm2022/lib/view/view-portal.pipe.mjs +4 -4
  163. package/esm2022/lib/view/view.component.mjs +8 -38
  164. package/esm2022/lib/view/workbench-view-route-guards.mjs +47 -0
  165. package/esm2022/lib/view/workbench-view.model.mjs +6 -4
  166. package/esm2022/lib/view/workbench-view.registry.mjs +4 -4
  167. package/esm2022/lib/view//311/265workbench-view.model.mjs +135 -28
  168. package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +33 -32
  169. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +7 -7
  170. package/esm2022/lib/view-dnd/view-drag.service.mjs +6 -6
  171. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +3 -3
  172. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +4 -4
  173. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +11 -9
  174. package/esm2022/lib/workbench-config.mjs +15 -0
  175. package/esm2022/lib/workbench-id.mjs +3 -3
  176. package/esm2022/lib/workbench.component.mjs +14 -10
  177. package/esm2022/lib/workbench.constants.mjs +8 -10
  178. package/esm2022/lib/workbench.model.mjs +1 -1
  179. package/esm2022/lib/workbench.module.mjs +15 -86
  180. package/esm2022/lib/workbench.provider.mjs +117 -0
  181. package/esm2022/lib/workbench.service.mjs +5 -5
  182. package/esm2022/lib//311/265workbench.service.mjs +15 -21
  183. package/fesm2022/scion-workbench.mjs +5527 -4289
  184. package/fesm2022/scion-workbench.mjs.map +1 -1
  185. package/lib/common/class-list.d.ts +51 -0
  186. package/lib/common/objects.util.d.ts +17 -0
  187. package/lib/common/uuid.util.d.ts +8 -0
  188. package/lib/dialog/workbench-dialog.d.ts +3 -7
  189. package/lib/dialog/workbench-dialog.options.d.ts +5 -4
  190. package/lib/dialog/workbench-dialog.registry.d.ts +4 -3
  191. package/lib/dialog/workbench-dialog.service.d.ts +1 -1
  192. package/lib/dialog//311/265workbench-dialog.d.ts +4 -6
  193. package/lib/filter-field/filter-field.component.d.ts +1 -1
  194. package/lib/layout/grid-element/grid-element.component.d.ts +2 -2
  195. package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +16 -0
  196. package/lib/layout/migration/model/workbench-layout-migration-v2.model.d.ts +22 -0
  197. package/lib/layout/migration/model/workbench-layout-migration-v3.model.d.ts +30 -0
  198. package/lib/layout/migration/model/workbench-layout-migration-v4.model.d.ts +31 -0
  199. package/lib/layout/migration/workbench-layout-migration-v2.service.d.ts +13 -0
  200. package/lib/layout/migration/workbench-layout-migration-v3.service.d.ts +16 -0
  201. package/lib/layout/migration/workbench-layout-migration-v4.service.d.ts +12 -0
  202. package/lib/layout/workbench-layout.d.ts +61 -7
  203. package/lib/layout/workbench-layout.factory.d.ts +1 -1
  204. package/lib/layout/workbench-layout.model.d.ts +19 -9
  205. package/lib/layout/workbench-layouts.util.d.ts +22 -6
  206. package/lib/layout/workench-layout-serializer.service.d.ts +28 -7
  207. package/lib/layout//311/265workbench-layout.d.ts +172 -98
  208. package/lib/layout//311/265workbench-layout.factory.d.ts +4 -0
  209. package/lib/logging/logger-names.d.ts +7 -7
  210. package/lib/logging/logging-support.d.ts +2 -2
  211. package/lib/message-box/workbench-message-box.options.d.ts +4 -3
  212. package/lib/message-box/workbench-message-box.service.d.ts +1 -1
  213. package/lib/microfrontend-platform/common/microfrontend.util.d.ts +22 -0
  214. package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +15 -9
  215. package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.d.ts +11 -0
  216. package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.d.ts +28 -0
  217. package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.d.ts +52 -0
  218. package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +37 -0
  219. package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
  220. package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-capability-interceptor.service.d.ts → microfrontend-popup-capability-validator.interceptor.d.ts} +3 -3
  221. package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-intent-interceptor.service.d.ts → microfrontend-popup-intent-handler.interceptor.d.ts} +9 -6
  222. package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +7 -10
  223. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +2 -9
  224. package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +12 -23
  225. package/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.d.ts +14 -0
  226. package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +10 -0
  227. package/lib/microfrontend-platform/routing/{microfrontend-view-capability-interceptor.service.d.ts → microfrontend-view-capability-validator.interceptor.d.ts} +3 -3
  228. package/lib/microfrontend-platform/routing/{microfrontend-view-intent-interceptor.service.d.ts → microfrontend-view-intent-handler.interceptor.d.ts} +6 -5
  229. package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +49 -0
  230. package/lib/microfrontend-platform/workbench-microfrontend-support.d.ts +3 -2
  231. package/lib/migration/workbench-migration.d.ts +9 -0
  232. package/lib/migration/workbench-migrator.d.ts +18 -0
  233. package/lib/notification/notification.config.d.ts +1 -1
  234. package/lib/notification/notification.d.ts +1 -3
  235. package/lib/page-not-found/format-url.pipe.d.ts +11 -0
  236. package/lib/page-not-found/page-not-found.component.d.ts +8 -0
  237. package/lib/part/part-action-bar/part-action.directive.d.ts +1 -1
  238. package/lib/part/part-bar/part-bar.component.d.ts +4 -3
  239. package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
  240. package/lib/part/view-context-menu/view-menu.service.d.ts +5 -4
  241. package/lib/part/view-list-item/view-list-item.component.d.ts +5 -4
  242. package/lib/part/view-tab/view-tab.component.d.ts +6 -5
  243. package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +3 -3
  244. package/lib/part/workbench-part.model.d.ts +5 -4
  245. package/lib/part//311/265workbench-part.model.d.ts +5 -4
  246. package/lib/perspective/migration/model/workbench-perspective-migration-v1.model.d.ts +8 -0
  247. package/lib/perspective/migration/model/workbench-perspective-migration-v2.model.d.ts +10 -0
  248. package/lib/perspective/migration/workbench-perspective-migration-v2.service.d.ts +13 -0
  249. package/lib/perspective/workbench-grid-merger.service.d.ts +9 -16
  250. package/lib/perspective/workbench-perspective-storage.service.d.ts +10 -28
  251. package/lib/perspective/workbench-perspective-view-conflict-resolver.service.d.ts +8 -25
  252. package/lib/perspective/workbench-perspective.model.d.ts +123 -14
  253. package/lib/perspective/workbench-perspective.service.d.ts +10 -3
  254. package/lib/perspective/workench-perspective-serializer.service.d.ts +26 -0
  255. package/lib/perspective//311/265workbench-perspective.model.d.ts +16 -14
  256. package/lib/popup/popup.config.d.ts +4 -3
  257. package/lib/portal/workbench-portal-outlet.directive.d.ts +2 -2
  258. package/lib/public_api.d.ts +4 -3
  259. package/lib/registry/workbench-object-registry.d.ts +2 -2
  260. package/lib/routing/empty-outlet/empty-outlet.component.d.ts +15 -0
  261. package/lib/routing/public_api.d.ts +2 -1
  262. package/lib/routing/router.util.d.ts +45 -31
  263. package/lib/routing/routing.model.d.ts +129 -0
  264. package/lib/routing/url-segment-matcher.d.ts +20 -0
  265. package/lib/routing/workbench-auxiliary-routes-registrator.service.d.ts +25 -16
  266. package/lib/routing/workbench-dialog-differ.d.ts +25 -0
  267. package/lib/routing/workbench-layout-differ.d.ts +4 -7
  268. package/lib/routing/workbench-navigational-states.d.ts +11 -21
  269. package/lib/routing/workbench-route-data.d.ts +14 -12
  270. package/lib/routing/workbench-router-link.directive.d.ts +22 -7
  271. package/lib/routing/workbench-router.service.d.ts +42 -157
  272. package/lib/routing/workbench-url-observer.service.d.ts +18 -6
  273. package/lib/routing//311/265workbench-router.service.d.ts +75 -0
  274. package/lib/startup/workbench-launcher.service.d.ts +4 -4
  275. package/lib/testing/public_api.d.ts +1 -0
  276. package/lib/testing/workbench-testing.module.d.ts +7 -6
  277. package/lib/testing/workbench.provider.d.ts +29 -0
  278. package/lib/view/public_api.d.ts +2 -1
  279. package/lib/view/view-move-handler.service.d.ts +2 -4
  280. package/lib/view/view-portal.pipe.d.ts +2 -1
  281. package/lib/view/view.component.d.ts +1 -11
  282. package/lib/view/workbench-view-route-guards.d.ts +36 -0
  283. package/lib/view/workbench-view.model.d.ts +46 -13
  284. package/lib/view/workbench-view.registry.d.ts +4 -3
  285. package/lib/view//311/265workbench-view.model.d.ts +79 -14
  286. package/lib/view-dnd/grid-drop-targets.util.d.ts +15 -17
  287. package/lib/view-dnd/view-drag.service.d.ts +12 -4
  288. package/lib/view-dnd/view-drop-zone.directive.d.ts +1 -1
  289. package/lib/{workbench-module-config.d.ts → workbench-config.d.ts} +29 -71
  290. package/lib/workbench.component.d.ts +2 -2
  291. package/lib/workbench.constants.d.ts +6 -8
  292. package/lib/workbench.model.d.ts +20 -8
  293. package/lib/workbench.module.d.ts +12 -7
  294. package/lib/workbench.provider.d.ts +38 -0
  295. package/lib/workbench.service.d.ts +32 -8
  296. package/lib//311/265workbench.service.d.ts +9 -3
  297. package/package.json +8 -8
  298. package/esm2022/lib/layout/migration/workbench-layout-migrator.service.mjs +0 -38
  299. package/esm2022/lib/layout/migration/workbench-layout-v1-migrator.service.mjs +0 -59
  300. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-interceptor.service.mjs +0 -30
  301. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-interceptor.service.mjs +0 -130
  302. package/esm2022/lib/microfrontend-platform/routing/microfrontend-navigational-states.mjs +0 -22
  303. package/esm2022/lib/microfrontend-platform/routing/microfrontend-routes.mjs +0 -71
  304. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-interceptor.service.mjs +0 -54
  305. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-interceptor.service.mjs +0 -123
  306. package/esm2022/lib/routing/navigation-state.resolver.mjs +0 -54
  307. package/esm2022/lib/view/workbench-view-pre-destroy.guard.mjs +0 -36
  308. package/esm2022/lib/workbench-module-config.mjs +0 -15
  309. package/lib/layout/migration/workbench-layout-migrator.service.d.ts +0 -15
  310. package/lib/layout/migration/workbench-layout-v1-migrator.service.d.ts +0 -12
  311. package/lib/microfrontend-platform/routing/microfrontend-navigational-states.d.ts +0 -11
  312. package/lib/microfrontend-platform/routing/microfrontend-routes.d.ts +0 -38
  313. package/lib/routing/navigation-state.resolver.d.ts +0 -12
  314. package/lib/view/workbench-view-pre-destroy.guard.d.ts +0 -5
@@ -7,29 +7,27 @@
7
7
  *
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  */
10
- import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Inject, ViewChild } from '@angular/core';
11
- import { asapScheduler, combineLatest, EMPTY, firstValueFrom, of, Subject } from 'rxjs';
12
- import { catchError, debounceTime, first, map, pairwise, startWith, switchMap, takeUntil } from 'rxjs/operators';
13
- import { ManifestService, mapToBody, MessageHeaders, MicrofrontendPlatformConfig, ResponseStatusCodes } from '@scion/microfrontend-platform';
14
- import { ɵMicrofrontendRouteParams, ɵTHEME_CONTEXT_KEY, ɵVIEW_ID_CONTEXT_KEY, ɵWorkbenchCommands } from '@scion/workbench-client';
15
- import { Arrays, Dictionaries, Maps } from '@scion/toolkit/util';
10
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Inject, runInInjectionContext, ViewChild } from '@angular/core';
11
+ import { combineLatest, firstValueFrom, of, Subject, switchMap } from 'rxjs';
12
+ import { first, map, takeUntil } from 'rxjs/operators';
13
+ import { mapToBody, MessageHeaders, MicrofrontendPlatformConfig, ResponseStatusCodes } from '@scion/microfrontend-platform';
14
+ import { ɵMicrofrontendRouteParams, ɵVIEW_ID_CONTEXT_KEY, ɵWorkbenchCommands } from '@scion/workbench-client';
15
+ import { Dictionaries, Maps } from '@scion/toolkit/util';
16
16
  import { LoggerNames } from '../../logging';
17
17
  import { IFRAME_HOST } from '../../content-projection/view-container.reference';
18
18
  import { serializeExecution } from '../../common/operators';
19
19
  import { ɵWorkbenchView } from '../../view/ɵworkbench-view.model';
20
20
  import { filterArray, mapArray } from '@scion/toolkit/operators';
21
21
  import { stringifyError } from '../../common/stringify-error.util';
22
- import { MicrofrontendViewRoutes } from '../routing/microfrontend-routes';
23
- import { WorkbenchRouteData } from '../../routing/workbench-route-data';
24
- import { WorkbenchNavigationalViewStates } from '../../routing/workbench-navigational-states';
25
- import { MicrofrontendNavigationalStates } from '../routing/microfrontend-navigational-states';
26
- import { Beans } from '@scion/toolkit/bean-manager';
22
+ import { MicrofrontendViewRoutes } from '../routing/microfrontend-view-routes';
27
23
  import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';
28
24
  import { ContentAsOverlayComponent } from '../../content-projection/content-as-overlay.component';
29
25
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
30
26
  import { MicrofrontendSplashComponent } from '../microfrontend-splash/microfrontend-splash.component';
31
- import '../microfrontend-platform.config';
32
27
  import { GLASS_PANE_BLOCKABLE, GlassPaneDirective } from '../../glass-pane/glass-pane.directive';
28
+ import { MicrofrontendWorkbenchView } from './microfrontend-workbench-view.model';
29
+ import { Microfrontends } from '../common/microfrontend.util';
30
+ import { Objects } from '../../common/objects.util';
33
31
  import * as i0 from "@angular/core";
34
32
  import * as i1 from "@angular/router";
35
33
  import * as i2 from "@scion/microfrontend-platform";
@@ -37,14 +35,13 @@ import * as i3 from "../../logging";
37
35
  import * as i4 from "../../part/view-context-menu/view-menu.service";
38
36
  import * as i5 from "../../layout/workbench-layout.service";
39
37
  import * as i6 from "../../routing/workbench-router.service";
40
- import * as i7 from "../../workbench.service";
41
- import * as i8 from "../../view/\u0275workbench-view.model";
42
- import * as i9 from "../../content-projection/view-container.reference";
38
+ import * as i7 from "../../view/\u0275workbench-view.model";
39
+ import * as i8 from "../../content-projection/view-container.reference";
43
40
  /**
44
41
  * Embeds the microfrontend of a view capability.
45
42
  */
46
43
  export class MicrofrontendViewComponent {
47
- constructor(_host, _route, _outletRouter, _manifestService, _messageClient, _destroyRef, _logger, _viewContextMenuService, _workbenchLayoutService, _workbenchRouter, _workbenchService, _cd, view, iframeHostRef) {
44
+ constructor(_host, _route, _outletRouter, _manifestService, _messageClient, _destroyRef, _logger, _viewContextMenuService, _workbenchLayoutService, _workbenchRouter, _injector, _cd, view, iframeHostRef) {
48
45
  this._host = _host;
49
46
  this._route = _route;
50
47
  this._outletRouter = _outletRouter;
@@ -55,7 +52,7 @@ export class MicrofrontendViewComponent {
55
52
  this._viewContextMenuService = _viewContextMenuService;
56
53
  this._workbenchLayoutService = _workbenchLayoutService;
57
54
  this._workbenchRouter = _workbenchRouter;
58
- this._workbenchService = _workbenchService;
55
+ this._injector = _injector;
59
56
  this._cd = _cd;
60
57
  this.view = view;
61
58
  this.iframeHostRef = iframeHostRef;
@@ -74,67 +71,52 @@ export class MicrofrontendViewComponent {
74
71
  this.splash = inject(MicrofrontendPlatformConfig).splash ?? MicrofrontendSplashComponent;
75
72
  }
76
73
  ngOnInit() {
77
- // Construct the view context, allowing embedded content to interact with this view.
78
74
  this.routerOutletElement.nativeElement.setContextValue(ɵVIEW_ID_CONTEXT_KEY, this.view.id);
79
- // Since the iframe is added at a top-level location in the DOM, that is, not as a child element of this component,
80
- // the workbench view misses keyboard events from embedded content. As a result, menu item accelerators of the context
81
- // menu of this view do not work, so we install the accelerators on the router outlet as well.
82
- this._viewContextMenuService.installMenuItemAccelerators$(this.routerOutletElement.nativeElement, this.view)
83
- .pipe(takeUntilDestroyed(this._destroyRef))
84
- .subscribe();
85
- combineLatest([this._route.params, this._route.data])
86
- .pipe(debounceTime(0, asapScheduler), // wait until the Angular router completed updating the route, similar to `ngOnChanges` in a component to wait for all input properties to be set
87
- map(() => this._route.snapshot), mapToMicrofrontendRouteSnapshot(), startWith(undefined), // initialize 'pairwise' operator
88
- pairwise(), serializeExecution(([prev, curr]) => this.onNavigate(prev, curr)), catchError((error, caught) => {
89
- this._logger.error(() => '[MicrofrontendLoadError] An unexpected error occurred.', LoggerNames.MICROFRONTEND_ROUTING, error);
90
- return caught; // re-subscribe to the params Observable
91
- }), takeUntilDestroyed(this._destroyRef))
75
+ this.propagateWorkbenchTheme();
76
+ this.installMenuItemAccelerators$();
77
+ this.installNavigator();
78
+ }
79
+ installNavigator() {
80
+ this._route.params
81
+ .pipe(switchMap(params => this.fetchCapability$(params[ɵMicrofrontendRouteParams.ɵVIEW_CAPABILITY_ID]).pipe(map(capability => ({ capability, params })))), serializeExecution(({ capability, params }) => this.onNavigate(this.capability, capability, params)), takeUntilDestroyed(this._destroyRef))
92
82
  .subscribe();
93
- this.installThemePropagator();
94
83
  }
95
- async onNavigate(prevRouteSnapshot, currRouteSnapshot) {
96
- const prevViewCapability = prevRouteSnapshot?.viewCapability;
97
- const { viewCapability, params, activatedRoute } = currRouteSnapshot;
98
- if (!viewCapability) {
99
- this._logger.warn(() => `[NullViewError] No application found to provide a view of id '${params[ɵMicrofrontendRouteParams.ɵVIEW_CAPABILITY_ID]}'. Maybe, the requested view is not public API or the providing application not available.`, LoggerNames.MICROFRONTEND_ROUTING);
100
- await this.view.close();
101
- return;
102
- }
103
- const application = this.lookupApplication(viewCapability.metadata.appSymbolicName);
104
- if (!application) {
105
- this._logger.error(() => `[NullApplicationError] Unexpected. Cannot resolve application '${viewCapability.metadata.appSymbolicName}'.`, LoggerNames.MICROFRONTEND_ROUTING, viewCapability);
84
+ async onNavigate(prevCapability, capability, params) {
85
+ if (!capability) {
86
+ this._logger.warn(() => `[NullCapabilityError] No application found to provide a view capability of id '${params[ɵMicrofrontendRouteParams.ɵVIEW_CAPABILITY_ID]}'. Maybe, the requested view is not public API or the providing application not available.`, LoggerNames.MICROFRONTEND_ROUTING);
106
87
  await this.view.close();
107
88
  return;
108
89
  }
90
+ this.capability = capability;
91
+ this.view.registerAdapter(MicrofrontendWorkbenchView, new MicrofrontendWorkbenchView(capability, params));
109
92
  // Check if navigating to a new microfrontend.
110
- if (!prevViewCapability || prevViewCapability.metadata.id !== viewCapability.metadata.id) {
111
- this.viewCapability = viewCapability;
112
- this.setViewProperties(viewCapability, activatedRoute, params);
113
- this.installParamsUpdater(viewCapability);
93
+ if (!prevCapability || prevCapability.metadata.id !== capability.metadata.id) {
94
+ this.setViewProperties(capability, params);
95
+ this.installParamsUpdater(capability);
114
96
  }
115
- // Signal that the currently loaded microfrontend, if any, is about to be replaced by a microfrontend of another application.
116
- if (prevViewCapability && prevViewCapability.metadata.appSymbolicName !== viewCapability.metadata.appSymbolicName) {
97
+ // Signal the currently loaded application to unload.
98
+ if (prevCapability && prevCapability.metadata.appSymbolicName !== capability.metadata.appSymbolicName) {
117
99
  await this._messageClient.publish(ɵWorkbenchCommands.viewUnloadingTopic(this.view.id));
118
100
  }
119
- // Provide route parameters including matrix parameters and qualifiers to the microfrontend.
101
+ // Pass parameters to the microfrontend.
120
102
  await this._messageClient.publish(ɵWorkbenchCommands.viewParamsTopic(this.view.id), Maps.coerce(params), { retain: true });
121
- // When navigating to another view capability of the same app, wait until transported the params to consumers before loading the
122
- // new microfrontend into the iframe, allowing the currently loaded microfrontend to cleanup subscriptions. Params include the
123
- // capability id.
124
- if (prevViewCapability
125
- && prevViewCapability.metadata.appSymbolicName === viewCapability.metadata.appSymbolicName
126
- && prevViewCapability.metadata.id !== viewCapability.metadata.id) {
127
- await this.waitForCapabilityParam(viewCapability.metadata.id);
103
+ // When navigating to another view capability of the same app, wait until transported the params to the microfrontend before loading the
104
+ // new microfrontend into the iframe, allowing the currently loaded microfrontend to clean up subscriptions.
105
+ if (prevCapability
106
+ && prevCapability.metadata.appSymbolicName === capability.metadata.appSymbolicName
107
+ && prevCapability.metadata.id !== capability.metadata.id) {
108
+ await this.waitForCapabilityParam(capability.metadata.id);
128
109
  }
129
110
  // Navigate to the microfrontend.
130
- this._logger.debug(() => `Loading microfrontend into workbench view [viewId=${this.view.id}, app=${viewCapability.metadata.appSymbolicName}, baseUrl=${application.baseUrl}, path=${(viewCapability.properties.path)}].`, LoggerNames.MICROFRONTEND_ROUTING, params, viewCapability);
131
- await this._outletRouter.navigate(viewCapability.properties.path, {
111
+ const application = this._manifestService.applications.find(app => app.symbolicName === capability.metadata.appSymbolicName);
112
+ this._logger.debug(() => `Loading microfrontend into workbench view [viewId=${this.view.id}, app=${capability.metadata.appSymbolicName}, baseUrl=${application.baseUrl}, path=${(capability.properties.path)}].`, LoggerNames.MICROFRONTEND_ROUTING, params, capability);
113
+ await this._outletRouter.navigate(capability.properties.path, {
132
114
  outlet: this.view.id,
133
115
  relativeTo: application.baseUrl,
134
116
  params: params,
135
117
  pushStateToSessionHistoryStack: false,
136
- showSplash: viewCapability.properties.showSplash,
137
- ɵcapabilityId: viewCapability.metadata.id,
118
+ showSplash: capability.properties.showSplash,
119
+ ɵcapabilityId: capability.metadata.id,
138
120
  });
139
121
  // Inactive views are detached from the Angular change detection tree.
140
122
  // Therefore, manually detect this component for changes for updating attributes on the `sci-router-outlet`.
@@ -142,6 +124,17 @@ export class MicrofrontendViewComponent {
142
124
  this._cd.detectChanges();
143
125
  }
144
126
  }
127
+ fetchCapability$(capabilityId) {
128
+ return this._manifestService.lookupCapabilities$({ id: capabilityId }).pipe(map(capabilities => capabilities.at(0)));
129
+ }
130
+ installMenuItemAccelerators$() {
131
+ // Since the iframe is added at a top-level location in the DOM, that is, not as a child element of this component,
132
+ // the workbench view misses keyboard events from embedded content. As a result, menu item accelerators of the context
133
+ // menu of this view do not work, so we install the accelerators on the router outlet as well.
134
+ this._viewContextMenuService.installMenuItemAccelerators$(this.routerOutletElement.nativeElement, this.view)
135
+ .pipe(takeUntilDestroyed(this._destroyRef))
136
+ .subscribe();
137
+ }
145
138
  /**
146
139
  * Subscribes to requests from the currently loaded microfrontend to update its parameters.
147
140
  */
@@ -153,23 +146,23 @@ export class MicrofrontendViewComponent {
153
146
  // We DO NOT navigate if the subscription was closed, e.g., because closed the view or navigated to another capability.
154
147
  const replyTo = request.headers.get(MessageHeaders.ReplyTo);
155
148
  try {
156
- const success = await this._workbenchRouternavigate(layout => {
149
+ const success = await this._workbenchRouter.navigate(layout => {
157
150
  // Cancel pending navigation if the subscription was closed, e.g., because closed the view or navigated to another capability
158
151
  if (subscription.closed) {
159
152
  return null;
160
153
  }
161
- const currentMicrofrontendParams = MicrofrontendViewRoutes.parseParams(this._route.snapshot);
162
- const currentParams = { ...currentMicrofrontendParams.urlParams, ...currentMicrofrontendParams.transientParams };
163
- const paramsUpdateCommand = request.body;
164
- const newParams = Dictionaries.coerce(paramsUpdateCommand.params); // coerce params for backward compatibility
165
- const mergedParams = Dictionaries.withoutUndefinedEntries(paramsUpdateCommand.paramsHandling === 'merge' ? { ...currentParams, ...newParams } : newParams);
154
+ const paramsHandling = request.body.paramsHandling;
155
+ const currentParams = this._route.snapshot.params;
156
+ const newParams = Dictionaries.coerce(request.body.params); // coerce params for backward compatibility
157
+ const mergedParams = Objects.withoutUndefinedEntries(paramsHandling === 'merge' ? { ...currentParams, ...newParams } : newParams);
166
158
  const { urlParams, transientParams } = MicrofrontendViewRoutes.splitParams(mergedParams, viewCapability);
167
- return {
168
- layout,
169
- viewOutlets: { [this.view.id]: [urlParams] },
170
- viewStates: { [this.view.id]: { [MicrofrontendNavigationalStates.transientParams]: transientParams } },
171
- };
172
- }, { relativeTo: this._route });
159
+ return layout.navigateView(this.view.id, [urlParams], {
160
+ relativeTo: this._route,
161
+ state: Objects.withoutUndefinedEntries({
162
+ [MicrofrontendViewRoutes.STATE_TRANSIENT_PARAMS]: transientParams,
163
+ }),
164
+ });
165
+ });
173
166
  await this._messageClient.publish(replyTo, success, { headers: new Map().set(MessageHeaders.Status, ResponseStatusCodes.TERMINAL) });
174
167
  }
175
168
  catch (error) {
@@ -180,21 +173,13 @@ export class MicrofrontendViewComponent {
180
173
  /**
181
174
  * Updates the properties of this view, such as the view title, as defined by the capability.
182
175
  */
183
- setViewProperties(viewCapability, activatedRoute, params) {
184
- this.view.title = substituteNamedParameters(viewCapability.properties.title, params) ?? null;
185
- this.view.heading = substituteNamedParameters(viewCapability.properties.heading, params) ?? null;
186
- this.view.cssClass = new Array()
187
- .concat(Arrays.coerce(viewCapability.properties.cssClass))
188
- .concat(Arrays.coerce(activatedRoute.data[WorkbenchRouteData.state]?.[WorkbenchNavigationalViewStates.cssClass]));
176
+ setViewProperties(viewCapability, params) {
177
+ this.view.title = Microfrontends.substituteNamedParameters(viewCapability.properties.title, Maps.coerce(params)) ?? null;
178
+ this.view.heading = Microfrontends.substituteNamedParameters(viewCapability.properties.heading, Maps.coerce(params)) ?? null;
179
+ this.view.classList.set(viewCapability.properties.cssClass, { scope: 'application' });
189
180
  this.view.closable = viewCapability.properties.closable ?? true;
190
181
  this.view.dirty = false;
191
182
  }
192
- /**
193
- * Looks up the application registered under the given symbolic name. Returns `undefined` if not found.
194
- */
195
- lookupApplication(symbolicName) {
196
- return this._manifestService.applications.find(app => app.symbolicName === symbolicName);
197
- }
198
183
  /**
199
184
  * Promise that resolves once params contain the given capability id.
200
185
  */
@@ -203,21 +188,17 @@ export class MicrofrontendViewComponent {
203
188
  .pipe(mapToBody(), first(params => params.get(ɵMicrofrontendRouteParams.ɵVIEW_CAPABILITY_ID) === viewCapabilityId));
204
189
  await firstValueFrom(viewParams$);
205
190
  }
206
- /**
207
- * Method invoked just before closing this view.
208
- *
209
- * If the embedded microfrontend has a listener installed to be notified when closing this view,
210
- * initiates a request-reply communication, allowing the microfrontend to prevent this view from closing.
211
- */
212
- async onWorkbenchViewPreDestroy() {
213
- const closingTopic = ɵWorkbenchCommands.viewClosingTopic(this.view.id);
214
- // Allow the microfrontend to prevent this view from closing.
215
- const count = await firstValueFrom(this._messageClient.subscriberCount$(closingTopic));
216
- if (count === 0) {
191
+ /** @inheritDoc */
192
+ async canClose() {
193
+ const canCloseTopic = ɵWorkbenchCommands.canCloseTopic(this.view.id);
194
+ const legacyCanCloseTopic = ɵWorkbenchCommands.viewClosingTopic(this.view.id);
195
+ // Initiate a request-response communication only if the embedded microfrontend implements `CanClose` guard.
196
+ const hasCanCloseGuard = await firstValueFrom(this._messageClient.subscriberCount$(canCloseTopic)) > 0;
197
+ const hasLegacyCanCloseGuard = await firstValueFrom(this._messageClient.subscriberCount$(legacyCanCloseTopic)) > 0;
198
+ if (!hasCanCloseGuard && !hasLegacyCanCloseGuard) {
217
199
  return true;
218
200
  }
219
- const doit = this._messageClient.request$(closingTopic).pipe(mapToBody(), catchError(() => EMPTY));
220
- return firstValueFrom(doit, { defaultValue: true });
201
+ return firstValueFrom(this._messageClient.request$(hasCanCloseGuard ? canCloseTopic : legacyCanCloseTopic).pipe(mapToBody()), { defaultValue: true });
221
202
  }
222
203
  onFocusWithin(event) {
223
204
  const { detail: focusWithin } = event;
@@ -256,35 +237,22 @@ export class MicrofrontendViewComponent {
256
237
  this.isWorkbenchDrag = (event === 'start');
257
238
  });
258
239
  }
259
- /**
260
- * Propagates the current theme and color scheme to embedded content.
261
- */
262
- installThemePropagator() {
263
- this._workbenchService.theme$
264
- .pipe(takeUntilDestroyed(this._destroyRef))
265
- .subscribe(theme => {
266
- if (theme) {
267
- this.routerOutletElement.nativeElement.setContextValue(ɵTHEME_CONTEXT_KEY, theme);
268
- this.routerOutletElement.nativeElement.setContextValue('color-scheme', theme.colorScheme);
269
- }
270
- else {
271
- this.routerOutletElement.nativeElement.removeContextValue(ɵTHEME_CONTEXT_KEY);
272
- this.routerOutletElement.nativeElement.removeContextValue('color-scheme');
273
- }
274
- });
240
+ propagateWorkbenchTheme() {
241
+ runInInjectionContext(this._injector, () => Microfrontends.propagateTheme(this.routerOutletElement.nativeElement));
275
242
  }
276
243
  ngOnDestroy() {
277
244
  // Instruct the message broker to delete retained messages to free resources.
278
245
  this._messageClient.publish(ɵWorkbenchCommands.viewActiveTopic(this.view.id), undefined, { retain: true }).then();
279
246
  this._messageClient.publish(ɵWorkbenchCommands.viewParamsTopic(this.view.id), undefined, { retain: true }).then();
280
247
  this._outletRouter.navigate(null, { outlet: this.view.id }).then();
248
+ this.view.unregisterAdapter(MicrofrontendWorkbenchView);
281
249
  }
282
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendViewComponent, deps: [{ token: i0.ElementRef }, { token: i1.ActivatedRoute }, { token: i2.OutletRouter }, { token: i2.ManifestService }, { token: i2.MessageClient }, { token: i0.DestroyRef }, { token: i3.Logger }, { token: i4.ViewMenuService }, { token: i5.WorkbenchLayoutService }, { token: i6.WorkbenchRouter }, { token: i7.WorkbenchService }, { token: i0.ChangeDetectorRef }, { token: i8.ɵWorkbenchView }, { token: IFRAME_HOST }], target: i0.ɵɵFactoryTarget.Component }); }
283
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: MicrofrontendViewComponent, isStandalone: true, selector: "wb-microfrontend-view", viewQueries: [{ propertyName: "routerOutletElement", first: true, predicate: ["router_outlet"], descendants: true, static: true }], ngImport: i0, template: "<wb-content-as-overlay [overlayHost]=\"iframeHostRef.ref$ | async\">\n <div class=\"microfrontend-view\"\n [class.workbench-drag]=\"isWorkbenchDrag\"\n [attr.data-viewid]=\"view.id\"\n wbGlassPane>\n <sci-router-outlet #router_outlet\n [name]=\"view.id\"\n [attr.data-capabilityid]=\"viewCapability?.metadata!.id\"\n [attr.data-app]=\"viewCapability?.metadata!.appSymbolicName\"\n [ngClass]=\"view.cssClasses\"\n (focuswithin)=\"onFocusWithin($event)\"\n [keystrokes]=\"keystrokesToBubble$ | async\">\n <ng-container *ngComponentOutlet=\"splash\"></ng-container>\n </sci-router-outlet>\n </div>\n</wb-content-as-overlay>\n", styles: [":host{display:grid}div.microfrontend-view{display:grid}div.microfrontend-view.workbench-drag{pointer-events:none}div.microfrontend-view>sci-router-outlet::part(splash){display:grid}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ContentAsOverlayComponent, selector: "wb-content-as-overlay", inputs: ["overlayHost"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: GlassPaneDirective, selector: "[wbGlassPane]" }], viewProviders: [
250
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MicrofrontendViewComponent, deps: [{ token: i0.ElementRef }, { token: i1.ActivatedRoute }, { token: i2.OutletRouter }, { token: i2.ManifestService }, { token: i2.MessageClient }, { token: i0.DestroyRef }, { token: i3.Logger }, { token: i4.ViewMenuService }, { token: i5.WorkbenchLayoutService }, { token: i6.WorkbenchRouter }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i7.ɵWorkbenchView }, { token: IFRAME_HOST }], target: i0.ɵɵFactoryTarget.Component }); }
251
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: MicrofrontendViewComponent, isStandalone: true, selector: "wb-microfrontend-view", viewQueries: [{ propertyName: "routerOutletElement", first: true, predicate: ["router_outlet"], descendants: true, static: true }], ngImport: i0, template: "<wb-content-as-overlay [overlayHost]=\"iframeHostRef.ref$ | async\">\n <div class=\"microfrontend-view\"\n [class.workbench-drag]=\"isWorkbenchDrag\"\n [attr.data-viewid]=\"view.id\"\n wbGlassPane>\n <sci-router-outlet #router_outlet\n [name]=\"view.id\"\n [attr.data-capabilityid]=\"capability?.metadata!.id\"\n [attr.data-app]=\"capability?.metadata!.appSymbolicName\"\n [ngClass]=\"view.classList.value\"\n (focuswithin)=\"onFocusWithin($event)\"\n [keystrokes]=\"keystrokesToBubble$ | async\">\n <ng-container *ngComponentOutlet=\"splash\"></ng-container>\n </sci-router-outlet>\n </div>\n</wb-content-as-overlay>\n", styles: [":host{display:grid}div.microfrontend-view{display:grid}div.microfrontend-view.workbench-drag{pointer-events:none}div.microfrontend-view>sci-router-outlet::part(splash){display:grid}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ContentAsOverlayComponent, selector: "wb-content-as-overlay", inputs: ["overlayHost"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: GlassPaneDirective, selector: "[wbGlassPane]" }], viewProviders: [
284
252
  configureMicrofrontendGlassPane(),
285
253
  ] }); }
286
254
  }
287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: MicrofrontendViewComponent, decorators: [{
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MicrofrontendViewComponent, decorators: [{
288
256
  type: Component,
289
257
  args: [{ selector: 'wb-microfrontend-view', standalone: true, imports: [
290
258
  NgClass,
@@ -294,38 +262,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImpor
294
262
  GlassPaneDirective,
295
263
  ], viewProviders: [
296
264
  configureMicrofrontendGlassPane(),
297
- ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<wb-content-as-overlay [overlayHost]=\"iframeHostRef.ref$ | async\">\n <div class=\"microfrontend-view\"\n [class.workbench-drag]=\"isWorkbenchDrag\"\n [attr.data-viewid]=\"view.id\"\n wbGlassPane>\n <sci-router-outlet #router_outlet\n [name]=\"view.id\"\n [attr.data-capabilityid]=\"viewCapability?.metadata!.id\"\n [attr.data-app]=\"viewCapability?.metadata!.appSymbolicName\"\n [ngClass]=\"view.cssClasses\"\n (focuswithin)=\"onFocusWithin($event)\"\n [keystrokes]=\"keystrokesToBubble$ | async\">\n <ng-container *ngComponentOutlet=\"splash\"></ng-container>\n </sci-router-outlet>\n </div>\n</wb-content-as-overlay>\n", styles: [":host{display:grid}div.microfrontend-view{display:grid}div.microfrontend-view.workbench-drag{pointer-events:none}div.microfrontend-view>sci-router-outlet::part(splash){display:grid}\n"] }]
298
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ActivatedRoute }, { type: i2.OutletRouter }, { type: i2.ManifestService }, { type: i2.MessageClient }, { type: i0.DestroyRef }, { type: i3.Logger }, { type: i4.ViewMenuService }, { type: i5.WorkbenchLayoutService }, { type: i6.WorkbenchRouter }, { type: i7.WorkbenchService }, { type: i0.ChangeDetectorRef }, { type: i8.ɵWorkbenchView }, { type: i9.ViewContainerReference, decorators: [{
265
+ ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<wb-content-as-overlay [overlayHost]=\"iframeHostRef.ref$ | async\">\n <div class=\"microfrontend-view\"\n [class.workbench-drag]=\"isWorkbenchDrag\"\n [attr.data-viewid]=\"view.id\"\n wbGlassPane>\n <sci-router-outlet #router_outlet\n [name]=\"view.id\"\n [attr.data-capabilityid]=\"capability?.metadata!.id\"\n [attr.data-app]=\"capability?.metadata!.appSymbolicName\"\n [ngClass]=\"view.classList.value\"\n (focuswithin)=\"onFocusWithin($event)\"\n [keystrokes]=\"keystrokesToBubble$ | async\">\n <ng-container *ngComponentOutlet=\"splash\"></ng-container>\n </sci-router-outlet>\n </div>\n</wb-content-as-overlay>\n", styles: [":host{display:grid}div.microfrontend-view{display:grid}div.microfrontend-view.workbench-drag{pointer-events:none}div.microfrontend-view>sci-router-outlet::part(splash){display:grid}\n"] }]
266
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ActivatedRoute }, { type: i2.OutletRouter }, { type: i2.ManifestService }, { type: i2.MessageClient }, { type: i0.DestroyRef }, { type: i3.Logger }, { type: i4.ViewMenuService }, { type: i5.WorkbenchLayoutService }, { type: i6.WorkbenchRouter }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i7.ɵWorkbenchView }, { type: i8.ViewContainerReference, decorators: [{
299
267
  type: Inject,
300
268
  args: [IFRAME_HOST]
301
269
  }] }], propDecorators: { routerOutletElement: [{
302
270
  type: ViewChild,
303
271
  args: ['router_outlet', { static: true }]
304
272
  }] } });
305
- /**
306
- * Maps the passed {@link ActivatedRouteSnapshot} to a {@link ActivatedMicrofrontendRouteSnapshot} with resolved params and capability.
307
- */
308
- function mapToMicrofrontendRouteSnapshot() {
309
- return switchMap((activatedRoute) => {
310
- const { viewCapabilityId, urlParams, transientParams, qualifier } = MicrofrontendViewRoutes.parseParams(activatedRoute);
311
- return Beans.get(ManifestService).lookupCapabilities$({ id: viewCapabilityId }).pipe(map(capabilities => ({
312
- activatedRoute,
313
- params: {
314
- ...urlParams,
315
- ...transientParams,
316
- ...qualifier,
317
- [ɵMicrofrontendRouteParams.ɵVIEW_CAPABILITY_ID]: viewCapabilityId, // capability ID cannot be overwritten.
318
- },
319
- viewCapability: capabilities[0],
320
- })));
321
- });
322
- }
323
- /**
324
- * Replaces named parameters with values of the contained {@link Params}.
325
- */
326
- function substituteNamedParameters(value, params) {
327
- return value?.replace(/:(\w+)/g, (match, paramName) => params[paramName] ?? match) || null;
328
- }
329
273
  /**
330
274
  * Blocks the microfrontend outlet when dialog(s) overlay this view.
331
275
  */
@@ -335,4 +279,4 @@ function configureMicrofrontendGlassPane() {
335
279
  useExisting: ɵWorkbenchView,
336
280
  };
337
281
  }
338
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0vbWljcm9mcm9udGVuZC12aWV3L21pY3JvZnJvbnRlbmQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9taWNyb2Zyb250ZW5kLXBsYXRmb3JtL21pY3JvZnJvbnRlbmQtdmlldy9taWNyb2Zyb250ZW5kLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQW9CLFNBQVMsRUFBRSxzQkFBc0IsRUFBMEIsTUFBTSxFQUFFLE1BQU0sRUFBK0IsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRW5LLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQWMsRUFBRSxFQUFvQixPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEgsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRyxPQUFPLEVBQWMsZUFBZSxFQUFFLFNBQVMsRUFBaUIsY0FBYyxFQUFFLDJCQUEyQixFQUFnQixtQkFBbUIsRUFBdUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzTixPQUFPLEVBQTBCLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUE0QixrQkFBa0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ25MLE9BQU8sRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLHFC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QyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztBQUM3RixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLCtCQUErQjtJQUN0QyxPQUFPO1FBQ0wsT0FBTyxFQUFFLG9CQUFvQjtRQUM3QixXQUFXLEVBQUUsY0FBYztLQUM1QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBpbmplY3QsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFByb3ZpZGVyLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUGFyYW1zfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHthc2FwU2NoZWR1bGVyLCBjb21iaW5lTGF0ZXN0LCBFTVBUWSwgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIG9mLCBPcGVyYXRvckZ1bmN0aW9uLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBmaXJzdCwgbWFwLCBwYWlyd2lzZSwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBcHBsaWNhdGlvbiwgTWFuaWZlc3RTZXJ2aWNlLCBtYXBUb0JvZHksIE1lc3NhZ2VDbGllbnQsIE1lc3NhZ2VIZWFkZXJzLCBNaWNyb2Zyb250ZW5kUGxhdGZvcm1Db25maWcsIE91dGxldFJvdXRlciwgUmVzcG9uc2VTdGF0dXNDb2RlcywgU2NpUm91dGVyT3V0bGV0RWxlbWVudCwgVG9waWNNZXNzYWdlfSBmcm9tICdAc2Npb24vbWljcm9mcm9udGVuZC1wbGF0Zm9ybSc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdDYXBhYmlsaXR5LCDJtU1pY3JvZnJvbnRlbmRSb3V0ZVBhcmFtcywgybVUSEVNRV9DT05URVhUX0tFWSwgybVWSUVXX0lEX0NPTlRFWFRfS0VZLCDJtVZpZXdQYXJhbXNVcGRhdGVDb21tYW5kLCDJtVdvcmtiZW5jaENvbW1hbmRzfSBmcm9tICdAc2Npb24vd29ya2JlbmNoLWNsaWVudCc7XG5pbXBvcnQge0FycmF5cywgRGljdGlvbmFyaWVzLCBNYXBzfSBmcm9tICdAc2Npb24vdG9vbGtpdC91dGlsJztcbmltcG9ydCB7TG9nZ2VyLCBMb2dnZXJOYW1lc30gZnJvbSAnLi4vLi4vbG9nZ2luZyc7XG5pbXBvcnQge1dvcmtiZW5jaFRoZW1lLCBXb3JrYmVuY2hWaWV3UHJlRGVzdHJveX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLm1vZGVsJztcbmltcG9ydCB7SUZSQU1FX0hPU1QsIFZpZXdDb250YWluZXJSZWZlcmVuY2V9IGZyb20gJy4uLy4uL2NvbnRlbnQtcHJvamVjdGlvbi92aWV3LWNvbnRhaW5lci5yZWZlcmVuY2UnO1xuaW1wb3J0IHtzZXJpYWxpemVFeGVjdXRpb259IGZyb20gJy4uLy4uL2NvbW1vbi9vcGVyYXRvcnMnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uLy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBtYXBBcnJheX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7Vmlld01lbnVTZXJ2aWNlfSBmcm9tICcuLi8uLi9wYXJ0L3ZpZXctY29udGV4dC1tZW51L3ZpZXctbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoUm91dGVyfSBmcm9tICcuLi8uLi9yb3V0aW5nL3dvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQge3N0cmluZ2lmeUVycm9yfSBmcm9tICcuLi8uLi9jb21tb24vc3RyaW5naWZ5LWVycm9yLnV0aWwnO1xuaW1wb3J0IHtNaWNyb2Zyb250ZW5kVmlld1JvdXRlc30gZnJvbSAnLi4vcm91dGluZy9taWNyb2Zyb250ZW5kLXJvdXRlcyc7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlRGF0YX0gZnJvbSAnLi4vLi4vcm91dGluZy93b3JrYmVuY2gtcm91dGUtZGF0YSc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXN9IGZyb20gJy4uLy4uL3JvdXRpbmcvd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuaW1wb3J0IHtNaWNyb2Zyb250ZW5kTmF2aWdhdGlvbmFsU3RhdGVzfSBmcm9tICcuLi9yb3V0aW5nL21pY3JvZnJvbnRlbmQtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge0JlYW5zfSBmcm9tICdAc2Npb24vdG9vbGtpdC9iZWFuLW1hbmFnZXInO1xuaW1wb3J0IHtBc3luY1BpcGUsIE5nQ2xhc3MsIE5nQ29tcG9uZW50T3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDb250ZW50QXNPdmVybGF5Q29tcG9uZW50fSBmcm9tICcuLi8uLi9jb250ZW50LXByb2plY3Rpb24vY29udGVudC1hcy1vdmVybGF5LmNvbXBvbmVudCc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtDb21wb25lbnRUeXBlfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7TWljcm9mcm9udGVuZFNwbGFzaENvbXBvbmVudH0gZnJvbSAnLi4vbWljcm9mcm9udGVuZC1zcGxhc2gvbWljcm9mcm9udGVuZC1zcGxhc2guY29tcG9uZW50JztcbmltcG9ydCAnLi4vbWljcm9mcm9udGVuZC1wbGF0Zm9ybS5jb25maWcnO1xuaW1wb3J0IHtHTEFTU19QQU5FX0JMT0NLQUJMRSwgR2xhc3NQYW5lRGlyZWN0aXZlfSBmcm9tICcuLi8uLi9nbGFzcy1wYW5lL2dsYXNzLXBhbmUuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBFbWJlZHMgdGhlIG1pY3JvZnJvbnRlbmQgb2YgYSB2aWV3IGNhcGFiaWxpdHkuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3diLW1pY3JvZnJvbnRlbmQtdmlldycsXG4gIHN0eWxlVXJsczogWycuL21pY3JvZnJvbnRlbmQtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vbWljcm9mcm9udGVuZC12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgQXN5bmNQaXBlLFxuICAgIENvbnRlbnRBc092ZXJsYXlDb21wb25lbnQsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgR2xhc3NQYW5lRGlyZWN0aXZlLFxuICBdLFxuICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgY29uZmlndXJlTWljcm9mcm9udGVuZEdsYXNzUGFuZSgpLFxuICBdLFxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sIC8vIHJlcXVpcmVkIGJlY2F1c2UgPHNjaS1yb3V0ZXItb3V0bGV0PiBpcyBhIGN1c3RvbSBlbGVtZW50XG59KVxuZXhwb3J0IGNsYXNzIE1pY3JvZnJvbnRlbmRWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFdvcmtiZW5jaFZpZXdQcmVEZXN0cm95IHtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZVBhcmFtc1VwZGF0ZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdW5pdmVyc2FsS2V5c3Ryb2tlcyA9IFtcbiAgICAna2V5ZG93bi5lc2NhcGUnLCAvLyBhbGxvd3MgY2xvc2luZyBub3RpZmljYXRpb25zXG4gIF07XG5cbiAgcHVibGljIHZpZXdDYXBhYmlsaXR5OiBXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BsYXNoIHRvIGRpc3BsYXkgdW50aWwgdGhlIG1pY3JvZnJvbnRlbmQgc2lnbmFscyByZWFkaW5lc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3BsYXNoOiBDb21wb25lbnRUeXBlPHVua25vd24+O1xuXG4gIEBWaWV3Q2hpbGQoJ3JvdXRlcl9vdXRsZXQnLCB7c3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHJvdXRlck91dGxldEVsZW1lbnQhOiBFbGVtZW50UmVmPFNjaVJvdXRlck91dGxldEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBLZXlzdHJva2VzIHdoaWNoIHRvIGJ1YmJsZSBhY3Jvc3MgaWZyYW1lIGJvdW5kYXJpZXMgb2YgZW1iZWRkZWQgY29udGVudC5cbiAgICovXG4gIHB1YmxpYyBrZXlzdHJva2VzVG9CdWJibGUkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSB3b3JrYmVuY2ggZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHN1Y2ggYXMgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3IgbW92aW5nIGEgc2FzaC5cbiAgICovXG4gIHB1YmxpYyBpc1dvcmtiZW5jaERyYWcgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9ob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9vdXRsZXRSb3V0ZXI6IE91dGxldFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbWFuaWZlc3RTZXJ2aWNlOiBNYW5pZmVzdFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX21lc3NhZ2VDbGllbnQ6IE1lc3NhZ2VDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Rlc3Ryb3lSZWY6IERlc3Ryb3lSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvZ2dlcjogTG9nZ2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3Q29udGV4dE1lbnVTZXJ2aWNlOiBWaWV3TWVudVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3dvcmtiZW5jaExheW91dFNlcnZpY2U6IFdvcmtiZW5jaExheW91dFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3dvcmtiZW5jaFJvdXRlcjogV29ya2JlbmNoUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hTZXJ2aWNlOiBXb3JrYmVuY2hTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3OiDJtVdvcmtiZW5jaFZpZXcsXG4gICAgICAgICAgICAgIEBJbmplY3QoSUZSQU1FX0hPU1QpIHByb3RlY3RlZCBpZnJhbWVIb3N0UmVmOiBWaWV3Q29udGFpbmVyUmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgTWljcm9mcm9udGVuZFZpZXdDb21wb25lbnQuIFt2aWV3SWQ9JHt0aGlzLnZpZXcuaWR9XWAsIExvZ2dlck5hbWVzLk1JQ1JPRlJPTlRFTkRfUk9VVElORyk7XG4gICAgdGhpcy5rZXlzdHJva2VzVG9CdWJibGUkID0gY29tYmluZUxhdGVzdChbdGhpcy52aWV3Q29udGV4dE1lbnVLZXlzdHJva2VzJCgpLCBvZih0aGlzLl91bml2ZXJzYWxLZXlzdHJva2VzKV0pXG4gICAgICAucGlwZShtYXAoa2V5c3Ryb2tlcyA9PiBuZXcgQXJyYXk8c3RyaW5nPigpLmNvbmNhdCguLi5rZXlzdHJva2VzKSkpO1xuICAgIHRoaXMuaW5zdGFsbFdvcmtiZW5jaERyYWdEZXRlY3RvcigpO1xuICAgIHRoaXMuc3BsYXNoID0gaW5qZWN0KE1pY3JvZnJvbnRlbmRQbGF0Zm9ybUNvbmZpZykuc3BsYXNoID8/IE1pY3JvZnJvbnRlbmRTcGxhc2hDb21wb25lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ29uc3RydWN0IHRoZSB2aWV3IGNvbnRleHQsIGFsbG93aW5nIGVtYmVkZGVkIGNvbnRlbnQgdG8gaW50ZXJhY3Qgd2l0aCB0aGlzIHZpZXcuXG4gICAgdGhpcy5yb3V0ZXJPdXRsZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0Q29udGV4dFZhbHVlKMm1VklFV19JRF9DT05URVhUX0tFWSwgdGhpcy52aWV3LmlkKTtcblxuICAgIC8vIFNpbmNlIHRoZSBpZnJhbWUgaXMgYWRkZWQgYXQgYSB0b3AtbGV2ZWwgbG9jYXRpb24gaW4gdGhlIERPTSwgdGhhdCBpcywgbm90IGFzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudCxcbiAgICAvLyB0aGUgd29ya2JlbmNoIHZpZXcgbWlzc2VzIGtleWJvYXJkIGV2ZW50cyBmcm9tIGVtYmVkZGVkIGNvbnRlbnQuIEFzIGEgcmVzdWx0LCBtZW51IGl0ZW0gYWNjZWxlcmF0b3JzIG9mIHRoZSBjb250ZXh0XG4gICAgLy8gbWVudSBvZiB0aGlzIHZpZXcgZG8gbm90IHdvcmssIHNvIHdlIGluc3RhbGwgdGhlIGFjY2VsZXJhdG9ycyBvbiB0aGUgcm91dGVyIG91dGxldCBhcyB3ZWxsLlxuICAgIHRoaXMuX3ZpZXdDb250ZXh0TWVudVNlcnZpY2UuaW5zdGFsbE1lbnVJdGVtQWNjZWxlcmF0b3JzJCh0aGlzLnJvdXRlck91dGxldEVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy52aWV3KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5fcm91dGUucGFyYW1zLCB0aGlzLl9yb3V0ZS5kYXRhXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCwgYXNhcFNjaGVkdWxlciksIC8vIHdhaXQgdW50aWwgdGhlIEFuZ3VsYXIgcm91dGVyIGNvbXBsZXRlZCB1cGRhdGluZyB0aGUgcm91dGUsIHNpbWlsYXIgdG8gYG5nT25DaGFuZ2VzYCBpbiBhIGNvbXBvbmVudCB0byB3YWl0IGZvciBhbGwgaW5wdXQgcHJvcGVydGllcyB0byBiZSBzZXRcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuX3JvdXRlLnNuYXBzaG90KSxcbiAgICAgICAgbWFwVG9NaWNyb2Zyb250ZW5kUm91dGVTbmFwc2hvdCgpLFxuICAgICAgICBzdGFydFdpdGgodW5kZWZpbmVkISBhcyBBY3RpdmF0ZWRNaWNyb2Zyb250ZW5kUm91dGVTbmFwc2hvdCksIC8vIGluaXRpYWxpemUgJ3BhaXJ3aXNlJyBvcGVyYXRvclxuICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICBzZXJpYWxpemVFeGVjdXRpb24oKFtwcmV2LCBjdXJyXSkgPT4gdGhpcy5vbk5hdmlnYXRlKHByZXYsIGN1cnIpKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IsIGNhdWdodCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcigoKSA9PiAnW01pY3JvZnJvbnRlbmRMb2FkRXJyb3JdIEFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuJywgTG9nZ2VyTmFtZXMuTUlDUk9GUk9OVEVORF9ST1VUSU5HLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIGNhdWdodDsgLy8gcmUtc3Vic2NyaWJlIHRvIHRoZSBwYXJhbXMgT2JzZXJ2YWJsZVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5pbnN0YWxsVGhlbWVQcm9wYWdhdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG9uTmF2aWdhdGUocHJldlJvdXRlU25hcHNob3Q6IEFjdGl2YXRlZE1pY3JvZnJvbnRlbmRSb3V0ZVNuYXBzaG90IHwgdW5kZWZpbmVkLCBjdXJyUm91dGVTbmFwc2hvdDogQWN0aXZhdGVkTWljcm9mcm9udGVuZFJvdXRlU25hcHNob3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmV2Vmlld0NhcGFiaWxpdHkgPSBwcmV2Um91dGVTbmFwc2hvdD8udmlld0NhcGFiaWxpdHk7XG4gICAgY29uc3Qge3ZpZXdDYXBhYmlsaXR5LCBwYXJhbXMsIGFjdGl2YXRlZFJvdXRlfSA9IGN1cnJSb3V0ZVNuYXBzaG90O1xuXG4gICAgaWYgKCF2aWV3Q2FwYWJpbGl0eSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oKCkgPT4gYFtOdWxsVmlld0Vycm9yXSBObyBhcHBsaWNhdGlvbiBmb3VuZCB0byBwcm92aWRlIGEgdmlldyBvZiBpZCAnJHtwYXJhbXNbybVNaWNyb2Zyb250ZW5kUm91dGVQYXJhbXMuybVWSUVXX0NBUEFCSUxJVFlfSURdfScuIE1heWJlLCB0aGUgcmVxdWVzdGVkIHZpZXcgaXMgbm90IHB1YmxpYyBBUEkgb3IgdGhlIHByb3ZpZGluZyBhcHBsaWNhdGlvbiBub3QgYXZhaWxhYmxlLmAsIExvZ2dlck5hbWVzLk1JQ1JPRlJPTlRFTkRfUk9VVElORyk7XG4gICAgICBhd2FpdCB0aGlzLnZpZXcuY2xvc2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBsaWNhdGlvbiA9IHRoaXMubG9va3VwQXBwbGljYXRpb24odmlld0NhcGFiaWxpdHkubWV0YWRhdGEhLmFwcFN5bWJvbGljTmFtZSk7XG4gICAgaWYgKCFhcHBsaWNhdGlvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCgpID0+IGBbTnVsbEFwcGxpY2F0aW9uRXJyb3JdIFVuZXhwZWN0ZWQuIENhbm5vdCByZXNvbHZlIGFwcGxpY2F0aW9uICcke3ZpZXdDYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWV9Jy5gLCBMb2dnZXJOYW1lcy5NSUNST0ZST05URU5EX1JPVVRJTkcsIHZpZXdDYXBhYmlsaXR5KTtcbiAgICAgIGF3YWl0IHRoaXMudmlldy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG5hdmlnYXRpbmcgdG8gYSBuZXcgbWljcm9mcm9udGVuZC5cbiAgICBpZiAoIXByZXZWaWV3Q2FwYWJpbGl0eSB8fCBwcmV2Vmlld0NhcGFiaWxpdHkubWV0YWRhdGEhLmlkICE9PSB2aWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQpIHtcbiAgICAgIHRoaXMudmlld0NhcGFiaWxpdHkgPSB2aWV3Q2FwYWJpbGl0eTtcbiAgICAgIHRoaXMuc2V0Vmlld1Byb3BlcnRpZXModmlld0NhcGFiaWxpdHksIGFjdGl2YXRlZFJvdXRlLCBwYXJhbXMpO1xuICAgICAgdGhpcy5pbnN0YWxsUGFyYW1zVXBkYXRlcih2aWV3Q2FwYWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gU2lnbmFsIHRoYXQgdGhlIGN1cnJlbnRseSBsb2FkZWQgbWljcm9mcm9udGVuZCwgaWYgYW55LCBpcyBhYm91dCB0byBiZSByZXBsYWNlZCBieSBhIG1pY3JvZnJvbnRlbmQgb2YgYW5vdGhlciBhcHBsaWNhdGlvbi5cbiAgICBpZiAocHJldlZpZXdDYXBhYmlsaXR5ICYmIHByZXZWaWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lICE9PSB2aWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQ2xpZW50LnB1Ymxpc2goybVXb3JrYmVuY2hDb21tYW5kcy52aWV3VW5sb2FkaW5nVG9waWModGhpcy52aWV3LmlkKSk7XG4gICAgfVxuXG4gICAgLy8gUHJvdmlkZSByb3V0ZSBwYXJhbWV0ZXJzIGluY2x1ZGluZyBtYXRyaXggcGFyYW1ldGVycyBhbmQgcXVhbGlmaWVycyB0byB0aGUgbWljcm9mcm9udGVuZC5cbiAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQ2xpZW50LnB1Ymxpc2goybVXb3JrYmVuY2hDb21tYW5kcy52aWV3UGFyYW1zVG9waWModGhpcy52aWV3LmlkKSwgTWFwcy5jb2VyY2UocGFyYW1zKSwge3JldGFpbjogdHJ1ZX0pO1xuXG4gICAgLy8gV2hlbiBuYXZpZ2F0aW5nIHRvIGFub3RoZXIgdmlldyBjYXBhYmlsaXR5IG9mIHRoZSBzYW1lIGFwcCwgd2FpdCB1bnRpbCB0cmFuc3BvcnRlZCB0aGUgcGFyYW1zIHRvIGNvbnN1bWVycyBiZWZvcmUgbG9hZGluZyB0aGVcbiAgICAvLyBuZXcgbWljcm9mcm9udGVuZCBpbnRvIHRoZSBpZnJhbWUsIGFsbG93aW5nIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1pY3JvZnJvbnRlbmQgdG8gY2xlYW51cCBzdWJzY3JpcHRpb25zLiBQYXJhbXMgaW5jbHVkZSB0aGVcbiAgICAvLyBjYXBhYmlsaXR5IGlkLlxuICAgIGlmIChwcmV2Vmlld0NhcGFiaWxpdHlcbiAgICAgICYmIHByZXZWaWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lID09PSB2aWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lXG4gICAgICAmJiBwcmV2Vmlld0NhcGFiaWxpdHkubWV0YWRhdGEhLmlkICE9PSB2aWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNhcGFiaWxpdHlQYXJhbSh2aWV3Q2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQpO1xuICAgIH1cblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBtaWNyb2Zyb250ZW5kLlxuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgTG9hZGluZyBtaWNyb2Zyb250ZW5kIGludG8gd29ya2JlbmNoIHZpZXcgW3ZpZXdJZD0ke3RoaXMudmlldy5pZH0sIGFwcD0ke3ZpZXdDYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWV9LCBiYXNlVXJsPSR7YXBwbGljYXRpb24uYmFzZVVybH0sIHBhdGg9JHsodmlld0NhcGFiaWxpdHkucHJvcGVydGllcy5wYXRoKX1dLmAsIExvZ2dlck5hbWVzLk1JQ1JPRlJPTlRFTkRfUk9VVElORywgcGFyYW1zLCB2aWV3Q2FwYWJpbGl0eSk7XG4gICAgYXdhaXQgdGhpcy5fb3V0bGV0Um91dGVyLm5hdmlnYXRlKHZpZXdDYXBhYmlsaXR5LnByb3BlcnRpZXMucGF0aCwge1xuICAgICAgb3V0bGV0OiB0aGlzLnZpZXcuaWQsXG4gICAgICByZWxhdGl2ZVRvOiBhcHBsaWNhdGlvbi5iYXNlVXJsLFxuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICBwdXNoU3RhdGVUb1Nlc3Npb25IaXN0b3J5U3RhY2s6IGZhbHNlLFxuICAgICAgc2hvd1NwbGFzaDogdmlld0NhcGFiaWxpdHkucHJvcGVydGllcy5zaG93U3BsYXNoLFxuICAgICAgybVjYXBhYmlsaXR5SWQ6IHZpZXdDYXBhYmlsaXR5Lm1ldGFkYXRhIS5pZCxcbiAgICB9KTtcblxuICAgIC8vIEluYWN0aXZlIHZpZXdzIGFyZSBkZXRhY2hlZCBmcm9tIHRoZSBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS5cbiAgICAvLyBUaGVyZWZvcmUsIG1hbnVhbGx5IGRldGVjdCB0aGlzIGNvbXBvbmVudCBmb3IgY2hhbmdlcyBmb3IgdXBkYXRpbmcgYXR0cmlidXRlcyBvbiB0aGUgYHNjaS1yb3V0ZXItb3V0bGV0YC5cbiAgICBpZiAoIXRoaXMudmlldy5hY3RpdmUpIHtcbiAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZXF1ZXN0cyBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1pY3JvZnJvbnRlbmQgdG8gdXBkYXRlIGl0cyBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsUGFyYW1zVXBkYXRlcih2aWV3Q2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHkpOiB2b2lkIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZVBhcmFtc1VwZGF0ZXIkLm5leHQoKTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLl9tZXNzYWdlQ2xpZW50Lm9ic2VydmUkPMm1Vmlld1BhcmFtc1VwZGF0ZUNvbW1hbmQ+KMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1BhcmFtc1VwZGF0ZVRvcGljKHRoaXMudmlldy5pZCwgdmlld0NhcGFiaWxpdHkubWV0YWRhdGEhLmlkKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZVBhcmFtc1VwZGF0ZXIkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAocmVxdWVzdDogVG9waWNNZXNzYWdlPMm1Vmlld1BhcmFtc1VwZGF0ZUNvbW1hbmQ+KSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcnhqcy9uby1hc3luYy1zdWJzY3JpYmVcbiAgICAgICAgLy8gV2UgRE8gTk9UIG5hdmlnYXRlIGlmIHRoZSBzdWJzY3JpcHRpb24gd2FzIGNsb3NlZCwgZS5nLiwgYmVjYXVzZSBjbG9zZWQgdGhlIHZpZXcgb3IgbmF2aWdhdGVkIHRvIGFub3RoZXIgY2FwYWJpbGl0eS5cbiAgICAgICAgY29uc3QgcmVwbHlUbyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoTWVzc2FnZUhlYWRlcnMuUmVwbHlUbyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5fd29ya2JlbmNoUm91dGVyLsm1bmF2aWdhdGUobGF5b3V0ID0+IHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBwZW5kaW5nIG5hdmlnYXRpb24gaWYgdGhlIHN1YnNjcmlwdGlvbiB3YXMgY2xvc2VkLCBlLmcuLCBiZWNhdXNlIGNsb3NlZCB0aGUgdmlldyBvciBuYXZpZ2F0ZWQgdG8gYW5vdGhlciBjYXBhYmlsaXR5XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudE1pY3JvZnJvbnRlbmRQYXJhbXMgPSBNaWNyb2Zyb250ZW5kVmlld1JvdXRlcy5wYXJzZVBhcmFtcyh0aGlzLl9yb3V0ZS5zbmFwc2hvdCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFyYW1zID0gey4uLmN1cnJlbnRNaWNyb2Zyb250ZW5kUGFyYW1zLnVybFBhcmFtcywgLi4uY3VycmVudE1pY3JvZnJvbnRlbmRQYXJhbXMudHJhbnNpZW50UGFyYW1zfTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zVXBkYXRlQ29tbWFuZDogybVWaWV3UGFyYW1zVXBkYXRlQ29tbWFuZCA9IHJlcXVlc3QuYm9keSE7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSBEaWN0aW9uYXJpZXMuY29lcmNlKHBhcmFtc1VwZGF0ZUNvbW1hbmQucGFyYW1zKTsgLy8gY29lcmNlIHBhcmFtcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkUGFyYW1zID0gRGljdGlvbmFyaWVzLndpdGhvdXRVbmRlZmluZWRFbnRyaWVzKHBhcmFtc1VwZGF0ZUNvbW1hbmQucGFyYW1zSGFuZGxpbmcgPT09ICdtZXJnZScgPyB7Li4uY3VycmVudFBhcmFtcywgLi4ubmV3UGFyYW1zfSA6IG5ld1BhcmFtcyk7XG4gICAgICAgICAgICBjb25zdCB7dXJsUGFyYW1zLCB0cmFuc2llbnRQYXJhbXN9ID0gTWljcm9mcm9udGVuZFZpZXdSb3V0ZXMuc3BsaXRQYXJhbXMobWVyZ2VkUGFyYW1zLCB2aWV3Q2FwYWJpbGl0eSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGxheW91dCxcbiAgICAgICAgICAgICAgdmlld091dGxldHM6IHtbdGhpcy52aWV3LmlkXTogW3VybFBhcmFtc119LFxuICAgICAgICAgICAgICB2aWV3U3RhdGVzOiB7W3RoaXMudmlldy5pZF06IHtbTWljcm9mcm9udGVuZE5hdmlnYXRpb25hbFN0YXRlcy50cmFuc2llbnRQYXJhbXNdOiB0cmFuc2llbnRQYXJhbXN9fSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSwge3JlbGF0aXZlVG86IHRoaXMuX3JvdXRlfSk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQ2xpZW50LnB1Ymxpc2gocmVwbHlUbywgc3VjY2Vzcywge2hlYWRlcnM6IG5ldyBNYXAoKS5zZXQoTWVzc2FnZUhlYWRlcnMuU3RhdHVzLCBSZXNwb25zZVN0YXR1c0NvZGVzLlRFUk1JTkFMKX0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX21lc3NhZ2VDbGllbnQucHVibGlzaChyZXBseVRvLCBzdHJpbmdpZnlFcnJvcihlcnJvciksIHtoZWFkZXJzOiBuZXcgTWFwKCkuc2V0KE1lc3NhZ2VIZWFkZXJzLlN0YXR1cywgUmVzcG9uc2VTdGF0dXNDb2Rlcy5FUlJPUil9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHZpZXcsIHN1Y2ggYXMgdGhlIHZpZXcgdGl0bGUsIGFzIGRlZmluZWQgYnkgdGhlIGNhcGFiaWxpdHkuXG4gICAqL1xuICBwcml2YXRlIHNldFZpZXdQcm9wZXJ0aWVzKHZpZXdDYXBhYmlsaXR5OiBXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSwgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LnRpdGxlID0gc3Vic3RpdHV0ZU5hbWVkUGFyYW1ldGVycyh2aWV3Q2FwYWJpbGl0eS5wcm9wZXJ0aWVzLnRpdGxlLCBwYXJhbXMpID8/IG51bGw7XG4gICAgdGhpcy52aWV3LmhlYWRpbmcgPSBzdWJzdGl0dXRlTmFtZWRQYXJhbWV0ZXJzKHZpZXdDYXBhYmlsaXR5LnByb3BlcnRpZXMuaGVhZGluZywgcGFyYW1zKSA/PyBudWxsO1xuICAgIHRoaXMudmlldy5jc3NDbGFzcyA9IG5ldyBBcnJheTxzdHJpbmc+KClcbiAgICAgIC5jb25jYXQoQXJyYXlzLmNvZXJjZSh2aWV3Q2FwYWJpbGl0eS5wcm9wZXJ0aWVzLmNzc0NsYXNzKSlcbiAgICAgIC5jb25jYXQoQXJyYXlzLmNvZXJjZShhY3RpdmF0ZWRSb3V0ZS5kYXRhW1dvcmtiZW5jaFJvdXRlRGF0YS5zdGF0ZV0/LltXb3JrYmVuY2hOYXZpZ2F0aW9uYWxWaWV3U3RhdGVzLmNzc0NsYXNzXSkpO1xuICAgIHRoaXMudmlldy5jbG9zYWJsZSA9IHZpZXdDYXBhYmlsaXR5LnByb3BlcnRpZXMuY2xvc2FibGUgPz8gdHJ1ZTtcbiAgICB0aGlzLnZpZXcuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCB0aGUgYXBwbGljYXRpb24gcmVnaXN0ZXJlZCB1bmRlciB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIGxvb2t1cEFwcGxpY2F0aW9uKHN5bWJvbGljTmFtZTogc3RyaW5nKTogQXBwbGljYXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFNlcnZpY2UuYXBwbGljYXRpb25zLmZpbmQoYXBwID0+IGFwcC5zeW1ib2xpY05hbWUgPT09IHN5bWJvbGljTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgcGFyYW1zIGNvbnRhaW4gdGhlIGdpdmVuIGNhcGFiaWxpdHkgaWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JDYXBhYmlsaXR5UGFyYW0odmlld0NhcGFiaWxpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgdmlld1BhcmFtcyQgPSB0aGlzLl9tZXNzYWdlQ2xpZW50Lm9ic2VydmUkPE1hcDxzdHJpbmcsIHN0cmluZz4+KMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1BhcmFtc1RvcGljKHRoaXMudmlldy5pZCkpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwVG9Cb2R5KCksXG4gICAgICAgIGZpcnN0KHBhcmFtcyA9PiBwYXJhbXMuZ2V0KMm1TWljcm9mcm9udGVuZFJvdXRlUGFyYW1zLsm1VklFV19DQVBBQklMSVRZX0lEKSA9PT0gdmlld0NhcGFiaWxpdHlJZCksXG4gICAgICApO1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHZpZXdQYXJhbXMkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCBqdXN0IGJlZm9yZSBjbG9zaW5nIHRoaXMgdmlldy5cbiAgICpcbiAgICogSWYgdGhlIGVtYmVkZGVkIG1pY3JvZnJvbnRlbmQgaGFzIGEgbGlzdGVuZXIgaW5zdGFsbGVkIHRvIGJlIG5vdGlmaWVkIHdoZW4gY2xvc2luZyB0aGlzIHZpZXcsXG4gICAqIGluaXRpYXRlcyBhIHJlcXVlc3QtcmVwbHkgY29tbXVuaWNhdGlvbiwgYWxsb3dpbmcgdGhlIG1pY3JvZnJvbnRlbmQgdG8gcHJldmVudCB0aGlzIHZpZXcgZnJvbSBjbG9zaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9uV29ya2JlbmNoVmlld1ByZURlc3Ryb3koKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2xvc2luZ1RvcGljID0gybVXb3JrYmVuY2hDb21tYW5kcy52aWV3Q2xvc2luZ1RvcGljKHRoaXMudmlldy5pZCk7XG5cbiAgICAvLyBBbGxvdyB0aGUgbWljcm9mcm9udGVuZCB0byBwcmV2ZW50IHRoaXMgdmlldyBmcm9tIGNsb3NpbmcuXG4gICAgY29uc3QgY291bnQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9tZXNzYWdlQ2xpZW50LnN1YnNjcmliZXJDb3VudCQoY2xvc2luZ1RvcGljKSk7XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2l0ID0gdGhpcy5fbWVzc2FnZUNsaWVudC5yZXF1ZXN0JDxib29sZWFuPihjbG9zaW5nVG9waWMpLnBpcGUobWFwVG9Cb2R5KCksIGNhdGNoRXJyb3IoKCkgPT4gRU1QVFkpKTtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oZG9pdCwge2RlZmF1bHRWYWx1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXNXaXRoaW4oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qge2RldGFpbDogZm9jdXNXaXRoaW59ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8Ym9vbGVhbj47XG4gICAgaWYgKGZvY3VzV2l0aGluKSB7XG4gICAgICB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3NjaS1taWNyb2Zyb250ZW5kLWZvY3VzaW4nLCB7YnViYmxlczogdHJ1ZX0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBvbiBzdWJzY3JpcHRpb24sIGVtaXRzIHRoZSBrZXlzdHJva2VzIHJlZ2lzdGVyZWQgd2l0aCBtZW51IGl0ZW1zIG9mIHRoaXMgdmlldydzIGNvbnRleHQgbWVudSxcbiAgICogYW5kIHRoZW4gY29udGludW91c2x5IHdoZW4gdGhleSBjaGFuZ2UuIFRoZSBvYnNlcnZhYmxlIG5ldmVyIGNvbXBsZXRlcy5cbiAgICovXG4gIHByaXZhdGUgdmlld0NvbnRleHRNZW51S2V5c3Ryb2tlcyQoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnZpZXcubWVudUl0ZW1zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlckFycmF5KG1lbnVJdGVtID0+ICEhbWVudUl0ZW0uYWNjZWxlcmF0b3IpLFxuICAgICAgICBtYXBBcnJheShtZW51SXRlbSA9PiBtZW51SXRlbS5hY2NlbGVyYXRvciEubWFwKGFjY2VsZXJhdG9yID0+IHtcbiAgICAgICAgICAvLyBOb3JtYWxpemUga2V5c3Ryb2tlcyBhY2NvcmRpbmcgdG8gYFNjaVJvdXRlck91dGxldEVsZW1lbnQja2V5c3Ryb2tlc2BcbiAgICAgICAgICBzd2l0Y2ggKGFjY2VsZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlICdjdHJsJzpcbiAgICAgICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgICAgICByZXR1cm4gJ2RvdCc7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYWNjZWxlcmF0b3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KSksXG4gICAgICAgIG1hcEFycmF5KGFjY2VsZXJhdG9yID0+IFsna2V5ZG93biddLmNvbmNhdChhY2NlbGVyYXRvcikuam9pbignLicpKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUge0BsaW5rIGlzV29ya2JlbmNoRHJhZ30gcHJvcGVydHkgd2hlbiBhIHdvcmtiZW5jaCBkcmFnIG9wZXJhdGlvbiBpcyBkZXRlY3RlZCxcbiAgICogc3VjaCBhcyB3aGVuIGRyYWdnaW5nIGEgdmlldyBvciBtb3ZpbmcgYSBzYXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsV29ya2JlbmNoRHJhZ0RldGVjdG9yKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UuZHJhZ2dpbmckXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2JlbmNoRHJhZyA9IChldmVudCA9PT0gJ3N0YXJ0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIHRoZSBjdXJyZW50IHRoZW1lIGFuZCBjb2xvciBzY2hlbWUgdG8gZW1iZWRkZWQgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFRoZW1lUHJvcGFnYXRvcigpOiB2b2lkIHtcbiAgICB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnRoZW1lJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh0aGVtZSA9PiB7XG4gICAgICAgIGlmICh0aGVtZSkge1xuICAgICAgICAgIHRoaXMucm91dGVyT3V0bGV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldENvbnRleHRWYWx1ZTxXb3JrYmVuY2hUaGVtZT4oybVUSEVNRV9DT05URVhUX0tFWSwgdGhlbWUpO1xuICAgICAgICAgIHRoaXMucm91dGVyT3V0bGV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldENvbnRleHRWYWx1ZSgnY29sb3Itc2NoZW1lJywgdGhlbWUuY29sb3JTY2hlbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMucm91dGVyT3V0bGV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUNvbnRleHRWYWx1ZSjJtVRIRU1FX0NPTlRFWFRfS0VZKTtcbiAgICAgICAgICB0aGlzLnJvdXRlck91dGxldEVsZW1lbnQubmF0aXZlRWxlbWVudC5yZW1vdmVDb250ZXh0VmFsdWUoJ2NvbG9yLXNjaGVtZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBJbnN0cnVjdCB0aGUgbWVzc2FnZSBicm9rZXIgdG8gZGVsZXRlIHJldGFpbmVkIG1lc3NhZ2VzIHRvIGZyZWUgcmVzb3VyY2VzLlxuICAgIHRoaXMuX21lc3NhZ2VDbGllbnQucHVibGlzaCjJtVdvcmtiZW5jaENvbW1hbmRzLnZpZXdBY3RpdmVUb3BpYyh0aGlzLnZpZXcuaWQpLCB1bmRlZmluZWQsIHtyZXRhaW46IHRydWV9KS50aGVuKCk7XG4gICAgdGhpcy5fbWVzc2FnZUNsaWVudC5wdWJsaXNoKMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1BhcmFtc1RvcGljKHRoaXMudmlldy5pZCksIHVuZGVmaW5lZCwge3JldGFpbjogdHJ1ZX0pLnRoZW4oKTtcbiAgICB0aGlzLl9vdXRsZXRSb3V0ZXIubmF2aWdhdGUobnVsbCwge291dGxldDogdGhpcy52aWV3LmlkfSkudGhlbigpO1xuICB9XG59XG5cbi8qKlxuICogTWFwcyB0aGUgcGFzc2VkIHtAbGluayBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90fSB0byBhIHtAbGluayBBY3RpdmF0ZWRNaWNyb2Zyb250ZW5kUm91dGVTbmFwc2hvdH0gd2l0aCByZXNvbHZlZCBwYXJhbXMgYW5kIGNhcGFiaWxpdHkuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvTWljcm9mcm9udGVuZFJvdXRlU25hcHNob3QoKTogT3BlcmF0b3JGdW5jdGlvbjxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBBY3RpdmF0ZWRNaWNyb2Zyb250ZW5kUm91dGVTbmFwc2hvdD4ge1xuICByZXR1cm4gc3dpdGNoTWFwKChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE9ic2VydmFibGU8QWN0aXZhdGVkTWljcm9mcm9udGVuZFJvdXRlU25hcHNob3Q+ID0+IHtcbiAgICBjb25zdCB7dmlld0NhcGFiaWxpdHlJZCwgdXJsUGFyYW1zLCB0cmFuc2llbnRQYXJhbXMsIHF1YWxpZmllcn0gPSBNaWNyb2Zyb250ZW5kVmlld1JvdXRlcy5wYXJzZVBhcmFtcyhhY3RpdmF0ZWRSb3V0ZSk7XG4gICAgcmV0dXJuIEJlYW5zLmdldChNYW5pZmVzdFNlcnZpY2UpLmxvb2t1cENhcGFiaWxpdGllcyQ8V29ya2JlbmNoVmlld0NhcGFiaWxpdHk+KHtpZDogdmlld0NhcGFiaWxpdHlJZH0pLnBpcGUobWFwKGNhcGFiaWxpdGllcyA9PiAoe1xuICAgICAgYWN0aXZhdGVkUm91dGUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgLi4udXJsUGFyYW1zLFxuICAgICAgICAuLi50cmFuc2llbnRQYXJhbXMsXG4gICAgICAgIC4uLnF1YWxpZmllciwgLy8gcXVhbGlmaWVyIGVudHJpZXMgaGF2ZSBhIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gcGFyYW1ldGVyc1xuICAgICAgICBbybVNaWNyb2Zyb250ZW5kUm91dGVQYXJhbXMuybVWSUVXX0NBUEFCSUxJVFlfSURdOiB2aWV3Q2FwYWJpbGl0eUlkLCAvLyBjYXBhYmlsaXR5IElEIGNhbm5vdCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgIH0sXG4gICAgICB2aWV3Q2FwYWJpbGl0eTogY2FwYWJpbGl0aWVzWzBdLFxuICAgIH0pKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIG1pY3JvZnJvbnRlbmQgcm91dGUgYXQgYSBwYXJ0aWN1bGFyIG1vbWVudCBpbiB0aW1lLlxuICovXG5pbnRlcmZhY2UgQWN0aXZhdGVkTWljcm9mcm9udGVuZFJvdXRlU25hcHNob3Qge1xuICBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdDtcbiAgcGFyYW1zOiBQYXJhbXM7XG4gIHZpZXdDYXBhYmlsaXR5PzogV29ya2JlbmNoVmlld0NhcGFiaWxpdHk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgbmFtZWQgcGFyYW1ldGVycyB3aXRoIHZhbHVlcyBvZiB0aGUgY29udGFpbmVkIHtAbGluayBQYXJhbXN9LlxuICovXG5mdW5jdGlvbiBzdWJzdGl0dXRlTmFtZWRQYXJhbWV0ZXJzKHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBwYXJhbXM6IFBhcmFtcyk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWU/LnJlcGxhY2UoLzooXFx3KykvZywgKG1hdGNoLCBwYXJhbU5hbWUpID0+IHBhcmFtc1twYXJhbU5hbWVdID8/IG1hdGNoKSB8fCBudWxsO1xufVxuXG4vKipcbiAqIEJsb2NrcyB0aGUgbWljcm9mcm9udGVuZCBvdXRsZXQgd2hlbiBkaWFsb2cocykgb3ZlcmxheSB0aGlzIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZU1pY3JvZnJvbnRlbmRHbGFzc1BhbmUoKTogUHJvdmlkZXIge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IEdMQVNTX1BBTkVfQkxPQ0tBQkxFLFxuICAgIHVzZUV4aXN0aW5nOiDJtVdvcmtiZW5jaFZpZXcsXG4gIH07XG59XG4iLCI8d2ItY29udGVudC1hcy1vdmVybGF5IFtvdmVybGF5SG9zdF09XCJpZnJhbWVIb3N0UmVmLnJlZiQgfCBhc3luY1wiPlxuICA8ZGl2IGNsYXNzPVwibWljcm9mcm9udGVuZC12aWV3XCJcbiAgICAgICBbY2xhc3Mud29ya2JlbmNoLWRyYWddPVwiaXNXb3JrYmVuY2hEcmFnXCJcbiAgICAgICBbYXR0ci5kYXRhLXZpZXdpZF09XCJ2aWV3LmlkXCJcbiAgICAgICB3YkdsYXNzUGFuZT5cbiAgICA8c2NpLXJvdXRlci1vdXRsZXQgI3JvdXRlcl9vdXRsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwidmlldy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2FwYWJpbGl0eWlkXT1cInZpZXdDYXBhYmlsaXR5Py5tZXRhZGF0YSEuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFwcF09XCJ2aWV3Q2FwYWJpbGl0eT8ubWV0YWRhdGEhLmFwcFN5bWJvbGljTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInZpZXcuY3NzQ2xhc3Nlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgIChmb2N1c3dpdGhpbik9XCJvbkZvY3VzV2l0aGluKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBba2V5c3Ryb2tlc109XCJrZXlzdHJva2VzVG9CdWJibGUkIHwgYXN5bmNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwic3BsYXNoXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zY2ktcm91dGVyLW91dGxldD5cbiAgPC9kaXY+XG48L3diLWNvbnRlbnQtYXMtb3ZlcmxheT5cbiJdfQ==
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0vbWljcm9mcm9udGVuZC12aWV3L21pY3JvZnJvbnRlbmQtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9taWNyb2Zyb250ZW5kLXBsYXRmb3JtL21pY3JvZnJvbnRlbmQtdmlldy9taWNyb2Zyb250ZW5kLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQW9CLFNBQVMsRUFBRSxzQkFBc0IsRUFBMEIsTUFBTSxFQUFFLE1BQU0sRUFBeUMscUJBQXFCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXBNLE9BQU8sRUFBQyxhQUFhLEVBQUUsY0FBYyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBa0IsU0FBUyxFQUFpQixjQUFjLEVBQUUsMkJBQTJCLEVBQWdCLG1CQUFtQixFQUF1QyxNQUFNLCtCQUErQixDQUFDO0FBQzlNLE9BQU8sRUFBMEIseUJBQXlCLEVBQUUsb0JBQW9CLEVBQTRCLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDL0osT0FBTyxFQUFDLFlBQVksRUFBRSxJQUFJLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQVMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBQyxXQUFXLEVBQXlCLE1B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QUN6QixpQkFBaUIsb1BBQ2pCLGtCQUFrQiwrQ0FFTDtZQUNiLCtCQUErQixFQUFFO1NBQ2xDOzsyRkFHVSwwQkFBMEI7a0JBakJ0QyxTQUFTOytCQUNFLHVCQUF1QixjQUdyQixJQUFJLFdBQ1A7d0JBQ1AsT0FBTzt3QkFDUCxTQUFTO3dCQUNULHlCQUF5Qjt3QkFDekIsaUJBQWlCO3dCQUNqQixrQkFBa0I7cUJBQ25CLGlCQUNjO3dCQUNiLCtCQUErQixFQUFFO3FCQUNsQyxXQUNRLENBQUMsc0JBQXNCLENBQUM7OzBCQTBDcEIsTUFBTTsyQkFBQyxXQUFXO3lDQXpCeEIsbUJBQW1CO3NCQUR6QixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7O0FBeVA1Qzs7R0FFRztBQUNILFNBQVMsK0JBQStCO0lBQ3RDLE9BQU87UUFDTCxPQUFPLEVBQUUsb0JBQW9CO1FBQzdCLFdBQVcsRUFBRSxjQUFjO0tBQzVCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIyIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIGluamVjdCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQsIFByb3ZpZGVyLCBydW5JbkluamVjdGlvbkNvbnRleHQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge2NvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Zmlyc3QsIG1hcCwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01hbmlmZXN0U2VydmljZSwgbWFwVG9Cb2R5LCBNZXNzYWdlQ2xpZW50LCBNZXNzYWdlSGVhZGVycywgTWljcm9mcm9udGVuZFBsYXRmb3JtQ29uZmlnLCBPdXRsZXRSb3V0ZXIsIFJlc3BvbnNlU3RhdHVzQ29kZXMsIFNjaVJvdXRlck91dGxldEVsZW1lbnQsIFRvcGljTWVzc2FnZX0gZnJvbSAnQHNjaW9uL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0nO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSwgybVNaWNyb2Zyb250ZW5kUm91dGVQYXJhbXMsIMm1VklFV19JRF9DT05URVhUX0tFWSwgybVWaWV3UGFyYW1zVXBkYXRlQ29tbWFuZCwgybVXb3JrYmVuY2hDb21tYW5kc30gZnJvbSAnQHNjaW9uL3dvcmtiZW5jaC1jbGllbnQnO1xuaW1wb3J0IHtEaWN0aW9uYXJpZXMsIE1hcHN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuaW1wb3J0IHtMb2dnZXIsIExvZ2dlck5hbWVzfSBmcm9tICcuLi8uLi9sb2dnaW5nJztcbmltcG9ydCB7Q2FuQ2xvc2V9IGZyb20gJy4uLy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge0lGUkFNRV9IT1NULCBWaWV3Q29udGFpbmVyUmVmZXJlbmNlfSBmcm9tICcuLi8uLi9jb250ZW50LXByb2plY3Rpb24vdmlldy1jb250YWluZXIucmVmZXJlbmNlJztcbmltcG9ydCB7c2VyaWFsaXplRXhlY3V0aW9ufSBmcm9tICcuLi8uLi9jb21tb24vb3BlcmF0b3JzJztcbmltcG9ydCB7ybVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi8uLi92aWV3L8m1d29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgbWFwQXJyYXl9IGZyb20gJ0BzY2lvbi90b29sa2l0L29wZXJhdG9ycyc7XG5pbXBvcnQge1ZpZXdNZW51U2VydmljZX0gZnJvbSAnLi4vLi4vcGFydC92aWV3LWNvbnRleHQtbWVudS92aWV3LW1lbnUuc2VydmljZSc7XG5pbXBvcnQge1dvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi4vLi4vcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtzdHJpbmdpZnlFcnJvcn0gZnJvbSAnLi4vLi4vY29tbW9uL3N0cmluZ2lmeS1lcnJvci51dGlsJztcbmltcG9ydCB7TWljcm9mcm9udGVuZFZpZXdSb3V0ZXN9IGZyb20gJy4uL3JvdXRpbmcvbWljcm9mcm9udGVuZC12aWV3LXJvdXRlcyc7XG5pbXBvcnQge0FzeW5jUGlwZSwgTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0NvbnRlbnRBc092ZXJsYXlDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvbnRlbnQtcHJvamVjdGlvbi9jb250ZW50LWFzLW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uLy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtDb21wb25lbnRUeXBlfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7TWljcm9mcm9udGVuZFNwbGFzaENvbXBvbmVudH0gZnJvbSAnLi4vbWljcm9mcm9udGVuZC1zcGxhc2gvbWljcm9mcm9udGVuZC1zcGxhc2guY29tcG9uZW50JztcbmltcG9ydCB7R0xBU1NfUEFORV9CTE9DS0FCTEUsIEdsYXNzUGFuZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vZ2xhc3MtcGFuZS9nbGFzcy1wYW5lLmRpcmVjdGl2ZSc7XG5pbXBvcnQge01pY3JvZnJvbnRlbmRXb3JrYmVuY2hWaWV3fSBmcm9tICcuL21pY3JvZnJvbnRlbmQtd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtNaWNyb2Zyb250ZW5kc30gZnJvbSAnLi4vY29tbW9uL21pY3JvZnJvbnRlbmQudXRpbCc7XG5pbXBvcnQge09iamVjdHN9IGZyb20gJy4uLy4uL2NvbW1vbi9vYmplY3RzLnV0aWwnO1xuXG4vKipcbiAqIEVtYmVkcyB0aGUgbWljcm9mcm9udGVuZCBvZiBhIHZpZXcgY2FwYWJpbGl0eS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2ItbWljcm9mcm9udGVuZC12aWV3JyxcbiAgc3R5bGVVcmxzOiBbJy4vbWljcm9mcm9udGVuZC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9taWNyb2Zyb250ZW5kLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBBc3luY1BpcGUsXG4gICAgQ29udGVudEFzT3ZlcmxheUNvbXBvbmVudCxcbiAgICBOZ0NvbXBvbmVudE91dGxldCxcbiAgICBHbGFzc1BhbmVEaXJlY3RpdmUsXG4gIF0sXG4gIHZpZXdQcm92aWRlcnM6IFtcbiAgICBjb25maWd1cmVNaWNyb2Zyb250ZW5kR2xhc3NQYW5lKCksXG4gIF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSwgLy8gcmVxdWlyZWQgYmVjYXVzZSA8c2NpLXJvdXRlci1vdXRsZXQ+IGlzIGEgY3VzdG9tIGVsZW1lbnRcbn0pXG5leHBvcnQgY2xhc3MgTWljcm9mcm9udGVuZFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuQ2xvc2Uge1xuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlUGFyYW1zVXBkYXRlciQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF91bml2ZXJzYWxLZXlzdHJva2VzID0gW1xuICAgICdrZXlkb3duLmVzY2FwZScsIC8vIGFsbG93cyBjbG9zaW5nIG5vdGlmaWNhdGlvbnNcbiAgXTtcblxuICBwcm90ZWN0ZWQgY2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNwbGFzaCB0byBkaXNwbGF5IHVudGlsIHRoZSBtaWNyb2Zyb250ZW5kIHNpZ25hbHMgcmVhZGluZXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNwbGFzaDogQ29tcG9uZW50VHlwZTx1bmtub3duPjtcblxuICBAVmlld0NoaWxkKCdyb3V0ZXJfb3V0bGV0Jywge3N0YXRpYzogdHJ1ZX0pXG4gIHB1YmxpYyByb3V0ZXJPdXRsZXRFbGVtZW50ITogRWxlbWVudFJlZjxTY2lSb3V0ZXJPdXRsZXRFbGVtZW50PjtcblxuICAvKipcbiAgICogS2V5c3Ryb2tlcyB3aGljaCB0byBidWJibGUgYWNyb3NzIGlmcmFtZSBib3VuZGFyaWVzIG9mIGVtYmVkZGVkIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMga2V5c3Ryb2tlc1RvQnViYmxlJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGEgd29ya2JlbmNoIGRyYWcgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLCBzdWNoIGFzIHdoZW4gZHJhZ2dpbmcgYSB2aWV3IG9yIG1vdmluZyBhIHNhc2guXG4gICAqL1xuICBwdWJsaWMgaXNXb3JrYmVuY2hEcmFnID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfb3V0bGV0Um91dGVyOiBPdXRsZXRSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX21hbmlmZXN0U2VydmljZTogTWFuaWZlc3RTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9tZXNzYWdlQ2xpZW50OiBNZXNzYWdlQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIF9kZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2dnZXI6IExvZ2dlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdmlld0NvbnRleHRNZW51U2VydmljZTogVmlld01lbnVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlOiBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hSb3V0ZXI6IFdvcmtiZW5jaFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3OiDJtVdvcmtiZW5jaFZpZXcsXG4gICAgICAgICAgICAgIEBJbmplY3QoSUZSQU1FX0hPU1QpIHByb3RlY3RlZCBpZnJhbWVIb3N0UmVmOiBWaWV3Q29udGFpbmVyUmVmZXJlbmNlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgTWljcm9mcm9udGVuZFZpZXdDb21wb25lbnQuIFt2aWV3SWQ9JHt0aGlzLnZpZXcuaWR9XWAsIExvZ2dlck5hbWVzLk1JQ1JPRlJPTlRFTkRfUk9VVElORyk7XG4gICAgdGhpcy5rZXlzdHJva2VzVG9CdWJibGUkID0gY29tYmluZUxhdGVzdChbdGhpcy52aWV3Q29udGV4dE1lbnVLZXlzdHJva2VzJCgpLCBvZih0aGlzLl91bml2ZXJzYWxLZXlzdHJva2VzKV0pXG4gICAgICAucGlwZShtYXAoa2V5c3Ryb2tlcyA9PiBuZXcgQXJyYXk8c3RyaW5nPigpLmNvbmNhdCguLi5rZXlzdHJva2VzKSkpO1xuICAgIHRoaXMuaW5zdGFsbFdvcmtiZW5jaERyYWdEZXRlY3RvcigpO1xuICAgIHRoaXMuc3BsYXNoID0gaW5qZWN0KE1pY3JvZnJvbnRlbmRQbGF0Zm9ybUNvbmZpZykuc3BsYXNoID8/IE1pY3JvZnJvbnRlbmRTcGxhc2hDb21wb25lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXJPdXRsZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0Q29udGV4dFZhbHVlKMm1VklFV19JRF9DT05URVhUX0tFWSwgdGhpcy52aWV3LmlkKTtcbiAgICB0aGlzLnByb3BhZ2F0ZVdvcmtiZW5jaFRoZW1lKCk7XG4gICAgdGhpcy5pbnN0YWxsTWVudUl0ZW1BY2NlbGVyYXRvcnMkKCk7XG4gICAgdGhpcy5pbnN0YWxsTmF2aWdhdG9yKCk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxOYXZpZ2F0b3IoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGUucGFyYW1zXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHBhcmFtcyA9PiB0aGlzLmZldGNoQ2FwYWJpbGl0eSQocGFyYW1zW8m1TWljcm9mcm9udGVuZFJvdXRlUGFyYW1zLsm1VklFV19DQVBBQklMSVRZX0lEXSkucGlwZShtYXAoY2FwYWJpbGl0eSA9PiAoe2NhcGFiaWxpdHksIHBhcmFtc30pKSkpLFxuICAgICAgICBzZXJpYWxpemVFeGVjdXRpb24oKHtjYXBhYmlsaXR5LCBwYXJhbXN9KSA9PiB0aGlzLm9uTmF2aWdhdGUodGhpcy5jYXBhYmlsaXR5LCBjYXBhYmlsaXR5LCBwYXJhbXMpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvbk5hdmlnYXRlKHByZXZDYXBhYmlsaXR5OiBXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSB8IHVuZGVmaW5lZCwgY2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHkgfCB1bmRlZmluZWQsIHBhcmFtczogUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFjYXBhYmlsaXR5KSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybigoKSA9PiBgW051bGxDYXBhYmlsaXR5RXJyb3JdIE5vIGFwcGxpY2F0aW9uIGZvdW5kIHRvIHByb3ZpZGUgYSB2aWV3IGNhcGFiaWxpdHkgb2YgaWQgJyR7cGFyYW1zW8m1TWljcm9mcm9udGVuZFJvdXRlUGFyYW1zLsm1VklFV19DQVBBQklMSVRZX0lEXX0nLiBNYXliZSwgdGhlIHJlcXVlc3RlZCB2aWV3IGlzIG5vdCBwdWJsaWMgQVBJIG9yIHRoZSBwcm92aWRpbmcgYXBwbGljYXRpb24gbm90IGF2YWlsYWJsZS5gLCBMb2dnZXJOYW1lcy5NSUNST0ZST05URU5EX1JPVVRJTkcpO1xuICAgICAgYXdhaXQgdGhpcy52aWV3LmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTtcbiAgICB0aGlzLnZpZXcucmVnaXN0ZXJBZGFwdGVyKE1pY3JvZnJvbnRlbmRXb3JrYmVuY2hWaWV3LCBuZXcgTWljcm9mcm9udGVuZFdvcmtiZW5jaFZpZXcoY2FwYWJpbGl0eSwgcGFyYW1zKSk7XG5cbiAgICAvLyBDaGVjayBpZiBuYXZpZ2F0aW5nIHRvIGEgbmV3IG1pY3JvZnJvbnRlbmQuXG4gICAgaWYgKCFwcmV2Q2FwYWJpbGl0eSB8fCBwcmV2Q2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQgIT09IGNhcGFiaWxpdHkubWV0YWRhdGEhLmlkKSB7XG4gICAgICB0aGlzLnNldFZpZXdQcm9wZXJ0aWVzKGNhcGFiaWxpdHksIHBhcmFtcyk7XG4gICAgICB0aGlzLmluc3RhbGxQYXJhbXNVcGRhdGVyKGNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIC8vIFNpZ25hbCB0aGUgY3VycmVudGx5IGxvYWRlZCBhcHBsaWNhdGlvbiB0byB1bmxvYWQuXG4gICAgaWYgKHByZXZDYXBhYmlsaXR5ICYmIHByZXZDYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWUgIT09IGNhcGFiaWxpdHkubWV0YWRhdGEhLmFwcFN5bWJvbGljTmFtZSkge1xuICAgICAgYXdhaXQgdGhpcy5fbWVzc2FnZUNsaWVudC5wdWJsaXNoKMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1VubG9hZGluZ1RvcGljKHRoaXMudmlldy5pZCkpO1xuICAgIH1cblxuICAgIC8vIFBhc3MgcGFyYW1ldGVycyB0byB0aGUgbWljcm9mcm9udGVuZC5cbiAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQ2xpZW50LnB1Ymxpc2goybVXb3JrYmVuY2hDb21tYW5kcy52aWV3UGFyYW1zVG9waWModGhpcy52aWV3LmlkKSwgTWFwcy5jb2VyY2UocGFyYW1zKSwge3JldGFpbjogdHJ1ZX0pO1xuXG4gICAgLy8gV2hlbiBuYXZpZ2F0aW5nIHRvIGFub3RoZXIgdmlldyBjYXBhYmlsaXR5IG9mIHRoZSBzYW1lIGFwcCwgd2FpdCB1bnRpbCB0cmFuc3BvcnRlZCB0aGUgcGFyYW1zIHRvIHRoZSBtaWNyb2Zyb250ZW5kIGJlZm9yZSBsb2FkaW5nIHRoZVxuICAgIC8vIG5ldyBtaWNyb2Zyb250ZW5kIGludG8gdGhlIGlmcmFtZSwgYWxsb3dpbmcgdGhlIGN1cnJlbnRseSBsb2FkZWQgbWljcm9mcm9udGVuZCB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgIGlmIChwcmV2Q2FwYWJpbGl0eVxuICAgICAgJiYgcHJldkNhcGFiaWxpdHkubWV0YWRhdGEhLmFwcFN5bWJvbGljTmFtZSA9PT0gY2FwYWJpbGl0eS5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lXG4gICAgICAmJiBwcmV2Q2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQgIT09IGNhcGFiaWxpdHkubWV0YWRhdGEhLmlkKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JDYXBhYmlsaXR5UGFyYW0oY2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQpO1xuICAgIH1cblxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBtaWNyb2Zyb250ZW5kLlxuICAgIGNvbnN0IGFwcGxpY2F0aW9uID0gdGhpcy5fbWFuaWZlc3RTZXJ2aWNlLmFwcGxpY2F0aW9ucy5maW5kKGFwcCA9PiBhcHAuc3ltYm9saWNOYW1lID09PSBjYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWUpITtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYExvYWRpbmcgbWljcm9mcm9udGVuZCBpbnRvIHdvcmtiZW5jaCB2aWV3IFt2aWV3SWQ9JHt0aGlzLnZpZXcuaWR9LCBhcHA9JHtjYXBhYmlsaXR5Lm1ldGFkYXRhIS5hcHBTeW1ib2xpY05hbWV9LCBiYXNlVXJsPSR7YXBwbGljYXRpb24uYmFzZVVybH0sIHBhdGg9JHsoY2FwYWJpbGl0eS5wcm9wZXJ0aWVzLnBhdGgpfV0uYCwgTG9nZ2VyTmFtZXMuTUlDUk9GUk9OVEVORF9ST1VUSU5HLCBwYXJhbXMsIGNhcGFiaWxpdHkpO1xuICAgIGF3YWl0IHRoaXMuX291dGxldFJvdXRlci5uYXZpZ2F0ZShjYXBhYmlsaXR5LnByb3BlcnRpZXMucGF0aCwge1xuICAgICAgb3V0bGV0OiB0aGlzLnZpZXcuaWQsXG4gICAgICByZWxhdGl2ZVRvOiBhcHBsaWNhdGlvbi5iYXNlVXJsLFxuICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICBwdXNoU3RhdGVUb1Nlc3Npb25IaXN0b3J5U3RhY2s6IGZhbHNlLFxuICAgICAgc2hvd1NwbGFzaDogY2FwYWJpbGl0eS5wcm9wZXJ0aWVzLnNob3dTcGxhc2gsXG4gICAgICDJtWNhcGFiaWxpdHlJZDogY2FwYWJpbGl0eS5tZXRhZGF0YSEuaWQsXG4gICAgfSk7XG5cbiAgICAvLyBJbmFjdGl2ZSB2aWV3cyBhcmUgZGV0YWNoZWQgZnJvbSB0aGUgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uIHRyZWUuXG4gICAgLy8gVGhlcmVmb3JlLCBtYW51YWxseSBkZXRlY3QgdGhpcyBjb21wb25lbnQgZm9yIGNoYW5nZXMgZm9yIHVwZGF0aW5nIGF0dHJpYnV0ZXMgb24gdGhlIGBzY2ktcm91dGVyLW91dGxldGAuXG4gICAgaWYgKCF0aGlzLnZpZXcuYWN0aXZlKSB7XG4gICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaENhcGFiaWxpdHkkKGNhcGFiaWxpdHlJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdFNlcnZpY2UubG9va3VwQ2FwYWJpbGl0aWVzJDxXb3JrYmVuY2hWaWV3Q2FwYWJpbGl0eT4oe2lkOiBjYXBhYmlsaXR5SWR9KS5waXBlKG1hcChjYXBhYmlsaXRpZXMgPT4gY2FwYWJpbGl0aWVzLmF0KDApKSk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxNZW51SXRlbUFjY2VsZXJhdG9ycyQoKTogdm9pZCB7XG4gICAgLy8gU2luY2UgdGhlIGlmcmFtZSBpcyBhZGRlZCBhdCBhIHRvcC1sZXZlbCBsb2NhdGlvbiBpbiB0aGUgRE9NLCB0aGF0IGlzLCBub3QgYXMgYSBjaGlsZCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50LFxuICAgIC8vIHRoZSB3b3JrYmVuY2ggdmlldyBtaXNzZXMga2V5Ym9hcmQgZXZlbnRzIGZyb20gZW1iZWRkZWQgY29udGVudC4gQXMgYSByZXN1bHQsIG1lbnUgaXRlbSBhY2NlbGVyYXRvcnMgb2YgdGhlIGNvbnRleHRcbiAgICAvLyBtZW51IG9mIHRoaXMgdmlldyBkbyBub3Qgd29yaywgc28gd2UgaW5zdGFsbCB0aGUgYWNjZWxlcmF0b3JzIG9uIHRoZSByb3V0ZXIgb3V0bGV0IGFzIHdlbGwuXG4gICAgdGhpcy5fdmlld0NvbnRleHRNZW51U2VydmljZS5pbnN0YWxsTWVudUl0ZW1BY2NlbGVyYXRvcnMkKHRoaXMucm91dGVyT3V0bGV0RWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLnZpZXcpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZXF1ZXN0cyBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1pY3JvZnJvbnRlbmQgdG8gdXBkYXRlIGl0cyBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsUGFyYW1zVXBkYXRlcih2aWV3Q2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHkpOiB2b2lkIHtcbiAgICB0aGlzLl91bnN1YnNjcmliZVBhcmFtc1VwZGF0ZXIkLm5leHQoKTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLl9tZXNzYWdlQ2xpZW50Lm9ic2VydmUkPMm1Vmlld1BhcmFtc1VwZGF0ZUNvbW1hbmQ+KMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1BhcmFtc1VwZGF0ZVRvcGljKHRoaXMudmlldy5pZCwgdmlld0NhcGFiaWxpdHkubWV0YWRhdGEhLmlkKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZVBhcmFtc1VwZGF0ZXIkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShhc3luYyAocmVxdWVzdDogVG9waWNNZXNzYWdlPMm1Vmlld1BhcmFtc1VwZGF0ZUNvbW1hbmQ+KSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcnhqcy9uby1hc3luYy1zdWJzY3JpYmVcbiAgICAgICAgLy8gV2UgRE8gTk9UIG5hdmlnYXRlIGlmIHRoZSBzdWJzY3JpcHRpb24gd2FzIGNsb3NlZCwgZS5nLiwgYmVjYXVzZSBjbG9zZWQgdGhlIHZpZXcgb3IgbmF2aWdhdGVkIHRvIGFub3RoZXIgY2FwYWJpbGl0eS5cbiAgICAgICAgY29uc3QgcmVwbHlUbyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoTWVzc2FnZUhlYWRlcnMuUmVwbHlUbyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5fd29ya2JlbmNoUm91dGVyLm5hdmlnYXRlKGxheW91dCA9PiB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgcGVuZGluZyBuYXZpZ2F0aW9uIGlmIHRoZSBzdWJzY3JpcHRpb24gd2FzIGNsb3NlZCwgZS5nLiwgYmVjYXVzZSBjbG9zZWQgdGhlIHZpZXcgb3IgbmF2aWdhdGVkIHRvIGFub3RoZXIgY2FwYWJpbGl0eVxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtc0hhbmRsaW5nID0gcmVxdWVzdC5ib2R5IS5wYXJhbXNIYW5kbGluZztcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXJhbXMgPSB0aGlzLl9yb3V0ZS5zbmFwc2hvdC5wYXJhbXM7XG4gICAgICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSBEaWN0aW9uYXJpZXMuY29lcmNlKHJlcXVlc3QuYm9keSEucGFyYW1zKTsgLy8gY29lcmNlIHBhcmFtcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkUGFyYW1zID0gT2JqZWN0cy53aXRob3V0VW5kZWZpbmVkRW50cmllcyhwYXJhbXNIYW5kbGluZyA9PT0gJ21lcmdlJyA/IHsuLi5jdXJyZW50UGFyYW1zLCAuLi5uZXdQYXJhbXN9IDogbmV3UGFyYW1zKTtcbiAgICAgICAgICAgIGNvbnN0IHt1cmxQYXJhbXMsIHRyYW5zaWVudFBhcmFtc30gPSBNaWNyb2Zyb250ZW5kVmlld1JvdXRlcy5zcGxpdFBhcmFtcyhtZXJnZWRQYXJhbXMsIHZpZXdDYXBhYmlsaXR5KTtcblxuICAgICAgICAgICAgcmV0dXJuIGxheW91dC5uYXZpZ2F0ZVZpZXcodGhpcy52aWV3LmlkLCBbdXJsUGFyYW1zXSwge1xuICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZSxcbiAgICAgICAgICAgICAgc3RhdGU6IE9iamVjdHMud2l0aG91dFVuZGVmaW5lZEVudHJpZXMoe1xuICAgICAgICAgICAgICAgIFtNaWNyb2Zyb250ZW5kVmlld1JvdXRlcy5TVEFURV9UUkFOU0lFTlRfUEFSQU1TXTogdHJhbnNpZW50UGFyYW1zLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy5fbWVzc2FnZUNsaWVudC5wdWJsaXNoKHJlcGx5VG8sIHN1Y2Nlc3MsIHtoZWFkZXJzOiBuZXcgTWFwKCkuc2V0KE1lc3NhZ2VIZWFkZXJzLlN0YXR1cywgUmVzcG9uc2VTdGF0dXNDb2Rlcy5URVJNSU5BTCl9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9tZXNzYWdlQ2xpZW50LnB1Ymxpc2gocmVwbHlUbywgc3RyaW5naWZ5RXJyb3IoZXJyb3IpLCB7aGVhZGVyczogbmV3IE1hcCgpLnNldChNZXNzYWdlSGVhZGVycy5TdGF0dXMsIFJlc3BvbnNlU3RhdHVzQ29kZXMuRVJST1IpfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyB2aWV3LCBzdWNoIGFzIHRoZSB2aWV3IHRpdGxlLCBhcyBkZWZpbmVkIGJ5IHRoZSBjYXBhYmlsaXR5LlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRWaWV3UHJvcGVydGllcyh2aWV3Q2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHksIHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LnRpdGxlID0gTWljcm9mcm9udGVuZHMuc3Vic3RpdHV0ZU5hbWVkUGFyYW1ldGVycyh2aWV3Q2FwYWJpbGl0eS5wcm9wZXJ0aWVzLnRpdGxlLCBNYXBzLmNvZXJjZShwYXJhbXMpKSA/PyBudWxsO1xuICAgIHRoaXMudmlldy5oZWFkaW5nID0gTWljcm9mcm9udGVuZHMuc3Vic3RpdHV0ZU5hbWVkUGFyYW1ldGVycyh2aWV3Q2FwYWJpbGl0eS5wcm9wZXJ0aWVzLmhlYWRpbmcsIE1hcHMuY29lcmNlKHBhcmFtcykpID8/IG51bGw7XG4gICAgdGhpcy52aWV3LmNsYXNzTGlzdC5zZXQodmlld0NhcGFiaWxpdHkucHJvcGVydGllcy5jc3NDbGFzcywge3Njb3BlOiAnYXBwbGljYXRpb24nfSk7XG4gICAgdGhpcy52aWV3LmNsb3NhYmxlID0gdmlld0NhcGFiaWxpdHkucHJvcGVydGllcy5jbG9zYWJsZSA/PyB0cnVlO1xuICAgIHRoaXMudmlldy5kaXJ0eSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHBhcmFtcyBjb250YWluIHRoZSBnaXZlbiBjYXBhYmlsaXR5IGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ2FwYWJpbGl0eVBhcmFtKHZpZXdDYXBhYmlsaXR5SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZXdQYXJhbXMkID0gdGhpcy5fbWVzc2FnZUNsaWVudC5vYnNlcnZlJDxNYXA8c3RyaW5nLCBzdHJpbmc+PijJtVdvcmtiZW5jaENvbW1hbmRzLnZpZXdQYXJhbXNUb3BpYyh0aGlzLnZpZXcuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcFRvQm9keSgpLFxuICAgICAgICBmaXJzdChwYXJhbXMgPT4gcGFyYW1zLmdldCjJtU1pY3JvZnJvbnRlbmRSb3V0ZVBhcmFtcy7JtVZJRVdfQ0FQQUJJTElUWV9JRCkgPT09IHZpZXdDYXBhYmlsaXR5SWQpLFxuICAgICAgKTtcbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2aWV3UGFyYW1zJCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHVibGljIGFzeW5jIGNhbkNsb3NlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhbkNsb3NlVG9waWMgPSDJtVdvcmtiZW5jaENvbW1hbmRzLmNhbkNsb3NlVG9waWModGhpcy52aWV3LmlkKTtcbiAgICBjb25zdCBsZWdhY3lDYW5DbG9zZVRvcGljID0gybVXb3JrYmVuY2hDb21tYW5kcy52aWV3Q2xvc2luZ1RvcGljKHRoaXMudmlldy5pZCk7XG5cbiAgICAvLyBJbml0aWF0ZSBhIHJlcXVlc3QtcmVzcG9uc2UgY29tbXVuaWNhdGlvbiBvbmx5IGlmIHRoZSBlbWJlZGRlZCBtaWNyb2Zyb250ZW5kIGltcGxlbWVudHMgYENhbkNsb3NlYCBndWFyZC5cbiAgICBjb25zdCBoYXNDYW5DbG9zZUd1YXJkID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fbWVzc2FnZUNsaWVudC5zdWJzY3JpYmVyQ291bnQkKGNhbkNsb3NlVG9waWMpKSA+IDA7XG4gICAgY29uc3QgaGFzTGVnYWN5Q2FuQ2xvc2VHdWFyZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX21lc3NhZ2VDbGllbnQuc3Vic2NyaWJlckNvdW50JChsZWdhY3lDYW5DbG9zZVRvcGljKSkgPiAwO1xuICAgIGlmICghaGFzQ2FuQ2xvc2VHdWFyZCAmJiAhaGFzTGVnYWN5Q2FuQ2xvc2VHdWFyZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9tZXNzYWdlQ2xpZW50LnJlcXVlc3QkPGJvb2xlYW4+KGhhc0NhbkNsb3NlR3VhcmQgPyBjYW5DbG9zZVRvcGljIDogbGVnYWN5Q2FuQ2xvc2VUb3BpYykucGlwZShtYXBUb0JvZHkoKSksIHtkZWZhdWx0VmFsdWU6IHRydWV9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzV2l0aGluKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHtkZXRhaWw6IGZvY3VzV2l0aGlufSA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PGJvb2xlYW4+O1xuICAgIGlmIChmb2N1c1dpdGhpbikge1xuICAgICAgdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdzY2ktbWljcm9mcm9udGVuZC1mb2N1c2luJywge2J1YmJsZXM6IHRydWV9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwb24gc3Vic2NyaXB0aW9uLCBlbWl0cyB0aGUga2V5c3Ryb2tlcyByZWdpc3RlcmVkIHdpdGggbWVudSBpdGVtcyBvZiB0aGlzIHZpZXcncyBjb250ZXh0IG1lbnUsXG4gICAqIGFuZCB0aGVuIGNvbnRpbnVvdXNseSB3aGVuIHRoZXkgY2hhbmdlLiBUaGUgb2JzZXJ2YWJsZSBuZXZlciBjb21wbGV0ZXMuXG4gICAqL1xuICBwcml2YXRlIHZpZXdDb250ZXh0TWVudUtleXN0cm9rZXMkKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3Lm1lbnVJdGVtcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXJBcnJheShtZW51SXRlbSA9PiAhIW1lbnVJdGVtLmFjY2VsZXJhdG9yKSxcbiAgICAgICAgbWFwQXJyYXkobWVudUl0ZW0gPT4gbWVudUl0ZW0uYWNjZWxlcmF0b3IhLm1hcChhY2NlbGVyYXRvciA9PiB7XG4gICAgICAgICAgLy8gTm9ybWFsaXplIGtleXN0cm9rZXMgYWNjb3JkaW5nIHRvIGBTY2lSb3V0ZXJPdXRsZXRFbGVtZW50I2tleXN0cm9rZXNgXG4gICAgICAgICAgc3dpdGNoIChhY2NlbGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSAnY3RybCc6XG4gICAgICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgICAgcmV0dXJuICdkb3QnO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgIHJldHVybiAnc3BhY2UnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGFjY2VsZXJhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpLFxuICAgICAgICBtYXBBcnJheShhY2NlbGVyYXRvciA9PiBbJ2tleWRvd24nXS5jb25jYXQoYWNjZWxlcmF0b3IpLmpvaW4oJy4nKSksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHtAbGluayBpc1dvcmtiZW5jaERyYWd9IHByb3BlcnR5IHdoZW4gYSB3b3JrYmVuY2ggZHJhZyBvcGVyYXRpb24gaXMgZGV0ZWN0ZWQsXG4gICAqIHN1Y2ggYXMgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3IgbW92aW5nIGEgc2FzaC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFdvcmtiZW5jaERyYWdEZXRlY3RvcigpOiB2b2lkIHtcbiAgICB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmRyYWdnaW5nJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtiZW5jaERyYWcgPSAoZXZlbnQgPT09ICdzdGFydCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHByb3BhZ2F0ZVdvcmtiZW5jaFRoZW1lKCk6IHZvaWQge1xuICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9pbmplY3RvciwgKCkgPT4gTWljcm9mcm9udGVuZHMucHJvcGFnYXRlVGhlbWUodGhpcy5yb3V0ZXJPdXRsZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBJbnN0cnVjdCB0aGUgbWVzc2FnZSBicm9rZXIgdG8gZGVsZXRlIHJldGFpbmVkIG1lc3NhZ2VzIHRvIGZyZWUgcmVzb3VyY2VzLlxuICAgIHRoaXMuX21lc3NhZ2VDbGllbnQucHVibGlzaCjJtVdvcmtiZW5jaENvbW1hbmRzLnZpZXdBY3RpdmVUb3BpYyh0aGlzLnZpZXcuaWQpLCB1bmRlZmluZWQsIHtyZXRhaW46IHRydWV9KS50aGVuKCk7XG4gICAgdGhpcy5fbWVzc2FnZUNsaWVudC5wdWJsaXNoKMm1V29ya2JlbmNoQ29tbWFuZHMudmlld1BhcmFtc1RvcGljKHRoaXMudmlldy5pZCksIHVuZGVmaW5lZCwge3JldGFpbjogdHJ1ZX0pLnRoZW4oKTtcbiAgICB0aGlzLl9vdXRsZXRSb3V0ZXIubmF2aWdhdGUobnVsbCwge291dGxldDogdGhpcy52aWV3LmlkfSkudGhlbigpO1xuICAgIHRoaXMudmlldy51bnJlZ2lzdGVyQWRhcHRlcihNaWNyb2Zyb250ZW5kV29ya2JlbmNoVmlldyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCbG9ja3MgdGhlIG1pY3JvZnJvbnRlbmQgb3V0bGV0IHdoZW4gZGlhbG9nKHMpIG92ZXJsYXkgdGhpcyB2aWV3LlxuICovXG5mdW5jdGlvbiBjb25maWd1cmVNaWNyb2Zyb250ZW5kR2xhc3NQYW5lKCk6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlOiBHTEFTU19QQU5FX0JMT0NLQUJMRSxcbiAgICB1c2VFeGlzdGluZzogybVXb3JrYmVuY2hWaWV3LFxuICB9O1xufVxuIiwiPHdiLWNvbnRlbnQtYXMtb3ZlcmxheSBbb3ZlcmxheUhvc3RdPVwiaWZyYW1lSG9zdFJlZi5yZWYkIHwgYXN5bmNcIj5cbiAgPGRpdiBjbGFzcz1cIm1pY3JvZnJvbnRlbmQtdmlld1wiXG4gICAgICAgW2NsYXNzLndvcmtiZW5jaC1kcmFnXT1cImlzV29ya2JlbmNoRHJhZ1wiXG4gICAgICAgW2F0dHIuZGF0YS12aWV3aWRdPVwidmlldy5pZFwiXG4gICAgICAgd2JHbGFzc1BhbmU+XG4gICAgPHNjaS1yb3V0ZXItb3V0bGV0ICNyb3V0ZXJfb3V0bGV0XG4gICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInZpZXcuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNhcGFiaWxpdHlpZF09XCJjYXBhYmlsaXR5Py5tZXRhZGF0YSEuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFwcF09XCJjYXBhYmlsaXR5Py5tZXRhZGF0YSEuYXBwU3ltYm9saWNOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidmlldy5jbGFzc0xpc3QudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXN3aXRoaW4pPVwib25Gb2N1c1dpdGhpbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2tleXN0cm9rZXNdPVwia2V5c3Ryb2tlc1RvQnViYmxlJCB8IGFzeW5jXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cInNwbGFzaFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc2NpLXJvdXRlci1vdXRsZXQ+XG4gIDwvZGl2PlxuPC93Yi1jb250ZW50LWFzLW92ZXJsYXk+XG4iXX0=
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ /**
11
+ * Represents a view that displays a microfrontend.
12
+ *
13
+ * This type is registered as adapter in {@link ɵWorkbenchView}, allowing adaptation of views displaying a microfrontend.
14
+ *
15
+ * @see ɵWorkbenchView.adapt
16
+ */
17
+ export class MicrofrontendWorkbenchView {
18
+ constructor(capability, params) {
19
+ this.capability = capability;
20
+ this.params = params;
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9mcm9udGVuZC13b3JrYmVuY2gtdmlldy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL21pY3JvZnJvbnRlbmQtcGxhdGZvcm0vbWljcm9mcm9udGVuZC12aWV3L21pY3JvZnJvbnRlbmQtd29ya2JlbmNoLXZpZXcubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFLSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sMEJBQTBCO0lBRXJDLFlBQTRCLFVBQW1DLEVBQWtCLE1BQWM7UUFBbkUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFBa0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUMvRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7V29ya2JlbmNoVmlld0NhcGFiaWxpdHl9IGZyb20gJ0BzY2lvbi93b3JrYmVuY2gtY2xpZW50JztcbmltcG9ydCB7UGFyYW1zfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB2aWV3IHRoYXQgZGlzcGxheXMgYSBtaWNyb2Zyb250ZW5kLlxuICpcbiAqIFRoaXMgdHlwZSBpcyByZWdpc3RlcmVkIGFzIGFkYXB0ZXIgaW4ge0BsaW5rIMm1V29ya2JlbmNoVmlld30sIGFsbG93aW5nIGFkYXB0YXRpb24gb2Ygdmlld3MgZGlzcGxheWluZyBhIG1pY3JvZnJvbnRlbmQuXG4gKlxuICogQHNlZSDJtVdvcmtiZW5jaFZpZXcuYWRhcHRcbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3JvZnJvbnRlbmRXb3JrYmVuY2hWaWV3IHtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY2FwYWJpbGl0eTogV29ya2JlbmNoVmlld0NhcGFiaWxpdHksIHB1YmxpYyByZWFkb25seSBwYXJhbXM6IFBhcmFtcykge1xuICB9XG59XG4iXX0=