@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
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2018-2022 Swiss Federal Railways
2
+ * Copyright (c) 2018-2024 Swiss Federal Railways
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -15,38 +15,38 @@ import { ɵWorkbenchPart } from '../part/ɵworkbench-part.model';
15
15
  import { ɵWorkbenchView } from '../view/ɵworkbench-view.model';
16
16
  import { ViewComponent } from '../view/view.component';
17
17
  import { LoggerNames } from '../logging';
18
- import { WorkbenchRouteData } from './workbench-route-data';
19
18
  import { WorkbenchNavigationalStates } from './workbench-navigational-states';
20
19
  import { MainAreaLayoutComponent } from '../layout/main-area-layout/main-area-layout.component';
21
20
  import { PartComponent } from '../part/part.component';
22
21
  import { MAIN_AREA } from '../layout/workbench-layout';
23
- import { canDeactivateWorkbenchView } from '../view/workbench-view-pre-destroy.guard';
24
- import { resolveNavigationalViewState } from './navigation-state.resolver';
25
22
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
23
+ import { RouterUtils } from './router.util';
24
+ import { canMatchNotFoundPage } from '../view/workbench-view-route-guards';
26
25
  import * as i0 from "@angular/core";
27
26
  import * as i1 from "@angular/router";
28
27
  import * as i2 from "./workbench-auxiliary-routes-registrator.service";
29
28
  import * as i3 from "../view/workbench-view.registry";
30
29
  import * as i4 from "../part/workbench-part.registry";
31
30
  import * as i5 from "../layout/workbench-layout.service";
32
- import * as i6 from "./workbench-router.service";
31
+ import * as i6 from "./\u0275workbench-router.service";
33
32
  import * as i7 from "../layout/\u0275workbench-layout.factory";
34
33
  import * as i8 from "./workbench-layout-differ";
35
34
  import * as i9 from "./workbench-popup-differ";
36
- import * as i10 from "../logging";
35
+ import * as i10 from "./workbench-dialog-differ";
36
+ import * as i11 from "../logging";
37
37
  /**
38
38
  * Tracks the browser URL for workbench layout changes.
39
39
  *
40
- * - For each added view, constructs a {@link WorkbenchView} and registers view specific auxiliary routes of all primary routes
40
+ * - For each added view, constructs a {@link WorkbenchView} and registers view specific auxiliary routes of all top-level routes
41
41
  * - For each removed view, destroys {@link WorkbenchView} and unregisters its auxiliary routes
42
42
  * - For each added part, constructs a {@link WorkbenchPart}
43
43
  * - For each removed part, destroys {@link WorkbenchPart}
44
44
  * - Parses the serialized layout and injects it into {@link WorkbenchLayoutService}.
45
45
  */
46
46
  export class WorkbenchUrlObserver {
47
- constructor(_router, _auxRoutesRegistrator, _viewRegistry, _partRegistry, _workbenchLayoutService, _environmentInjector, _workbenchRouter, _workbenchLayoutFactory, _workbenchLayoutDiffer, _workbenchPopupDiffer, _logger) {
47
+ constructor(_router, _auxiliaryRoutesRegistrator, _viewRegistry, _partRegistry, _workbenchLayoutService, _environmentInjector, _workbenchRouter, _workbenchLayoutFactory, _workbenchLayoutDiffer, _workbenchPopupDiffer, _workbenchDialogDiffer, _logger) {
48
48
  this._router = _router;
49
- this._auxRoutesRegistrator = _auxRoutesRegistrator;
49
+ this._auxiliaryRoutesRegistrator = _auxiliaryRoutesRegistrator;
50
50
  this._viewRegistry = _viewRegistry;
51
51
  this._partRegistry = _partRegistry;
52
52
  this._workbenchLayoutService = _workbenchLayoutService;
@@ -55,16 +55,18 @@ export class WorkbenchUrlObserver {
55
55
  this._workbenchLayoutFactory = _workbenchLayoutFactory;
56
56
  this._workbenchLayoutDiffer = _workbenchLayoutDiffer;
57
57
  this._workbenchPopupDiffer = _workbenchPopupDiffer;
58
+ this._workbenchDialogDiffer = _workbenchDialogDiffer;
58
59
  this._logger = _logger;
59
60
  this.installRouterEventListeners();
60
61
  }
61
62
  /** Invoked at the beginning of each navigation */
62
63
  onNavigationStart(event) {
63
64
  const context = this.createWorkbenchNavigationContext(event.url);
64
- this._logger.debug(() => 'onNavigationStart', LoggerNames.ROUTING, event, `NavigationContext [parts=${context.layout.parts().map(part => part.id)}, layoutDiff=${context.layoutDiff.toString()}, popupDiff=${context.popupDiff.toString()}]`);
65
+ this._logger.debug(() => 'onNavigationStart', LoggerNames.ROUTING, event, `NavigationContext [parts=${context.layout.parts().map(part => part.id)}, layoutDiff=${context.layoutDiff.toString()}, popupDiff=${context.popupDiff.toString()}, dialogDiff=${context.dialogDiff.toString()}]`);
65
66
  this._workbenchRouter.setCurrentNavigationContext(context);
66
67
  this.registerAddedViewAuxiliaryRoutes();
67
68
  this.registerAddedPopupAuxiliaryRoutes();
69
+ this.registerAddedDialogAuxiliaryRoutes();
68
70
  }
69
71
  /** Invoked upon successful navigation */
70
72
  onNavigationEnd(event) {
@@ -81,6 +83,7 @@ export class WorkbenchUrlObserver {
81
83
  this.undoAuxiliaryRoutesRegistration();
82
84
  this.undoWorkbenchLayoutDiffer();
83
85
  this.undoWorkbenchPopupDiffer();
86
+ this.undoWorkbenchDialogDiffer();
84
87
  this._workbenchRouter.setCurrentNavigationContext(null);
85
88
  }
86
89
  /** Invoked when the navigation failed */
@@ -89,6 +92,7 @@ export class WorkbenchUrlObserver {
89
92
  this.undoAuxiliaryRoutesRegistration();
90
93
  this.undoWorkbenchLayoutDiffer();
91
94
  this.undoWorkbenchPopupDiffer();
95
+ this.undoWorkbenchDialogDiffer();
92
96
  this._workbenchRouter.setCurrentNavigationContext(null);
93
97
  }
94
98
  /** Invoked after checked guards for activation */
@@ -104,9 +108,9 @@ export class WorkbenchUrlObserver {
104
108
  const layout = this._workbenchLayoutFactory.create({
105
109
  mainAreaGrid: (() => {
106
110
  // Read the main area grid from the query parameter.
107
- const mainAreaLayout = urlTree.queryParamMap.get(MAIN_AREA_LAYOUT_QUERY_PARAM) ?? urlTree.queryParamMap.get('parts'); // TODO [Angular 18] Remove fallback to 'parts' query parameter
108
- if (mainAreaLayout) {
109
- return mainAreaLayout;
111
+ const mainAreaGrid = urlTree.queryParamMap.get(MAIN_AREA_LAYOUT_QUERY_PARAM) ?? urlTree.queryParamMap.get('parts'); // TODO [Angular 18] Remove fallback to 'parts' query parameter
112
+ if (mainAreaGrid) {
113
+ return mainAreaGrid;
110
114
  }
111
115
  // Do not fall back to the current layout if the navigation was performed via the Workbench Router.
112
116
  const isWorkbenchRouterNavigation = workbenchNavigationalState !== null;
@@ -123,36 +127,49 @@ export class WorkbenchUrlObserver {
123
127
  })(),
124
128
  workbenchGrid: workbenchNavigationalState?.workbenchGrid ?? this._workbenchLayoutService.layout?.workbenchGrid,
125
129
  maximized: workbenchNavigationalState?.maximized ?? this._workbenchLayoutService.layout?.maximized,
130
+ viewStates: workbenchNavigationalState?.viewStates ?? this._workbenchLayoutService.layout?.viewStates(),
131
+ viewOutlets: Object.fromEntries(RouterUtils.parseViewOutlets(urlTree)),
126
132
  });
127
133
  return {
128
134
  layout,
129
135
  layoutDiff: this._workbenchLayoutDiffer.diff(layout, urlTree),
130
136
  popupDiff: this._workbenchPopupDiffer.diff(urlTree),
137
+ dialogDiff: this._workbenchDialogDiffer.diff(urlTree),
131
138
  };
132
139
  }
133
140
  /**
134
- * For each added view, registers auxiliary routes of all primary routes.
141
+ * For each added view, registers auxiliary routes of all top-level routes.
135
142
  */
136
143
  registerAddedViewAuxiliaryRoutes() {
137
144
  const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
138
- const addedViewOutlets = navigationContext.layoutDiff.addedViewOutlets;
139
- const newAuxiliaryRoutes = this._auxRoutesRegistrator.registerOutletAuxiliaryRoutes(addedViewOutlets, {
140
- canDeactivate: [canDeactivateWorkbenchView],
141
- resolve: { [WorkbenchRouteData.state]: resolveNavigationalViewState },
145
+ const addedViews = navigationContext.layoutDiff.addedViews;
146
+ const registeredRoutes = this._auxiliaryRoutesRegistrator.registerAuxiliaryRoutes(addedViews, {
147
+ canMatchNotFoundPage: [canMatchNotFoundPage],
142
148
  });
143
- if (newAuxiliaryRoutes.length) {
144
- this._logger.debug(() => `Registered auxiliary routes for views: ${addedViewOutlets}`, LoggerNames.ROUTING, newAuxiliaryRoutes);
149
+ if (registeredRoutes.length) {
150
+ this._logger.debug(() => `Registered auxiliary routes for views: ${addedViews}`, LoggerNames.ROUTING, registeredRoutes);
145
151
  }
146
152
  }
147
153
  /**
148
- * For each added popup, registers auxiliary routes of all primary routes.
154
+ * For each added popup, registers auxiliary routes of all top-level routes.
149
155
  */
150
156
  registerAddedPopupAuxiliaryRoutes() {
151
157
  const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
152
158
  const addedPopupOutlets = navigationContext.popupDiff.addedPopupOutlets;
153
- const newAuxiliaryRoutes = this._auxRoutesRegistrator.registerOutletAuxiliaryRoutes(addedPopupOutlets);
159
+ const registeredRoutes = this._auxiliaryRoutesRegistrator.registerAuxiliaryRoutes(addedPopupOutlets);
160
+ if (registeredRoutes.length) {
161
+ this._logger.debug(() => `Registered auxiliary routes for popups: ${addedPopupOutlets}`, LoggerNames.ROUTING, registeredRoutes);
162
+ }
163
+ }
164
+ /**
165
+ * For each added dialog, registers auxiliary routes of all top-level routes.
166
+ */
167
+ registerAddedDialogAuxiliaryRoutes() {
168
+ const navigationContext = this._workbenchRouter.getCurrentNavigationContext();
169
+ const addedDialogOutlets = navigationContext.dialogDiff.addedDialogOutlets;
170
+ const newAuxiliaryRoutes = this._auxiliaryRoutesRegistrator.registerAuxiliaryRoutes(addedDialogOutlets);
154
171
  if (newAuxiliaryRoutes.length) {
155
- this._logger.debug(() => `Registered auxiliary routes for popups: ${addedPopupOutlets}`, LoggerNames.ROUTING, newAuxiliaryRoutes);
172
+ this._logger.debug(() => `Registered auxiliary routes for dialogs: ${addedDialogOutlets}`, LoggerNames.ROUTING, newAuxiliaryRoutes);
156
173
  }
157
174
  }
158
175
  /**
@@ -174,6 +191,15 @@ export class WorkbenchUrlObserver {
174
191
  const prevNavigateUrl = this._router.parseUrl(this._router.url); // Browser URL is only updated after successful navigation
175
192
  this._workbenchPopupDiffer.diff(prevNavigateUrl);
176
193
  }
194
+ /**
195
+ * Reverts the dialog outlet differ to the state before the navigation.
196
+ *
197
+ * Invoke this method after navigation failure or cancellation. The navigation is cancelled when guards perform a redirect or reject navigation.
198
+ */
199
+ undoWorkbenchDialogDiffer() {
200
+ const prevNavigateUrl = this._router.parseUrl(this._router.url); // Browser URL is only updated after successful navigation
201
+ this._workbenchDialogDiffer.diff(prevNavigateUrl);
202
+ }
177
203
  /**
178
204
  * Undoes the registration of auxiliary routes.
179
205
  *
@@ -182,9 +208,10 @@ export class WorkbenchUrlObserver {
182
208
  undoAuxiliaryRoutesRegistration() {
183
209
  const layoutDiff = this._workbenchRouter.getCurrentNavigationContext().layoutDiff;
184
210
  const popupDiff = this._workbenchRouter.getCurrentNavigationContext().popupDiff;
185
- const addedOutlets = [...layoutDiff.addedViewOutlets, ...popupDiff.addedPopupOutlets];
211
+ const dialogDiff = this._workbenchRouter.getCurrentNavigationContext().dialogDiff;
212
+ const addedOutlets = [...layoutDiff.addedViews, ...popupDiff.addedPopupOutlets, ...dialogDiff.addedDialogOutlets];
186
213
  if (addedOutlets.length) {
187
- this._auxRoutesRegistrator.unregisterOutletAuxiliaryRoutes(addedOutlets);
214
+ this._auxiliaryRoutesRegistrator.unregisterAuxiliaryRoutes(addedOutlets);
188
215
  this._logger.debug(() => `Undo auxiliary routes registration for outlet(s): ${addedOutlets}`, LoggerNames.ROUTING);
189
216
  }
190
217
  }
@@ -196,8 +223,8 @@ export class WorkbenchUrlObserver {
196
223
  if (layout !== this._workbenchLayoutService.layout) { // Layout instance does not change if navigating through the Angular router.
197
224
  this.updateViewRegistry();
198
225
  this.updatePartRegistry();
199
- this._viewRegistry.views.forEach(view => view.onLayoutChange(layout));
200
- this._partRegistry.parts.forEach(part => part.onLayoutChange(layout));
226
+ layout.views().forEach(view => this._viewRegistry.get(view.id).onLayoutChange(layout));
227
+ layout.parts().forEach(part => this._partRegistry.get(part.id).onLayoutChange(layout));
201
228
  }
202
229
  }
203
230
  /**
@@ -205,7 +232,8 @@ export class WorkbenchUrlObserver {
205
232
  */
206
233
  publishWorkbenchLayout() {
207
234
  const { layout } = this._workbenchRouter.getCurrentNavigationContext();
208
- if (layout !== this._workbenchLayoutService.layout) { // Layout instance does not change if navigating through the Angular router.
235
+ if (layout !== this._workbenchLayoutService.layout) {
236
+ // Layout instance only changes when navigating via the workbench router, but not via the Angular router, e.g., when not navigating views.
209
237
  this._logger.debug(() => 'Publishing workbench layout', LoggerNames.ROUTING, layout);
210
238
  this._workbenchLayoutService.setLayout(layout);
211
239
  }
@@ -217,7 +245,7 @@ export class WorkbenchUrlObserver {
217
245
  const layout = this._workbenchRouter.getCurrentNavigationContext().layout;
218
246
  if (layout.mainAreaGrid?.migrated) {
219
247
  // Update the URL with the migrated URL and clear existing query params, for example, if the layout query parameter has been renamed.
220
- this._workbenchRouternavigate(layout => layout, { queryParamsHandling: null, replaceUrl: true }).then();
248
+ this._workbenchRouter.navigate(layout => layout, { queryParamsHandling: null, replaceUrl: true }).then();
221
249
  }
222
250
  }
223
251
  /**
@@ -226,10 +254,11 @@ export class WorkbenchUrlObserver {
226
254
  unregisterRemovedOutletAuxiliaryRoutes() {
227
255
  const layoutDiff = this._workbenchRouter.getCurrentNavigationContext().layoutDiff;
228
256
  const popupDiff = this._workbenchRouter.getCurrentNavigationContext().popupDiff;
229
- const removedOutlets = [...layoutDiff.removedViewOutlets, ...popupDiff.removedPopupOutlets];
257
+ const dialogDiff = this._workbenchRouter.getCurrentNavigationContext().dialogDiff;
258
+ const removedOutlets = [...layoutDiff.removedViews, ...popupDiff.removedPopupOutlets, ...dialogDiff.removedDialogOutlets];
230
259
  if (removedOutlets.length) {
231
260
  this._logger.debug(() => 'Unregistering outlet auxiliary routes: ', LoggerNames.ROUTING, removedOutlets);
232
- this._auxRoutesRegistrator.unregisterOutletAuxiliaryRoutes(removedOutlets);
261
+ this._auxiliaryRoutesRegistrator.unregisterAuxiliaryRoutes(removedOutlets);
233
262
  }
234
263
  }
235
264
  /**
@@ -291,11 +320,11 @@ export class WorkbenchUrlObserver {
291
320
  }
292
321
  });
293
322
  }
294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchUrlObserver, deps: [{ token: i1.Router }, { token: i2.WorkbenchAuxiliaryRoutesRegistrator }, { token: i3.WorkbenchViewRegistry }, { token: i4.WorkbenchPartRegistry }, { token: i5.WorkbenchLayoutService }, { token: i0.EnvironmentInjector }, { token: i6.WorkbenchRouter }, { token: i7.ɵWorkbenchLayoutFactory }, { token: i8.WorkbenchLayoutDiffer }, { token: i9.WorkbenchPopupDiffer }, { token: i10.Logger }], target: i0.ɵɵFactoryTarget.Injectable }); }
295
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchUrlObserver, providedIn: 'root' }); }
323
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchUrlObserver, deps: [{ token: i1.Router }, { token: i2.WorkbenchAuxiliaryRoutesRegistrator }, { token: i3.WorkbenchViewRegistry }, { token: i4.WorkbenchPartRegistry }, { token: i5.WorkbenchLayoutService }, { token: i0.EnvironmentInjector }, { token: i6WorkbenchRouter }, { token: i7.ɵWorkbenchLayoutFactory }, { token: i8.WorkbenchLayoutDiffer }, { token: i9.WorkbenchPopupDiffer }, { token: i10.WorkbenchDialogDiffer }, { token: i11.Logger }], target: i0.ɵɵFactoryTarget.Injectable }); }
324
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchUrlObserver, providedIn: 'root' }); }
296
325
  }
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchUrlObserver, decorators: [{
326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchUrlObserver, decorators: [{
298
327
  type: Injectable,
299
328
  args: [{ providedIn: 'root' }]
300
- }], ctorParameters: () => [{ type: i1.Router }, { type: i2.WorkbenchAuxiliaryRoutesRegistrator }, { type: i3.WorkbenchViewRegistry }, { type: i4.WorkbenchPartRegistry }, { type: i5.WorkbenchLayoutService }, { type: i0.EnvironmentInjector }, { type: i6.WorkbenchRouter }, { type: i7.ɵWorkbenchLayoutFactory }, { type: i8.WorkbenchLayoutDiffer }, { type: i9.WorkbenchPopupDiffer }, { type: i10.Logger }] });
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXVybC1vYnNlcnZlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtdXJsLW9ic2VydmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0VBUUU7QUFFRixPQUFPLEVBQVEsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlJLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQXNCLFVBQVUsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUlwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUlyRCxPQUFPLEVBQVMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQzlGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FB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RyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTthQUNoQixJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsS0FBMEIsRUFBd0IsRUFBRSxDQUFDLEtBQUssWUFBWSxXQUFXLENBQUMsRUFDMUYsa0JBQWtCLEVBQUUsQ0FDckI7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUU7WUFDaEMsSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7aUJBQ0ksSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdCO2lCQUNJLElBQUksS0FBSyxZQUFZLGdCQUFnQixFQUFFO2dCQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEM7aUJBQ0ksSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7aUJBQ0ksSUFBSSxLQUFLLFlBQVksY0FBYyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBdlJVLG9CQUFvQjtrSEFBcEIsb0JBQW9CLGNBRFIsTUFBTTs7MkZBQ2xCLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4qXG4qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4qXG4qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4qL1xuXG5pbXBvcnQge0V2ZW50LCBHdWFyZHNDaGVja0VuZCwgTmF2aWdhdGlvbkNhbmNlbCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciwgUm91dGVyRXZlbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFbnZpcm9ubWVudEluamVjdG9yLCBJbmplY3RhYmxlLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXb3JrYmVuY2hBdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvcn0gZnJvbSAnLi93b3JrYmVuY2gtYXV4aWxpYXJ5LXJvdXRlcy1yZWdpc3RyYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7TUFJTl9BUkVBX0xBWU9VVF9RVUVSWV9QQVJBTX0gZnJvbSAnLi4vd29ya2JlbmNoLmNvbnN0YW50cyc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdSZWdpc3RyeX0gZnJvbSAnLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge1dvcmtiZW5jaFBhcnRSZWdpc3RyeX0gZnJvbSAnLi4vcGFydC93b3JrYmVuY2gtcGFydC5yZWdpc3RyeSc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFBhcnR9IGZyb20gJy4uL3BhcnQvybV3b3JrYmVuY2gtcGFydC5tb2RlbCc7XG5pbXBvcnQge8m1V29ya2JlbmNoVmlld30gZnJvbSAnLi4vdmlldy/JtXdvcmtiZW5jaC12aWV3Lm1vZGVsJztcbmltcG9ydCB7Vmlld0NvbXBvbmVudH0gZnJvbSAnLi4vdmlldy92aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0LCBXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4vd29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0RGlmZmVyfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQtZGlmZmVyJztcbmltcG9ydCB7V29ya2JlbmNoUG9wdXBEaWZmZXJ9IGZyb20gJy4vd29ya2JlbmNoLXBvcHVwLWRpZmZlcic7XG5pbXBvcnQge0xvZ2dlciwgTG9nZ2VyTmFtZXN9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHtXb3JrYmVuY2hSb3V0ZURhdGF9IGZyb20gJy4vd29ya2JlbmNoLXJvdXRlLWRhdGEnO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuaW1wb3J0IHtNYWluQXJlYUxheW91dENvbXBvbmVudH0gZnJvbSAnLi4vbGF5b3V0L21haW4tYXJlYS1sYXlvdXQvbWFpbi1hcmVhLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHtQYXJ0Q29tcG9uZW50fSBmcm9tICcuLi9wYXJ0L3BhcnQuY29tcG9uZW50JztcbmltcG9ydCB7TUFJTl9BUkVBfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dCc7XG5pbXBvcnQge2NhbkRlYWN0aXZhdGVXb3JrYmVuY2hWaWV3fSBmcm9tICcuLi92aWV3L3dvcmtiZW5jaC12aWV3LXByZS1kZXN0cm95Lmd1YXJkJztcbmltcG9ydCB7cmVzb2x2ZU5hdmlnYXRpb25hbFZpZXdTdGF0ZX0gZnJvbSAnLi9uYXZpZ2F0aW9uLXN0YXRlLnJlc29sdmVyJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0RmFjdG9yeX0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC5mYWN0b3J5JztcblxuLyoqXG4gKiBUcmFja3MgdGhlIGJyb3dzZXIgVVJMIGZvciB3b3JrYmVuY2ggbGF5b3V0IGNoYW5nZXMuXG4gKlxuICogLSBGb3IgZWFjaCBhZGRlZCB2aWV3LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFZpZXd9IGFuZCByZWdpc3RlcnMgdmlldyBzcGVjaWZpYyBhdXhpbGlhcnkgcm91dGVzIG9mIGFsbCBwcmltYXJ5IHJvdXRlc1xuICogLSBGb3IgZWFjaCByZW1vdmVkIHZpZXcsIGRlc3Ryb3lzIHtAbGluayBXb3JrYmVuY2hWaWV3fSBhbmQgdW5yZWdpc3RlcnMgaXRzIGF1eGlsaWFyeSByb3V0ZXNcbiAqIC0gRm9yIGVhY2ggYWRkZWQgcGFydCwgY29uc3RydWN0cyBhIHtAbGluayBXb3JrYmVuY2hQYXJ0fVxuICogLSBGb3IgZWFjaCByZW1vdmVkIHBhcnQsIGRlc3Ryb3lzIHtAbGluayBXb3JrYmVuY2hQYXJ0fVxuICogLSBQYXJzZXMgdGhlIHNlcmlhbGl6ZWQgbGF5b3V0IGFuZCBpbmplY3RzIGl0IGludG8ge0BsaW5rIFdvcmtiZW5jaExheW91dFNlcnZpY2V9LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBXb3JrYmVuY2hVcmxPYnNlcnZlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2F1eFJvdXRlc1JlZ2lzdHJhdG9yOiBXb3JrYmVuY2hBdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdmlld1JlZ2lzdHJ5OiBXb3JrYmVuY2hWaWV3UmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgX3BhcnRSZWdpc3RyeTogV29ya2JlbmNoUGFydFJlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlOiBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hSb3V0ZXI6IFdvcmtiZW5jaFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0RmFjdG9yeTogybVXb3JrYmVuY2hMYXlvdXRGYWN0b3J5LFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXREaWZmZXI6IFdvcmtiZW5jaExheW91dERpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoUG9wdXBEaWZmZXI6IFdvcmtiZW5jaFBvcHVwRGlmZmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMuaW5zdGFsbFJvdXRlckV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKiogSW52b2tlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbmF2aWdhdGlvbiAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dChldmVudC51cmwpO1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uU3RhcnQnLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBldmVudCwgYE5hdmlnYXRpb25Db250ZXh0IFtwYXJ0cz0ke2NvbnRleHQubGF5b3V0LnBhcnRzKCkubWFwKHBhcnQgPT4gcGFydC5pZCl9LCBsYXlvdXREaWZmPSR7Y29udGV4dC5sYXlvdXREaWZmLnRvU3RyaW5nKCl9LCBwb3B1cERpZmY9JHtjb250ZXh0LnBvcHVwRGlmZi50b1N0cmluZygpfV1gKTtcbiAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KGNvbnRleHQpO1xuICAgIHRoaXMucmVnaXN0ZXJBZGRlZFZpZXdBdXhpbGlhcnlSb3V0ZXMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyQWRkZWRQb3B1cEF1eGlsaWFyeVJvdXRlcygpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgdXBvbiBzdWNjZXNzZnVsIG5hdmlnYXRpb24gKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkVuZCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50KTtcbiAgICB0aGlzLnVucmVnaXN0ZXJSZW1vdmVkT3V0bGV0QXV4aWxpYXJ5Um91dGVzKCk7XG4gICAgdGhpcy5hcHBseVdvcmtiZW5jaExheW91dENoYW5nZXMoKTtcbiAgICB0aGlzLnB1Ymxpc2hXb3JrYmVuY2hMYXlvdXQoKTtcbiAgICB0aGlzLm1pZ3JhdGVVUkwoKTtcbiAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KG51bGwpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgd2hlbiBjYW5jZWxsZWQgdGhlIG5hdmlnYXRpb24sIGUuZy4sIGluIGEgZ3VhcmQgKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkNhbmNlbCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50KTtcbiAgICB0aGlzLnVuZG9BdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRpb24oKTtcbiAgICB0aGlzLnVuZG9Xb3JrYmVuY2hMYXlvdXREaWZmZXIoKTtcbiAgICB0aGlzLnVuZG9Xb3JrYmVuY2hQb3B1cERpZmZlcigpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGZhaWxlZCAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvbkVycm9yJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMudW5kb0F1eGlsaWFyeVJvdXRlc1JlZ2lzdHJhdGlvbigpO1xuICAgIHRoaXMudW5kb1dvcmtiZW5jaExheW91dERpZmZlcigpO1xuICAgIHRoaXMudW5kb1dvcmtiZW5jaFBvcHVwRGlmZmVyKCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLnNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChudWxsKTtcbiAgfVxuXG4gIC8qKiBJbnZva2VkIGFmdGVyIGNoZWNrZWQgZ3VhcmRzIGZvciBhY3RpdmF0aW9uICovXG4gIHByaXZhdGUgb25HdWFyZHNDaGVja0VuZChldmVudDogR3VhcmRzQ2hlY2tFbmQpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYG9uR3VhcmRzQ2hlY2tFbmQgW3Nob3VsZEFjdGl2YXRlPSR7ZXZlbnQuc2hvdWxkQWN0aXZhdGV9XWAsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IG5hdmlnYXRpb24uIFRoZSBjb250ZXh0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmV3IGxheW91dCBhbmQgaG93IGl0IGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBsYXlvdXQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0KHVybDogc3RyaW5nKTogV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9yb3V0ZXIucGFyc2VVcmwodXJsKTtcbiAgICBjb25zdCB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZSA9IFdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlcy5mcm9tTmF2aWdhdGlvbih0aGlzLl9yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSEpO1xuXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoTGF5b3V0RmFjdG9yeS5jcmVhdGUoe1xuICAgICAgbWFpbkFyZWFHcmlkOiAoKCkgPT4ge1xuICAgICAgICAvLyBSZWFkIHRoZSBtYWluIGFyZWEgZ3JpZCBmcm9tIHRoZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAgICAgIGNvbnN0IG1haW5BcmVhTGF5b3V0ID0gdXJsVHJlZS5xdWVyeVBhcmFtTWFwLmdldChNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNKSA/PyB1cmxUcmVlLnF1ZXJ5UGFyYW1NYXAuZ2V0KCdwYXJ0cycpOyAvLyBUT0RPIFtBbmd1bGFyIDE4XSBSZW1vdmUgZmFsbGJhY2sgdG8gJ3BhcnRzJyBxdWVyeSBwYXJhbWV0ZXJcbiAgICAgICAgaWYgKG1haW5BcmVhTGF5b3V0KSB7XG4gICAgICAgICAgcmV0dXJuIG1haW5BcmVhTGF5b3V0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG8gbm90IGZhbGwgYmFjayB0byB0aGUgY3VycmVudCBsYXlvdXQgaWYgdGhlIG5hdmlnYXRpb24gd2FzIHBlcmZvcm1lZCB2aWEgdGhlIFdvcmtiZW5jaCBSb3V0ZXIuXG4gICAgICAgIGNvbnN0IGlzV29ya2JlbmNoUm91dGVyTmF2aWdhdGlvbiA9IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlICE9PSBudWxsO1xuICAgICAgICBpZiAoaXNXb3JrYmVuY2hSb3V0ZXJOYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyBub3QgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCBpZiB0aGUgbmF2aWdhdGlvbiB3YXMgdHJpZ2dlcmVkIGZyb20gb3V0c2lkZSB0aGUgQW5ndWxhciBSb3V0ZXIsIGkuZS4sIHRoZSBicm93c2VyIGJhY2svZm9yd2FyZCBidXR0b25zLlxuICAgICAgICBjb25zdCBpc0V4dGVybmFsTmF2aWdhdGlvbiA9IHRoaXMuX3JvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpIS50cmlnZ2VyID09PSAncG9wc3RhdGUnO1xuICAgICAgICBpZiAoaXNFeHRlcm5hbE5hdmlnYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBsYXlvdXQgaWYgdGhlIG5hdmlnYXRpb24gd2FzIHBlcmZvcm1lZCB2aWEgdGhlIEFuZ3VsYXIgcm91dGVyLCBpLmUuLCB0aGUgbmF2aWdhdG9yIGRpZCBub3QgcHJlc2VydmUgdGhlIHF1ZXJ5IHBhcmFtcy5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2UubGF5b3V0Py5tYWluQXJlYUdyaWQ7XG4gICAgICB9KSgpLFxuICAgICAgd29ya2JlbmNoR3JpZDogd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGU/LndvcmtiZW5jaEdyaWQgPz8gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQ/LndvcmtiZW5jaEdyaWQsXG4gICAgICBtYXhpbWl6ZWQ6IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlPy5tYXhpbWl6ZWQgPz8gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQ/Lm1heGltaXplZCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF5b3V0LFxuICAgICAgbGF5b3V0RGlmZjogdGhpcy5fd29ya2JlbmNoTGF5b3V0RGlmZmVyLmRpZmYobGF5b3V0LCB1cmxUcmVlKSxcbiAgICAgIHBvcHVwRGlmZjogdGhpcy5fd29ya2JlbmNoUG9wdXBEaWZmZXIuZGlmZih1cmxUcmVlKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIGFkZGVkIHZpZXcsIHJlZ2lzdGVycyBhdXhpbGlhcnkgcm91dGVzIG9mIGFsbCBwcmltYXJ5IHJvdXRlcy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJBZGRlZFZpZXdBdXhpbGlhcnlSb3V0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbkNvbnRleHQgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG4gICAgY29uc3QgYWRkZWRWaWV3T3V0bGV0cyA9IG5hdmlnYXRpb25Db250ZXh0LmxheW91dERpZmYuYWRkZWRWaWV3T3V0bGV0cztcblxuICAgIGNvbnN0IG5ld0F1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eFJvdXRlc1JlZ2lzdHJhdG9yLnJlZ2lzdGVyT3V0bGV0QXV4aWxpYXJ5Um91dGVzKGFkZGVkVmlld091dGxldHMsIHtcbiAgICAgIGNhbkRlYWN0aXZhdGU6IFtjYW5EZWFjdGl2YXRlV29ya2JlbmNoVmlld10sXG4gICAgICByZXNvbHZlOiB7W1dvcmtiZW5jaFJvdXRlRGF0YS5zdGF0ZV06IHJlc29sdmVOYXZpZ2F0aW9uYWxWaWV3U3RhdGV9LFxuICAgIH0pO1xuICAgIGlmIChuZXdBdXhpbGlhcnlSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYFJlZ2lzdGVyZWQgYXV4aWxpYXJ5IHJvdXRlcyBmb3Igdmlld3M6ICR7YWRkZWRWaWV3T3V0bGV0c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBuZXdBdXhpbGlhcnlSb3V0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBhZGRlZCBwb3B1cCwgcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHByaW1hcnkgcm91dGVzLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQWRkZWRQb3B1cEF1eGlsaWFyeVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ29udGV4dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBhZGRlZFBvcHVwT3V0bGV0cyA9IG5hdmlnYXRpb25Db250ZXh0LnBvcHVwRGlmZi5hZGRlZFBvcHVwT3V0bGV0cztcblxuICAgIGNvbnN0IG5ld0F1eGlsaWFyeVJvdXRlcyA9IHRoaXMuX2F1eFJvdXRlc1JlZ2lzdHJhdG9yLnJlZ2lzdGVyT3V0bGV0QXV4aWxpYXJ5Um91dGVzKGFkZGVkUG9wdXBPdXRsZXRzKTtcbiAgICBpZiAobmV3QXV4aWxpYXJ5Um91dGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBSZWdpc3RlcmVkIGF1eGlsaWFyeSByb3V0ZXMgZm9yIHBvcHVwczogJHthZGRlZFBvcHVwT3V0bGV0c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBuZXdBdXhpbGlhcnlSb3V0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIHRoZSB3b3JrYmVuY2ggbGF5b3V0IGRpZmZlciB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBJbnZva2UgdGhpcyBtZXRob2QgYWZ0ZXIgbmF2aWdhdGlvbiBmYWlsdXJlIG9yIGNhbmNlbGxhdGlvbi4gVGhlIG5hdmlnYXRpb24gaXMgY2FuY2VsbGVkIHdoZW4gZ3VhcmRzIHBlcmZvcm0gYSByZWRpcmVjdCBvciByZWplY3QgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgdW5kb1dvcmtiZW5jaExheW91dERpZmZlcigpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2TmF2aWdhdGVMYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dDsgLy8gTGF5b3V0IGluIGBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlYCBpcyBvbmx5IHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBuYXZpZ2F0aW9uXG4gICAgY29uc3QgcHJldk5hdmlnYXRlVXJsID0gdGhpcy5fcm91dGVyLnBhcnNlVXJsKHRoaXMuX3JvdXRlci51cmwpOyAvLyBCcm93c2VyIFVSTCBpcyBvbmx5IHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBuYXZpZ2F0aW9uXG4gICAgdGhpcy5fd29ya2JlbmNoTGF5b3V0RGlmZmVyLmRpZmYocHJldk5hdmlnYXRlTGF5b3V0LCBwcmV2TmF2aWdhdGVVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgdGhlIHBvcHVwIG91dGxldCBkaWZmZXIgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9Xb3JrYmVuY2hQb3B1cERpZmZlcigpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2TmF2aWdhdGVVcmwgPSB0aGlzLl9yb3V0ZXIucGFyc2VVcmwodGhpcy5fcm91dGVyLnVybCk7IC8vIEJyb3dzZXIgVVJMIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBzdWNjZXNzZnVsIG5hdmlnYXRpb25cbiAgICB0aGlzLl93b3JrYmVuY2hQb3B1cERpZmZlci5kaWZmKHByZXZOYXZpZ2F0ZVVybCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kb2VzIHRoZSByZWdpc3RyYXRpb24gb2YgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9BdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0RGlmZiA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5sYXlvdXREaWZmO1xuICAgIGNvbnN0IHBvcHVwRGlmZiA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5wb3B1cERpZmY7XG4gICAgY29uc3QgYWRkZWRPdXRsZXRzOiBzdHJpbmdbXSA9IFsuLi5sYXlvdXREaWZmLmFkZGVkVmlld091dGxldHMsIC4uLnBvcHVwRGlmZi5hZGRlZFBvcHVwT3V0bGV0c107XG4gICAgaWYgKGFkZGVkT3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2F1eFJvdXRlc1JlZ2lzdHJhdG9yLnVucmVnaXN0ZXJPdXRsZXRBdXhpbGlhcnlSb3V0ZXMoYWRkZWRPdXRsZXRzKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgVW5kbyBhdXhpbGlhcnkgcm91dGVzIHJlZ2lzdHJhdGlvbiBmb3Igb3V0bGV0KHMpOiAke2FkZGVkT3V0bGV0c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyByZWdpc3RyaWVzIGFuZCB3b3JrYmVuY2ggaGFuZGxlcyB0byByZWZsZWN0IHRoZSBuZXcgbGF5b3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVdvcmtiZW5jaExheW91dENoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dH0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG4gICAgaWYgKGxheW91dCAhPT0gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQpIHsgLy8gTGF5b3V0IGluc3RhbmNlIGRvZXMgbm90IGNoYW5nZSBpZiBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIEFuZ3VsYXIgcm91dGVyLlxuICAgICAgdGhpcy51cGRhdGVWaWV3UmVnaXN0cnkoKTtcbiAgICAgIHRoaXMudXBkYXRlUGFydFJlZ2lzdHJ5KCk7XG5cbiAgICAgIHRoaXMuX3ZpZXdSZWdpc3RyeS52aWV3cy5mb3JFYWNoKHZpZXcgPT4gdmlldy5vbkxheW91dENoYW5nZShsYXlvdXQpKTtcbiAgICAgIHRoaXMuX3BhcnRSZWdpc3RyeS5wYXJ0cy5mb3JFYWNoKHBhcnQgPT4gcGFydC5vbkxheW91dENoYW5nZShsYXlvdXQpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIHRoZSB3b3JrYmVuY2ggbGF5b3V0IHZpYSB7QGxpbmsgV29ya2JlbmNoTGF5b3V0U2VydmljZX0sIHNpbWlsYXIgdG8gYSB0cmFuc2FjdGlvbmFsIGNvbW1pdC5cbiAgICovXG4gIHByaXZhdGUgcHVibGlzaFdvcmtiZW5jaExheW91dCgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0fSA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBpZiAobGF5b3V0ICE9PSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCkgeyAvLyBMYXlvdXQgaW5zdGFuY2UgZG9lcyBub3QgY2hhbmdlIGlmIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgQW5ndWxhciByb3V0ZXIuXG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ1B1Ymxpc2hpbmcgd29ya2JlbmNoIGxheW91dCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGxheW91dCk7XG4gICAgICB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLnNldExheW91dChsYXlvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBVUkwgaWYgdGhlIGxheW91dCBoYXMgYmVlbiBtaWdyYXRlZCBmcm9tIGFuIG91dGRhdGVkIHZlcnNpb24uXG4gICAqL1xuICBwcml2YXRlIG1pZ3JhdGVVUkwoKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmxheW91dDtcbiAgICBpZiAobGF5b3V0Lm1haW5BcmVhR3JpZD8ubWlncmF0ZWQpIHtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgVVJMIHdpdGggdGhlIG1pZ3JhdGVkIFVSTCBhbmQgY2xlYXIgZXhpc3RpbmcgcXVlcnkgcGFyYW1zLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGxheW91dCBxdWVyeSBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVuYW1lZC5cbiAgICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci7JtW5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQsIHtxdWVyeVBhcmFtc0hhbmRsaW5nOiBudWxsLCByZXBsYWNlVXJsOiB0cnVlfSkudGhlbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhdXhpbGlhcnkgcm91dGVzIG9mIHJlbW92ZWQgd29ya2JlbmNoIG91dGxldHMuXG4gICAqL1xuICBwcml2YXRlIHVucmVnaXN0ZXJSZW1vdmVkT3V0bGV0QXV4aWxpYXJ5Um91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxheW91dERpZmYgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCkubGF5b3V0RGlmZjtcbiAgICBjb25zdCBwb3B1cERpZmYgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCkucG9wdXBEaWZmO1xuICAgIGNvbnN0IHJlbW92ZWRPdXRsZXRzOiBzdHJpbmdbXSA9IFsuLi5sYXlvdXREaWZmLnJlbW92ZWRWaWV3T3V0bGV0cywgLi4ucG9wdXBEaWZmLnJlbW92ZWRQb3B1cE91dGxldHNdO1xuICAgIGlmIChyZW1vdmVkT3V0bGV0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnVW5yZWdpc3RlcmluZyBvdXRsZXQgYXV4aWxpYXJ5IHJvdXRlczogJywgTG9nZ2VyTmFtZXMuUk9VVElORywgcmVtb3ZlZE91dGxldHMpO1xuICAgICAgdGhpcy5fYXV4Um91dGVzUmVnaXN0cmF0b3IudW5yZWdpc3Rlck91dGxldEF1eGlsaWFyeVJvdXRlcyhyZW1vdmVkT3V0bGV0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIC0gRm9yIGVhY2ggYWRkZWQgdmlldywgY29uc3RydWN0cyBhIHtAbGluayBXb3JrYmVuY2hWaWV3fSBhbmQgcmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hWaWV3UmVnaXN0cnl9XG4gICAqIC0gRm9yIGVhY2ggcmVtb3ZlZCB2aWV3LCBkZXN0cm95cyB0aGUge0BsaW5rIFdvcmtiZW5jaFZpZXd9IGFuZCB1bnJlZ2lzdGVycyBpdCBpbiB7QGxpbmsgV29ya2JlbmNoVmlld1JlZ2lzdHJ5fVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3UmVnaXN0cnkoKTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dERpZmZ9ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuXG4gICAgbGF5b3V0RGlmZi5hZGRlZFZpZXdzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgQ29uc3RydWN0aW5nIMm1V29ya2JlbmNoVmlldyBbdmlld0lkPSR7dmlld0lkfV1gLCBMb2dnZXJOYW1lcy5MSUZFQ1lDTEUpO1xuICAgICAgdGhpcy5fdmlld1JlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuY3JlYXRlV29ya2JlbmNoVmlldyh2aWV3SWQpKTtcbiAgICB9KTtcbiAgICBsYXlvdXREaWZmLnJlbW92ZWRWaWV3cy5mb3JFYWNoKHZpZXdJZCA9PiB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYERlc3Ryb3lpbmcgybVXb3JrYmVuY2hWaWV3IFt2aWV3SWQ9JHt2aWV3SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl92aWV3UmVnaXN0cnkudW5yZWdpc3Rlcih2aWV3SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIC0gRm9yIGVhY2ggYWRkZWQgcGFydCwgY29uc3RydWN0cyBhIHtAbGluayBXb3JrYmVuY2hQYXJ0fSBhbmQgcmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9XG4gICAqIC0gRm9yIGVhY2ggcmVtb3ZlZCBwYXJ0LCBkZXN0cm95cyB0aGUge0BsaW5rIFdvcmtiZW5jaFBhcnR9IGFuZCB1bnJlZ2lzdGVycyBpdCBpbiB7QGxpbmsgV29ya2JlbmNoUGFydFJlZ2lzdHJ5fVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQYXJ0UmVnaXN0cnkoKTogdm9pZCB7XG4gICAgY29uc3Qge2xheW91dERpZmZ9ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuXG4gICAgbGF5b3V0RGlmZi5hZGRlZFBhcnRzLmZvckVhY2gocGFydElkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgQ29uc3RydWN0aW5nIMm1V29ya2JlbmNoUGFydCBbcGFydElkPSR7cGFydElkfV1gLCBMb2dnZXJOYW1lcy5MSUZFQ1lDTEUpO1xuICAgICAgdGhpcy5fcGFydFJlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuY3JlYXRlV29ya2JlbmNoUGFydChwYXJ0SWQpKTtcbiAgICB9KTtcbiAgICBsYXlvdXREaWZmLnJlbW92ZWRQYXJ0cy5mb3JFYWNoKHBhcnRJZCA9PiB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYERlc3Ryb3lpbmcgybVXb3JrYmVuY2hQYXJ0IFtwYXJ0SWQ9JHtwYXJ0SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl9wYXJ0UmVnaXN0cnkudW5yZWdpc3RlcihwYXJ0SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hQYXJ0KHBhcnRJZDogc3RyaW5nKTogybVXb3JrYmVuY2hQYXJ0IHtcbiAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2Vudmlyb25tZW50SW5qZWN0b3IsICgpID0+IG5ldyDJtVdvcmtiZW5jaFBhcnQocGFydElkLCB7XG4gICAgICBjb21wb25lbnQ6IHBhcnRJZCA9PT0gTUFJTl9BUkVBID8gTWFpbkFyZWFMYXlvdXRDb21wb25lbnQgOiBQYXJ0Q29tcG9uZW50LFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV29ya2JlbmNoVmlldyh2aWV3SWQ6IHN0cmluZyk6IMm1V29ya2JlbmNoVmlldyB7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9lbnZpcm9ubWVudEluamVjdG9yLCAoKSA9PiBuZXcgybVXb3JrYmVuY2hWaWV3KHZpZXdJZCwge2NvbXBvbmVudDogVmlld0NvbXBvbmVudH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFJvdXRlckV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuX3JvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGV2ZW50OiBFdmVudCB8IFJvdXRlckV2ZW50KTogZXZlbnQgaXMgUm91dGVyRXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBSb3V0ZXJFdmVudCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uU3RhcnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uRW5kKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwpIHtcbiAgICAgICAgICB0aGlzLm9uTmF2aWdhdGlvbkNhbmNlbChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLm9uTmF2aWdhdGlvbkVycm9yKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEd1YXJkc0NoZWNrRW5kKSB7XG4gICAgICAgICAgdGhpcy5vbkd1YXJkc0NoZWNrRW5kKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
329
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i2.WorkbenchAuxiliaryRoutesRegistrator }, { type: i3.WorkbenchViewRegistry }, { type: i4.WorkbenchPartRegistry }, { type: i5.WorkbenchLayoutService }, { type: i0.EnvironmentInjector }, { type: i6WorkbenchRouter }, { type: i7.ɵWorkbenchLayoutFactory }, { type: i8.WorkbenchLayoutDiffer }, { type: i9.WorkbenchPopupDiffer }, { type: i10.WorkbenchDialogDiffer }, { type: i11.Logger }] });
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXVybC1vYnNlcnZlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtdXJsLW9ic2VydmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0VBUUU7QUFFRixPQUFPLEVBQVEsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlJLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQXNCLFVBQVUsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUlwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUdyRCxPQUFPLEVBQVMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQzlGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFHOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUkxQyxPQUFPLEVB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UCxDQUFDOzhHQXhUVSxvQkFBb0I7a0hBQXBCLG9CQUFvQixjQURSLE1BQU07OzJGQUNsQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuKlxuKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4qIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4qIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuKlxuKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuKi9cblxuaW1wb3J0IHtFdmVudCwgR3VhcmRzQ2hlY2tFbmQsIE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIsIFJvdXRlckV2ZW50fSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RW52aXJvbm1lbnRJbmplY3RvciwgSW5qZWN0YWJsZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V29ya2JlbmNoQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3J9IGZyb20gJy4vd29ya2JlbmNoLWF1eGlsaWFyeS1yb3V0ZXMtcmVnaXN0cmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU19IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3UmVnaXN0cnl9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9IGZyb20gJy4uL3BhcnQvd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfSBmcm9tICcuLi9sYXlvdXQvd29ya2JlbmNoLWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7ybVXb3JrYmVuY2hQYXJ0fSBmcm9tICcuLi9wYXJ0L8m1d29ya2JlbmNoLXBhcnQubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdDb21wb25lbnR9IGZyb20gJy4uL3ZpZXcvdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXREaWZmZXJ9IGZyb20gJy4vd29ya2JlbmNoLWxheW91dC1kaWZmZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hQb3B1cERpZmZlcn0gZnJvbSAnLi93b3JrYmVuY2gtcG9wdXAtZGlmZmVyJztcbmltcG9ydCB7TG9nZ2VyLCBMb2dnZXJOYW1lc30gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlc30gZnJvbSAnLi93b3JrYmVuY2gtbmF2aWdhdGlvbmFsLXN0YXRlcyc7XG5pbXBvcnQge01haW5BcmVhTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9sYXlvdXQvbWFpbi1hcmVhLWxheW91dC9tYWluLWFyZWEtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQge1BhcnRDb21wb25lbnR9IGZyb20gJy4uL3BhcnQvcGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHtNQUlOX0FSRUF9IGZyb20gJy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0JztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge8m1V29ya2JlbmNoTGF5b3V0RmFjdG9yeX0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dC5mYWN0b3J5JztcbmltcG9ydCB7V29ya2JlbmNoRGlhbG9nRGlmZmVyfSBmcm9tICcuL3dvcmtiZW5jaC1kaWFsb2ctZGlmZmVyJztcbmltcG9ydCB7Um91dGVyVXRpbHN9IGZyb20gJy4vcm91dGVyLnV0aWwnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi/JtXdvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQge1dvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0fSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHtjYW5NYXRjaE5vdEZvdW5kUGFnZX0gZnJvbSAnLi4vdmlldy93b3JrYmVuY2gtdmlldy1yb3V0ZS1ndWFyZHMnO1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgYnJvd3NlciBVUkwgZm9yIHdvcmtiZW5jaCBsYXlvdXQgY2hhbmdlcy5cbiAqXG4gKiAtIEZvciBlYWNoIGFkZGVkIHZpZXcsIGNvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHJlZ2lzdGVycyB2aWV3IHNwZWNpZmljIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXNcbiAqIC0gRm9yIGVhY2ggcmVtb3ZlZCB2aWV3LCBkZXN0cm95cyB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHVucmVnaXN0ZXJzIGl0cyBhdXhpbGlhcnkgcm91dGVzXG4gKiAtIEZvciBlYWNoIGFkZGVkIHBhcnQsIGNvbnN0cnVjdHMgYSB7QGxpbmsgV29ya2JlbmNoUGFydH1cbiAqIC0gRm9yIGVhY2ggcmVtb3ZlZCBwYXJ0LCBkZXN0cm95cyB7QGxpbmsgV29ya2JlbmNoUGFydH1cbiAqIC0gUGFyc2VzIHRoZSBzZXJpYWxpemVkIGxheW91dCBhbmQgaW5qZWN0cyBpdCBpbnRvIHtAbGluayBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlfS5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgV29ya2JlbmNoVXJsT2JzZXJ2ZXIge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvcjogV29ya2JlbmNoQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdSZWdpc3RyeTogV29ya2JlbmNoVmlld1JlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIF9wYXJ0UmVnaXN0cnk6IFdvcmtiZW5jaFBhcnRSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0U2VydmljZTogV29ya2JlbmNoTGF5b3V0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZW52aXJvbm1lbnRJbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoUm91dGVyOiDJtVdvcmtiZW5jaFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoTGF5b3V0RmFjdG9yeTogybVXb3JrYmVuY2hMYXlvdXRGYWN0b3J5LFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXREaWZmZXI6IFdvcmtiZW5jaExheW91dERpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoUG9wdXBEaWZmZXI6IFdvcmtiZW5jaFBvcHVwRGlmZmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hEaWFsb2dEaWZmZXI6IFdvcmtiZW5jaERpYWxvZ0RpZmZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbG9nZ2VyOiBMb2dnZXIpIHtcbiAgICB0aGlzLmluc3RhbGxSb3V0ZXJFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG5hdmlnYXRpb24gKi9cbiAgcHJpdmF0ZSBvbk5hdmlnYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQoZXZlbnQudXJsKTtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ29uTmF2aWdhdGlvblN0YXJ0JywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQsIGBOYXZpZ2F0aW9uQ29udGV4dCBbcGFydHM9JHtjb250ZXh0LmxheW91dC5wYXJ0cygpLm1hcChwYXJ0ID0+IHBhcnQuaWQpfSwgbGF5b3V0RGlmZj0ke2NvbnRleHQubGF5b3V0RGlmZi50b1N0cmluZygpfSwgcG9wdXBEaWZmPSR7Y29udGV4dC5wb3B1cERpZmYudG9TdHJpbmcoKX0sICBkaWFsb2dEaWZmPSR7Y29udGV4dC5kaWFsb2dEaWZmLnRvU3RyaW5nKCl9XWApO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoY29udGV4dCk7XG4gICAgdGhpcy5yZWdpc3RlckFkZGVkVmlld0F1eGlsaWFyeVJvdXRlcygpO1xuICAgIHRoaXMucmVnaXN0ZXJBZGRlZFBvcHVwQXV4aWxpYXJ5Um91dGVzKCk7XG4gICAgdGhpcy5yZWdpc3RlckFkZGVkRGlhbG9nQXV4aWxpYXJ5Um91dGVzKCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB1cG9uIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbiAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uRW5kJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMudW5yZWdpc3RlclJlbW92ZWRPdXRsZXRBdXhpbGlhcnlSb3V0ZXMoKTtcbiAgICB0aGlzLmFwcGx5V29ya2JlbmNoTGF5b3V0Q2hhbmdlcygpO1xuICAgIHRoaXMucHVibGlzaFdvcmtiZW5jaExheW91dCgpO1xuICAgIHRoaXMubWlncmF0ZVVSTCgpO1xuICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5zZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQobnVsbCk7XG4gIH1cblxuICAvKiogSW52b2tlZCB3aGVuIGNhbmNlbGxlZCB0aGUgbmF2aWdhdGlvbiwgZS5nLiwgaW4gYSBndWFyZCAqL1xuICBwcml2YXRlIG9uTmF2aWdhdGlvbkNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uQ2FuY2VsJywgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICAgIHRoaXMudW5kb0F1eGlsaWFyeVJvdXRlc1JlZ2lzdHJhdGlvbigpO1xuICAgIHRoaXMudW5kb1dvcmtiZW5jaExheW91dERpZmZlcigpO1xuICAgIHRoaXMudW5kb1dvcmtiZW5jaFBvcHVwRGlmZmVyKCk7XG4gICAgdGhpcy51bmRvV29ya2JlbmNoRGlhbG9nRGlmZmVyKCk7XG4gICAgdGhpcy5fd29ya2JlbmNoUm91dGVyLnNldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dChudWxsKTtcbiAgfVxuXG4gIC8qKiBJbnZva2VkIHdoZW4gdGhlIG5hdmlnYXRpb24gZmFpbGVkICovXG4gIHByaXZhdGUgb25OYXZpZ2F0aW9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiAnb25OYXZpZ2F0aW9uRXJyb3InLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCBldmVudCk7XG4gICAgdGhpcy51bmRvQXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0aW9uKCk7XG4gICAgdGhpcy51bmRvV29ya2JlbmNoTGF5b3V0RGlmZmVyKCk7XG4gICAgdGhpcy51bmRvV29ya2JlbmNoUG9wdXBEaWZmZXIoKTtcbiAgICB0aGlzLnVuZG9Xb3JrYmVuY2hEaWFsb2dEaWZmZXIoKTtcbiAgICB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KG51bGwpO1xuICB9XG5cbiAgLyoqIEludm9rZWQgYWZ0ZXIgY2hlY2tlZCBndWFyZHMgZm9yIGFjdGl2YXRpb24gKi9cbiAgcHJpdmF0ZSBvbkd1YXJkc0NoZWNrRW5kKGV2ZW50OiBHdWFyZHNDaGVja0VuZCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgb25HdWFyZHNDaGVja0VuZCBbc2hvdWxkQWN0aXZhdGU9JHtldmVudC5zaG91bGRBY3RpdmF0ZX1dYCwgTG9nZ2VyTmFtZXMuUk9VVElORywgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi4gVGhlIGNvbnRleHQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBuZXcgbGF5b3V0IGFuZCBob3cgaXQgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IGxheW91dC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQodXJsOiBzdHJpbmcpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uQ29udGV4dCB7XG4gICAgY29uc3QgdXJsVHJlZSA9IHRoaXMuX3JvdXRlci5wYXJzZVVybCh1cmwpO1xuICAgIGNvbnN0IHdvcmtiZW5jaE5hdmlnYXRpb25hbFN0YXRlID0gV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmZyb21OYXZpZ2F0aW9uKHRoaXMuX3JvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpISk7XG5cbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLl93b3JrYmVuY2hMYXlvdXRGYWN0b3J5LmNyZWF0ZSh7XG4gICAgICBtYWluQXJlYUdyaWQ6ICgoKSA9PiB7XG4gICAgICAgIC8vIFJlYWQgdGhlIG1haW4gYXJlYSBncmlkIGZyb20gdGhlIHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgY29uc3QgbWFpbkFyZWFHcmlkID0gdXJsVHJlZS5xdWVyeVBhcmFtTWFwLmdldChNQUlOX0FSRUFfTEFZT1VUX1FVRVJZX1BBUkFNKSA/PyB1cmxUcmVlLnF1ZXJ5UGFyYW1NYXAuZ2V0KCdwYXJ0cycpOyAvLyBUT0RPIFtBbmd1bGFyIDE4XSBSZW1vdmUgZmFsbGJhY2sgdG8gJ3BhcnRzJyBxdWVyeSBwYXJhbWV0ZXJcbiAgICAgICAgaWYgKG1haW5BcmVhR3JpZCkge1xuICAgICAgICAgIHJldHVybiBtYWluQXJlYUdyaWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyBub3QgZmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCBpZiB0aGUgbmF2aWdhdGlvbiB3YXMgcGVyZm9ybWVkIHZpYSB0aGUgV29ya2JlbmNoIFJvdXRlci5cbiAgICAgICAgY29uc3QgaXNXb3JrYmVuY2hSb3V0ZXJOYXZpZ2F0aW9uID0gd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGUgIT09IG51bGw7XG4gICAgICAgIGlmIChpc1dvcmtiZW5jaFJvdXRlck5hdmlnYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvIG5vdCBmYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGlmIHRoZSBuYXZpZ2F0aW9uIHdhcyB0cmlnZ2VyZWQgZnJvbSBvdXRzaWRlIHRoZSBBbmd1bGFyIFJvdXRlciwgaS5lLiwgdGhlIGJyb3dzZXIgYmFjay9mb3J3YXJkIGJ1dHRvbnMuXG4gICAgICAgIGNvbnN0IGlzRXh0ZXJuYWxOYXZpZ2F0aW9uID0gdGhpcy5fcm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkhLnRyaWdnZXIgPT09ICdwb3BzdGF0ZSc7XG4gICAgICAgIGlmIChpc0V4dGVybmFsTmF2aWdhdGlvbikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGxheW91dCBpZiB0aGUgbmF2aWdhdGlvbiB3YXMgcGVyZm9ybWVkIHZpYSB0aGUgQW5ndWxhciByb3V0ZXIsIGkuZS4sIHRoZSBuYXZpZ2F0b3IgZGlkIG5vdCBwcmVzZXJ2ZSB0aGUgcXVlcnkgcGFyYW1zLlxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQ/Lm1haW5BcmVhR3JpZDtcbiAgICAgIH0pKCksXG4gICAgICB3b3JrYmVuY2hHcmlkOiB3b3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZT8ud29ya2JlbmNoR3JpZCA/PyB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dD8ud29ya2JlbmNoR3JpZCxcbiAgICAgIG1heGltaXplZDogd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGU/Lm1heGltaXplZCA/PyB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dD8ubWF4aW1pemVkLFxuICAgICAgdmlld1N0YXRlczogd29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGU/LnZpZXdTdGF0ZXMgPz8gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQ/LnZpZXdTdGF0ZXMoKSxcbiAgICAgIHZpZXdPdXRsZXRzOiBPYmplY3QuZnJvbUVudHJpZXMoUm91dGVyVXRpbHMucGFyc2VWaWV3T3V0bGV0cyh1cmxUcmVlKSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF5b3V0LFxuICAgICAgbGF5b3V0RGlmZjogdGhpcy5fd29ya2JlbmNoTGF5b3V0RGlmZmVyLmRpZmYobGF5b3V0LCB1cmxUcmVlKSxcbiAgICAgIHBvcHVwRGlmZjogdGhpcy5fd29ya2JlbmNoUG9wdXBEaWZmZXIuZGlmZih1cmxUcmVlKSxcbiAgICAgIGRpYWxvZ0RpZmY6IHRoaXMuX3dvcmtiZW5jaERpYWxvZ0RpZmZlci5kaWZmKHVybFRyZWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yIGVhY2ggYWRkZWQgdmlldywgcmVnaXN0ZXJzIGF1eGlsaWFyeSByb3V0ZXMgb2YgYWxsIHRvcC1sZXZlbCByb3V0ZXMuXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyQWRkZWRWaWV3QXV4aWxpYXJ5Um91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IG5hdmlnYXRpb25Db250ZXh0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpO1xuICAgIGNvbnN0IGFkZGVkVmlld3MgPSBuYXZpZ2F0aW9uQ29udGV4dC5sYXlvdXREaWZmLmFkZGVkVmlld3M7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUm91dGVzID0gdGhpcy5fYXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3IucmVnaXN0ZXJBdXhpbGlhcnlSb3V0ZXMoYWRkZWRWaWV3cywge1xuICAgICAgY2FuTWF0Y2hOb3RGb3VuZFBhZ2U6IFtjYW5NYXRjaE5vdEZvdW5kUGFnZV0sXG4gICAgfSk7XG4gICAgaWYgKHJlZ2lzdGVyZWRSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYFJlZ2lzdGVyZWQgYXV4aWxpYXJ5IHJvdXRlcyBmb3Igdmlld3M6ICR7YWRkZWRWaWV3c31gLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCByZWdpc3RlcmVkUm91dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yIGVhY2ggYWRkZWQgcG9wdXAsIHJlZ2lzdGVycyBhdXhpbGlhcnkgcm91dGVzIG9mIGFsbCB0b3AtbGV2ZWwgcm91dGVzLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQWRkZWRQb3B1cEF1eGlsaWFyeVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ29udGV4dCA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBhZGRlZFBvcHVwT3V0bGV0cyA9IG5hdmlnYXRpb25Db250ZXh0LnBvcHVwRGlmZi5hZGRlZFBvcHVwT3V0bGV0cztcblxuICAgIGNvbnN0IHJlZ2lzdGVyZWRSb3V0ZXMgPSB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhhZGRlZFBvcHVwT3V0bGV0cyk7XG4gICAgaWYgKHJlZ2lzdGVyZWRSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYFJlZ2lzdGVyZWQgYXV4aWxpYXJ5IHJvdXRlcyBmb3IgcG9wdXBzOiAke2FkZGVkUG9wdXBPdXRsZXRzfWAsIExvZ2dlck5hbWVzLlJPVVRJTkcsIHJlZ2lzdGVyZWRSb3V0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBhZGRlZCBkaWFsb2csIHJlZ2lzdGVycyBhdXhpbGlhcnkgcm91dGVzIG9mIGFsbCB0b3AtbGV2ZWwgcm91dGVzLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQWRkZWREaWFsb2dBdXhpbGlhcnlSb3V0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdGlvbkNvbnRleHQgPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG4gICAgY29uc3QgYWRkZWREaWFsb2dPdXRsZXRzID0gbmF2aWdhdGlvbkNvbnRleHQuZGlhbG9nRGlmZi5hZGRlZERpYWxvZ091dGxldHM7XG5cbiAgICBjb25zdCBuZXdBdXhpbGlhcnlSb3V0ZXMgPSB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhhZGRlZERpYWxvZ091dGxldHMpO1xuICAgIGlmIChuZXdBdXhpbGlhcnlSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gYFJlZ2lzdGVyZWQgYXV4aWxpYXJ5IHJvdXRlcyBmb3IgZGlhbG9nczogJHthZGRlZERpYWxvZ091dGxldHN9YCwgTG9nZ2VyTmFtZXMuUk9VVElORywgbmV3QXV4aWxpYXJ5Um91dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJ0cyB0aGUgd29ya2JlbmNoIGxheW91dCBkaWZmZXIgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9Xb3JrYmVuY2hMYXlvdXREaWZmZXIoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldk5hdmlnYXRlTGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQ7IC8vIExheW91dCBpbiBgV29ya2JlbmNoTGF5b3V0U2VydmljZWAgaXMgb25seSB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvblxuICAgIGNvbnN0IHByZXZOYXZpZ2F0ZVVybCA9IHRoaXMuX3JvdXRlci5wYXJzZVVybCh0aGlzLl9yb3V0ZXIudXJsKTsgLy8gQnJvd3NlciBVUkwgaXMgb25seSB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvblxuICAgIHRoaXMuX3dvcmtiZW5jaExheW91dERpZmZlci5kaWZmKHByZXZOYXZpZ2F0ZUxheW91dCwgcHJldk5hdmlnYXRlVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIHRoZSBwb3B1cCBvdXRsZXQgZGlmZmVyIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCBhZnRlciBuYXZpZ2F0aW9uIGZhaWx1cmUgb3IgY2FuY2VsbGF0aW9uLiBUaGUgbmF2aWdhdGlvbiBpcyBjYW5jZWxsZWQgd2hlbiBndWFyZHMgcGVyZm9ybSBhIHJlZGlyZWN0IG9yIHJlamVjdCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmRvV29ya2JlbmNoUG9wdXBEaWZmZXIoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldk5hdmlnYXRlVXJsID0gdGhpcy5fcm91dGVyLnBhcnNlVXJsKHRoaXMuX3JvdXRlci51cmwpOyAvLyBCcm93c2VyIFVSTCBpcyBvbmx5IHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBuYXZpZ2F0aW9uXG4gICAgdGhpcy5fd29ya2JlbmNoUG9wdXBEaWZmZXIuZGlmZihwcmV2TmF2aWdhdGVVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgdGhlIGRpYWxvZyBvdXRsZXQgZGlmZmVyIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCBhZnRlciBuYXZpZ2F0aW9uIGZhaWx1cmUgb3IgY2FuY2VsbGF0aW9uLiBUaGUgbmF2aWdhdGlvbiBpcyBjYW5jZWxsZWQgd2hlbiBndWFyZHMgcGVyZm9ybSBhIHJlZGlyZWN0IG9yIHJlamVjdCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmRvV29ya2JlbmNoRGlhbG9nRGlmZmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZOYXZpZ2F0ZVVybCA9IHRoaXMuX3JvdXRlci5wYXJzZVVybCh0aGlzLl9yb3V0ZXIudXJsKTsgLy8gQnJvd3NlciBVUkwgaXMgb25seSB1cGRhdGVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvblxuICAgIHRoaXMuX3dvcmtiZW5jaERpYWxvZ0RpZmZlci5kaWZmKHByZXZOYXZpZ2F0ZVVybCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kb2VzIHRoZSByZWdpc3RyYXRpb24gb2YgYXV4aWxpYXJ5IHJvdXRlcy5cbiAgICpcbiAgICogSW52b2tlIHRoaXMgbWV0aG9kIGFmdGVyIG5hdmlnYXRpb24gZmFpbHVyZSBvciBjYW5jZWxsYXRpb24uIFRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZCB3aGVuIGd1YXJkcyBwZXJmb3JtIGEgcmVkaXJlY3Qgb3IgcmVqZWN0IG5hdmlnYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHVuZG9BdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0RGlmZiA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5sYXlvdXREaWZmO1xuICAgIGNvbnN0IHBvcHVwRGlmZiA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5wb3B1cERpZmY7XG4gICAgY29uc3QgZGlhbG9nRGlmZiA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKS5kaWFsb2dEaWZmO1xuICAgIGNvbnN0IGFkZGVkT3V0bGV0czogc3RyaW5nW10gPSBbLi4ubGF5b3V0RGlmZi5hZGRlZFZpZXdzLCAuLi5wb3B1cERpZmYuYWRkZWRQb3B1cE91dGxldHMsIC4uLmRpYWxvZ0RpZmYuYWRkZWREaWFsb2dPdXRsZXRzXTtcbiAgICBpZiAoYWRkZWRPdXRsZXRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYXV4aWxpYXJ5Um91dGVzUmVnaXN0cmF0b3IudW5yZWdpc3RlckF1eGlsaWFyeVJvdXRlcyhhZGRlZE91dGxldHMpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBVbmRvIGF1eGlsaWFyeSByb3V0ZXMgcmVnaXN0cmF0aW9uIGZvciBvdXRsZXQocyk6ICR7YWRkZWRPdXRsZXRzfWAsIExvZ2dlck5hbWVzLlJPVVRJTkcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHJlZ2lzdHJpZXMgYW5kIHdvcmtiZW5jaCBoYW5kbGVzIHRvIHJlZmxlY3QgdGhlIG5ldyBsYXlvdXQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5V29ya2JlbmNoTGF5b3V0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0fSA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBpZiAobGF5b3V0ICE9PSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCkgeyAvLyBMYXlvdXQgaW5zdGFuY2UgZG9lcyBub3QgY2hhbmdlIGlmIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgQW5ndWxhciByb3V0ZXIuXG4gICAgICB0aGlzLnVwZGF0ZVZpZXdSZWdpc3RyeSgpO1xuICAgICAgdGhpcy51cGRhdGVQYXJ0UmVnaXN0cnkoKTtcblxuICAgICAgbGF5b3V0LnZpZXdzKCkuZm9yRWFjaCh2aWV3ID0+IHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlldy5pZCkub25MYXlvdXRDaGFuZ2UobGF5b3V0KSk7XG4gICAgICBsYXlvdXQucGFydHMoKS5mb3JFYWNoKHBhcnQgPT4gdGhpcy5fcGFydFJlZ2lzdHJ5LmdldChwYXJ0LmlkKS5vbkxheW91dENoYW5nZShsYXlvdXQpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIHRoZSB3b3JrYmVuY2ggbGF5b3V0IHZpYSB7QGxpbmsgV29ya2JlbmNoTGF5b3V0U2VydmljZX0sIHNpbWlsYXIgdG8gYSB0cmFuc2FjdGlvbmFsIGNvbW1pdC5cbiAgICovXG4gIHByaXZhdGUgcHVibGlzaFdvcmtiZW5jaExheW91dCgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0fSA9IHRoaXMuX3dvcmtiZW5jaFJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTtcbiAgICBpZiAobGF5b3V0ICE9PSB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCkge1xuICAgICAgLy8gTGF5b3V0IGluc3RhbmNlIG9ubHkgY2hhbmdlcyB3aGVuIG5hdmlnYXRpbmcgdmlhIHRoZSB3b3JrYmVuY2ggcm91dGVyLCBidXQgbm90IHZpYSB0aGUgQW5ndWxhciByb3V0ZXIsIGUuZy4sIHdoZW4gbm90IG5hdmlnYXRpbmcgdmlld3MuXG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoKCkgPT4gJ1B1Ymxpc2hpbmcgd29ya2JlbmNoIGxheW91dCcsIExvZ2dlck5hbWVzLlJPVVRJTkcsIGxheW91dCk7XG4gICAgICB0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLnNldExheW91dChsYXlvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBVUkwgaWYgdGhlIGxheW91dCBoYXMgYmVlbiBtaWdyYXRlZCBmcm9tIGFuIG91dGRhdGVkIHZlcnNpb24uXG4gICAqL1xuICBwcml2YXRlIG1pZ3JhdGVVUkwoKTogdm9pZCB7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmxheW91dDtcbiAgICBpZiAobGF5b3V0Lm1haW5BcmVhR3JpZD8ubWlncmF0ZWQpIHtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgVVJMIHdpdGggdGhlIG1pZ3JhdGVkIFVSTCBhbmQgY2xlYXIgZXhpc3RpbmcgcXVlcnkgcGFyYW1zLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGxheW91dCBxdWVyeSBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVuYW1lZC5cbiAgICAgIHRoaXMuX3dvcmtiZW5jaFJvdXRlci5uYXZpZ2F0ZShsYXlvdXQgPT4gbGF5b3V0LCB7cXVlcnlQYXJhbXNIYW5kbGluZzogbnVsbCwgcmVwbGFjZVVybDogdHJ1ZX0pLnRoZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYXV4aWxpYXJ5IHJvdXRlcyBvZiByZW1vdmVkIHdvcmtiZW5jaCBvdXRsZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyUmVtb3ZlZE91dGxldEF1eGlsaWFyeVJvdXRlcygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXREaWZmID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmxheW91dERpZmY7XG4gICAgY29uc3QgcG9wdXBEaWZmID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLnBvcHVwRGlmZjtcbiAgICBjb25zdCBkaWFsb2dEaWZmID0gdGhpcy5fd29ya2JlbmNoUm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCgpLmRpYWxvZ0RpZmY7XG4gICAgY29uc3QgcmVtb3ZlZE91dGxldHM6IHN0cmluZ1tdID0gWy4uLmxheW91dERpZmYucmVtb3ZlZFZpZXdzLCAuLi5wb3B1cERpZmYucmVtb3ZlZFBvcHVwT3V0bGV0cywgLi4uZGlhbG9nRGlmZi5yZW1vdmVkRGlhbG9nT3V0bGV0c107XG4gICAgaWYgKHJlbW92ZWRPdXRsZXRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+ICdVbnJlZ2lzdGVyaW5nIG91dGxldCBhdXhpbGlhcnkgcm91dGVzOiAnLCBMb2dnZXJOYW1lcy5ST1VUSU5HLCByZW1vdmVkT3V0bGV0cyk7XG4gICAgICB0aGlzLl9hdXhpbGlhcnlSb3V0ZXNSZWdpc3RyYXRvci51bnJlZ2lzdGVyQXV4aWxpYXJ5Um91dGVzKHJlbW92ZWRPdXRsZXRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogLSBGb3IgZWFjaCBhZGRlZCB2aWV3LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFZpZXd9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdvcmtiZW5jaFZpZXdSZWdpc3RyeX1cbiAgICogLSBGb3IgZWFjaCByZW1vdmVkIHZpZXcsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoVmlld30gYW5kIHVucmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hWaWV3UmVnaXN0cnl9XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpZXdSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0RGlmZn0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICBsYXlvdXREaWZmLmFkZGVkVmlld3MuZm9yRWFjaCh2aWV3SWQgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgybVXb3JrYmVuY2hWaWV3IFt2aWV3SWQ9JHt2aWV3SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl92aWV3UmVnaXN0cnkucmVnaXN0ZXIodGhpcy5jcmVhdGVXb3JrYmVuY2hWaWV3KHZpZXdJZCkpO1xuICAgIH0pO1xuICAgIGxheW91dERpZmYucmVtb3ZlZFZpZXdzLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgRGVzdHJveWluZyDJtVdvcmtiZW5jaFZpZXcgW3ZpZXdJZD0ke3ZpZXdJZH1dYCwgTG9nZ2VyTmFtZXMuTElGRUNZQ0xFKTtcbiAgICAgIHRoaXMuX3ZpZXdSZWdpc3RyeS51bnJlZ2lzdGVyKHZpZXdJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogLSBGb3IgZWFjaCBhZGRlZCBwYXJ0LCBjb25zdHJ1Y3RzIGEge0BsaW5rIFdvcmtiZW5jaFBhcnR9IGFuZCByZWdpc3RlcnMgaXQgaW4ge0BsaW5rIFdvcmtiZW5jaFBhcnRSZWdpc3RyeX1cbiAgICogLSBGb3IgZWFjaCByZW1vdmVkIHBhcnQsIGRlc3Ryb3lzIHRoZSB7QGxpbmsgV29ya2JlbmNoUGFydH0gYW5kIHVucmVnaXN0ZXJzIGl0IGluIHtAbGluayBXb3JrYmVuY2hQYXJ0UmVnaXN0cnl9XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVBhcnRSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICBjb25zdCB7bGF5b3V0RGlmZn0gPSB0aGlzLl93b3JrYmVuY2hSb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KCk7XG5cbiAgICBsYXlvdXREaWZmLmFkZGVkUGFydHMuZm9yRWFjaChwYXJ0SWQgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCgpID0+IGBDb25zdHJ1Y3RpbmcgybVXb3JrYmVuY2hQYXJ0IFtwYXJ0SWQ9JHtwYXJ0SWR9XWAsIExvZ2dlck5hbWVzLkxJRkVDWUNMRSk7XG4gICAgICB0aGlzLl9wYXJ0UmVnaXN0cnkucmVnaXN0ZXIodGhpcy5jcmVhdGVXb3JrYmVuY2hQYXJ0KHBhcnRJZCkpO1xuICAgIH0pO1xuICAgIGxheW91dERpZmYucmVtb3ZlZFBhcnRzLmZvckVhY2gocGFydElkID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygoKSA9PiBgRGVzdHJveWluZyDJtVdvcmtiZW5jaFBhcnQgW3BhcnRJZD0ke3BhcnRJZH1dYCwgTG9nZ2VyTmFtZXMuTElGRUNZQ0xFKTtcbiAgICAgIHRoaXMuX3BhcnRSZWdpc3RyeS51bnJlZ2lzdGVyKHBhcnRJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdvcmtiZW5jaFBhcnQocGFydElkOiBzdHJpbmcpOiDJtVdvcmtiZW5jaFBhcnQge1xuICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5fZW52aXJvbm1lbnRJbmplY3RvciwgKCkgPT4gbmV3IMm1V29ya2JlbmNoUGFydChwYXJ0SWQsIHtcbiAgICAgIGNvbXBvbmVudDogcGFydElkID09PSBNQUlOX0FSRUEgPyBNYWluQXJlYUxheW91dENvbXBvbmVudCA6IFBhcnRDb21wb25lbnQsXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVXb3JrYmVuY2hWaWV3KHZpZXdJZDogVmlld0lkKTogybVXb3JrYmVuY2hWaWV3IHtcbiAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuX2Vudmlyb25tZW50SW5qZWN0b3IsICgpID0+IG5ldyDJtVdvcmtiZW5jaFZpZXcodmlld0lkLCB7Y29tcG9uZW50OiBWaWV3Q29tcG9uZW50fSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnN0YWxsUm91dGVyRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZXZlbnQ6IEV2ZW50IHwgUm91dGVyRXZlbnQpOiBldmVudCBpcyBSb3V0ZXJFdmVudCA9PiBldmVudCBpbnN0YW5jZW9mIFJvdXRlckV2ZW50KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25TdGFydChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uQ2FuY2VsKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uRXJyb3IoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgR3VhcmRzQ2hlY2tFbmQpIHtcbiAgICAgICAgICB0aGlzLm9uR3VhcmRzQ2hlY2tFbmQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19
@@ -61,10 +61,10 @@ class ɵLocation extends Location {
61
61
  // the router only if the platform is still running.
62
62
  return (this._router ??= !this._appRef.destroyed ? this._appRef.injector.get(Router) : undefined);
63
63
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ɵLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ɵLocation }); }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ɵLocation, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ɵLocation }); }
66
66
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: ɵLocation, decorators: [{
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ɵLocation, decorators: [{
68
68
  type: Injectable
69
69
  }], ctorParameters: () => [] });
70
70
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiybVsb2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3JvdXRpbmcvybVsb2NhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsY0FBYyxFQUF3QixNQUFNLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFFNUU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsUUFBUTtZQUNqQixRQUFRLEVBQUUsU0FBUztTQUNwQjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQ00sU0FBVSxTQUFRLFFBQVE7SUFLOUI7UUFDRSxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUoxQixZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBS3pDLENBQUM7SUFFZSxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsS0FBYztRQUMvRCxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN6RixDQUFDO0lBRUQ7O09BRUc7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksSUFBSSxDQUFDO1FBQ3RFLE9BQU8saUJBQWlCLEtBQUssSUFBSSxJQUFJLDJCQUEyQixDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUM5RyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLE1BQU07UUFDaEIseUdBQXlHO1FBQ3pHLG9HQUFvRztRQUNwRyxvR0FBb0c7UUFDcEcscUdBQXFHO1FBQ3JHLG9EQUFvRDtRQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7OEdBL0JHLFNBQVM7a0hBQVQsU0FBUzs7MkZBQVQsU0FBUztrQkFEZCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0xvY2F0aW9uLCBMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtBcHBsaWNhdGlvblJlZiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIGluamVjdCwgSW5qZWN0YWJsZSwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIERJIHByb3ZpZGVycyB0byBwYXRjaCB7QGxpbmsgTG9jYXRpb259IGZvciB0aGUgQW5ndWxhciByb3V0ZXIgdG8gYWx3YXlzIGFkZCB3b3JrYmVuY2ggbmF2aWdhdGlvbnNcbiAqIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLlxuICpcbiAqIEBzZWUgybVMb2NhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUxvY2F0aW9uUGF0Y2goKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBMb2NhdGlvbixcbiAgICAgIHVzZUNsYXNzOiDJtUxvY2F0aW9uLFxuICAgIH0sXG4gIF0pO1xufVxuXG4vKipcbiAqIFBhdGNoZXMge0BsaW5rIExvY2F0aW9ufSBmb3IgdGhlIEFuZ3VsYXIgcm91dGVyIHRvIGFsd2F5cyBhZGQgd29ya2JlbmNoIG5hdmlnYXRpb25zIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLFxuICogZXZlbiBpZiB0aGUgVVJMIGRvZXMgbm90IGNoYW5nZS5cbiAqXG4gKiBSYXRpb25hbGU6XG4gKiBJZiBvbmx5IHRoZSBsYXlvdXQgb2YgdGhlIHdvcmtiZW5jaCBncmlkIGlzIGNoYW5nZWQsIHRoZSBVUkwgZG9lcyBub3QgY2hhbmdlIGJlY2F1c2UgdGhlIGxheW91dCBpcyBwYXNzZWQgdG8gdGhlXG4gKiBuYXZpZ2F0aW9uIGFzIHN0YXRlIGFuZCBub3QgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIEJ5IGRlZmF1bHQsIGFuIHVuY2hhbmdlZCBVUkwgZG9lcyBub3QgY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZVxuICogYnJvd3NpbmcgaGlzdG9yeSBzdGFjaywgYnV0IHJlcGxhY2VzIHRoZSBjdXJyZW50IGVudHJ5LiBTZWUgQW5ndWxhciByb3V0ZXIudHMjc2V0QnJvd3NlclVybFxuICovXG5ASW5qZWN0YWJsZSgvKiBETyBOT1QgUFJPVklERSB2aWEgJ3Byb3ZpZGVkSW4nIG1ldGFkYXRhIGFzIHJlZ2lzdGVyZWQgdW5kZXIgYExvY2F0aW9uYCBESSB0b2tlbi4gKi8pXG5jbGFzcyDJtUxvY2F0aW9uIGV4dGVuZHMgTG9jYXRpb24ge1xuXG4gIHByaXZhdGUgX2FwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIHByaXZhdGUgX3JvdXRlcjogUm91dGVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluamVjdChMb2NhdGlvblN0cmF0ZWd5KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aDogc3RyaW5nLCBxdWVyeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0N1cnJlbnRQYXRoRXF1YWxUbyhwYXRoLCBxdWVyeSkgPyAhdGhpcy5pc1dvcmtiZW5jaE5hdmlnYXRpb24oKSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gaXMgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiBwZXJmb3JtZWQgdGhyb3VnaCB0aGUgd29ya2JlbmNoIHJvdXRlci5cbiAgICovXG4gIHByaXZhdGUgaXNXb3JrYmVuY2hOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uID0gdGhpcy5yb3V0ZXI/LmdldEN1cnJlbnROYXZpZ2F0aW9uKCkgPz8gbnVsbDtcbiAgICByZXR1cm4gY3VycmVudE5hdmlnYXRpb24gIT09IG51bGwgJiYgV29ya2JlbmNoTmF2aWdhdGlvbmFsU3RhdGVzLmZyb21OYXZpZ2F0aW9uKGN1cnJlbnROYXZpZ2F0aW9uKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIEFuZ3VsYXIgcm91dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcm91dGVyKCk6IFJvdXRlciB8IHVuZGVmaW5lZCB7XG4gICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBpbmplY3QgdGhlIGBSb3V0ZXJgIGluIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSBgUm91dGVyYCBkZXBlbmRzIG9uIGBMb2NhdGlvbmAsXG4gICAgLy8gd2hpY2ggd291bGQgY2F1c2UgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbnN0ZWFkLCB3ZSBpbmplY3QgdGhlIHJvdXRlciBsYXp5LlxuICAgIC8vIEhvd2V2ZXIsIGluamVjdGluZyB0aGUgcm91dGVyIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQsIHdoaWNoIGhhcHBlbnNcbiAgICAvLyBpbiB0ZXN0cyB0aGF0IHRlYXIgZG93biBiZWZvcmUgdGhlIGluaXRpYWwgbmF2aWdhdGlvbiBoYXMgZmluaXNoZWQuIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHdlIGluamVjdFxuICAgIC8vIHRoZSByb3V0ZXIgb25seSBpZiB0aGUgcGxhdGZvcm0gaXMgc3RpbGwgcnVubmluZy5cbiAgICByZXR1cm4gKHRoaXMuX3JvdXRlciA/Pz0gIXRoaXMuX2FwcFJlZi5kZXN0cm95ZWQgPyB0aGlzLl9hcHBSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcikgOiB1bmRlZmluZWQpO1xuICB9XG59XG4iXX0=