@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -0,0 +1,521 @@
1
+ import { NgStyle } from '@angular/common';
2
+ import { Component, DestroyRef, EnvironmentInjector, NgZone, computed, inject, signal } from '@angular/core';
3
+ import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
+ import { FocusTrapFactory } from '@angular/cdk/a11y';
5
+ import { Overlay } from '@angular/cdk/overlay';
6
+ import { ComponentPortal } from '@angular/cdk/portal';
7
+ import { combineLatest, debounceTime, fromEvent } from 'rxjs';
8
+ import { disableBodyScroll, enableBodyScroll } from '../../../../core/utils/body-scroll.util';
9
+ import { SpotlightComponent } from '../../spotlight.component';
10
+ import { SpotlightTourService } from '../../services/spotlight-tour.service';
11
+ import * as i0 from "@angular/core";
12
+ const POPOVER_WIDTH = 342;
13
+ const SPOTLIGHT_PADDING = 8;
14
+ const ARROW_HALF_SIZE = 8;
15
+ const ARROW_OFFSET_MIN = 4;
16
+ const ARROW_OFFSET_MAX = POPOVER_WIDTH - 4 - 16;
17
+ const MASK_BG = 'rgba(0,0,0,0.5)';
18
+ const MASK_TRANSITION = 'all 0.2s ease';
19
+ const OVERLAY_Z = '10000';
20
+ const POPOVER_Z = '10001';
21
+ function createMaskBaseStyle() {
22
+ return {
23
+ position: 'fixed',
24
+ 'z-index': OVERLAY_Z,
25
+ background: MASK_BG,
26
+ transition: MASK_TRANSITION,
27
+ cursor: 'default'
28
+ };
29
+ }
30
+ function createHiddenMaskStyle() {
31
+ return {
32
+ ...createMaskBaseStyle(),
33
+ top: '0',
34
+ left: '0',
35
+ width: '0',
36
+ height: '0'
37
+ };
38
+ }
39
+ function toConnectedPositions(position) {
40
+ const [direction, alignment] = position.split('-');
41
+ const padding = SPOTLIGHT_PADDING + 2;
42
+ const horizontalAlignment = alignment;
43
+ const verticalAlignmentMap = {
44
+ start: 'top',
45
+ center: 'center',
46
+ end: 'bottom'
47
+ };
48
+ const verticalAlignment = verticalAlignmentMap[alignment] ?? 'center';
49
+ let primary;
50
+ let opposite;
51
+ switch (direction) {
52
+ case 'top':
53
+ primary = {
54
+ originX: horizontalAlignment,
55
+ originY: 'top',
56
+ overlayX: horizontalAlignment,
57
+ overlayY: 'bottom',
58
+ offsetY: -padding
59
+ };
60
+ opposite = {
61
+ originX: horizontalAlignment,
62
+ originY: 'bottom',
63
+ overlayX: horizontalAlignment,
64
+ overlayY: 'top',
65
+ offsetY: padding
66
+ };
67
+ break;
68
+ case 'right':
69
+ primary = {
70
+ originX: 'end',
71
+ originY: verticalAlignment,
72
+ overlayX: 'start',
73
+ overlayY: verticalAlignment,
74
+ offsetX: padding
75
+ };
76
+ opposite = {
77
+ originX: 'start',
78
+ originY: verticalAlignment,
79
+ overlayX: 'end',
80
+ overlayY: verticalAlignment,
81
+ offsetX: -padding
82
+ };
83
+ break;
84
+ case 'left':
85
+ primary = {
86
+ originX: 'start',
87
+ originY: verticalAlignment,
88
+ overlayX: 'end',
89
+ overlayY: verticalAlignment,
90
+ offsetX: -padding
91
+ };
92
+ opposite = {
93
+ originX: 'end',
94
+ originY: verticalAlignment,
95
+ overlayX: 'start',
96
+ overlayY: verticalAlignment,
97
+ offsetX: padding
98
+ };
99
+ break;
100
+ default:
101
+ primary = {
102
+ originX: horizontalAlignment,
103
+ originY: 'bottom',
104
+ overlayX: horizontalAlignment,
105
+ overlayY: 'top',
106
+ offsetY: padding
107
+ };
108
+ opposite = {
109
+ originX: horizontalAlignment,
110
+ originY: 'top',
111
+ overlayX: horizontalAlignment,
112
+ overlayY: 'bottom',
113
+ offsetY: -padding
114
+ };
115
+ }
116
+ return [
117
+ primary,
118
+ opposite,
119
+ { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: padding },
120
+ { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -padding },
121
+ { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: padding },
122
+ { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -padding }
123
+ ];
124
+ }
125
+ export class SpotlightOverlayComponent {
126
+ tourService = inject(SpotlightTourService);
127
+ destroyRef = inject(DestroyRef);
128
+ zone = inject(NgZone);
129
+ overlay = inject(Overlay);
130
+ environmentInjector = inject(EnvironmentInjector);
131
+ focusTrapFactory = inject(FocusTrapFactory);
132
+ isActive = this.tourService.isActive;
133
+ currentStep = this.tourService.currentStep;
134
+ currentIndex = this.tourService.currentIndex;
135
+ totalSteps = this.tourService.totalSteps;
136
+ targetRect = signal(null);
137
+ topMaskStyle = computed(() => {
138
+ const rect = this.targetRect();
139
+ const base = createMaskBaseStyle();
140
+ if (!rect) {
141
+ return { ...base, top: '0', left: '0', right: '0', bottom: '0' };
142
+ }
143
+ return {
144
+ ...base,
145
+ top: '0',
146
+ left: '0',
147
+ right: '0',
148
+ height: `${Math.max(0, rect.top - SPOTLIGHT_PADDING)}px`
149
+ };
150
+ });
151
+ leftMaskStyle = computed(() => {
152
+ const rect = this.targetRect();
153
+ if (!rect) {
154
+ return createHiddenMaskStyle();
155
+ }
156
+ const top = Math.max(0, rect.top - SPOTLIGHT_PADDING);
157
+ const bottom = Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING);
158
+ const left = Math.max(0, rect.left - SPOTLIGHT_PADDING);
159
+ return {
160
+ position: 'fixed',
161
+ 'z-index': OVERLAY_Z,
162
+ background: MASK_BG,
163
+ transition: MASK_TRANSITION,
164
+ cursor: 'default',
165
+ top: `${top}px`,
166
+ left: '0',
167
+ width: `${left}px`,
168
+ height: `${bottom - top}px`
169
+ };
170
+ });
171
+ rightMaskStyle = computed(() => {
172
+ const rect = this.targetRect();
173
+ if (!rect) {
174
+ return createHiddenMaskStyle();
175
+ }
176
+ const top = Math.max(0, rect.top - SPOTLIGHT_PADDING);
177
+ const bottom = Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING);
178
+ const right = Math.min(window.innerWidth, rect.right + SPOTLIGHT_PADDING);
179
+ return {
180
+ position: 'fixed',
181
+ 'z-index': OVERLAY_Z,
182
+ background: MASK_BG,
183
+ transition: MASK_TRANSITION,
184
+ cursor: 'default',
185
+ top: `${top}px`,
186
+ left: `${right}px`,
187
+ right: '0',
188
+ height: `${bottom - top}px`
189
+ };
190
+ });
191
+ bottomMaskStyle = computed(() => {
192
+ const rect = this.targetRect();
193
+ if (!rect) {
194
+ return createHiddenMaskStyle();
195
+ }
196
+ return {
197
+ position: 'fixed',
198
+ 'z-index': OVERLAY_Z,
199
+ background: MASK_BG,
200
+ transition: MASK_TRANSITION,
201
+ cursor: 'default',
202
+ top: `${Math.min(window.innerHeight, rect.bottom + SPOTLIGHT_PADDING)}px`,
203
+ left: '0',
204
+ right: '0',
205
+ bottom: '0'
206
+ };
207
+ });
208
+ transparentBlockerStyle = computed(() => ({
209
+ position: 'fixed',
210
+ top: '0',
211
+ left: '0',
212
+ right: '0',
213
+ bottom: '0',
214
+ 'z-index': OVERLAY_Z,
215
+ cursor: 'default'
216
+ }));
217
+ resizeObserver = null;
218
+ popoverOverlayRef = null;
219
+ popoverComponentRef = null;
220
+ popoverSubscriptions = [];
221
+ focusTrap = null;
222
+ previouslyFocusedElement = null;
223
+ constructor() {
224
+ combineLatest([
225
+ toObservable(this.currentStep),
226
+ toObservable(this.isActive),
227
+ toObservable(this.tourService.registrationVersion)
228
+ ])
229
+ .pipe(takeUntilDestroyed(this.destroyRef))
230
+ .subscribe(([step, active]) => {
231
+ this.disconnectResizeObserver();
232
+ if (!step || !active) {
233
+ this.targetRect.set(null);
234
+ this.destroyPopoverOverlay();
235
+ return;
236
+ }
237
+ const element = this.tourService.getElement(step.stepId);
238
+ if (element?.nativeElement) {
239
+ element.nativeElement.scrollIntoView({ block: 'nearest' });
240
+ this.syncResolvedElement(element.nativeElement, step);
241
+ return;
242
+ }
243
+ this.targetRect.set(null);
244
+ this.updatePopoverOverlay(null, step);
245
+ });
246
+ }
247
+ ngOnInit() {
248
+ this.zone.runOutsideAngular(() => {
249
+ this.subscribeToViewportUpdates();
250
+ this.subscribeToEscapeKey();
251
+ });
252
+ }
253
+ ngOnDestroy() {
254
+ this.destroyPopoverOverlay();
255
+ }
256
+ onNext() {
257
+ this.tourService.next();
258
+ }
259
+ onPrevious() {
260
+ this.tourService.previous();
261
+ }
262
+ onClose() {
263
+ this.tourService.stop();
264
+ }
265
+ onDismiss() {
266
+ const step = this.currentStep();
267
+ if (!step || step.dismissible === false) {
268
+ return;
269
+ }
270
+ this.tourService.stop({
271
+ reason: this.totalSteps() === 1 ? 'dismissed' : 'interrupted',
272
+ doNotShowAgain: false
273
+ });
274
+ }
275
+ updatePopoverOverlay(target, step) {
276
+ const strategy = target
277
+ ? this.overlay
278
+ .position()
279
+ .flexibleConnectedTo(target)
280
+ .withPositions(toConnectedPositions(step.position ?? 'bottom-center'))
281
+ .withFlexibleDimensions(false)
282
+ .withPush(true)
283
+ .withViewportMargin(8)
284
+ : this.overlay.position().global().centerHorizontally().centerVertically();
285
+ if (!this.popoverOverlayRef) {
286
+ this.popoverOverlayRef = this.overlay.create({
287
+ hasBackdrop: false,
288
+ scrollStrategy: target
289
+ ? this.overlay.scrollStrategies.reposition()
290
+ : this.overlay.scrollStrategies.noop(),
291
+ positionStrategy: strategy,
292
+ width: POPOVER_WIDTH
293
+ });
294
+ this.setPopoverZIndex();
295
+ this.attachPopoverPortal(step);
296
+ return;
297
+ }
298
+ this.popoverOverlayRef.updatePositionStrategy(strategy);
299
+ this.popoverOverlayRef.updatePosition();
300
+ this.updatePopoverInputs(step);
301
+ if (target) {
302
+ this.scheduleSync();
303
+ }
304
+ this.scheduleFocusTrapRefocus();
305
+ }
306
+ setPopoverZIndex() {
307
+ if (!this.popoverOverlayRef) {
308
+ return;
309
+ }
310
+ this.popoverOverlayRef.overlayElement.style.zIndex = POPOVER_Z;
311
+ const host = this.popoverOverlayRef.hostElement;
312
+ if (host !== this.popoverOverlayRef.overlayElement) {
313
+ host.style.zIndex = POPOVER_Z;
314
+ }
315
+ }
316
+ attachPopoverPortal(step) {
317
+ this.previouslyFocusedElement = document.activeElement;
318
+ this.popoverComponentRef = this.popoverOverlayRef?.attach(new ComponentPortal(SpotlightComponent, null, this.environmentInjector)) ?? null;
319
+ this.updatePopoverInputs(step);
320
+ this.scheduleSync();
321
+ if (this.totalSteps() > 1) {
322
+ this.activateTourMode();
323
+ }
324
+ if (!this.popoverComponentRef) {
325
+ return;
326
+ }
327
+ this.popoverSubscriptions.push(this.popoverComponentRef.instance.next.subscribe(() => {
328
+ const doNotShowAgain = this.popoverComponentRef?.instance.isDoNotShowAgainChecked() ?? false;
329
+ this.tourService.next(doNotShowAgain);
330
+ }), this.popoverComponentRef.instance.previous.subscribe(() => this.tourService.previous()), this.popoverComponentRef.instance.closed.subscribe(() => this.tourService.stop({
331
+ reason: this.totalSteps() === 1 ? 'dismissed' : 'interrupted',
332
+ doNotShowAgain: false
333
+ })), this.popoverComponentRef.instance.understand.subscribe(() => {
334
+ const doNotShowAgain = this.popoverComponentRef?.instance.isDoNotShowAgainChecked() ?? false;
335
+ this.tourService.stop({ reason: 'completed', doNotShowAgain });
336
+ }));
337
+ }
338
+ updatePopoverInputs(step) {
339
+ if (!this.popoverComponentRef) {
340
+ return;
341
+ }
342
+ this.popoverComponentRef.setInput('title', step.title);
343
+ this.popoverComponentRef.setInput('message', step.message);
344
+ this.popoverComponentRef.setInput('position', step.position ?? 'bottom-center');
345
+ this.popoverComponentRef.setInput('currentStep', this.currentIndex() + 1);
346
+ this.popoverComponentRef.setInput('totalSteps', this.totalSteps());
347
+ this.popoverComponentRef.setInput('content', step.content ?? null);
348
+ this.popoverComponentRef.setInput('actions', step.actions ?? []);
349
+ this.popoverComponentRef.setInput('showDoNotShowAgain', step.showDoNotShowAgain ?? true);
350
+ this.popoverComponentRef.setInput('arrowOffsetPx', null);
351
+ }
352
+ scheduleSync() {
353
+ this.zone.runOutsideAngular(() => {
354
+ requestAnimationFrame(() => {
355
+ this.zone.run(() => this.syncDirectionAndArrow());
356
+ });
357
+ });
358
+ }
359
+ activateTourMode() {
360
+ disableBodyScroll();
361
+ this.zone.runOutsideAngular(() => {
362
+ requestAnimationFrame(() => {
363
+ this.zone.run(() => {
364
+ const paneElement = this.popoverOverlayRef?.overlayElement;
365
+ if (!paneElement) {
366
+ return;
367
+ }
368
+ this.focusTrap = this.focusTrapFactory.create(paneElement);
369
+ this.focusTrap.focusInitialElementWhenReady();
370
+ });
371
+ });
372
+ });
373
+ }
374
+ scheduleFocusTrapRefocus() {
375
+ if (!this.focusTrap) {
376
+ return;
377
+ }
378
+ this.zone.runOutsideAngular(() => {
379
+ requestAnimationFrame(() => {
380
+ this.zone.run(() => this.focusTrap?.focusFirstTabbableElement());
381
+ });
382
+ });
383
+ }
384
+ subscribeToViewportUpdates() {
385
+ fromEvent(document, 'scroll', { capture: true, passive: true })
386
+ .pipe(debounceTime(16), takeUntilDestroyed(this.destroyRef))
387
+ .subscribe(() => this.runOverlayRefresh());
388
+ fromEvent(window, 'resize', { passive: true })
389
+ .pipe(debounceTime(16), takeUntilDestroyed(this.destroyRef))
390
+ .subscribe(() => this.runOverlayRefresh());
391
+ }
392
+ subscribeToEscapeKey() {
393
+ fromEvent(document, 'keydown')
394
+ .pipe(takeUntilDestroyed(this.destroyRef))
395
+ .subscribe((event) => {
396
+ if (event.key === 'Escape') {
397
+ this.zone.run(() => this.onDismiss());
398
+ }
399
+ });
400
+ }
401
+ runOverlayRefresh() {
402
+ this.zone.run(() => {
403
+ this.refreshRect();
404
+ this.popoverOverlayRef?.updatePosition();
405
+ this.scheduleSync();
406
+ });
407
+ }
408
+ syncResolvedElement(target, step) {
409
+ this.zone.runOutsideAngular(() => {
410
+ requestAnimationFrame(() => {
411
+ this.zone.run(() => this.applyResolvedElement(target, step));
412
+ });
413
+ });
414
+ }
415
+ applyResolvedElement(target, step) {
416
+ if (!this.isActive()) {
417
+ return;
418
+ }
419
+ this.updateTargetRect(target);
420
+ this.observeElement(target);
421
+ this.updatePopoverOverlay(target, step);
422
+ }
423
+ syncDirectionAndArrow() {
424
+ const ref = this.popoverComponentRef;
425
+ const pane = this.popoverOverlayRef?.overlayElement.getBoundingClientRect();
426
+ const rect = this.targetRect();
427
+ if (!ref || !pane || !rect) {
428
+ ref?.setInput('arrowOffsetPx', null);
429
+ return;
430
+ }
431
+ const direction = this.computeDirection(pane, rect);
432
+ ref.setInput('position', `${direction}-center`);
433
+ const offset = this.computeArrowOffset(pane, rect, direction);
434
+ ref.setInput('arrowOffsetPx', Math.max(ARROW_OFFSET_MIN, Math.min(ARROW_OFFSET_MAX, offset)));
435
+ }
436
+ computeDirection(pane, rect) {
437
+ const tolerance = SPOTLIGHT_PADDING + 4;
438
+ if (pane.top >= rect.bottom - tolerance) {
439
+ return 'bottom';
440
+ }
441
+ if (pane.bottom <= rect.top + tolerance) {
442
+ return 'top';
443
+ }
444
+ if (pane.left >= rect.right - tolerance) {
445
+ return 'right';
446
+ }
447
+ if (pane.right <= rect.left + tolerance) {
448
+ return 'left';
449
+ }
450
+ return this.computeDirectionByDistance(pane, rect);
451
+ }
452
+ computeDirectionByDistance(pane, rect) {
453
+ const paneCenterY = pane.top + pane.height / 2;
454
+ const rectCenterY = rect.top + rect.height / 2;
455
+ const paneCenterX = pane.left + pane.width / 2;
456
+ const rectCenterX = rect.left + rect.width / 2;
457
+ const deltaY = Math.abs(paneCenterY - rectCenterY);
458
+ const deltaX = Math.abs(paneCenterX - rectCenterX);
459
+ const isVerticalPreferred = deltaY >= deltaX;
460
+ const isAboveTarget = paneCenterY < rectCenterY;
461
+ const verticalDirection = isAboveTarget ? 'top' : 'bottom';
462
+ const horizontalDirection = paneCenterX < rectCenterX ? 'left' : 'right';
463
+ return isVerticalPreferred ? verticalDirection : horizontalDirection;
464
+ }
465
+ computeArrowOffset(pane, rect, direction) {
466
+ const targetCenterX = rect.left + rect.width / 2;
467
+ const targetCenterY = rect.top + rect.height / 2;
468
+ return direction === 'top' || direction === 'bottom'
469
+ ? targetCenterX - pane.left - ARROW_HALF_SIZE
470
+ : targetCenterY - pane.top - ARROW_HALF_SIZE;
471
+ }
472
+ destroyPopoverOverlay() {
473
+ this.popoverSubscriptions.forEach((subscription) => subscription.unsubscribe());
474
+ this.popoverSubscriptions = [];
475
+ this.popoverComponentRef = null;
476
+ if (this.focusTrap) {
477
+ this.focusTrap.destroy();
478
+ this.focusTrap = null;
479
+ }
480
+ enableBodyScroll();
481
+ if (this.previouslyFocusedElement) {
482
+ this.previouslyFocusedElement.focus();
483
+ this.previouslyFocusedElement = null;
484
+ }
485
+ if (this.popoverOverlayRef) {
486
+ this.popoverOverlayRef.detach();
487
+ this.popoverOverlayRef.dispose();
488
+ this.popoverOverlayRef = null;
489
+ }
490
+ }
491
+ updateTargetRect(element) {
492
+ this.targetRect.set(element.getBoundingClientRect());
493
+ }
494
+ refreshRect() {
495
+ const step = this.currentStep();
496
+ if (!step || !this.isActive()) {
497
+ return;
498
+ }
499
+ const element = this.tourService.getElement(step.stepId);
500
+ if (element?.nativeElement) {
501
+ this.updateTargetRect(element.nativeElement);
502
+ }
503
+ }
504
+ observeElement(element) {
505
+ this.resizeObserver = new ResizeObserver(() => {
506
+ this.zone.run(() => this.updateTargetRect(element));
507
+ });
508
+ this.resizeObserver.observe(element);
509
+ }
510
+ disconnectResizeObserver() {
511
+ this.resizeObserver?.disconnect();
512
+ this.resizeObserver = null;
513
+ }
514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpotlightOverlayComponent, isStandalone: true, selector: "sdc-spotlight-overlay", ngImport: i0, template: "@if (isActive() && currentStep(); as step) {\n@if (step.showBackdrop !== false) {\n<button\n type=\"button\"\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n\n@if (targetRect()) {\n<button\n type=\"button\"\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n\n@if (step.showBackdrop === false) {\n@if (step.dismissible === false) {\n<div [ngStyle]=\"transparentBlockerStyle()\"></div>\n} @else {\n<button\n type=\"button\"\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n}\n", dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
516
+ }
517
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightOverlayComponent, decorators: [{
518
+ type: Component,
519
+ args: [{ selector: 'sdc-spotlight-overlay', standalone: true, imports: [NgStyle], template: "@if (isActive() && currentStep(); as step) {\n@if (step.showBackdrop !== false) {\n<button\n type=\"button\"\n [ngStyle]=\"topMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n\n@if (targetRect()) {\n<button\n type=\"button\"\n [ngStyle]=\"leftMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"rightMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n<button\n type=\"button\"\n [ngStyle]=\"bottomMaskStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n\n@if (step.showBackdrop === false) {\n@if (step.dismissible === false) {\n<div [ngStyle]=\"transparentBlockerStyle()\"></div>\n} @else {\n<button\n type=\"button\"\n [ngStyle]=\"transparentBlockerStyle()\"\n (click)=\"onDismiss()\"\n></button>\n}\n}\n}\n" }]
520
+ }], ctorParameters: () => [] });
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9zcG90bGlnaHQvY29tcG9uZW50cy9zcG90bGlnaHQtb3ZlcmxheS9zcG90bGlnaHQtb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Nwb3RsaWdodC9jb21wb25lbnRzL3Nwb3RsaWdodC1vdmVybGF5L3Nwb3RsaWdodC1vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsTUFBTSxFQUdOLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7O0FBSTdFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztB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NEZBQXpCLHlCQUF5QixpRkN4SnRDLHV3QkF1Q0EsNENEOEdZLE9BQU87OzRGQUdOLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRGVzdHJveVJlZixcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZGlzYWJsZUJvZHlTY3JvbGwsIGVuYWJsZUJvZHlTY3JvbGwgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL2JvZHktc2Nyb2xsLnV0aWwnO1xuaW1wb3J0IHR5cGUgeyBTcG90bGlnaHRQb3NpdGlvbiwgU3BvdGxpZ2h0U3RlcCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdHlwZXMvc3BvdGxpZ2h0LnR5cGUnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3BvdGxpZ2h0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTcG90bGlnaHRUb3VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Nwb3RsaWdodC10b3VyLnNlcnZpY2UnO1xuXG50eXBlIFNwb3RsaWdodERpcmVjdGlvbiA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuXG5jb25zdCBQT1BPVkVSX1dJRFRIID0gMzQyO1xuY29uc3QgU1BPVExJR0hUX1BBRERJTkcgPSA4O1xuY29uc3QgQVJST1dfSEFMRl9TSVpFID0gODtcbmNvbnN0IEFSUk9XX09GRlNFVF9NSU4gPSA0O1xuY29uc3QgQVJST1dfT0ZGU0VUX01BWCA9IFBPUE9WRVJfV0lEVEggLSA0IC0gMTY7XG5jb25zdCBNQVNLX0JHID0gJ3JnYmEoMCwwLDAsMC41KSc7XG5jb25zdCBNQVNLX1RSQU5TSVRJT04gPSAnYWxsIDAuMnMgZWFzZSc7XG5jb25zdCBPVkVSTEFZX1ogPSAnMTAwMDAnO1xuY29uc3QgUE9QT1ZFUl9aID0gJzEwMDAxJztcblxuZnVuY3Rpb24gY3JlYXRlTWFza0Jhc2VTdHlsZSgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIaWRkZW5NYXNrU3R5bGUoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiB7XG4gICAgLi4uY3JlYXRlTWFza0Jhc2VTdHlsZSgpLFxuICAgIHRvcDogJzAnLFxuICAgIGxlZnQ6ICcwJyxcbiAgICB3aWR0aDogJzAnLFxuICAgIGhlaWdodDogJzAnXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvQ29ubmVjdGVkUG9zaXRpb25zKHBvc2l0aW9uOiBTcG90bGlnaHRQb3NpdGlvbik6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICBjb25zdCBbZGlyZWN0aW9uLCBhbGlnbm1lbnRdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgY29uc3QgcGFkZGluZyA9IFNQT1RMSUdIVF9QQURESU5HICsgMjtcbiAgY29uc3QgaG9yaXpvbnRhbEFsaWdubWVudCA9IGFsaWdubWVudCBhcyAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJztcbiAgY29uc3QgdmVydGljYWxBbGlnbm1lbnRNYXA6IFJlY29yZDxzdHJpbmcsICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJz4gPSB7XG4gICAgc3RhcnQ6ICd0b3AnLFxuICAgIGNlbnRlcjogJ2NlbnRlcicsXG4gICAgZW5kOiAnYm90dG9tJ1xuICB9O1xuICBjb25zdCB2ZXJ0aWNhbEFsaWdubWVudCA9IHZlcnRpY2FsQWxpZ25tZW50TWFwW2FsaWdubWVudF0gPz8gJ2NlbnRlcic7XG5cbiAgbGV0IHByaW1hcnk6IENvbm5lY3RlZFBvc2l0aW9uO1xuICBsZXQgb3Bwb3NpdGU6IENvbm5lY3RlZFBvc2l0aW9uO1xuXG4gIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHByaW1hcnkgPSB7XG4gICAgICAgIG9yaWdpblg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICBvdmVybGF5WDogaG9yaXpvbnRhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICBvZmZzZXRZOiAtcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgb2Zmc2V0WTogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHByaW1hcnkgPSB7XG4gICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb2Zmc2V0WDogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICBvdmVybGF5WTogdmVydGljYWxBbGlnbm1lbnQsXG4gICAgICAgIG9mZnNldFg6IC1wYWRkaW5nXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBwcmltYXJ5ID0ge1xuICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICBvdmVybGF5WTogdmVydGljYWxBbGlnbm1lbnQsXG4gICAgICAgIG9mZnNldFg6IC1wYWRkaW5nXG4gICAgICB9O1xuICAgICAgb3Bwb3NpdGUgPSB7XG4gICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICBvcmlnaW5ZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgIG92ZXJsYXlZOiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgb2Zmc2V0WDogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBwcmltYXJ5ID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgb2Zmc2V0WTogcGFkZGluZ1xuICAgICAgfTtcbiAgICAgIG9wcG9zaXRlID0ge1xuICAgICAgICBvcmlnaW5YOiBob3Jpem9udGFsQWxpZ25tZW50LFxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgb3ZlcmxheVg6IGhvcml6b250YWxBbGlnbm1lbnQsXG4gICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgb2Zmc2V0WTogLXBhZGRpbmdcbiAgICAgIH07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHByaW1hcnksXG4gICAgb3Bwb3NpdGUsXG4gICAgeyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnLCBvZmZzZXRZOiBwYWRkaW5nIH0sXG4gICAgeyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtcGFkZGluZyB9LFxuICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdjZW50ZXInLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInLCBvZmZzZXRYOiBwYWRkaW5nIH0sXG4gICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IC1wYWRkaW5nIH1cbiAgXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXNwb3RsaWdodC1vdmVybGF5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nU3R5bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodE92ZXJsYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG91clNlcnZpY2UgPSBpbmplY3QoU3BvdGxpZ2h0VG91clNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb2N1c1RyYXBGYWN0b3J5ID0gaW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpO1xuXG4gIHJlYWRvbmx5IGlzQWN0aXZlID0gdGhpcy50b3VyU2VydmljZS5pc0FjdGl2ZTtcbiAgcmVhZG9ubHkgY3VycmVudFN0ZXAgPSB0aGlzLnRvdXJTZXJ2aWNlLmN1cnJlbnRTdGVwO1xuICByZWFkb25seSBjdXJyZW50SW5kZXggPSB0aGlzLnRvdXJTZXJ2aWNlLmN1cnJlbnRJbmRleDtcbiAgcmVhZG9ubHkgdG90YWxTdGVwcyA9IHRoaXMudG91clNlcnZpY2UudG90YWxTdGVwcztcbiAgcmVhZG9ubHkgdGFyZ2V0UmVjdCA9IHNpZ25hbDxET01SZWN0IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgdG9wTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcbiAgICBjb25zdCBiYXNlID0gY3JlYXRlTWFza0Jhc2VTdHlsZSgpO1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCB0b3A6ICcwJywgbGVmdDogJzAnLCByaWdodDogJzAnLCBib3R0b206ICcwJyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICByaWdodDogJzAnLFxuICAgICAgaGVpZ2h0OiBgJHtNYXRoLm1heCgwLCByZWN0LnRvcCAtIFNQT1RMSUdIVF9QQURESU5HKX1weGBcbiAgICB9O1xuICB9KTtcblxuICByZWFkb25seSBsZWZ0TWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgIGlmICghcmVjdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUhpZGRlbk1hc2tTdHlsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wIC0gU1BPVExJR0hUX1BBRERJTkcpO1xuICAgIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20gKyBTUE9UTElHSFRfUEFERElORyk7XG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCAtIFNQT1RMSUdIVF9QQURESU5HKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgd2lkdGg6IGAke2xlZnR9cHhgLFxuICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgXG4gICAgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcmlnaHRNYXNrU3R5bGUgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0UmVjdCgpO1xuXG4gICAgaWYgKCFyZWN0KSB7XG4gICAgICByZXR1cm4gY3JlYXRlSGlkZGVuTWFza1N0eWxlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMCwgcmVjdC50b3AgLSBTUE9UTElHSFRfUEFERElORyk7XG4gICAgY29uc3QgYm90dG9tID0gTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSArIFNQT1RMSUdIVF9QQURESU5HKTtcbiAgICBjb25zdCByaWdodCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCByZWN0LnJpZ2h0ICsgU1BPVExJR0hUX1BBRERJTkcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgJ3otaW5kZXgnOiBPVkVSTEFZX1osXG4gICAgICBiYWNrZ3JvdW5kOiBNQVNLX0JHLFxuICAgICAgdHJhbnNpdGlvbjogTUFTS19UUkFOU0lUSU9OLFxuICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICB0b3A6IGAke3RvcH1weGAsXG4gICAgICBsZWZ0OiBgJHtyaWdodH1weGAsXG4gICAgICByaWdodDogJzAnLFxuICAgICAgaGVpZ2h0OiBgJHtib3R0b20gLSB0b3B9cHhgXG4gICAgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYm90dG9tTWFza1N0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLnRhcmdldFJlY3QoKTtcblxuICAgIGlmICghcmVjdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUhpZGRlbk1hc2tTdHlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICd6LWluZGV4JzogT1ZFUkxBWV9aLFxuICAgICAgYmFja2dyb3VuZDogTUFTS19CRyxcbiAgICAgIHRyYW5zaXRpb246IE1BU0tfVFJBTlNJVElPTixcbiAgICAgIGN1cnNvcjogJ2RlZmF1bHQnLFxuICAgICAgdG9wOiBgJHtNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHJlY3QuYm90dG9tICsgU1BPVExJR0hUX1BBRERJTkcpfXB4YCxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICBib3R0b206ICcwJ1xuICAgIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRyYW5zcGFyZW50QmxvY2tlclN0eWxlID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4gKHtcbiAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICB0b3A6ICcwJyxcbiAgICBsZWZ0OiAnMCcsXG4gICAgcmlnaHQ6ICcwJyxcbiAgICBib3R0b206ICcwJyxcbiAgICAnei1pbmRleCc6IE9WRVJMQVlfWixcbiAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICB9KSk7XG5cbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb3BvdmVyT3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTcG90bGlnaHRDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9wb3ZlclN1YnNjcmlwdGlvbnM6IEFycmF5PHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9PiA9IFtdO1xuICBwcml2YXRlIGZvY3VzVHJhcDogRm9jdXNUcmFwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuY3VycmVudFN0ZXApLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuaXNBY3RpdmUpLFxuICAgICAgdG9PYnNlcnZhYmxlKHRoaXMudG91clNlcnZpY2UucmVnaXN0cmF0aW9uVmVyc2lvbilcbiAgICBdKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChbc3RlcCwgYWN0aXZlXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RSZXNpemVPYnNlcnZlcigpO1xuXG4gICAgICAgIGlmICghc3RlcCB8fCAhYWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy50YXJnZXRSZWN0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuXG4gICAgICAgIGlmIChlbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcblxuICAgICAgICAgIHRoaXMuc3luY1Jlc29sdmVkRWxlbWVudChlbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHN0ZXApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlUG9wb3Zlck92ZXJsYXkobnVsbCwgc3RlcCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvVmlld3BvcnRVcGRhdGVzKCk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRXNjYXBlS2V5KCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblByZXZpb3VzKCk6IHZvaWQge1xuICAgIHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGlzbWlzcygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5jdXJyZW50U3RlcCgpO1xuXG4gICAgaWYgKCFzdGVwIHx8IHN0ZXAuZGlzbWlzc2libGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b3VyU2VydmljZS5zdG9wKHtcbiAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICBkb05vdFNob3dBZ2FpbjogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9wb3Zlck92ZXJsYXkodGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwsIHN0ZXA6IFNwb3RsaWdodFN0ZXApOiB2b2lkIHtcbiAgICBjb25zdCBzdHJhdGVneSA9IHRhcmdldFxuICAgICAgPyB0aGlzLm92ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0KVxuICAgICAgICAud2l0aFBvc2l0aW9ucyh0b0Nvbm5lY3RlZFBvc2l0aW9ucyhzdGVwLnBvc2l0aW9uID8/ICdib3R0b20tY2VudGVyJykpXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFB1c2godHJ1ZSlcbiAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgOiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCk7XG5cbiAgICBpZiAoIXRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGFyZ2V0XG4gICAgICAgICAgPyB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKClcbiAgICAgICAgICA6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgICAgIHdpZHRoOiBQT1BPVkVSX1dJRFRIXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRQb3BvdmVyWkluZGV4KCk7XG4gICAgICB0aGlzLmF0dGFjaFBvcG92ZXJQb3J0YWwoc3RlcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyT3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHN0cmF0ZWd5KTtcbiAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXApO1xuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3BvdmVyWkluZGV4KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyT3ZlcmxheVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmhvc3RFbGVtZW50O1xuXG4gICAgaWYgKGhvc3QgIT09IHRoaXMucG9wb3Zlck92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpIHtcbiAgICAgIGhvc3Quc3R5bGUuekluZGV4ID0gUE9QT1ZFUl9aO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoUG9wb3ZlclBvcnRhbChzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8uYXR0YWNoKFxuICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChTcG90bGlnaHRDb21wb25lbnQsIG51bGwsIHRoaXMuZW52aXJvbm1lbnRJbmplY3RvcilcbiAgICApID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXApO1xuICAgIHRoaXMuc2NoZWR1bGVTeW5jKCk7XG5cbiAgICBpZiAodGhpcy50b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICB0aGlzLmFjdGl2YXRlVG91ck1vZGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucG9wb3ZlclN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5uZXh0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvTm90U2hvd0FnYWluID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc0RvTm90U2hvd0FnYWluQ2hlY2tlZCgpID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLm5leHQoZG9Ob3RTaG93QWdhaW4pO1xuICAgICAgfSksXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UucHJldmlvdXMuc3Vic2NyaWJlKCgpID0+IHRoaXMudG91clNlcnZpY2UucHJldmlvdXMoKSksXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuY2xvc2VkLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICB0aGlzLnRvdXJTZXJ2aWNlLnN0b3Aoe1xuICAgICAgICAgIHJlYXNvbjogdGhpcy50b3RhbFN0ZXBzKCkgPT09IDEgPyAnZGlzbWlzc2VkJyA6ICdpbnRlcnJ1cHRlZCcsXG4gICAgICAgICAgZG9Ob3RTaG93QWdhaW46IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLnVuZGVyc3RhbmQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZG9Ob3RTaG93QWdhaW4gPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWY/Lmluc3RhbmNlLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKCkgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMudG91clNlcnZpY2Uuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3BvdmVySW5wdXRzKHN0ZXA6IFNwb3RsaWdodFN0ZXAgJiB7IHNob3dEb05vdFNob3dBZ2Fpbj86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCd0aXRsZScsIHN0ZXAudGl0bGUpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnbWVzc2FnZScsIHN0ZXAubWVzc2FnZSk7XG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCdwb3NpdGlvbicsIHN0ZXAucG9zaXRpb24gPz8gJ2JvdHRvbS1jZW50ZXInKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2N1cnJlbnRTdGVwJywgdGhpcy5jdXJyZW50SW5kZXgoKSArIDEpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgndG90YWxTdGVwcycsIHRoaXMudG90YWxTdGVwcygpKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbnRlbnQnLCBzdGVwLmNvbnRlbnQgPz8gbnVsbCk7XG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLnNldElucHV0KCdhY3Rpb25zJywgc3RlcC5hY3Rpb25zID8/IFtdKTtcbiAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Nob3dEb05vdFNob3dBZ2FpbicsIHN0ZXAuc2hvd0RvTm90U2hvd0FnYWluID8/IHRydWUpO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5zeW5jRGlyZWN0aW9uQW5kQXJyb3coKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVUb3VyTW9kZSgpOiB2b2lkIHtcbiAgICBkaXNhYmxlQm9keVNjcm9sbCgpO1xuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhbmVFbGVtZW50ID0gdGhpcy5wb3BvdmVyT3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoIXBhbmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLmZvY3VzVHJhcEZhY3RvcnkuY3JlYXRlKHBhbmVFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlRm9jdXNUcmFwUmVmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c1RyYXA/LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9WaWV3cG9ydFVwZGF0ZXMoKTogdm9pZCB7XG4gICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0gYXMgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMpXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTYpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ydW5PdmVybGF5UmVmcmVzaCgpKTtcblxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSBhcyBBZGRFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNiksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJ1bk92ZXJsYXlSZWZyZXNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0VzY2FwZUtleSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMub25EaXNtaXNzKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcnVuT3ZlcmxheVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hSZWN0KCk7XG4gICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgdGhpcy5zY2hlZHVsZVN5bmMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Jlc29sdmVkRWxlbWVudCh0YXJnZXQ6IEhUTUxFbGVtZW50LCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy5hcHBseVJlc29sdmVkRWxlbWVudCh0YXJnZXQsIHN0ZXApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJlc29sdmVkRWxlbWVudCh0YXJnZXQ6IEhUTUxFbGVtZW50LCBzdGVwOiBTcG90bGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QodGFyZ2V0KTtcbiAgICB0aGlzLm9ic2VydmVFbGVtZW50KHRhcmdldCk7XG4gICAgdGhpcy51cGRhdGVQb3BvdmVyT3ZlcmxheSh0YXJnZXQsIHN0ZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jRGlyZWN0aW9uQW5kQXJyb3coKTogdm9pZCB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmO1xuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBvcG92ZXJPdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy50YXJnZXRSZWN0KCk7XG5cbiAgICBpZiAoIXJlZiB8fCAhcGFuZSB8fCAhcmVjdCkge1xuICAgICAgcmVmPy5zZXRJbnB1dCgnYXJyb3dPZmZzZXRQeCcsIG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuY29tcHV0ZURpcmVjdGlvbihwYW5lLCByZWN0KTtcbiAgICByZWYuc2V0SW5wdXQoJ3Bvc2l0aW9uJywgYCR7ZGlyZWN0aW9ufS1jZW50ZXJgKTtcblxuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY29tcHV0ZUFycm93T2Zmc2V0KHBhbmUsIHJlY3QsIGRpcmVjdGlvbik7XG4gICAgcmVmLnNldElucHV0KCdhcnJvd09mZnNldFB4JywgTWF0aC5tYXgoQVJST1dfT0ZGU0VUX01JTiwgTWF0aC5taW4oQVJST1dfT0ZGU0VUX01BWCwgb2Zmc2V0KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRGlyZWN0aW9uKHBhbmU6IERPTVJlY3QsIHJlY3Q6IERPTVJlY3QpOiBTcG90bGlnaHREaXJlY3Rpb24ge1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IFNQT1RMSUdIVF9QQURESU5HICsgNDtcblxuICAgIGlmIChwYW5lLnRvcCA+PSByZWN0LmJvdHRvbSAtIHRvbGVyYW5jZSkge1xuICAgICAgcmV0dXJuICdib3R0b20nO1xuICAgIH1cbiAgICBpZiAocGFuZS5ib3R0b20gPD0gcmVjdC50b3AgKyB0b2xlcmFuY2UpIHtcbiAgICAgIHJldHVybiAndG9wJztcbiAgICB9XG4gICAgaWYgKHBhbmUubGVmdCA+PSByZWN0LnJpZ2h0IC0gdG9sZXJhbmNlKSB7XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICB9XG4gICAgaWYgKHBhbmUucmlnaHQgPD0gcmVjdC5sZWZ0ICsgdG9sZXJhbmNlKSB7XG4gICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVEaXJlY3Rpb25CeURpc3RhbmNlKHBhbmUsIHJlY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlRGlyZWN0aW9uQnlEaXN0YW5jZShwYW5lOiBET01SZWN0LCByZWN0OiBET01SZWN0KTogU3BvdGxpZ2h0RGlyZWN0aW9uIHtcbiAgICBjb25zdCBwYW5lQ2VudGVyWSA9IHBhbmUudG9wICsgcGFuZS5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHJlY3RDZW50ZXJZID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDI7XG4gICAgY29uc3QgcGFuZUNlbnRlclggPSBwYW5lLmxlZnQgKyBwYW5lLndpZHRoIC8gMjtcbiAgICBjb25zdCByZWN0Q2VudGVyWCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuXG4gICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnMocGFuZUNlbnRlclkgLSByZWN0Q2VudGVyWSk7XG4gICAgY29uc3QgZGVsdGFYID0gTWF0aC5hYnMocGFuZUNlbnRlclggLSByZWN0Q2VudGVyWCk7XG5cbiAgICBjb25zdCBpc1ZlcnRpY2FsUHJlZmVycmVkID0gZGVsdGFZID49IGRlbHRhWDtcbiAgICBjb25zdCBpc0Fib3ZlVGFyZ2V0ID0gcGFuZUNlbnRlclkgPCByZWN0Q2VudGVyWTtcbiAgICBjb25zdCB2ZXJ0aWNhbERpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uID0gaXNBYm92ZVRhcmdldCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgY29uc3QgaG9yaXpvbnRhbERpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uID0gcGFuZUNlbnRlclggPCByZWN0Q2VudGVyWCA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgICByZXR1cm4gaXNWZXJ0aWNhbFByZWZlcnJlZCA/IHZlcnRpY2FsRGlyZWN0aW9uIDogaG9yaXpvbnRhbERpcmVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUFycm93T2Zmc2V0KHBhbmU6IERPTVJlY3QsIHJlY3Q6IERPTVJlY3QsIGRpcmVjdGlvbjogU3BvdGxpZ2h0RGlyZWN0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCB0YXJnZXRDZW50ZXJYID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgY29uc3QgdGFyZ2V0Q2VudGVyWSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuXG4gICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ3RvcCcgfHwgZGlyZWN0aW9uID09PSAnYm90dG9tJ1xuICAgICAgPyB0YXJnZXRDZW50ZXJYIC0gcGFuZS5sZWZ0IC0gQVJST1dfSEFMRl9TSVpFXG4gICAgICA6IHRhcmdldENlbnRlclkgLSBwYW5lLnRvcCAtIEFSUk9XX0hBTEZfU0laRTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVBvcG92ZXJPdmVybGF5KCk6IHZvaWQge1xuICAgIHRoaXMucG9wb3ZlclN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5wb3BvdmVyU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZm9jdXNUcmFwID0gbnVsbDtcbiAgICB9XG5cbiAgICBlbmFibGVCb2R5U2Nyb2xsKCk7XG5cbiAgICBpZiAodGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJldmlvdXNseUZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9wb3Zlck92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB0aGlzLnBvcG92ZXJPdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucG9wb3Zlck92ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFyZ2V0UmVjdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMudGFyZ2V0UmVjdC5zZXQoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSZWN0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICBpZiAoIXN0ZXAgfHwgIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRvdXJTZXJ2aWNlLmdldEVsZW1lbnQoc3RlcC5zdGVwSWQpO1xuICAgIGlmIChlbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLnVwZGF0ZVRhcmdldFJlY3QoZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudXBkYXRlVGFyZ2V0UmVjdChlbGVtZW50KSk7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNjb25uZWN0UmVzaXplT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICB9XG59XG4iLCJAaWYgKGlzQWN0aXZlKCkgJiYgY3VycmVudFN0ZXAoKTsgYXMgc3RlcCkge1xuQGlmIChzdGVwLnNob3dCYWNrZHJvcCAhPT0gZmFsc2UpIHtcbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cInRvcE1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cblxuQGlmICh0YXJnZXRSZWN0KCkpIHtcbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cImxlZnRNYXNrU3R5bGUoKVwiXG4gIChjbGljayk9XCJvbkRpc21pc3MoKVwiXG4+PC9idXR0b24+XG48YnV0dG9uXG4gIHR5cGU9XCJidXR0b25cIlxuICBbbmdTdHlsZV09XCJyaWdodE1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbjxidXR0b25cbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtuZ1N0eWxlXT1cImJvdHRvbU1hc2tTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbn1cbn1cblxuQGlmIChzdGVwLnNob3dCYWNrZHJvcCA9PT0gZmFsc2UpIHtcbkBpZiAoc3RlcC5kaXNtaXNzaWJsZSA9PT0gZmFsc2UpIHtcbjxkaXYgW25nU3R5bGVdPVwidHJhbnNwYXJlbnRCbG9ja2VyU3R5bGUoKVwiPjwvZGl2PlxufSBAZWxzZSB7XG48YnV0dG9uXG4gIHR5cGU9XCJidXR0b25cIlxuICBbbmdTdHlsZV09XCJ0cmFuc3BhcmVudEJsb2NrZXJTdHlsZSgpXCJcbiAgKGNsaWNrKT1cIm9uRGlzbWlzcygpXCJcbj48L2J1dHRvbj5cbn1cbn1cbn1cbiJdfQ==