@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
@@ -31,6 +31,7 @@ export class ComboboxComponent extends InputsComponent {
31
31
  overrideChipMessage;
32
32
  maxSelectedLabels = COMBOBOX_DEFAULT_MAX_SELECTED_LABELS;
33
33
  showClear = true;
34
+ searchable = true;
34
35
  iconSelector = false;
35
36
  showIconClass = false;
36
37
  infoTooltip = null;
@@ -159,7 +160,7 @@ export class ComboboxComponent extends InputsComponent {
159
160
  return this.filteredItems.length > 0 && this.filteredItems.every((item) => this.isOptionSelected(item));
160
161
  }
161
162
  get hasSearchQuery() {
162
- return this.searchTerm.trim().length > 0;
163
+ return this.searchable && this.searchTerm.trim().length > 0;
163
164
  }
164
165
  get isOptionsLoading() {
165
166
  return this.iconSelector && this.iconOptionsLoading && this._iconOptionsCacheLang !== this.currentLang;
@@ -188,6 +189,9 @@ export class ComboboxComponent extends InputsComponent {
188
189
  this.onSearchTermChange(event.target?.value ?? '');
189
190
  }
190
191
  onSearchTermChange(value) {
192
+ if (!this.searchable) {
193
+ return;
194
+ }
191
195
  const currentActiveValue = this.activeOptionValue;
192
196
  this.searchTerm = value ?? '';
193
197
  this.openPanel({ focusSearch: false });
@@ -196,6 +200,9 @@ export class ComboboxComponent extends InputsComponent {
196
200
  this.cdr.markForCheck();
197
201
  }
198
202
  onSearchCleared() {
203
+ if (!this.searchable) {
204
+ return;
205
+ }
199
206
  this.searchTerm = '';
200
207
  this.refreshFilteredItems();
201
208
  this.syncHighlightWithSelection();
@@ -455,7 +462,7 @@ export class ComboboxComponent extends InputsComponent {
455
462
  }
456
463
  trackByOptionValue = (_index, item) => item.value;
457
464
  openPanelAndFocusSearch() {
458
- this.openPanel({ focusSearch: true });
465
+ this.openPanel({ focusSearch: this.searchable });
459
466
  }
460
467
  openPanel(options) {
461
468
  if (this.disabled) {
@@ -495,7 +502,7 @@ export class ComboboxComponent extends InputsComponent {
495
502
  }
496
503
  focusTriggerSoon() { queueMicrotask(() => this.focusTrigger()); }
497
504
  focusSearchbox() {
498
- if (!this.panelOpen) {
505
+ if (!this.panelOpen || !this.searchable) {
499
506
  return;
500
507
  }
501
508
  this.singleInputRef?.nativeElement?.blur();
@@ -513,7 +520,7 @@ export class ComboboxComponent extends InputsComponent {
513
520
  this.singleInputRef?.nativeElement?.focus();
514
521
  }
515
522
  refreshFilteredItems(preserveCurrentInvalid = false) {
516
- const query = normalizeComboboxSearchText(this.searchTerm);
523
+ const query = this.searchable ? normalizeComboboxSearchText(this.searchTerm) : '';
517
524
  const all = this.normalizeOptions();
518
525
  if (this.isOptionsLoading) {
519
526
  this.filteredItems = [];
@@ -782,6 +789,9 @@ export class ComboboxComponent extends InputsComponent {
782
789
  this.value = [this.value];
783
790
  }
784
791
  handlePrintableTriggerKey(event) {
792
+ if (!this.searchable) {
793
+ return false;
794
+ }
785
795
  if (!this.isPrintableCharacter(event)) {
786
796
  return false;
787
797
  }
@@ -935,13 +945,13 @@ export class ComboboxComponent extends InputsComponent {
935
945
  this.visibleFilteredItems = [];
936
946
  }
937
947
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
938
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "sdc-combobox", inputs: { multiple: "multiple", appendTo: "appendTo", zIndex: "zIndex", options: "options", overrideChipMessage: "overrideChipMessage", maxSelectedLabels: "maxSelectedLabels", showClear: "showClear", iconSelector: "iconSelector", showIconClass: "showIconClass", infoTooltip: "infoTooltip", infoTooltipPosition: "infoTooltipPosition", infoTooltipEvent: "infoTooltipEvent", infoTooltipAllowHtml: "infoTooltipAllowHtml" }, outputs: { selectedValueEvent: "onSelectedItem", panelClosed: "panelClosed" }, providers: [
948
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "sdc-combobox", inputs: { multiple: "multiple", appendTo: "appendTo", zIndex: "zIndex", options: "options", overrideChipMessage: "overrideChipMessage", maxSelectedLabels: "maxSelectedLabels", showClear: "showClear", searchable: "searchable", iconSelector: "iconSelector", showIconClass: "showIconClass", infoTooltip: "infoTooltip", infoTooltipPosition: "infoTooltipPosition", infoTooltipEvent: "infoTooltipEvent", infoTooltipAllowHtml: "infoTooltipAllowHtml" }, outputs: { selectedValueEvent: "onSelectedItem", panelClosed: "panelClosed" }, providers: [
939
949
  {
940
950
  provide: NG_VALUE_ACCESSOR,
941
951
  useExisting: forwardRef(() => ComboboxComponent),
942
952
  multi: true
943
953
  }
944
- ], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
954
+ ], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
945
955
  }
946
956
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, decorators: [{
947
957
  type: Component,
@@ -961,7 +971,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
961
971
  useExisting: forwardRef(() => ComboboxComponent),
962
972
  multi: true
963
973
  }
964
- ], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (option of filteredItems; track trackByOptionValue(index, option); let index = $index) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
974
+ ], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
965
975
  }], ctorParameters: () => [], propDecorators: { multiple: [{
966
976
  type: Input
967
977
  }], appendTo: [{
@@ -976,6 +986,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
976
986
  type: Input
977
987
  }], showClear: [{
978
988
  type: Input
989
+ }], searchable: [{
990
+ type: Input
979
991
  }], iconSelector: [{
980
992
  type: Input
981
993
  }], showIconClass: [{
@@ -1015,4 +1027,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1015
1027
  type: ViewChild,
1016
1028
  args: ['optionsViewportRef']
1017
1029
  }] } });
1018
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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UTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDb0Isa0JBQWtCO3NCQUEzQyxNQUFNO3VCQUFDLGdCQUFnQjtnQkFDZCxXQUFXO3NCQUFwQixNQUFNO2dCQUNzQixPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDSyxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNELGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNLLGNBQWM7c0JBQTdDLFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNGLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDRyxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDTSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBDT01CT0JPWF9ERUZBVUxUX01BWF9TRUxFQ1RFRF9MQUJFTFMsXG4gIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVCxcbiAgQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYLFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0JVRkZFUl9TSVpFLFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0RFRkFVTFRfUk9XX0hFSUdIVCxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9ST1dfSEVJR0hUX1dJVEhfQ0xBU1MsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfVklFV1BPUlRfRkFMTEJBQ0tfSEVJR0hULFxuICBDT01CT0JPWF9SRU1PVkVfQ0hJUF9MQUJFTF9LRVksXG4gIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWVxufSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy9jb21ib2JveC5jb25zdCc7XG5pbXBvcnQgeyBJY29uU2VsZWN0b3JEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvaWNvbi1zZWxlY3Rvci1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW5wdXRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL2lucHV0cy5kaXJlY3RpdmUnO1xuaW1wb3J0IHR5cGUgeyBDaGlwUmVtb3ZlRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2NoaXBzLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25JdGVtLCBPcHRpb25zLCBPcHRpb25WYWx1ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvc2VtYW50aWNzLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBUb29sdGlwRXZlbnQsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvdG9vbHRpcC50eXBlJztcbmltcG9ydCB7IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pMThuLnV0aWwnO1xuaW1wb3J0IHsgbmV4dFNlcXVlbnRpYWxJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvaWQudXRpbCc7XG5pbXBvcnQgeyBJY29uUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2NvbXBvbmVudHMvaWNvbi1yZW5kZXJlci9pY29uLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IFRvb2x0aXBDb21wb25lbnQgfSBmcm9tICcuLi90b29sdGlwL3Rvb2x0aXAuY29tcG9uZW50JztcbmltcG9ydCB7IGFzQ29tYm9ib3hBcnJheSwgYnVpbGRDb21ib2JveFNlYXJjaFRleHQsIGJ1aWxkQ29tYm9ib3hVaVN0YXRlLCBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucywgYnVpbGRWaXNpYmxlQ29tYm9ib3hPcHRpb25zLCBjcmVhdGVSZXNvbHZlZENvbWJvYm94T3B0aW9uLCBnZXRBY3RpdmVPcHRpb25WYWx1ZSwgZ2V0Rmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUsIGdldFNlbGVjdGVkQ291bnQsIG5vcm1hbGl6ZUNvbWJvYm94U2VhcmNoVGV4dCwgbm9ybWFsaXplRXh0ZXJuYWxDb21ib2JveFZhbHVlLCBzaG91bGRDb2xsYXBzZUNvbWJvYm94Q2hpcERpc3BsYXksIHR5cGUgQ29tYm9ib3hEaXNwbGF5TW9kZSwgdHlwZSBDb21ib2JveFJlc29sdmVkT3B0aW9uLCB0eXBlIENvbWJvYm94VWlTdGF0ZSwgdHlwZSBDb21ib2JveFZhbHVlLCB0eXBlIENvbWJvYm94VmlzaWJsZU9wdGlvbiwgdHlwZSBIaWdobGlnaHRTdGVwLCB0eXBlIFBhbmVsQ2xvc2VSZWFzb24gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2NvbWJvYm94LnV0aWwnO1xuQENvbXBvbmVudCh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEljb25SZW5kZXJlckNvbXBvbmVudCxcbiAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIFBvcG92ZXJDb21wb25lbnQsXG4gICAgU2VhcmNoYm94Q29tcG9uZW50LFxuICAgIFRvb2x0aXBDb21wb25lbnRcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdzZGMtY29tYm9ib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBJbnB1dHNDb21wb25lbnQ8T3B0aW9uVmFsdWUgfCBPcHRpb25WYWx1ZVtdPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VsZWN0b3JEYXRhID0gaW5qZWN0KEljb25TZWxlY3RvckRhdGFTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdlbmVyYXRlZElkID0gbmV4dFNlcXVlbnRpYWxJZCgnc2RjLWNvbWJvYm94Jyk7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGVuZFRvOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHpJbmRleCA9IENPTUJPQk9YX0RFRkFVTFRfWl9JTkRFWDtcbiAgQElucHV0KCkgb3B0aW9uczogT3B0aW9ucyB8IHN0cmluZyA9IFtdO1xuICBASW5wdXQoKSBvdmVycmlkZUNoaXBNZXNzYWdlPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhTZWxlY3RlZExhYmVscyA9IENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUztcbiAgQElucHV0KCkgc2hvd0NsZWFyID0gdHJ1ZTtcbiAgQElucHV0KCkgaWNvblNlbGVjdG9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uQ2xhc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5mb1Rvb2x0aXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAncmlnaHQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcEV2ZW50OiBUb29sdGlwRXZlbnQgPSAnYm90aCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQWxsb3dIdG1sID0gZmFsc2U7XG4gIEBPdXRwdXQoJ29uU2VsZWN0ZWRJdGVtJykgc2VsZWN0ZWRWYWx1ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveFZhbHVlPigpO1xuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGlzT3B0aW9uc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nICYmIHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nICE9PSB0aGlzLmN1cnJlbnRMYW5nO1xuICB9XG4gIGdldCB1c2VWaXJ0dWFsaXplZE9wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlbGVjdG9yICYmIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzaG93RW1wdHlTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNPcHRpb25zTG9hZGluZyAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID09PSAwO1xuICB9XG4gIGdldCBvcHRpb25Sb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbkNsYXNzXG4gICAgICA/IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfUk9XX0hFSUdIVF9XSVRIX0NMQVNTXG4gICAgICA6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hUO1xuICB9XG4gIGdldCBiZWZvcmVWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggKiB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgfVxuICBnZXQgYWZ0ZXJWaXJ0dWFsU3BhY2VySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsICh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy52aXNpYmxlRW5kSW5kZXgpICogdGhpcy5vcHRpb25Sb3dIZWlnaHQpO1xuICB9XG4gIG9uU2VhcmNoKGV2ZW50OiB7IHF1ZXJ5Pzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoU3RyaW5nKGV2ZW50Py5xdWVyeSA/PyAnJykpO1xuICB9XG4gIG9uUGFuZWxJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VhcmNoVGVybUNoYW5nZSgoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8udmFsdWUgPz8gJycpO1xuICB9XG4gIG9uU2VhcmNoVGVybUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uc1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gIH1cbiAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNraXBOZXh0Rm9jdXNPcGVuKSB7XG4gICAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICB9XG4gIG9uSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGV2ZW50LnRhcmdldC5pZCA9PT0gdGhpcy51aS5wYW5lbFNlYXJjaElkZW50aXR5LmlkKSB7XG4gICAgICB0aGlzLm9uU2VhcmNoYm94S2V5ZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub25UcmlnZ2VyS2V5ZG93bihldmVudCk7XG4gIH1cbiAgb25UcmlnZ2VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVRyaWdnZXJBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlck9wZW5LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25TZWFyY2hib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94QXJyb3dLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveEJvdW5kYXJ5S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudCk7XG4gIH1cbiAgb25Db250cm9sTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAvLyBLZWVwIHRoZSBwYW5lbCBzZWFyY2hib3ggZm9jdXNlZCBldmVuIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSB0cmlnZ2VyIGFyZWEgYWdhaW4uXG4gICAgICAvLyBXaXRob3V0IHByZXZlbnRpbmcgdGhlIHRyaWdnZXIgZnJvbSB0YWtpbmcgZm9jdXMgZmlyc3QsIHRoZSBjYXJldCBtYXkgZGlzYXBwZWFyIGV2ZW5cbiAgICAgIC8vIHRob3VnaCB0eXBpbmcgc3RpbGwgdXBkYXRlcyB0aGUgc2VhcmNoYm94LlxuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3VwcHJlc3MgZm9jdXMtdHJpZ2dlcmVkIG9wZW46IGluIHNpbmdsZSBtb2RlIHRoZSBpbnB1dCByZWNlaXZlcyBmb2N1cyBvbiBtb3VzZWRvd24sXG4gICAgLy8gd2hpY2ggZmlyZXMgb25JbnB1dEZvY3VzKCkgYmVmb3JlIHRoZSBjbGljayBldmVudC4gV2l0aG91dCB0aGlzIGZsYWcsIG9uSW5wdXRGb2N1c1xuICAgIC8vIHdvdWxkIG9wZW4gdGhlIHBhbmVsIGFuZCB0aGUgc3Vic2VxdWVudCBjbGljayAob25Db250cm9sQ2xpY2spIHdvdWxkIGltbWVkaWF0ZWx5IGNsb3NlIGl0LlxuICAgIHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSBmYWxzZTsgfSwgMCk7XG4gIH1cbiAgb25Db250cm9sQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25Ub2dnbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuICBvblBvcG92ZXJPcGVuQ2hhbmdlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAob3BlbiB8fCAhdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZVBhbmVsKCdvdXRzaWRlJyk7XG4gIH1cbiAgdG9nZ2xlUGFuZWwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlUGFuZWwoJ3RvZ2dsZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgY2xlYXJBbGwoZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3QgY2xlYXJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsID0gdGhpcy5tdWx0aXBsZSA/IFtdIDogbnVsbDtcbiAgICBjb25zdCBzaG91bGRSZWZvY3VzU2VhcmNoID0gdGhpcy5wYW5lbE9wZW47XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy52YWx1ZSA9IGNsZWFyZWRWYWx1ZTtcbiAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZShjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoY2xlYXJlZFZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChzaG91bGRSZWZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBvbk9wdGlvbkNsaWNrKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihvcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uKTtcbiAgfVxuICBvbk9wdGlvbkNoZWNrYm94Q2hhbmdlKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbiwgY2hlY2tlZCk7XG4gICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgfVxuICBvbk9wdGlvbkNoZWNrYm94S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgndG9nZ2xlJyk7XG4gICAgfVxuICB9XG4gIG9uT3B0aW9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgb3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VudGVyJyAmJiBldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub25PcHRpb25DbGljayhvcHRpb24pO1xuICB9XG4gIHRvZ2dsZUFsbEZpbHRlcmVkSXRlbXMoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlVmFsdWUgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gbmV3IFNldChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZmlsdGVyZWRJdGVtcykge1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZFZhbHVlcy5kZWxldGUob3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3JkZXJlZFZhbHVlcyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gc2VsZWN0ZWRWYWx1ZXMuaGFzKGVudHJ5LnZhbHVlKSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3JkZXJlZFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIHJlbW92ZVNlbGVjdGVkSXRlbShvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQ/LigpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24/LigpO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50QWN0aXZlVmFsdWUgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkuZmlsdGVyKChlbnRyeSkgPT4gIU9iamVjdC5pcyhlbnRyeSwgb3B0aW9uLnZhbHVlKSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUoY3VycmVudFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIG9uQ2hpcFJlbW92ZWQoZXZlbnQ6IENoaXBSZW1vdmVFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMucmVzb2x2ZU9wdGlvbihldmVudC52YWx1ZSk7XG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEl0ZW0ob3B0aW9uLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgfVxuICByZXNvbHZlT3B0aW9uKG9wdE9yVmFsdWU6IHVua25vd24pOiBDb21ib2JveFJlc29sdmVkT3B0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKCk7XG4gICAgaWYgKG9wdE9yVmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0T3JWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG9iaiA9IG9wdE9yVmFsdWUgYXMgeyB0ZXh0Pzogc3RyaW5nOyB2YWx1ZT86IE9wdGlvblZhbHVlIH07XG4gICAgICBpZiAoJ3RleHQnIGluIG9iaiAmJiAndmFsdWUnIGluIG9iaikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLihvYmogYXMgT3B0aW9uSXRlbSksXG4gICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVUZXh0KG9iai50ZXh0KSxcbiAgICAgICAgICBzZWFyY2hUZXh0OiBidWlsZENvbWJvYm94U2VhcmNoVGV4dCh0aGlzLnRyYW5zbGF0ZVRleHQob2JqLnRleHQpLCB0aGlzLmFzVGV4dChvYmoudmFsdWUpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCd2YWx1ZScgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiBhbGwuZmluZCgob3B0aW9uKSA9PiBPYmplY3QuaXMob3B0aW9uLnZhbHVlLCBvYmoudmFsdWUpKSA/PyBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsLmZpbmQoKG9wdGlvbikgPT4gT2JqZWN0LmlzKG9wdGlvbi52YWx1ZSwgb3B0T3JWYWx1ZSBhcyBPcHRpb25WYWx1ZSkpID8/IG51bGw7XG4gIH1cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLnNvbWUoKGVudHJ5KSA9PiBPYmplY3QuaXMoZW50cnksIG9wdGlvbi52YWx1ZSkpO1xuICB9XG4gIGlzT3B0aW9uQWN0aXZlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEluZGV4ID09PSBpbmRleDtcbiAgfVxuICBvbk9wdGlvbk1vdXNlRW50ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChpbmRleCwgZmFsc2UpO1xuICB9XG4gIG9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCA9IHRydWU7XG4gIH1cbiAgb25PcHRpb25zUGFuZWxNb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIG9wdGlvbk1ldGFUZXh0KG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgIXRoaXMuc2hvd0ljb25DbGFzcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb24uaWNvbkNsYXNzTmFtZSA/PyBudWxsO1xuICB9XG4gIG9wdGlvbklkKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnVpLmNvbnRyb2xJZH0tb3B0aW9uLSR7aW5kZXh9YDtcbiAgfVxuICBjaGlwUmVtb3ZlQXJpYUxhYmVsKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCh0aGlzLnRyYW5zbGF0ZSwgbnVsbCwgQ09NQk9CT1hfUkVNT1ZFX0NISVBfTEFCRUxfS0VZKTtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFx7bGFiZWxcXH0vZywgb3B0aW9uLnRleHQpO1xuICB9XG4gIHRyYWNrQnlPcHRpb25WYWx1ZSA9IChfaW5kZXg6IG51bWJlciwgaXRlbTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IE9wdGlvblZhbHVlID0+IGl0ZW0udmFsdWU7XG4gIHByaXZhdGUgb3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogdHJ1ZSB9KTtcbiAgfVxuICBwcml2YXRlIG9wZW5QYW5lbChvcHRpb25zOiB7IGZvY3VzU2VhcmNoOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTtcbiAgICB0aGlzLnBhbmVsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcyh0cnVlKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKHRoaXMucmVzb2x2ZVByZWZlcnJlZEhpZ2hsaWdodFZhbHVlKCkpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucG9wb3Zlcj8ucmVwb3NpdGlvbigpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmModHJ1ZSk7XG4gICAgaWYgKG9wdGlvbnMuZm9jdXNTZWFyY2gpIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2xvc2VQYW5lbChyZWFzb246IFBhbmVsQ2xvc2VSZWFzb24pOiB2b2lkIHtcbiAgICBjb25zdCByZXN0b3JlVHJpZ2dlckZvY3VzID0gcmVhc29uID09PSAnZXNjYXBlJyB8fCByZWFzb24gPT09ICdzZWxlY3Rpb24nIHx8IHJlYXNvbiA9PT0gJ3RvZ2dsZSc7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnJlc2V0VmlydHVhbFdpbmRvdygpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHJlc3RvcmVUcmlnZ2VyRm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXNUcmlnZ2VyU29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZvY3VzU2VhcmNoYm94U29vbigpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmZvY3VzU2VhcmNoYm94KCkpO1xuICAgIGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpLCAwKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLmZvY3VzU2VhcmNoYm94KCkpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyU29vbigpOiB2b2lkIHsgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1RyaWdnZXIoKSk7IH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2luZ2xlSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmJsdXIoKTtcbiAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyPy4oKTtcbiAgICB0aGlzLnBhbmVsU2VhcmNoYm94Py5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5wb3BvdmVyPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaEZpbHRlcmVkSXRlbXMocHJlc2VydmVDdXJyZW50SW52YWxpZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBub3JtYWxpemVDb21ib2JveFNlYXJjaFRleHQodGhpcy5zZWFyY2hUZXJtKTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgICBpZiAodGhpcy5pc09wdGlvbnNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKHRydWUpO1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VhcmNoVGV4dC5pbmNsdWRlcyhxdWVyeSkpXG4gICAgICA6IGFsbC5zbGljZSgpO1xuICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCFxdWVyeSk7XG4gICAgaWYgKCFxdWVyeSAmJiBwcmVzZXJ2ZUN1cnJlbnRJbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW52YWxpZCA9IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggPT09IDAgJiYgYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLmxlbmd0aCA9PT0gMCAmJiBxdWVyeS5sZW5ndGggPiAwO1xuICB9XG4gIHByaXZhdGUgc2V0SGlnaGxpZ2h0ZWRJbmRleChpbmRleDogbnVtYmVyLCBlbnN1cmVWaXNpYmxlID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSkpO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IG5leHRJbmRleDtcbiAgICBpZiAoZW5zdXJlVmlzaWJsZSAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5zY3JvbGxIaWdobGlnaHRlZE9wdGlvbkludG9WaWV3KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbW92ZUhpZ2hsaWdodChzdGVwOiBIaWdobGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA8IDApIHtcbiAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChzdGVwID4gMCA/IDAgOiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucG9pbnRlck1vdmVkU2luY2VLZXlib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleCgodGhpcy5oaWdobGlnaHRlZEluZGV4ICsgc3RlcCArIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpICUgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihwcmVmZXJyZWRWYWx1ZTogT3B0aW9uVmFsdWUgfCBudWxsID0gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbmRpZGF0ZVZhbHVlcyA9IFtcbiAgICAgIHByZWZlcnJlZFZhbHVlLFxuICAgICAgIXRoaXMubXVsdGlwbGUgPyB0aGlzLnNlbGVjdGVkU2luZ2xlT3B0aW9uPy52YWx1ZSA/PyBudWxsIDogdGhpcy5maXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSxcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtc1swXT8udmFsdWUgPz8gbnVsbFxuICAgIF07XG4gICAgY29uc3QgbmV4dEluZGV4ID0gY2FuZGlkYXRlVmFsdWVzXG4gICAgICAubWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbCA/IC0xIDogdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gT2JqZWN0LmlzKGl0ZW0udmFsdWUsIHZhbHVlKSkpXG4gICAgICAuZmluZCgoaW5kZXgpID0+IGluZGV4ID49IDApO1xuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleChuZXh0SW5kZXggPz8gMCk7XG4gIH1cbiAgcHJpdmF0ZSBzY3JvbGxIaWdobGlnaHRlZE9wdGlvbkludG9WaWV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZVZpcnR1YWxpemVkT3B0aW9ucykge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm9wdGlvbnNWaWV3cG9ydFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25Ub3AgPSB0aGlzLmhpZ2hsaWdodGVkSW5kZXggKiB0aGlzLm9wdGlvblJvd0hlaWdodDtcbiAgICAgIGNvbnN0IG9wdGlvbkJvdHRvbSA9IG9wdGlvblRvcCArIHRoaXMub3B0aW9uUm93SGVpZ2h0O1xuICAgICAgY29uc3Qgdmlld3BvcnRUb3AgPSB2aWV3cG9ydC5zY3JvbGxUb3A7XG4gICAgICBjb25zdCB2aWV3cG9ydEJvdHRvbSA9IHZpZXdwb3J0VG9wICsgdmlld3BvcnQuY2xpZW50SGVpZ2h0O1xuICAgICAgaWYgKG9wdGlvblRvcCA8IHZpZXdwb3J0VG9wKSB7XG4gICAgICAgIHZpZXdwb3J0LnNjcm9sbFRvcCA9IG9wdGlvblRvcDtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uQm90dG9tID4gdmlld3BvcnRCb3R0b20pIHtcbiAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG9wID0gb3B0aW9uQm90dG9tIC0gdmlld3BvcnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGhpZ2hsaWdodGVkIG9wdGlvbiBpcyBhbHJlYWR5IGZ1bGx5IHZpc2libGUuXG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpKTtcbiAgICAgIGlmICh0eXBlb2Ygbm9kZT8uc2Nyb2xsSW50b1ZpZXcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm9kZS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLmZpbHRlcmVkSXRlbXNbdGhpcy5oaWdobGlnaHRlZEluZGV4XTtcbiAgICBpZiAoIWFjdGl2ZU9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy50b2dnbGVPcHRpb24oYWN0aXZlT3B0aW9uKTtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0U2luZ2xlT3B0aW9uKGFjdGl2ZU9wdGlvbik7XG4gIH1cbiAgcHJpdmF0ZSBzZWxlY3RTaW5nbGVPcHRpb24ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLmNsb3NlUGFuZWwoJ3NlbGVjdGlvbicpO1xuICB9XG4gIHByaXZhdGUgdG9nZ2xlT3B0aW9uKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgZm9yY2VDaGVja2VkOiBib29sZWFuIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IG5ldyBTZXQoYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpKTtcbiAgICBjb25zdCBzaG91bGRTZWxlY3QgPSB0aGlzLnJlc29sdmVPcHRpb25DaGVja2VkU3RhdGUoc2VsZWN0ZWRWYWx1ZXMsIG9wdGlvbiwgZm9yY2VDaGVja2VkKTtcbiAgICBpZiAoc2hvdWxkU2VsZWN0KSB7XG4gICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRWYWx1ZXMuZGVsZXRlKG9wdGlvbi52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG9yZGVyZWRWYWx1ZXMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IHNlbGVjdGVkVmFsdWVzLmhhcyhlbnRyeS52YWx1ZSkpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpO1xuICAgIHRoaXMucHJvcGFnYXRlRnJvbVZhbHVlKG9yZGVyZWRWYWx1ZXMpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IGJ1aWxkVmlzaWJsZUNvbWJvYm94T3B0aW9ucyh7XG4gICAgICByZXNldFNjcm9sbCxcbiAgICAgIGJ1ZmZlclNpemU6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gICAgICBmYWxsYmFja1ZpZXdwb3J0SGVpZ2h0OiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1ZJRVdQT1JUX0ZBTExCQUNLX0hFSUdIVCxcbiAgICAgIGZpbHRlcmVkSXRlbXM6IHRoaXMuZmlsdGVyZWRJdGVtcyxcbiAgICAgIG9wdGlvblJvd0hlaWdodDogdGhpcy5vcHRpb25Sb3dIZWlnaHQsXG4gICAgICB1c2VWaXJ0dWFsaXplZE9wdGlvbnM6IHRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zLFxuICAgICAgdmlld3BvcnQ6IHRoaXMub3B0aW9uc1ZpZXdwb3J0UmVmPy5uYXRpdmVFbGVtZW50XG4gICAgfSk7XG4gICAgdGhpcy52aXNpYmxlU3RhcnRJbmRleCA9IG5leHRTdGF0ZS52aXNpYmxlU3RhcnRJbmRleDtcbiAgICB0aGlzLnZpc2libGVFbmRJbmRleCA9IG5leHRTdGF0ZS52aXNpYmxlRW5kSW5kZXg7XG4gICAgdGhpcy52aXNpYmxlRmlsdGVyZWRJdGVtcyA9IG5leHRTdGF0ZS52aXNpYmxlRmlsdGVyZWRJdGVtcztcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZU9wdGlvbnMoKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdIHtcbiAgICBpZiAodGhpcy5pY29uU2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgICAgaWYgKHRoaXMuX2ljb25PcHRpb25zQ2FjaGVMYW5nID09PSB0aGlzLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pY29uT3B0aW9uc0NhY2hlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMuY3VycmVudExhbmc7XG4gICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gdGhpcy5fb3B0aW9uc0NhY2hlS2V5ICYmIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPT09IGN1cnJlbnRMYW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NhY2hlO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdGhpcy5wYXJzZU5vcm1hbGl6ZWRPcHRpb25zSW5wdXQoKTtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9IGN1cnJlbnRMYW5nO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZSA9IG5leHQubWFwKChvcHRpb24pID0+IGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24ob3B0aW9uLCAodmFsdWUpID0+IHRoaXMudHJhbnNsYXRlVGV4dCh2YWx1ZSkpKTtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NhY2hlO1xuICB9XG4gIHByaXZhdGUgYXNUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnOyB9XG4gIHByaXZhdGUgdHJhbnNsYXRlVGV4dCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7IHJldHVybiByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCh0aGlzLnRyYW5zbGF0ZSwgdGhpcy5hc1RleHQodmFsdWUpKTsgfVxuICBwcml2YXRlIHBhcnNlTm9ybWFsaXplZE9wdGlvbnNJbnB1dCgpOiBPcHRpb25JdGVtW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMgYXMgT3B0aW9uSXRlbVtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMgfHwgJ1tdJyk7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gKHBhcnNlZCBhcyBPcHRpb25JdGVtW10pIDogW107XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nID8/IHRoaXMudHJhbnNsYXRlLmdldERlZmF1bHRMYW5nPy4oKSA/PyAnJztcbiAgfVxuICBwcml2YXRlIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFNlbGVjdGVkQ291bnQodGhpcy52YWx1ZSwgdGhpcy5tdWx0aXBsZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgYWN0aXZlT3B0aW9uVmFsdWUoKTogT3B0aW9uVmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0QWN0aXZlT3B0aW9uVmFsdWUodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLmhpZ2hsaWdodGVkSW5kZXgpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlKCk6IE9wdGlvblZhbHVlIHwgbnVsbCB7XG4gICAgcmV0dXJuIGdldEZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5TW9kZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuZGlzcGxheU1vZGUgPSAnc3VtbWFyeSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheU1vZGUgPSB0aGlzLnNob3VsZENvbGxhcHNlQ2hpcERpc3BsYXlUb1N1bW1hcnkoKSA/ICdzdW1tYXJ5JyA6ICdjaGlwJztcbiAgfVxuICBwcml2YXRlIHByb3BhZ2F0ZUZyb21WYWx1ZSh2YWx1ZTogT3B0aW9uVmFsdWUgfCBPcHRpb25WYWx1ZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoYXNDb21ib2JveEFycmF5KHRoaXMudmFsdWUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlbWl0dGVkVmFsdWUgPSB0aGlzLnZhbHVlID8/ICh0aGlzLm11bHRpcGxlID8gW10gOiBudWxsKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVFdmVudC5lbWl0KGVtaXR0ZWRWYWx1ZSk7XG4gICAgdGhpcy5jb21taXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgaXNQcmludGFibGVDaGFyYWN0ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICB9XG4gIHByaXZhdGUgc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnN5bmNDaGlwUHJlc2VudGF0aW9uKCkpO1xuICAgIGNvbnN0IHNjaGVkdWxlID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgIDogKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjaykgPT4gZ2xvYmFsVGhpcy53aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayhwZXJmb3JtYW5jZS5ub3coKSksIDApO1xuICAgIHNjaGVkdWxlKCgpID0+IHRoaXMuc3luY0NoaXBQcmVzZW50YXRpb24oKSk7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jQ2hpcFByZXNlbnRhdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0RGlzcGxheU1vZGU6ICdjaGlwJyB8ICdzdW1tYXJ5JyA9IHRoaXMuc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpID8gJ3N1bW1hcnknIDogJ2NoaXAnO1xuICAgIGlmICh0aGlzLmRpc3BsYXlNb2RlID09PSBuZXh0RGlzcGxheU1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IG5leHREaXNwbGF5TW9kZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIHNob3VsZENvbGxhcHNlQ2hpcERpc3BsYXlUb1N1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSh7XG4gICAgICBtdWx0aXBsZTogdGhpcy5tdWx0aXBsZSxcbiAgICAgIHNlbGVjdGVkSXRlbUNvdW50OiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoLFxuICAgICAgc2VsZWN0ZWRDb3VudDogdGhpcy5zZWxlY3RlZENvdW50LFxuICAgICAgbWF4U2VsZWN0ZWRMYWJlbHM6IHRoaXMubWF4U2VsZWN0ZWRMYWJlbHMsXG4gICAgICBhdmFpbGFibGVXaWR0aDogdGhpcy5tdWx0aVZhbHVlUmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRXaWR0aCA/PyAwLFxuICAgICAgcmVxdWlyZWRXaWR0aDogdGhpcy5jaGlwTWVhc3VyZVJlZj8ubmF0aXZlRWxlbWVudD8uc2Nyb2xsV2lkdGggPz8gMFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmVzZXRPcHRpb25zQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlS2V5ID0gbnVsbDtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlID0gW107XG4gICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSAnJztcbiAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlID0gW107XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoQ29tYm9ib3hTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVPcHRpb25zQ2FjaGVDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snb3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnJlc2V0T3B0aW9uc0NhY2hlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlVmlydHVhbFdpbmRvd0NoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpY29uU2VsZWN0b3InXSB8fCBjaGFuZ2VzWydzaG93SWNvbkNsYXNzJ10pIHtcbiAgICAgIHRoaXMucmVzZXRWaXJ0dWFsV2luZG93KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZWxlY3RvciddKSB7XG4gICAgICB0aGlzLmVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoRmlsdGVyZWRTdGF0ZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzT3B0aW9uQ2hhbmdlcyA9ICEhY2hhbmdlc1snb3B0aW9ucyddO1xuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ211bHRpcGxlJ10gfHwgISFjaGFuZ2VzWyd2YWx1ZSddO1xuICAgIGNvbnN0IGhhc0ljb25DaGFuZ2VzID0gISFjaGFuZ2VzWydpY29uU2VsZWN0b3InXSB8fCAhIWNoYW5nZXNbJ3Nob3dJY29uQ2xhc3MnXTtcblxuICAgIHJldHVybiBoYXNPcHRpb25DaGFuZ2VzIHx8IGhhc1NlbGVjdGlvbkNoYW5nZXMgfHwgaGFzSWNvbkNoYW5nZXM7XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRSZWZyZXNoRGlzcGxheU1vZGUoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShjaGFuZ2VzWydtdWx0aXBsZSddIHx8IGNoYW5nZXNbJ21heFNlbGVjdGVkTGFiZWxzJ10gfHwgY2hhbmdlc1sndmFsdWUnXSk7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemVWYWx1ZUZvck11bHRpcGxlTW9kZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCFjaGFuZ2VzWydtdWx0aXBsZSddIHx8ICF0aGlzLm11bHRpcGxlIHx8IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgfHwgdGhpcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBbdGhpcy52YWx1ZV07XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVQcmludGFibGVUcmlnZ2VyS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzUHJpbnRhYmxlQ2hhcmFjdGVyKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGV2ZW50LmtleTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm5hdmlnYXRlVHJpZ2dlckFycm93KC0xKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRyaWdnZXJBcnJvdyhzdGVwOiBIaWdobGlnaHRTdGVwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgICAgaWYgKHN0ZXAgPCAwKSB7XG4gICAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRJbmRleCh0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubW92ZUhpZ2hsaWdodChzdGVwKTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVRyaWdnZXJPcGVuS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNPcGVuS2V5ID0gZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnO1xuXG4gICAgaWYgKCFpc09wZW5LZXkgfHwgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVNlYXJjaGJveEFycm93S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLm1vdmVIaWdobGlnaHQoMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KC0xKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hCb3VuZGFyeUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgoMCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVNlYXJjaGJveFNlbGVjdGlvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlbGVjdEhpZ2hsaWdodGVkT3B0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFuZGxlUGFuZWxDbG9zZUtleShldmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVCYWNrc3BhY2VLZXkoZXZlbnQpO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlUGFuZWxDbG9zZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCdlc2NhcGUnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5jbG9zZVBhbmVsKCd0YWInKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0JhY2tzcGFjZScgfHwgIXRoaXMubXVsdGlwbGUgfHwgdGhpcy5oYXNTZWFyY2hRdWVyeSB8fCB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEl0ZW0odGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXSwgZXZlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVByZWZlcnJlZEhpZ2hsaWdodFZhbHVlKCk6IE9wdGlvblZhbHVlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaGFzU2VhcmNoUXVlcnkpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU2luZ2xlT3B0aW9uPy52YWx1ZSA/PyBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVPcHRpb25DaGVja2VkU3RhdGUoXG4gICAgc2VsZWN0ZWRWYWx1ZXM6IFNldDxPcHRpb25WYWx1ZT4sXG4gICAgb3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLFxuICAgIGZvcmNlQ2hlY2tlZDogYm9vbGVhbiB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGZvcmNlQ2hlY2tlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZvcmNlQ2hlY2tlZDtcbiAgICB9XG4gICAgcmV0dXJuICFzZWxlY3RlZFZhbHVlcy5oYXMob3B0aW9uLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZUljb25TZWxlY3Rvck9wdGlvbnNMb2FkZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmljb25TZWxlY3RvciB8fCB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9PT0gdGhpcy5jdXJyZW50TGFuZyB8fCB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkUHJvbWlzZSA9IHRoaXMuaWNvblNlbGVjdG9yRGF0YVxuICAgICAgLmxvYWRGb250QXdlc29tZVY1U29saWRJY29ucygpXG4gICAgICAudGhlbigoaWNvbnMpID0+IHtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZSA9IGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zKGljb25zLCAodmFsdWUpID0+IHRoaXMudHJhbnNsYXRlVGV4dCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9IHRoaXMuY3VycmVudExhbmc7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHJlc2V0U2Nyb2xsID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8ICF0aGlzLnVzZVZpcnR1YWxpemVkT3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICAgIGNvbnN0IHNjaGVkdWxlID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgIDogKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjaykgPT4gZ2xvYmFsVGhpcy53aW5kb3cuc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjayhwZXJmb3JtYW5jZS5ub3coKSksIDApO1xuICAgIHNjaGVkdWxlKCgpID0+IHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKHJlc2V0U2Nyb2xsKSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldFZpcnR1YWxXaW5kb3coKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlU3RhcnRJbmRleCA9IDA7XG4gICAgdGhpcy52aXNpYmxlRW5kSW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUZpbHRlcmVkSXRlbXMgPSBbXTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveFwiPlxuICBAaWYgKHVpLmxhYmVsVGV4dCB8fCB1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC1yb3dcIj5cbiAgICAgIEBpZiAodWkubGFiZWxUZXh0KSB7XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIFtpZF09XCJ1aS5sYWJlbElkXCJcbiAgICAgICAgICBbZm9yXT1cInVpLmxhYmVsRm9ySWRcIlxuICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXF1aXJlZCA/IHVpLmxhYmVsVGV4dCArICcgJyArIHVpLnJlcXVpcmVkRmllbGRUZXh0IDogdWkubGFiZWxUZXh0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xhYmVsLXRleHRcIj5cbiAgICAgICAgICAgIHt7IHVpLmxhYmVsVGV4dCB9fVxuICAgICAgICAgICAgQGlmIChyZXF1aXJlZCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICB9XG4gICAgICBAaWYgKHVpLmluZm9Ub29sdGlwVGV4dCkge1xuICAgICAgICA8c2RjLXRvb2x0aXBcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faW5mby10b29sdGlwLXdyYXBcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCJ1aS5pbmZvVG9vbHRpcFRleHRcIlxuICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiaW5mb1Rvb2x0aXBQb3NpdGlvblwiXG4gICAgICAgICAgW3Rvb2x0aXBFdmVudF09XCJpbmZvVG9vbHRpcEV2ZW50XCJcbiAgICAgICAgICBbYWxsb3dIdG1sXT1cImluZm9Ub29sdGlwQWxsb3dIdG1sXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGUgc2RjLWNvbWJvYm94X19pbmZvLXRvb2x0aXAtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zZGMtdG9vbHRpcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxzZGMtcG9wb3ZlclxuICAgIFtvcGVuXT1cInBhbmVsT3BlblwiXG4gICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcbiAgICBbekluZGV4XT1cInpJbmRleFwiXG4gICAgW29mZnNldF09XCJ1aS5wYW5lbE9mZnNldFwiXG4gICAgW2FyaWFMYWJlbF09XCJ1aS5kcm9wZG93bkFyaWFMYWJlbFwiXG4gICAgW21hdGNoVHJpZ2dlcldpZHRoXT1cInRydWVcIlxuICAgIFt0b2dnbGVPblRyaWdnZXJDbGlja109XCJmYWxzZVwiXG4gICAgW2Nsb3NlT25Fc2NhcGVdPVwiZmFsc2VcIlxuICAgIFtwYW5lbENsYXNzXT1cInVpLnBhbmVsT3ZlcmxheUNsYXNzXCJcbiAgICAob3BlbkNoYW5nZSk9XCJvblBvcG92ZXJPcGVuQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8ZGl2XG4gICAgICBzZGMtcG9wb3Zlci10cmlnZ2VyXG4gICAgICAjdHJpZ2dlckNvbnRyb2xSZWZcbiAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jb250cm9sXCJcbiAgICAgIFthdHRyLmlkXT1cIm11bHRpcGxlID8gdWkuY29udHJvbElkIDogbnVsbFwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tc21hbGxdPVwic2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbbmdTdHlsZV09XCJnZXRJbnB1dFN0eWxlKClcIlxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwibXVsdGlwbGUgJiYgIWRpc2FibGVkID8gMCA6IG51bGxcIlxuICAgICAgW2F0dHIucm9sZV09XCJtdWx0aXBsZSA/ICdjb21ib2JveCcgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwibXVsdGlwbGUgPyAnbGlzdGJveCcgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibXVsdGlwbGUgPyB1aS5jb21ib2JveEFyaWFMYWJlbCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIm11bHRpcGxlID8gdWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJtdWx0aXBsZSA/IHJlcXVpcmVkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibXVsdGlwbGUgPyBpbnZhbGlkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm11bHRpcGxlID8gKHBhbmVsT3BlbiA/ICd0cnVlJyA6ICdmYWxzZScpIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIm11bHRpcGxlID8gdWkubGlzdGJveElkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwibXVsdGlwbGUgPyBhY3RpdmVEZXNjZW5kYW50IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm11bHRpcGxlID8gdWkubWVzc2FnZUlkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWF1dG9jb21wbGV0ZV09XCJtdWx0aXBsZSA/ICdsaXN0JyA6IG51bGxcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkNvbnRyb2xNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwib25Db250cm9sQ2xpY2soKVwiXG4gICAgICAoa2V5ZG93bik9XCJtdWx0aXBsZSA/IG9uVHJpZ2dlcktleWRvd24oJGV2ZW50KSA6IG51bGxcIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fdmFsdWVcIj5cbiAgICAgICAgQGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgICBAaWYgKHNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uKSB7XG4gICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xlYWRpbmctaWNvblwiXG4gICAgICAgICAgICAgIFtpY29uXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uXCJcbiAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy5pY29uVHlwZVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNzaW5nbGVJbnB1dFJlZlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2lucHV0XCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFtpZF09XCJ1aS5jb250cm9sSWRcIlxuICAgICAgICAgICAgW25hbWVdPVwidWkuaW5wdXROYW1lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkU2luZ2xlT3B0aW9uPy50ZXh0ID8/ICcnXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ1aS5wbGFjZWhvbGRlclRleHRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jb21ib2JveEFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgICAgICAgICAgYXJpYS1jb250cm9scz1cImNvbWJvYm94LWZpZWxkLWxpc3Rib3hcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJ1aS5tZXNzYWdlSWRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uSW5wdXRGb2N1cygpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiAjbXVsdGlWYWx1ZVJlZiBjbGFzcz1cInNkYy1jb21ib2JveF9fbXVsdGktdmFsdWVcIj5cbiAgICAgICAgICAgICAgQGlmICghc2hvdWxkRGlzcGxheUNoaXBTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1saXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzZWxlY3RlZFN1bW1hcnlUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlbGVjdGVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJpdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGFiZWxcIiBbYXR0ci50aXRsZV09XCJpdGVtLnRleHRcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1yZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNoaXBSZW1vdmVBcmlhTGFiZWwoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRJdGVtKGl0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fc3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFN1bW1hcnlUZXh0IH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHVpLnBsYWNlaG9sZGVyVGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgI2NoaXBNZWFzdXJlUmVmXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1saXN0IHNkYy1jb21ib2JveF9fY2hpcC1saXN0LS1tZWFzdXJlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlbGVjdGVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cIml0ZW0uaWNvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGFiZWxcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtcmVtb3ZlLXBsYWNlaG9sZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2FjdGlvbnNcIj5cbiAgICAgICAgICBAaWYgKGhhc0NsZWFyQWN0aW9uKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faWNvbi1idXR0b24gc2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbi0tY2xlYXJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNsZWFyRmllbGRUZXh0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faWNvbi1idXR0b24gc2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbi0tdG9nZ2xlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmRyb3Bkb3duQXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxPcGVuXCJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Ub2dnbGVNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jYXJldC1kb3duIHNkYy1jb21ib2JveF9fY2FyZXRcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jYXJldC0tb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBzZGMtcG9wb3Zlci1jb250ZW50XG4gICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbFwiXG4gICAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cInBhbmVsTWF4SGVpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2gtcm93XCI+XG4gICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWxlY3QtYWxsXCI+XG4gICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuc2VsZWN0QWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVBbGxGaWx0ZXJlZEl0ZW1zKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICAjcGFuZWxTZWFyY2hib3hSZWZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlYXJjaGJveFwiXG4gICAgICAgICAgICAgIFtpZGVudGl0eV09XCJ1aS5wYW5lbFNlYXJjaElkZW50aXR5XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVpLnBhbmVsU2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAgICAgW2RlYm91bmNlVGltZU1zXT1cIjBcIlxuICAgICAgICAgICAgICBbc3VibWl0T25FbnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtjbGVhck9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJ1aS5wYW5lbFNlYXJjaEFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgIFtpbnB1dFJvbGVdPVwibnVsbFwiXG4gICAgICAgICAgICAgIFtpbnB1dEF1dG9jb21wbGV0ZV09XCInb2ZmJ1wiXG4gICAgICAgICAgICAgIFtpbnB1dEFyaWFDb250cm9sc109XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbaW5wdXRBcmlhRGVzY3JpYmVkQnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hUZXJtQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvblNlYXJjaENsZWFyZWQoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1zZWFyY2hib3g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaXNPcHRpb25zTG9hZGluZykge1xuICAgICAgICAgIDxvdXRwdXQgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xvYWRpbmdcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtc3BpbiBzZGMtY29tYm9ib3hfX2xvYWRpbmctaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sb2FkaW5nLXRleHRcIj57eyB1aS5sb2FkaW5nSXRlbXNUZXh0IH19PC9zcGFuPlxuICAgICAgICAgIDwvb3V0cHV0PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93RW1wdHlTdGF0ZSkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19lbXB0eVwiXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5saW5lLXRleHRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInVpLmVtcHR5VGl0bGVUZXh0XCJcbiAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIEBpZiAodXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICNvcHRpb25zVmlld3BvcnRSZWZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnMgc2RjLWNvbWJvYm94X19vcHRpb25zLS12aXJ0dWFsaXplZFwiXG4gICAgICAgICAgICAgIChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKClcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBOT1NPTkFSOiBjdXN0b20gY29tYm9ib3ggcG9wdXAgaW50ZW50aW9uYWxseSB1c2VzIEFSSUEgbGlzdGJveCBzZW1hbnRpY3MgaW5zdGVhZCBvZiBhIG5hdGl2ZSBzZWxlY3QgLS0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9ucy1saXN0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aS5jb21ib2JveEFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZpcnR1YWwtc3BhY2VyXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgIHZpc2libGVPcHRpb24gb2YgdmlzaWJsZUZpbHRlcmVkSXRlbXM7XG4gICAgICAgICAgICAgICAgICB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUodmlzaWJsZU9wdGlvbi5pbmRleCwgdmlzaWJsZU9wdGlvbi5pdGVtKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNPcHRpb25BY3RpdmUodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWljb24tc2VsZWN0b3JdPVwiaWNvblNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1zZWxlY3RlZF09XCIhbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwidmlzaWJsZU9wdGlvbi5pbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uT3B0aW9uTW91c2VFbnRlcih2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25DaGVja2JveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2UodmlzaWJsZU9wdGlvbi5pdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodmlzaWJsZU9wdGlvbi5pdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ2aXNpYmxlT3B0aW9uLml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IHZpc2libGVPcHRpb24uaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KHZpc2libGVPcHRpb24uaXRlbSk7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJhZnRlclZpcnR1YWxTcGFjZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnNcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZShpbmRleCwgb3B0aW9uKTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWFjdGl2ZV09XCJpc09wdGlvbkFjdGl2ZShpbmRleClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1pY29uLXNlbGVjdG9yXT1cImljb25TZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLXNlbGVjdGVkXT1cIiFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25PcHRpb25Nb3VzZUVudGVyKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uQ2hlY2tib3hLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25PcHRpb25DaGVja2JveENoYW5nZShvcHRpb24sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICA8IS0tIHRoZSBjdXN0b20gbGlzdGJveCBrZWVwcyBvcHRpb24gc2VtYW50aWNzIG9uIHRoZSBmb2N1c2FibGUgYWN0aW9uIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJvcHRpb25JZChpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidvcHRpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbikgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbktleWRvd24oJGV2ZW50LCBvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2xpY2sob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChvcHRpb24uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24taWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cIm9wdGlvbi5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLXRleHRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWxhYmVsXCI+e3sgb3B0aW9uLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KG9wdGlvbik7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLW1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb25NZXRhIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZChvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHNkYy1jb21ib2JveF9fb3B0aW9uLXNlbGVjdGVkLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1wb3BvdmVyPlxuXG4gICAgQGlmICh1aS5tZXNzYWdlVGV4dCkge1xuICAgICAgPHNtYWxsXG4gICAgICAgIFtpZF09XCJ1aS5tZXNzYWdlSWRcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXRJbnZhbGlkTWVzc2FnZUNsYXNzKClcIlxuICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICA+XG4gICAgICAgIHt7IHVpLm1lc3NhZ2VUZXh0IH19XG4gICAgICA8L3NtYWxsPlxuICAgIH1cbiAgPC9kaXY+XG4iXX0=
1030
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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O2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIGZvcndhcmRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUyxcbiAgQ09NQk9CT1hfREVGQVVMVF9QQU5FTF9NQVhfSEVJR0hULFxuICBDT01CT0JPWF9ERUZBVUxUX1pfSU5ERVgsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hULFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTUyxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9WSUVXUE9SVF9GQUxMQkFDS19IRUlHSFQsXG4gIENPTUJPQk9YX1JFTU9WRV9DSElQX0xBQkVMX0tFWSxcbiAgQ09NQk9CT1hfU0VMRUNURURfSVRFTVNfTEFCRUxfS0VZXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2NvbWJvYm94LmNvbnN0JztcbmltcG9ydCB7IEljb25TZWxlY3RvckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9pY29uLXNlbGVjdG9yLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvaW5wdXRzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgdHlwZSB7IENoaXBSZW1vdmVFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvY2hpcHMudHlwZSc7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbkl0ZW0sIE9wdGlvbnMsIE9wdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZW1hbnRpY3MudHlwZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2x0aXBFdmVudCwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90b29sdGlwLnR5cGUnO1xuaW1wb3J0IHsgcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2kxOG4udXRpbCc7XG5pbXBvcnQgeyBuZXh0U2VxdWVudGlhbElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pZC51dGlsJztcbmltcG9ydCB7IEljb25SZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvY29tcG9uZW50cy9pY29uLXJlbmRlcmVyL2ljb24tcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoYm94L3NlYXJjaGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgYXNDb21ib2JveEFycmF5LCBidWlsZENvbWJvYm94U2VhcmNoVGV4dCwgYnVpbGRDb21ib2JveFVpU3RhdGUsIGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zLCBidWlsZFZpc2libGVDb21ib2JveE9wdGlvbnMsIGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24sIGdldEFjdGl2ZU9wdGlvblZhbHVlLCBnZXRGaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSwgZ2V0U2VsZWN0ZWRDb3VudCwgbm9ybWFsaXplQ29tYm9ib3hTZWFyY2hUZXh0LCBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUsIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSwgdHlwZSBDb21ib2JveERpc3BsYXlNb2RlLCB0eXBlIENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIHR5cGUgQ29tYm9ib3hVaVN0YXRlLCB0eXBlIENvbWJvYm94VmFsdWUsIHR5cGUgQ29tYm9ib3hWaXNpYmxlT3B0aW9uLCB0eXBlIEhpZ2hsaWdodFN0ZXAsIHR5cGUgUGFuZWxDbG9zZVJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvY29tYm9ib3gudXRpbCc7XG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgSWNvblJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ3NkYy1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIElucHV0c0NvbXBvbmVudDxPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGljb25TZWxlY3RvckRhdGEgPSBpbmplY3QoSWNvblNlbGVjdG9yRGF0YVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdGVkSWQgPSBuZXh0U2VxdWVudGlhbElkKCdzZGMtY29tYm9ib3gnKTtcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwZW5kVG86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgekluZGV4ID0gQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYO1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zIHwgc3RyaW5nID0gW107XG4gIEBJbnB1dCgpIG92ZXJyaWRlQ2hpcE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heFNlbGVjdGVkTGFiZWxzID0gQ09NQk9CT1hfREVGQVVMVF9NQVhfU0VMRUNURURfTEFCRUxTO1xuICBASW5wdXQoKSBzaG93Q2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgaWNvblNlbGVjdG9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uQ2xhc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5mb1Rvb2x0aXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAncmlnaHQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcEV2ZW50OiBUb29sdGlwRXZlbnQgPSAnYm90aCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQWxsb3dIdG1sID0gZmFsc2U7XG4gIEBPdXRwdXQoJ29uU2VsZWN0ZWRJdGVtJykgc2VsZWN0ZWRWYWx1ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveFZhbHVlPigpO1xuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5zZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBpc09wdGlvbnNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmljb25PcHRpb25zTG9hZGluZyAmJiB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyAhPT0gdGhpcy5jdXJyZW50TGFuZztcbiAgfVxuICBnZXQgdXNlVmlydHVhbGl6ZWRPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgc2hvd0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT3B0aW9uc0xvYWRpbmcgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBnZXQgb3B0aW9uUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ljb25DbGFzc1xuICAgICAgPyBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTU1xuICAgICAgOiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0RFRkFVTFRfUk9XX0hFSUdIVDtcbiAgfVxuICBnZXQgYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVTdGFydEluZGV4ICogdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gIH1cbiAgZ2V0IGFmdGVyVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMudmlzaWJsZUVuZEluZGV4KSAqIHRoaXMub3B0aW9uUm93SGVpZ2h0KTtcbiAgfVxuICBvblNlYXJjaChldmVudDogeyBxdWVyeT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25TZWFyY2hUZXJtQ2hhbmdlKFN0cmluZyhldmVudD8ucXVlcnkgPz8gJycpKTtcbiAgfVxuICBvblBhbmVsSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCk/LnZhbHVlID8/ICcnKTtcbiAgfVxuICBvblNlYXJjaFRlcm1DaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgb25PcHRpb25zU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoKTtcbiAgfVxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcE5leHRGb2N1c09wZW4pIHtcbiAgICAgIHRoaXMuc2tpcE5leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25JbnB1dEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0LmlkID09PSB0aGlzLnVpLnBhbmVsU2VhcmNoSWRlbnRpdHkuaWQpIHtcbiAgICAgIHRoaXMub25TZWFyY2hib3hLZXlkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblRyaWdnZXJLZXlkb3duKGV2ZW50KTtcbiAgfVxuICBvblRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlUHJpbnRhYmxlVHJpZ2dlcktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlckFycm93S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVUcmlnZ2VyT3BlbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvblNlYXJjaGJveEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveFNlbGVjdGlvbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvbkNvbnRyb2xNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIC8vIEtlZXAgdGhlIHBhbmVsIHNlYXJjaGJveCBmb2N1c2VkIGV2ZW4gd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRyaWdnZXIgYXJlYSBhZ2Fpbi5cbiAgICAgIC8vIFdpdGhvdXQgcHJldmVudGluZyB0aGUgdHJpZ2dlciBmcm9tIHRha2luZyBmb2N1cyBmaXJzdCwgdGhlIGNhcmV0IG1heSBkaXNhcHBlYXIgZXZlblxuICAgICAgLy8gdGhvdWdoIHR5cGluZyBzdGlsbCB1cGRhdGVzIHRoZSBzZWFyY2hib3guXG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdXBwcmVzcyBmb2N1cy10cmlnZ2VyZWQgb3BlbjogaW4gc2luZ2xlIG1vZGUgdGhlIGlucHV0IHJlY2VpdmVzIGZvY3VzIG9uIG1vdXNlZG93bixcbiAgICAvLyB3aGljaCBmaXJlcyBvbklucHV0Rm9jdXMoKSBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50LiBXaXRob3V0IHRoaXMgZmxhZywgb25JbnB1dEZvY3VzXG4gICAgLy8gd291bGQgb3BlbiB0aGUgcGFuZWwgYW5kIHRoZSBzdWJzZXF1ZW50IGNsaWNrIChvbkNvbnRyb2xDbGljaykgd291bGQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuXG4gICAgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlOyB9LCAwKTtcbiAgfVxuICBvbkNvbnRyb2xDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBvblRvZ2dsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIG9uUG9wb3Zlck9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChvcGVuIHx8ICF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlUGFuZWwoJ291dHNpZGUnKTtcbiAgfVxuICB0b2dnbGVQYW5lbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgndG9nZ2xlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBjbGVhckFsbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBjb25zdCBjbGVhcmVkVmFsdWU6IE9wdGlvblZhbHVlIHwgT3B0aW9uVmFsdWVbXSB8IG51bGwgPSB0aGlzLm11bHRpcGxlID8gW10gOiBudWxsO1xuICAgIGNvbnN0IHNob3VsZFJlZm9jdXNTZWFyY2ggPSB0aGlzLnBhbmVsT3BlbjtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnZhbHVlID0gY2xlYXJlZFZhbHVlO1xuICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKGNsZWFyZWRWYWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlRXZlbnQuZW1pdChjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHNob3VsZFJlZm9jdXNTZWFyY2gpIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIG9uT3B0aW9uQ2xpY2sob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbik7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb24pO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hDaGFuZ2Uob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVPcHRpb24ob3B0aW9uLCBjaGVja2VkKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCd0b2dnbGUnKTtcbiAgICB9XG4gIH1cbiAgb25PcHRpb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vbk9wdGlvbkNsaWNrKG9wdGlvbik7XG4gIH1cbiAgdG9nZ2xlQWxsRmlsdGVyZWRJdGVtcyhjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKSk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5maWx0ZXJlZEl0ZW1zKSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLmRlbGV0ZShvcHRpb24udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkVmFsdWVzID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKClcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBzZWxlY3RlZFZhbHVlcy5oYXMoZW50cnkudmFsdWUpKVxuICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcmRlcmVkVmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgcmVtb3ZlU2VsZWN0ZWRJdGVtKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5maWx0ZXIoKGVudHJ5KSA9PiAhT2JqZWN0LmlzKGVudHJ5LCBvcHRpb24udmFsdWUpKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShjdXJyZW50VmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICB9XG4gIH1cbiAgb25DaGlwUmVtb3ZlZChldmVudDogQ2hpcFJlbW92ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5yZXNvbHZlT3B0aW9uKGV2ZW50LnZhbHVlKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkSXRlbShvcHRpb24sIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICB9XG4gIHJlc29sdmVPcHRpb24ob3B0T3JWYWx1ZTogdW5rbm93bik6IENvbWJvYm94UmVzb2x2ZWRPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgICBpZiAob3B0T3JWYWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRPclZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgb2JqID0gb3B0T3JWYWx1ZSBhcyB7IHRleHQ/OiBzdHJpbmc7IHZhbHVlPzogT3B0aW9uVmFsdWUgfTtcbiAgICAgIGlmICgndGV4dCcgaW4gb2JqICYmICd2YWx1ZScgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uKG9iaiBhcyBPcHRpb25JdGVtKSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVRleHQob2JqLnRleHQpLFxuICAgICAgICAgIHNlYXJjaFRleHQ6IGJ1aWxkQ29tYm9ib3hTZWFyY2hUZXh0KHRoaXMudHJhbnNsYXRlVGV4dChvYmoudGV4dCksIHRoaXMuYXNUZXh0KG9iai52YWx1ZSkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGFsbC5maW5kKChvcHRpb24pID0+IE9iamVjdC5pcyhvcHRpb24udmFsdWUsIG9iai52YWx1ZSkpID8/IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGwuZmluZCgob3B0aW9uKSA9PiBPYmplY3QuaXMob3B0aW9uLnZhbHVlLCBvcHRPclZhbHVlIGFzIE9wdGlvblZhbHVlKSkgPz8gbnVsbDtcbiAgfVxuICBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkuc29tZSgoZW50cnkpID0+IE9iamVjdC5pcyhlbnRyeSwgb3B0aW9uLnZhbHVlKSk7XG4gIH1cbiAgaXNPcHRpb25BY3RpdmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPT09IGluZGV4O1xuICB9XG4gIG9uT3B0aW9uTW91c2VFbnRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KGluZGV4LCBmYWxzZSk7XG4gIH1cbiAgb25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgb3B0aW9uTWV0YVRleHQob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmljb25TZWxlY3RvciB8fCAhdGhpcy5zaG93SWNvbkNsYXNzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbi5pY29uQ2xhc3NOYW1lID8/IG51bGw7XG4gIH1cbiAgb3B0aW9uSWQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudWkuY29udHJvbElkfS1vcHRpb24tJHtpbmRleH1gO1xuICB9XG4gIGNoaXBSZW1vdmVBcmlhTGFiZWwob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCBudWxsLCBDT01CT0JPWF9SRU1PVkVfQ0hJUF9MQUJFTF9LRVkpO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtsYWJlbFxcfS9nLCBvcHRpb24udGV4dCk7XG4gIH1cbiAgdHJhY2tCeU9wdGlvblZhbHVlID0gKF9pbmRleDogbnVtYmVyLCBpdGVtOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogT3B0aW9uVmFsdWUgPT4gaXRlbS52YWx1ZTtcbiAgcHJpdmF0ZSBvcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5QYW5lbCh7IGZvY3VzU2VhcmNoOiB0aGlzLnNlYXJjaGFibGUgfSk7XG4gIH1cbiAgcHJpdmF0ZSBvcGVuUGFuZWwob3B0aW9uczogeyBmb2N1c1NlYXJjaDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbih0aGlzLnJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnBvcG92ZXI/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHRydWUpO1xuICAgIGlmIChvcHRpb25zLmZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsb3NlUGFuZWwocmVhc29uOiBQYW5lbENsb3NlUmVhc29uKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdG9yZVRyaWdnZXJGb2N1cyA9IHJlYXNvbiA9PT0gJ2VzY2FwZScgfHwgcmVhc29uID09PSAnc2VsZWN0aW9uJyB8fCByZWFzb24gPT09ICd0b2dnbGUnO1xuICAgIHRoaXMucGFuZWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMucGFuZWxDbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChyZXN0b3JlVHJpZ2dlckZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJpZ2dlclNvb24oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveFNvb24oKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNTZWFyY2hib3goKSwgMCk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgfVxuICBwcml2YXRlIGZvY3VzVHJpZ2dlclNvb24oKTogdm9pZCB7IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNUcmlnZ2VyKCkpOyB9XG4gIHByaXZhdGUgZm9jdXNTZWFyY2hib3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2luZ2xlSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmJsdXIoKTtcbiAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyPy4oKTtcbiAgICB0aGlzLnBhbmVsU2VhcmNoYm94Py5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5wb3BvdmVyPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaEZpbHRlcmVkSXRlbXMocHJlc2VydmVDdXJyZW50SW52YWxpZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaGFibGUgPyBub3JtYWxpemVDb21ib2JveFNlYXJjaFRleHQodGhpcy5zZWFyY2hUZXJtKSA6ICcnO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpO1xuICAgIGlmICh0aGlzLmlzT3B0aW9uc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gcXVlcnlcbiAgICAgID8gYWxsLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWFyY2hUZXh0LmluY2x1ZGVzKHF1ZXJ5KSlcbiAgICAgIDogYWxsLnNsaWNlKCk7XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoIXF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5ICYmIHByZXNlcnZlQ3VycmVudEludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnZhbGlkID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID09PSAwICYmIHF1ZXJ5Lmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBzZXRIaWdobGlnaHRlZEluZGV4KGluZGV4OiBudW1iZXIsIGVuc3VyZVZpc2libGUgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKSk7XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gbmV4dEluZGV4O1xuICAgIGlmIChlbnN1cmVWaXNpYmxlICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLnNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0KHN0ZXA6IEhpZ2hsaWdodFN0ZXApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHN0ZXAgPiAwID8gMCA6IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KCh0aGlzLmhpZ2hsaWdodGVkSW5kZXggKyBzdGVwICsgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKHByZWZlcnJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IG51bGwgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FuZGlkYXRlVmFsdWVzID0gW1xuICAgICAgcHJlZmVycmVkVmFsdWUsXG4gICAgICAhdGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRTaW5nbGVPcHRpb24/LnZhbHVlID8/IG51bGwgOiB0aGlzLmZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlLFxuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zWzBdPy52YWx1ZSA/PyBudWxsXG4gICAgXTtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBjYW5kaWRhdGVWYWx1ZXNcbiAgICAgIC5tYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PSBudWxsID8gLTEgOiB0aGlzLmZpbHRlcmVkSXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBPYmplY3QuaXMoaXRlbS52YWx1ZSwgdmFsdWUpKSlcbiAgICAgIC5maW5kKChpbmRleCkgPT4gaW5kZXggPj0gMCk7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KG5leHRJbmRleCA/PyAwKTtcbiAgfVxuICBwcml2YXRlIHNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMub3B0aW9uc1ZpZXdwb3J0UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvblRvcCA9IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCAqIHRoaXMub3B0aW9uUm93SGVpZ2h0O1xuICAgICAgY29uc3Qgb3B0aW9uQm90dG9tID0gb3B0aW9uVG9wICsgdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gICAgICBjb25zdCB2aWV3cG9ydFRvcCA9IHZpZXdwb3J0LnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnRUb3AgKyB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICBpZiAob3B0aW9uVG9wIDwgdmlld3BvcnRUb3ApIHtcbiAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG9wID0gb3B0aW9uVG9wO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25Cb3R0b20gPiB2aWV3cG9ydEJvdHRvbSkge1xuICAgICAgICB2aWV3cG9ydC5zY3JvbGxUb3AgPSBvcHRpb25Cb3R0b20gLSB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgaGlnaGxpZ2h0ZWQgb3B0aW9uIGlzIGFscmVhZHkgZnVsbHkgdmlzaWJsZS5cbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbklkKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCkpO1xuICAgICAgaWYgKHR5cGVvZiBub2RlPy5zY3JvbGxJbnRvVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdEhpZ2hsaWdodGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuZmlsdGVyZWRJdGVtc1t0aGlzLmhpZ2hsaWdodGVkSW5kZXhdO1xuICAgIGlmICghYWN0aXZlT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihhY3RpdmVPcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24oYWN0aXZlT3B0aW9uKTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIHRoaXMuY2xvc2VQYW5lbCgnc2VsZWN0aW9uJyk7XG4gIH1cbiAgcHJpdmF0ZSB0b2dnbGVPcHRpb24ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gbmV3IFNldChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkpO1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9IHRoaXMucmVzb2x2ZU9wdGlvbkNoZWNrZWRTdGF0ZShzZWxlY3RlZFZhbHVlcywgb3B0aW9uLCBmb3JjZUNoZWNrZWQpO1xuICAgIGlmIChzaG91bGRTZWxlY3QpIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVzLmFkZChvcHRpb24udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZFZhbHVlcy5kZWxldGUob3B0aW9uLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXJlZFZhbHVlcyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gc2VsZWN0ZWRWYWx1ZXMuaGFzKGVudHJ5LnZhbHVlKSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3JkZXJlZFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24ob3B0aW9uLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gYnVpbGRWaXNpYmxlQ29tYm9ib3hPcHRpb25zKHtcbiAgICAgIHJlc2V0U2Nyb2xsLFxuICAgICAgYnVmZmVyU2l6ZTogQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9CVUZGRVJfU0laRSxcbiAgICAgIGZhbGxiYWNrVmlld3BvcnRIZWlnaHQ6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfVklFV1BPUlRfRkFMTEJBQ0tfSEVJR0hULFxuICAgICAgZmlsdGVyZWRJdGVtczogdGhpcy5maWx0ZXJlZEl0ZW1zLFxuICAgICAgb3B0aW9uUm93SGVpZ2h0OiB0aGlzLm9wdGlvblJvd0hlaWdodCxcbiAgICAgIHVzZVZpcnR1YWxpemVkT3B0aW9uczogdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMsXG4gICAgICB2aWV3cG9ydDogdGhpcy5vcHRpb25zVmlld3BvcnRSZWY/Lm5hdGl2ZUVsZW1lbnRcbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVTdGFydEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVTdGFydEluZGV4O1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVFbmRJbmRleDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gbmV4dFN0YXRlLnZpc2libGVGaWx0ZXJlZEl0ZW1zO1xuICB9XG4gIHByaXZhdGUgbm9ybWFsaXplT3B0aW9ucygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIGlmICh0aGlzLmljb25TZWxlY3Rvcikge1xuICAgICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgICBpZiAodGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25PcHRpb25zQ2FjaGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5jdXJyZW50TGFuZztcbiAgICBpZiAodGhpcy5vcHRpb25zID09PSB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgJiYgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9PT0gY3VycmVudExhbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhcnNlTm9ybWFsaXplZE9wdGlvbnNJbnB1dCgpO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUtleSA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID0gY3VycmVudExhbmc7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlID0gbmV4dC5tYXAoKG9wdGlvbikgPT4gY3JlYXRlUmVzb2x2ZWRDb21ib2JveE9wdGlvbihvcHRpb24sICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKSkpO1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gIH1cbiAgcHJpdmF0ZSBhc1RleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7IH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHsgcmV0dXJuIHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCB0aGlzLmFzVGV4dCh2YWx1ZSkpOyB9XG4gIHByaXZhdGUgcGFyc2VOb3JtYWxpemVkT3B0aW9uc0lucHV0KCk6IE9wdGlvbkl0ZW1bXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyBhcyBPcHRpb25JdGVtW107XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRoaXMub3B0aW9ucyB8fCAnW10nKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyAocGFyc2VkIGFzIE9wdGlvbkl0ZW1bXSkgOiBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3VycmVudExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgPz8gdGhpcy50cmFuc2xhdGUuZ2V0RGVmYXVsdExhbmc/LigpID8/ICcnO1xuICB9XG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRDb3VudCh0aGlzLnZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgfVxuICBwcml2YXRlIGdldCBhY3RpdmVPcHRpb25WYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBnZXRBY3RpdmVPcHRpb25WYWx1ZSh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUoKTogT3B0aW9uVmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0Rmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZURpc3BsYXlNb2RlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5kaXNwbGF5TW9kZSA9ICdzdW1tYXJ5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IHRoaXMuc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpID8gJ3N1bW1hcnknIDogJ2NoaXAnO1xuICB9XG4gIHByaXZhdGUgcHJvcGFnYXRlRnJvbVZhbHVlKHZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmIChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVtaXR0ZWRWYWx1ZSA9IHRoaXMudmFsdWUgPz8gKHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoZW1pdHRlZFZhbHVlKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUNoYXJhY3RlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuc3luY0NoaXBQcmVzZW50YXRpb24oKSk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5zeW5jQ2hpcFByZXNlbnRhdGlvbigpKTtcbiAgfVxuICBwcml2YXRlIHN5bmNDaGlwUHJlc2VudGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHREaXNwbGF5TW9kZTogJ2NoaXAnIHwgJ3N1bW1hcnknID0gdGhpcy5zaG91bGRDb2xsYXBzZUNoaXBEaXNwbGF5VG9TdW1tYXJ5KCkgPyAnc3VtbWFyeScgOiAnY2hpcCc7XG4gICAgaWYgKHRoaXMuZGlzcGxheU1vZGUgPT09IG5leHREaXNwbGF5TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXlNb2RlID0gbmV4dERpc3BsYXlNb2RlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2hvdWxkQ29sbGFwc2VDb21ib2JveENoaXBEaXNwbGF5KHtcbiAgICAgIG11bHRpcGxlOiB0aGlzLm11bHRpcGxlLFxuICAgICAgc2VsZWN0ZWRJdGVtQ291bnQ6IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICBzZWxlY3RlZENvdW50OiB0aGlzLnNlbGVjdGVkQ291bnQsXG4gICAgICBtYXhTZWxlY3RlZExhYmVsczogdGhpcy5tYXhTZWxlY3RlZExhYmVscyxcbiAgICAgIGF2YWlsYWJsZVdpZHRoOiB0aGlzLm11bHRpVmFsdWVSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IDAsXG4gICAgICByZXF1aXJlZFdpZHRoOiB0aGlzLmNoaXBNZWFzdXJlUmVmPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxXaWR0aCA/PyAwXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldE9wdGlvbnNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgPSBudWxsO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPSAnJztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGUgPSBbXTtcbiAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9ICcnO1xuICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBbXTtcbiAgfVxuICBwcml2YXRlIHJlZnJlc2hDb21ib2JveFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZU9wdGlvbnNDYWNoZUNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVzZXRPcHRpb25zQ2FjaGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVWaXJ0dWFsV2luZG93Q2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8IGNoYW5nZXNbJ3Nob3dJY29uQ2xhc3MnXSkge1xuICAgICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVJY29uU2VsZWN0b3JDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaWNvblNlbGVjdG9yJ10pIHtcbiAgICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNPcHRpb25DaGFuZ2VzID0gISFjaGFuZ2VzWydvcHRpb25zJ107XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uQ2hhbmdlcyA9ICEhY2hhbmdlc1snbXVsdGlwbGUnXSB8fCAhIWNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgY29uc3QgaGFzSWNvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8ICEhY2hhbmdlc1snc2hvd0ljb25DbGFzcyddO1xuXG4gICAgcmV0dXJuIGhhc09wdGlvbkNoYW5nZXMgfHwgaGFzU2VsZWN0aW9uQ2hhbmdlcyB8fCBoYXNJY29uQ2hhbmdlcztcbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNoYW5nZXNbJ211bHRpcGxlJ10gfHwgY2hhbmdlc1snbWF4U2VsZWN0ZWRMYWJlbHMnXSB8fCBjaGFuZ2VzWyd2YWx1ZSddKTtcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXNbJ211bHRpcGxlJ10gfHwgIXRoaXMubXVsdGlwbGUgfHwgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSB8fCB0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IFt0aGlzLnZhbHVlXTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ByaW50YWJsZUNoYXJhY3RlcihldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5rZXk7XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQXJyb3dLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubmF2aWdhdGVUcmlnZ2VyQXJyb3coMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgbmF2aWdhdGVUcmlnZ2VyQXJyb3coc3RlcDogSGlnaGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICAgIGlmIChzdGVwIDwgMCkge1xuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdmVIaWdobGlnaHQoc3RlcCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyT3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT3BlbktleSA9IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJztcblxuICAgIGlmICghaXNPcGVuS2V5IHx8IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KDApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgnZXNjYXBlJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuY2xvc2VQYW5lbCgndGFiJykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdCYWNrc3BhY2UnIHx8ICF0aGlzLm11bHRpcGxlIHx8IHRoaXMuaGFzU2VhcmNoUXVlcnkgfHwgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0sIGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc1NlYXJjaFF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNpbmdsZU9wdGlvbj8udmFsdWUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uQ2hlY2tlZFN0YXRlKFxuICAgIHNlbGVjdGVkVmFsdWVzOiBTZXQ8T3B0aW9uVmFsdWU+LFxuICAgIG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbixcbiAgICBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChmb3JjZUNoZWNrZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmb3JjZUNoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiAhc2VsZWN0ZWRWYWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSB0aGlzLmljb25TZWxlY3RvckRhdGFcbiAgICAgIC5sb2FkRm9udEF3ZXNvbWVWNVNvbGlkSWNvbnMoKVxuICAgICAgLnRoZW4oKGljb25zKSA9PiB7XG4gICAgICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucyhpY29ucywgKHZhbHVlKSA9PiB0aGlzLnRyYW5zbGF0ZVRleHQodmFsdWUpKTtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSB0aGlzLmN1cnJlbnRMYW5nO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29tYm9ib3hTdGF0ZSgpO1xuICAgICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpc2libGVPcHRpb25zU3luYyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwpKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRWaXJ0dWFsV2luZG93KCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gMDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gW107XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hcIj5cbiAgQGlmICh1aS5sYWJlbFRleHQgfHwgdWkuaW5mb1Rvb2x0aXBUZXh0KSB7XG4gICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWwtcm93XCI+XG4gICAgICBAaWYgKHVpLmxhYmVsVGV4dCkge1xuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBbaWRdPVwidWkubGFiZWxJZFwiXG4gICAgICAgICAgW2Zvcl09XCJ1aS5sYWJlbEZvcklkXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVxdWlyZWQgPyB1aS5sYWJlbFRleHQgKyAnICcgKyB1aS5yZXF1aXJlZEZpZWxkVGV4dCA6IHVpLmxhYmVsVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC10ZXh0XCI+XG4gICAgICAgICAgICB7eyB1aS5sYWJlbFRleHQgfX1cbiAgICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuICAgICAgQGlmICh1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICAgICAgPHNkYy10b29sdGlwXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2luZm8tdG9vbHRpcC13cmFwXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwidWkuaW5mb1Rvb2x0aXBUZXh0XCJcbiAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImluZm9Ub29sdGlwUG9zaXRpb25cIlxuICAgICAgICAgIFt0b29sdGlwRXZlbnRdPVwiaW5mb1Rvb2x0aXBFdmVudFwiXG4gICAgICAgICAgW2FsbG93SHRtbF09XCJpbmZvVG9vbHRpcEFsbG93SHRtbFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlIHNkYy1jb21ib2JveF9faW5mby10b29sdGlwLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXG4gICAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICAgIFtvZmZzZXRdPVwidWkucGFuZWxPZmZzZXRcIlxuICAgIFthcmlhTGFiZWxdPVwidWkuZHJvcGRvd25BcmlhTGFiZWxcIlxuICAgIFttYXRjaFRyaWdnZXJXaWR0aF09XCJ0cnVlXCJcbiAgICBbdG9nZ2xlT25UcmlnZ2VyQ2xpY2tdPVwiZmFsc2VcIlxuICAgIFtjbG9zZU9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICBbcGFuZWxDbGFzc109XCJ1aS5wYW5lbE92ZXJsYXlDbGFzc1wiXG4gICAgKG9wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPGRpdlxuICAgICAgc2RjLXBvcG92ZXItdHJpZ2dlclxuICAgICAgI3RyaWdnZXJDb250cm9sUmVmXG4gICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY29udHJvbFwiXG4gICAgICBbYXR0ci5pZF09XCJtdWx0aXBsZSA/IHVpLmNvbnRyb2xJZCA6IG51bGxcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLXNtYWxsXT1cInNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgW25nU3R5bGVdPVwiZ2V0SW5wdXRTdHlsZSgpXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIm11bHRpcGxlICYmICFkaXNhYmxlZCA/IDAgOiBudWxsXCJcbiAgICAgIFthdHRyLnJvbGVdPVwibXVsdGlwbGUgPyAnY29tYm9ib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIm11bHRpcGxlID8gJ2xpc3Rib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm11bHRpcGxlID8gdWkuY29tYm9ib3hBcmlhTGFiZWwgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJtdWx0aXBsZSA/IHVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwibXVsdGlwbGUgPyByZXF1aXJlZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIm11bHRpcGxlID8gaW52YWxpZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtdWx0aXBsZSA/IChwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJtdWx0aXBsZSA/IHVpLmxpc3Rib3hJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm11bHRpcGxlID8gYWN0aXZlRGVzY2VuZGFudCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJtdWx0aXBsZSA/IHVpLm1lc3NhZ2VJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25Db250cm9sTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uQ29udHJvbENsaWNrKClcIlxuICAgICAgKGtleWRvd24pPVwibXVsdGlwbGUgPyBvblRyaWdnZXJLZXlkb3duKCRldmVudCkgOiBudWxsXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZhbHVlXCI+XG4gICAgICAgIEBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgQGlmIChzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvbikge1xuICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19sZWFkaW5nLWljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblwiXG4gICAgICAgICAgICAgIFtpY29uVHlwZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblR5cGVcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjc2luZ2xlSW5wdXRSZWZcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19pbnB1dFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbaWRdPVwidWkuY29udHJvbElkXCJcbiAgICAgICAgICAgIFtuYW1lXT1cInVpLmlucHV0TmFtZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8udGV4dCA/PyAnJ1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidWkucGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJjb21ib2JveC1maWVsZC1saXN0Ym94XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgI211bHRpVmFsdWVSZWYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX211bHRpLXZhbHVlXCI+XG4gICAgICAgICAgICAgIEBpZiAoIXNob3VsZERpc3BsYXlDaGlwU3VtbWFyeSkge1xuICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2VsZWN0ZWRTdW1tYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwiaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCIgW2F0dHIudGl0bGVdPVwiaXRlbS50ZXh0XCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtcmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjaGlwUmVtb3ZlQXJpYUxhYmVsKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3N1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0ZWRTdW1tYXJ5VGV4dCB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyB1aS5wbGFjZWhvbGRlclRleHQgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICNjaGlwTWVhc3VyZVJlZlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdCBzZGMtY29tYm9ib3hfX2NoaXAtbGlzdC0tbWVhc3VyZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJpdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLXJlbW92ZS1wbGFjZWhvbGRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19hY3Rpb25zXCI+XG4gICAgICAgICAgQGlmIChoYXNDbGVhckFjdGlvbikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLWNsZWFyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jbGVhckZpZWxkVGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckFsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLXRvZ2dsZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5kcm9wZG93bkFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uVG9nZ2xlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2FyZXQtZG93biBzZGMtY29tYm9ib3hfX2NhcmV0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY2FyZXQtLW9wZW5dPVwicGFuZWxPcGVuXCJcbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgc2RjLXBvcG92ZXItY29udGVudFxuICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWxcIlxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJwYW5lbE1heEhlaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgQGlmIChzZWFyY2hhYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VhcmNoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2gtcm93XCI+XG4gICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VsZWN0LWFsbFwiPlxuICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhcmVBbGxGaWx0ZXJlZEl0ZW1zU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLnNlbGVjdEFsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVBbGxGaWx0ZXJlZEl0ZW1zKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDxzZGMtc2VhcmNoYm94XG4gICAgICAgICAgICAgICAgI3BhbmVsU2VhcmNoYm94UmVmXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlYXJjaGJveFwiXG4gICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cInVpLnBhbmVsU2VhcmNoSWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVpLnBhbmVsU2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAgICAgICAgIFtkZWJvdW5jZVRpbWVNc109XCIwXCJcbiAgICAgICAgICAgICAgICBbc3VibWl0T25FbnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2NsZWFyT25Fc2NhcGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwidWkucGFuZWxTZWFyY2hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFtpbnB1dFJvbGVdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgW2lucHV0QXV0b2NvbXBsZXRlXT1cIidvZmYnXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRBcmlhQ29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRBcmlhRGVzY3JpYmVkQnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaFRlcm1DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25TZWFyY2hDbGVhcmVkKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXNlYXJjaGJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc09wdGlvbnNMb2FkaW5nKSB7XG4gICAgICAgICAgPG91dHB1dCBjbGFzcz1cInNkYy1jb21ib2JveF9fbG9hZGluZ1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1zcGluIHNkYy1jb21ib2JveF9fbG9hZGluZy1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xvYWRpbmctdGV4dFwiPnt7IHVpLmxvYWRpbmdJdGVtc1RleHQgfX08L3NwYW4+XG4gICAgICAgICAgPC9vdXRwdXQ+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dFbXB0eVN0YXRlKSB7XG4gICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2VtcHR5XCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJpbmxpbmUtdGV4dFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidWkuZW1wdHlUaXRsZVRleHRcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgQGlmICh1c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgI29wdGlvbnNWaWV3cG9ydFJlZlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9ucyBzZGMtY29tYm9ib3hfX29wdGlvbnMtLXZpcnR1YWxpemVkXCJcbiAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvbk9wdGlvbnNTY3JvbGwoKVwiXG4gICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgLS0+XG4gICAgICAgICAgICAgIDwhLS0gQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25zLWxpc3RcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jb21ib2JveEFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtdWx0aXBsZSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiZWZvcmVWaXJ0dWFsU3BhY2VySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZU9wdGlvbiBvZiB2aXNpYmxlRmlsdGVyZWRJdGVtcztcbiAgICAgICAgICAgICAgICAgIHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSh2aXNpYmxlT3B0aW9uLmluZGV4LCB2aXNpYmxlT3B0aW9uLml0ZW0pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWFjdGl2ZV09XCJpc09wdGlvbkFjdGl2ZSh2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0taWNvbi1zZWxlY3Rvcl09XCJpY29uU2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLXNlbGVjdGVkXT1cIiFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLW9wdGlvbi1pbmRleF09XCJ2aXNpYmxlT3B0aW9uLmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25PcHRpb25Nb3VzZUVudGVyKHZpc2libGVPcHRpb24uaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzT3B0aW9uU2VsZWN0ZWQodmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbkNoZWNrYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25PcHRpb25DaGVja2JveENoYW5nZSh2aXNpYmxlT3B0aW9uLml0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTk9TT05BUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgY3VzdG9tIGxpc3Rib3gga2VlcHMgb3B0aW9uIHNlbWFudGljcyBvbiB0aGUgZm9jdXNhYmxlIGFjdGlvbiBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJvcHRpb25JZCh2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSkgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25LZXlkb3duKCRldmVudCwgdmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2xpY2sodmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh2aXNpYmxlT3B0aW9uLml0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwidmlzaWJsZU9wdGlvbi5pdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi10ZXh0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWxhYmVsXCI+e3sgdmlzaWJsZU9wdGlvbi5pdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uTWV0YVRleHQodmlzaWJsZU9wdGlvbi5pdGVtKTsgYXMgb3B0aW9uTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLW1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uTWV0YSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHNkYy1jb21ib2JveF9fb3B0aW9uLXNlbGVjdGVkLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X192aXJ0dWFsLXNwYWNlclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImFmdGVyVmlydHVhbFNwYWNlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDwhLS0gTk9TT05BUjogY3VzdG9tIGNvbWJvYm94IHBvcHVwIGludGVudGlvbmFsbHkgdXNlcyBBUklBIGxpc3Rib3ggc2VtYW50aWNzIGluc3RlYWQgb2YgYSBuYXRpdmUgc2VsZWN0IC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uc1wiXG4gICAgICAgICAgICAgIFthdHRyLmlkXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICBvcHRpb24gb2YgZmlsdGVyZWRJdGVtcztcbiAgICAgICAgICAgICAgICB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoaW5kZXgsIG9wdGlvbik7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gJGluZGV4XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNPcHRpb25BY3RpdmUoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0taWNvbi1zZWxlY3Rvcl09XCJpY29uU2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1zZWxlY3RlZF09XCIhbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtb3B0aW9uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uT3B0aW9uTW91c2VFbnRlcihpbmRleClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY2hlY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbkNoZWNrYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2Uob3B0aW9uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPCEtLSBOT1NPTkFSIC0tPlxuICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgY3VzdG9tIGxpc3Rib3gga2VlcHMgb3B0aW9uIHNlbWFudGljcyBvbiB0aGUgZm9jdXNhYmxlIGFjdGlvbiBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25LZXlkb3duKCRldmVudCwgb3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJvcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJvcHRpb24uaWNvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi10ZXh0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IG9wdGlvbi50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvcHRpb25NZXRhVGV4dChvcHRpb24pOyBhcyBvcHRpb25NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uTWV0YSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIW11bHRpcGxlICYmIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtcG9wb3Zlcj5cblxuICAgIEBpZiAodWkubWVzc2FnZVRleHQpIHtcbiAgICAgIDxzbWFsbFxuICAgICAgICBbaWRdPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SW52YWxpZE1lc3NhZ2VDbGFzcygpXCJcbiAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICB7eyB1aS5tZXNzYWdlVGV4dCB9fVxuICAgICAgPC9zbWFsbD5cbiAgICB9XG4gIDwvZGl2PlxuIl19