@seniorsistemas/angular-components 19.9.14 → 19.9.15-develop-11ab86f5

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 (513) hide show
  1. package/README.md +84 -2
  2. package/accordion/README.md +5 -4
  3. package/accordion/lib/accordion/accordion.module.d.ts +7 -0
  4. package/alert/lib/alert/alert.module.d.ts +7 -0
  5. package/badge/README.md +5 -4
  6. package/badge/lib/badge/badge.module.d.ts +10 -0
  7. package/bignumber-input/README.md +5 -4
  8. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +16 -39
  9. package/bignumber-input/lib/bignumber-input/bignumber-input.module.d.ts +7 -0
  10. package/breadcrumb/README.md +5 -4
  11. package/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.module.d.ts +5 -1
  12. package/button/lib/button/button.module.d.ts +7 -0
  13. package/calendar-mask/README.md +5 -4
  14. package/calendar-mask/lib/calendar-mask/calendar-mask.module.d.ts +7 -0
  15. package/card/README.md +6 -5
  16. package/card/lib/card/card.component.d.ts +2 -0
  17. package/card/lib/card/card.module.d.ts +7 -0
  18. package/chat/README.md +11 -8
  19. package/chat/lib/chat/chat.module.d.ts +7 -0
  20. package/checkbox-list/README.md +5 -4
  21. package/checkbox-list/lib/checkbox-list/checkbox-list.module.d.ts +7 -0
  22. package/chips/README.md +5 -4
  23. package/chips/lib/chips/chips.module.d.ts +7 -0
  24. package/code-editor/README.md +5 -4
  25. package/code-editor/lib/code-editor/code-editor.module.d.ts +7 -0
  26. package/collapse-link/README.md +5 -4
  27. package/collapse-link/lib/collapse-link/collapse-link.module.d.ts +7 -0
  28. package/common/lib/angular-components.module.d.ts +9 -0
  29. package/common/lib/provide-angular-components.d.ts +19 -0
  30. package/common/lib/svg-factory/svg-factory.module.d.ts +7 -0
  31. package/common/public-api.d.ts +1 -0
  32. package/content-generator/README.md +2 -2
  33. package/content-generator/lib/content-generator/content-generator.module.d.ts +7 -0
  34. package/control-errors/README.md +2 -2
  35. package/control-errors/lib/control-errors/control-errors.module.d.ts +7 -0
  36. package/country-phone-picker/README.md +2 -2
  37. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +1 -0
  38. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.d.ts +7 -0
  39. package/currency/README.md +1 -1
  40. package/custom-fields/README.md +14 -3
  41. package/custom-fields/lib/custom-fields/custom-fields.module.d.ts +7 -0
  42. package/custom-fields/lib/custom-fields/models/custom-field-value-parser.d.ts +21 -0
  43. package/custom-fields/lib/custom-fields/models/index.d.ts +1 -0
  44. package/dialog/README.md +1 -1
  45. package/drawer/README.md +8 -4
  46. package/drawer/lib/drawer/drawer.module.d.ts +10 -0
  47. package/dynamic-form/README.md +18 -2
  48. package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +0 -1
  49. package/dynamic-form/dynamic-form/dynamic-form.module.d.ts +7 -0
  50. package/dynamic-form/dynamic-form/form-field/addon-config.d.ts +10 -1
  51. package/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.d.ts +15 -15
  52. package/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.d.ts +8 -6
  53. package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +5 -2
  54. package/dynamic-form/public-api.d.ts +0 -1
  55. package/editable-overlay/README.md +2 -2
  56. package/editable-overlay/lib/editable-overlay/editable-overlay.module.d.ts +7 -0
  57. package/empty-state/README.md +5 -2
  58. package/empty-state/lib/empty-state/empty-state.module.d.ts +7 -0
  59. package/esm2022/accordion/lib/accordion/accordion.module.mjs +8 -1
  60. package/esm2022/alert/lib/alert/alert.module.mjs +8 -1
  61. package/esm2022/badge/lib/badge/badge.module.mjs +11 -1
  62. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +19 -127
  63. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.module.mjs +8 -1
  64. package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.module.mjs +6 -2
  65. package/esm2022/button/lib/button/button.module.mjs +8 -1
  66. package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.module.mjs +8 -1
  67. package/esm2022/card/lib/card/card.component.mjs +17 -3
  68. package/esm2022/card/lib/card/card.module.mjs +8 -1
  69. package/esm2022/chat/lib/chat/chat.module.mjs +8 -1
  70. package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.module.mjs +8 -1
  71. package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
  72. package/esm2022/chips/lib/chips/chips.module.mjs +8 -1
  73. package/esm2022/code-editor/lib/code-editor/code-editor.component.mjs +10 -1
  74. package/esm2022/code-editor/lib/code-editor/code-editor.module.mjs +9 -15
  75. package/esm2022/collapse-link/lib/collapse-link/collapse-link.module.mjs +8 -1
  76. package/esm2022/common/lib/angular-components.module.mjs +10 -1
  77. package/esm2022/common/lib/provide-angular-components.mjs +22 -0
  78. package/esm2022/common/lib/svg-factory/svg-factory.module.mjs +8 -1
  79. package/esm2022/common/public-api.mjs +2 -1
  80. package/esm2022/content-generator/lib/content-generator/content-generator.module.mjs +8 -1
  81. package/esm2022/control-errors/lib/control-errors/control-errors.module.mjs +8 -1
  82. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +12 -7
  83. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.mjs +8 -1
  84. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.service.mjs +4 -3
  85. package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +17 -13
  86. package/esm2022/custom-fields/lib/custom-fields/custom-fields.module.mjs +8 -1
  87. package/esm2022/custom-fields/lib/custom-fields/custom-fields.service.mjs +4 -3
  88. package/esm2022/custom-fields/lib/custom-fields/models/custom-field-type.mjs +4 -2
  89. package/esm2022/custom-fields/lib/custom-fields/models/custom-field-value-parser.mjs +46 -0
  90. package/esm2022/custom-fields/lib/custom-fields/models/index.mjs +2 -1
  91. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +3 -3
  92. package/esm2022/drawer/lib/drawer/drawer.module.mjs +11 -1
  93. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -5
  94. package/esm2022/dynamic-form/dynamic-form/dynamic-form.module.mjs +8 -1
  95. package/esm2022/dynamic-form/dynamic-form/form-field/addon-config.mjs +6 -2
  96. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.mjs +1 -1
  97. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +1 -1
  98. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +33 -10
  99. package/esm2022/dynamic-form/public-api.mjs +2 -7
  100. package/esm2022/editable-overlay/lib/editable-overlay/editable-overlay.module.mjs +8 -1
  101. package/esm2022/empty-state/lib/empty-state/empty-state.module.mjs +8 -1
  102. package/esm2022/fieldset/lib/fieldset/fieldset.module.mjs +8 -1
  103. package/esm2022/file-picker/lib/file-picker/file-picker.module.mjs +8 -1
  104. package/esm2022/file-picker/lib/file-picker/file-picker.service.mjs +4 -3
  105. package/esm2022/gantt/lib/gantt/gantt.module.mjs +8 -1
  106. package/esm2022/global-search/lib/global-search/global-search.module.mjs +19 -1
  107. package/esm2022/grid-menu/lib/grid-menu/grid-menu.module.mjs +8 -1
  108. package/esm2022/help-popover/lib/help-popover/help-popover.module.mjs +8 -1
  109. package/esm2022/image-cropper/lib/image-cropper/image-cropper.module.mjs +12 -1
  110. package/esm2022/image-cropper/lib/image-cropper/image-cropper.service.mjs +4 -3
  111. package/esm2022/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.mjs +8 -1
  112. package/esm2022/info-sign/lib/info-sign/info-sign.module.mjs +8 -1
  113. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +5 -5
  114. package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +8 -1
  115. package/esm2022/input-group/lib/input-group/input-group.module.mjs +8 -1
  116. package/esm2022/input-mask/lib/input-mask/input-mask.module.mjs +8 -1
  117. package/esm2022/input-text/lib/input-text/input-text.module.mjs +8 -1
  118. package/esm2022/insights/lib/insights/insights.module.mjs +11 -1
  119. package/esm2022/kanban/lib/kanban/kanban-event.service.mjs +4 -3
  120. package/esm2022/kanban/lib/kanban/kanban.module.mjs +11 -1
  121. package/esm2022/label-value/lib/label-value/label-value.module.mjs +8 -1
  122. package/esm2022/loading-state/lib/loading-state/loading-state.module.mjs +8 -1
  123. package/esm2022/locale/lib/locale/locale.module.mjs +14 -1
  124. package/esm2022/locale/lib/locale/locale.service.mjs +4 -3
  125. package/esm2022/locale/lib/locale/options/index.mjs +1 -13
  126. package/esm2022/locale/lib/locale/pipes/localized-bignumber-impure.pipe.mjs +1 -1
  127. package/esm2022/locale/lib/locale/pipes/localized-bignumber.pipe.mjs +10 -2
  128. package/esm2022/locale/lib/locale/provide-locale.mjs +42 -0
  129. package/esm2022/locale/public-api.mjs +2 -1
  130. package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.directive.mjs +5 -1
  131. package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.module.mjs +8 -1
  132. package/esm2022/mask/lib/mask/mask-formatter.module.mjs +8 -1
  133. package/esm2022/mouse-events/lib/mouse-events/mouse-events.module.mjs +8 -1
  134. package/esm2022/navigation-button/lib/navigation-button/navigation-button.module.mjs +8 -1
  135. package/esm2022/number-input/lib/number-input/number-input.directive.mjs +2 -2
  136. package/esm2022/number-input/lib/number-input/number-input.module.mjs +9 -2
  137. package/esm2022/numeric/lib/numeric.module.mjs +8 -1
  138. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +178 -15
  139. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.module.mjs +8 -1
  140. package/esm2022/object-card/lib/object-card/object-card.module.mjs +12 -1
  141. package/esm2022/panel/lib/panel/panel.module.mjs +11 -1
  142. package/esm2022/password-strength/lib/password-strength/password-strength.module.mjs +8 -1
  143. package/esm2022/picklist/lib/picklist/picklist.module.mjs +8 -1
  144. package/esm2022/pin-code-field/lib/pin-code-field.module.mjs +8 -1
  145. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +8 -1
  146. package/esm2022/progressbar/lib/progressbar/progressbar.module.mjs +8 -1
  147. package/esm2022/rating-scale/lib/rating-scale/rating-scale.module.mjs +8 -1
  148. package/esm2022/select/lib/select/select.component.mjs +16 -3
  149. package/esm2022/select-button/lib/select-button/select-button.module.mjs +8 -1
  150. package/esm2022/shared/lib/shared/border-button/border-button.module.mjs +8 -1
  151. package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.mjs +8 -1
  152. package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.service.mjs +4 -3
  153. package/esm2022/slider/lib/slider/slider.module.mjs +8 -1
  154. package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition.module.mjs +8 -1
  155. package/esm2022/split-button/lib/split-button/split-button.module.mjs +8 -1
  156. package/esm2022/stats-card/lib/stats-card/stats-card.module.mjs +8 -1
  157. package/esm2022/stepper/lib/stepper/stepper.module.mjs +8 -1
  158. package/esm2022/structure/lib/structure/structure.module.mjs +8 -1
  159. package/esm2022/switch/lib/switch/switch.module.mjs +8 -1
  160. package/esm2022/table/lib/table/table.module.mjs +9 -1
  161. package/esm2022/table-header/lib/table-header/table-header-checkox.module.mjs +8 -1
  162. package/esm2022/template/lib/template/template.module.mjs +8 -1
  163. package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
  164. package/esm2022/text-area/lib/text-area.module.mjs +8 -1
  165. package/esm2022/thumbnail/lib/thumbnail/thumbnail.module.mjs +8 -1
  166. package/esm2022/thumbnails/lib/thumbnails/thumbnails.module.mjs +8 -1
  167. package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.module.mjs +8 -1
  168. package/esm2022/tile/lib/tile/tile.module.mjs +11 -1
  169. package/esm2022/timeline/lib/timeline/timeline.module.mjs +8 -1
  170. package/esm2022/toast/lib/toast/toast.module.mjs +8 -1
  171. package/esm2022/token-list/lib/token-list/token-list.module.mjs +8 -1
  172. package/esm2022/tooltip/lib/tooltip/tooltip.module.mjs +8 -1
  173. package/esm2022/topbar/lib/topbar/topbar.module.mjs +11 -1
  174. package/esm2022/tree/lib/tree/tree.module.mjs +8 -1
  175. package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.module.mjs +8 -1
  176. package/fesm2022/seniorsistemas-angular-components-accordion.mjs +7 -0
  177. package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
  178. package/fesm2022/seniorsistemas-angular-components-alert.mjs +7 -0
  179. package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
  180. package/fesm2022/seniorsistemas-angular-components-badge.mjs +10 -0
  181. package/fesm2022/seniorsistemas-angular-components-badge.mjs.map +1 -1
  182. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +25 -126
  183. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  184. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -1
  185. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
  186. package/fesm2022/seniorsistemas-angular-components-button.mjs +7 -0
  187. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  188. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +7 -0
  189. package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
  190. package/fesm2022/seniorsistemas-angular-components-card.mjs +23 -2
  191. package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
  192. package/fesm2022/seniorsistemas-angular-components-chat.mjs +7 -0
  193. package/fesm2022/seniorsistemas-angular-components-chat.mjs.map +1 -1
  194. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +7 -0
  195. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
  196. package/fesm2022/seniorsistemas-angular-components-chips.mjs +9 -2
  197. package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
  198. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +164 -160
  199. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  200. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +7 -0
  201. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
  202. package/fesm2022/seniorsistemas-angular-components-common.mjs +38 -2
  203. package/fesm2022/seniorsistemas-angular-components-common.mjs.map +1 -1
  204. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +7 -0
  205. package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
  206. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +7 -0
  207. package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
  208. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +21 -8
  209. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
  210. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +75 -15
  211. package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
  212. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +2 -2
  213. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  214. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +10 -0
  215. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  216. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +54 -212
  217. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  218. package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs +7 -0
  219. package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs.map +1 -1
  220. package/fesm2022/seniorsistemas-angular-components-empty-state.mjs +7 -0
  221. package/fesm2022/seniorsistemas-angular-components-empty-state.mjs.map +1 -1
  222. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +7 -0
  223. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
  224. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +10 -2
  225. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  226. package/fesm2022/seniorsistemas-angular-components-gantt.mjs +7 -0
  227. package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
  228. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +18 -0
  229. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  230. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +7 -0
  231. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
  232. package/fesm2022/seniorsistemas-angular-components-help-popover.mjs +7 -0
  233. package/fesm2022/seniorsistemas-angular-components-help-popover.mjs.map +1 -1
  234. package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs +14 -2
  235. package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs.map +1 -1
  236. package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs +7 -0
  237. package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs.map +1 -1
  238. package/fesm2022/seniorsistemas-angular-components-info-sign.mjs +7 -0
  239. package/fesm2022/seniorsistemas-angular-components-info-sign.mjs.map +1 -1
  240. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +11 -4
  241. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  242. package/fesm2022/seniorsistemas-angular-components-input-group.mjs +7 -0
  243. package/fesm2022/seniorsistemas-angular-components-input-group.mjs.map +1 -1
  244. package/fesm2022/seniorsistemas-angular-components-input-mask.mjs +7 -0
  245. package/fesm2022/seniorsistemas-angular-components-input-mask.mjs.map +1 -1
  246. package/fesm2022/seniorsistemas-angular-components-input-text.mjs +7 -0
  247. package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
  248. package/fesm2022/seniorsistemas-angular-components-insights.mjs +10 -0
  249. package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
  250. package/fesm2022/seniorsistemas-angular-components-kanban.mjs +13 -2
  251. package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
  252. package/fesm2022/seniorsistemas-angular-components-label-value.mjs +7 -0
  253. package/fesm2022/seniorsistemas-angular-components-label-value.mjs.map +1 -1
  254. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +7 -0
  255. package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
  256. package/fesm2022/seniorsistemas-angular-components-locale.mjs +58 -5
  257. package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
  258. package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs +11 -0
  259. package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs.map +1 -1
  260. package/fesm2022/seniorsistemas-angular-components-mask.mjs +7 -0
  261. package/fesm2022/seniorsistemas-angular-components-mask.mjs.map +1 -1
  262. package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs +7 -0
  263. package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs.map +1 -1
  264. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +7 -0
  265. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
  266. package/fesm2022/seniorsistemas-angular-components-number-input.mjs +9 -2
  267. package/fesm2022/seniorsistemas-angular-components-number-input.mjs.map +1 -1
  268. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +184 -14
  269. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  270. package/fesm2022/seniorsistemas-angular-components-numeric.mjs +7 -0
  271. package/fesm2022/seniorsistemas-angular-components-numeric.mjs.map +1 -1
  272. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +11 -0
  273. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  274. package/fesm2022/seniorsistemas-angular-components-panel.mjs +10 -0
  275. package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
  276. package/fesm2022/seniorsistemas-angular-components-password-strength.mjs +7 -0
  277. package/fesm2022/seniorsistemas-angular-components-password-strength.mjs.map +1 -1
  278. package/fesm2022/seniorsistemas-angular-components-picklist.mjs +7 -0
  279. package/fesm2022/seniorsistemas-angular-components-picklist.mjs.map +1 -1
  280. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +7 -0
  281. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
  282. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +7 -0
  283. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
  284. package/fesm2022/seniorsistemas-angular-components-progressbar.mjs +7 -0
  285. package/fesm2022/seniorsistemas-angular-components-progressbar.mjs.map +1 -1
  286. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +7 -0
  287. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  288. package/fesm2022/seniorsistemas-angular-components-select-button.mjs +7 -0
  289. package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
  290. package/fesm2022/seniorsistemas-angular-components-select.mjs +15 -2
  291. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  292. package/fesm2022/seniorsistemas-angular-components-shared.mjs +7 -0
  293. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  294. package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs +10 -2
  295. package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs.map +1 -1
  296. package/fesm2022/seniorsistemas-angular-components-slider.mjs +7 -0
  297. package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
  298. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +7 -0
  299. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
  300. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +7 -0
  301. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  302. package/fesm2022/seniorsistemas-angular-components-stats-card.mjs +7 -0
  303. package/fesm2022/seniorsistemas-angular-components-stats-card.mjs.map +1 -1
  304. package/fesm2022/seniorsistemas-angular-components-stepper.mjs +7 -0
  305. package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
  306. package/fesm2022/seniorsistemas-angular-components-structure.mjs +7 -0
  307. package/fesm2022/seniorsistemas-angular-components-structure.mjs.map +1 -1
  308. package/fesm2022/seniorsistemas-angular-components-switch.mjs +7 -0
  309. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  310. package/fesm2022/seniorsistemas-angular-components-table-header.mjs +7 -0
  311. package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
  312. package/fesm2022/seniorsistemas-angular-components-table.mjs +8 -0
  313. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  314. package/fesm2022/seniorsistemas-angular-components-template.mjs +7 -0
  315. package/fesm2022/seniorsistemas-angular-components-template.mjs.map +1 -1
  316. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +9 -2
  317. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  318. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +7 -0
  319. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
  320. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +7 -0
  321. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
  322. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +7 -0
  323. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  324. package/fesm2022/seniorsistemas-angular-components-tile.mjs +10 -0
  325. package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
  326. package/fesm2022/seniorsistemas-angular-components-timeline.mjs +7 -0
  327. package/fesm2022/seniorsistemas-angular-components-timeline.mjs.map +1 -1
  328. package/fesm2022/seniorsistemas-angular-components-toast.mjs +7 -0
  329. package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
  330. package/fesm2022/seniorsistemas-angular-components-token-list.mjs +7 -0
  331. package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
  332. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +7 -0
  333. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
  334. package/fesm2022/seniorsistemas-angular-components-topbar.mjs +10 -0
  335. package/fesm2022/seniorsistemas-angular-components-topbar.mjs.map +1 -1
  336. package/fesm2022/seniorsistemas-angular-components-tree.mjs +7 -0
  337. package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
  338. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +7 -0
  339. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
  340. package/fieldset/README.md +2 -2
  341. package/fieldset/lib/fieldset/fieldset.module.d.ts +7 -0
  342. package/file-picker/README.md +2 -2
  343. package/file-picker/lib/file-picker/file-picker.module.d.ts +7 -0
  344. package/file-upload/README.md +1 -1
  345. package/gantt/README.md +2 -2
  346. package/gantt/lib/gantt/gantt.module.d.ts +7 -0
  347. package/global-search/README.md +5 -2
  348. package/global-search/lib/global-search/global-search.module.d.ts +18 -0
  349. package/grid-menu/README.md +5 -4
  350. package/grid-menu/lib/grid-menu/grid-menu.module.d.ts +7 -0
  351. package/help-popover/README.md +5 -4
  352. package/help-popover/lib/help-popover/help-popover.module.d.ts +7 -0
  353. package/ia-insight/README.md +1 -1
  354. package/image-cropper/README.md +6 -5
  355. package/image-cropper/lib/image-cropper/image-cropper.module.d.ts +11 -0
  356. package/infinite-scroll/README.md +5 -4
  357. package/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.d.ts +7 -0
  358. package/info-sign/README.md +5 -4
  359. package/info-sign/lib/info-sign/info-sign.module.d.ts +7 -0
  360. package/inline-edit/README.md +5 -4
  361. package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +7 -0
  362. package/input-group/lib/input-group/input-group.module.d.ts +7 -0
  363. package/input-mask/lib/input-mask/input-mask.module.d.ts +7 -0
  364. package/input-text/lib/input-text/input-text.module.d.ts +7 -0
  365. package/insights/README.md +6 -4
  366. package/insights/lib/insights/insights.module.d.ts +10 -0
  367. package/kanban/README.md +6 -4
  368. package/kanban/lib/kanban/kanban.module.d.ts +10 -0
  369. package/label-value/README.md +5 -4
  370. package/label-value/lib/label-value/label-value.module.d.ts +7 -0
  371. package/loading-state/README.md +9 -5
  372. package/loading-state/lib/loading-state/loading-state.module.d.ts +7 -0
  373. package/locale/lib/locale/locale.module.d.ts +13 -0
  374. package/locale/lib/locale/pipes/localized-bignumber-impure.pipe.d.ts +2 -2
  375. package/locale/lib/locale/pipes/localized-bignumber.pipe.d.ts +20 -1
  376. package/locale/lib/locale/provide-locale.d.ts +18 -0
  377. package/locale/public-api.d.ts +1 -0
  378. package/localized-number-input/README.md +32 -8
  379. package/localized-number-input/lib/localized-number-input/localized-number-input.directive.d.ts +4 -0
  380. package/localized-number-input/lib/localized-number-input/localized-number-input.module.d.ts +7 -0
  381. package/mask/lib/mask/mask-formatter.module.d.ts +7 -0
  382. package/mouse-events/README.md +5 -4
  383. package/mouse-events/lib/mouse-events/mouse-events.module.d.ts +7 -0
  384. package/navigation-button/README.md +5 -4
  385. package/navigation-button/lib/navigation-button/navigation-button.module.d.ts +7 -0
  386. package/number-input/lib/number-input/number-input.directive.d.ts +1 -1
  387. package/number-input/lib/number-input/number-input.module.d.ts +8 -1
  388. package/numeric/README.md +6 -5
  389. package/numeric/lib/numeric.module.d.ts +7 -0
  390. package/numeric-mask/README.md +44 -1
  391. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +65 -4
  392. package/numeric-mask/lib/numeric-mask/numeric-mask.module.d.ts +7 -0
  393. package/object-card/README.md +11 -4
  394. package/object-card/lib/object-card/object-card.module.d.ts +11 -0
  395. package/package.json +1 -1
  396. package/panel/README.md +8 -4
  397. package/panel/lib/panel/panel.module.d.ts +10 -0
  398. package/password-strength/README.md +6 -3
  399. package/password-strength/lib/password-strength/password-strength.module.d.ts +7 -0
  400. package/picklist/README.md +8 -5
  401. package/picklist/lib/picklist/picklist.module.d.ts +7 -0
  402. package/pin-code-field/lib/pin-code-field.module.d.ts +7 -0
  403. package/product-header/README.md +2 -2
  404. package/profile-picture-picker/README.md +6 -3
  405. package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.d.ts +7 -0
  406. package/progressbar/README.md +6 -3
  407. package/progressbar/lib/progressbar/progressbar.module.d.ts +7 -0
  408. package/rating-scale/README.md +6 -3
  409. package/rating-scale/lib/rating-scale/rating-scale.module.d.ts +7 -0
  410. package/schematics/collection.json +40 -0
  411. package/schematics/migrations/migrate-app-to-standalone/index.d.ts +32 -0
  412. package/schematics/migrations/migrate-app-to-standalone/index.js +98 -0
  413. package/schematics/migrations/migrate-app-to-standalone/index.js.map +1 -0
  414. package/schematics/migrations/migrate-deprecated-apis/index.d.ts +49 -0
  415. package/schematics/migrations/migrate-deprecated-apis/index.js +660 -0
  416. package/schematics/migrations/migrate-deprecated-apis/index.js.map +1 -0
  417. package/schematics/migrations/migrate-deprecated-datepicker/index.d.ts +31 -0
  418. package/schematics/migrations/migrate-deprecated-datepicker/index.js +115 -0
  419. package/schematics/migrations/migrate-deprecated-datepicker/index.js.map +1 -0
  420. package/schematics/migrations/migrate-deprecated-dynamic-form/index.d.ts +52 -0
  421. package/schematics/migrations/migrate-deprecated-dynamic-form/index.js +661 -0
  422. package/schematics/migrations/migrate-deprecated-dynamic-form/index.js.map +1 -0
  423. package/schematics/migrations/migrate-deprecated-imports/index.d.ts +23 -0
  424. package/schematics/migrations/migrate-deprecated-imports/index.js +335 -0
  425. package/schematics/migrations/migrate-deprecated-imports/index.js.map +1 -0
  426. package/schematics/migrations/migrate-deprecated-selectors/index.d.ts +15 -0
  427. package/schematics/migrations/migrate-deprecated-selectors/index.js +76 -0
  428. package/schematics/migrations/migrate-deprecated-selectors/index.js.map +1 -0
  429. package/schematics/migrations/migrate-modules-to-standalone/index.d.ts +51 -0
  430. package/schematics/migrations/migrate-modules-to-standalone/index.js +632 -0
  431. package/schematics/migrations/migrate-modules-to-standalone/index.js.map +1 -0
  432. package/schematics/migrations/migrate-modules-to-standalone/modules-map.json +1656 -0
  433. package/schematics/migrations/migrate-v20/index.d.ts +9 -0
  434. package/schematics/migrations/migrate-v20/index.js +90 -0
  435. package/schematics/migrations/migrate-v20/index.js.map +1 -0
  436. package/schematics/migrations/migrate-v20/items.d.ts +7 -0
  437. package/schematics/migrations/migrate-v20/items.js +54 -0
  438. package/schematics/migrations/migrate-v20/items.js.map +1 -0
  439. package/schematics/migrations/migrate-v20/plan.d.ts +32 -0
  440. package/schematics/migrations/migrate-v20/plan.js +29 -0
  441. package/schematics/migrations/migrate-v20/plan.js.map +1 -0
  442. package/schematics/migrations.json +5 -1
  443. package/schematics/schema/app-standalone.schema.json +21 -0
  444. package/schematics/schema/migrate-v20.schema.json +33 -0
  445. package/schematics/schema/scope.schema.json +17 -0
  446. package/schematics/utils/ast-utils.js +16 -0
  447. package/schematics/utils/ast-utils.js.map +1 -1
  448. package/schematics/utils/eol.d.ts +5 -0
  449. package/schematics/utils/eol.js +17 -0
  450. package/schematics/utils/eol.js.map +1 -0
  451. package/schematics/utils/prompt-utils.d.ts +62 -0
  452. package/schematics/utils/prompt-utils.js +166 -0
  453. package/schematics/utils/prompt-utils.js.map +1 -0
  454. package/schematics/utils/report.d.ts +27 -0
  455. package/schematics/utils/report.js +70 -0
  456. package/schematics/utils/report.js.map +1 -0
  457. package/schematics/utils/scope.d.ts +17 -0
  458. package/schematics/utils/scope.js +55 -0
  459. package/schematics/utils/scope.js.map +1 -0
  460. package/schematics/utils/selection.d.ts +21 -0
  461. package/schematics/utils/selection.js +60 -0
  462. package/schematics/utils/selection.js.map +1 -0
  463. package/schematics/utils/symbol-utils.d.ts +31 -0
  464. package/schematics/utils/symbol-utils.js +202 -0
  465. package/schematics/utils/symbol-utils.js.map +1 -0
  466. package/schematics/utils/template-utils.d.ts +62 -0
  467. package/schematics/utils/template-utils.js +165 -0
  468. package/schematics/utils/template-utils.js.map +1 -0
  469. package/schematics/utils/tsconfig-paths.d.ts +5 -0
  470. package/schematics/utils/tsconfig-paths.js +73 -0
  471. package/schematics/utils/tsconfig-paths.js.map +1 -0
  472. package/select/lib/select/select.component.d.ts +8 -0
  473. package/select-button/README.md +6 -3
  474. package/select-button/lib/select-button/select-button.module.d.ts +7 -0
  475. package/shared/lib/shared/border-button/border-button.module.d.ts +7 -0
  476. package/sidebar/README.md +2 -2
  477. package/slide-in-bar/README.md +5 -5
  478. package/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.d.ts +7 -0
  479. package/slider/README.md +6 -3
  480. package/slider/lib/slider/slider.module.d.ts +7 -0
  481. package/speech-recognition/README.md +6 -3
  482. package/speech-recognition/lib/speech-recognition/speech-recognition.module.d.ts +7 -0
  483. package/split-button/README.md +6 -3
  484. package/split-button/lib/split-button/split-button.module.d.ts +7 -0
  485. package/stats-card/README.md +6 -3
  486. package/stats-card/lib/stats-card/stats-card.module.d.ts +7 -0
  487. package/stepper/README.md +6 -3
  488. package/stepper/lib/stepper/stepper.module.d.ts +7 -0
  489. package/structure/lib/structure/structure.module.d.ts +7 -0
  490. package/switch/README.md +6 -3
  491. package/switch/lib/switch/switch.module.d.ts +7 -0
  492. package/table/README.md +12 -4
  493. package/table/lib/table/table.module.d.ts +8 -0
  494. package/table-header/lib/table-header/table-header-checkox.module.d.ts +7 -0
  495. package/template/README.md +0 -11
  496. package/template/lib/template/template.module.d.ts +7 -0
  497. package/text-area/lib/text-area.module.d.ts +7 -0
  498. package/text-area-ia/README.md +1 -1
  499. package/thumbnail/lib/thumbnail/thumbnail.module.d.ts +7 -0
  500. package/thumbnails/lib/thumbnails/thumbnails.module.d.ts +7 -0
  501. package/tiered-menu/lib/tiered-menu/tiered-menu.module.d.ts +7 -0
  502. package/tile/lib/tile/tile.module.d.ts +10 -0
  503. package/timeline/lib/timeline/timeline.module.d.ts +7 -0
  504. package/toast/lib/toast/toast.module.d.ts +7 -0
  505. package/token-list/lib/token-list/token-list.module.d.ts +7 -0
  506. package/tooltip/lib/tooltip/tooltip.module.d.ts +7 -0
  507. package/topbar/lib/topbar/topbar.module.d.ts +10 -0
  508. package/tree/lib/tree/tree.module.d.ts +7 -0
  509. package/workspace-switch/lib/workspace-switch/workspace-switch.module.d.ts +7 -0
  510. package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +0 -664
  511. package/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.d.ts +0 -29
  512. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +0 -96
  513. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +0 -124
@@ -273,6 +273,13 @@ export class SelectComponent {
273
273
  filter: new FormControl('', { nonNullable: true }),
274
274
  });
275
275
  _containerDiv = viewChild('containerDiv');
276
+ /**
277
+ * Largura do painel (igual à do trigger), medida quando o overlay é anexado. Ler `offsetWidth`
278
+ * direto no template mede layout durante o change detection e dispara NG0100 quando a largura
279
+ * muda entre duas verificações. Um resize da janela fecha o painel (`onWindowResize`), então
280
+ * medir na abertura basta.
281
+ */
282
+ panelWidth = signal(null);
276
283
  _filterInput = viewChild('filterInput');
277
284
  // `read: ElementRef` é obrigatório aqui: `#selectAllCheckbox` está num elemento de
278
285
  // componente (`<s-checkbox>`), então sem isso o viewChild resolve pra instância do
@@ -545,6 +552,12 @@ export class SelectComponent {
545
552
  * Fecha o dropdown de opções caso ele esteja visível ao redimensionar a janela.
546
553
  * @param _ Evento de redimensionamento da janela (não utilizado).
547
554
  */
555
+ _syncPanelWidth() {
556
+ const width = this._containerDiv()?.nativeElement.offsetWidth;
557
+ if (width !== undefined) {
558
+ this.panelWidth.set(width);
559
+ }
560
+ }
548
561
  onWindowResize(_) {
549
562
  if (this.showOptions()) {
550
563
  this._closeDropdown();
@@ -1064,7 +1077,7 @@ export class SelectComponent {
1064
1077
  useExisting: forwardRef(() => SelectComponent),
1065
1078
  multi: true,
1066
1079
  },
1067
- ], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }, { propertyName: "_filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "_selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l group-hover:bg-grayscale-5\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n role=\"presentation\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "isSelected", "checkIconClass", "groupAnnouncement", "posinset", "setsize"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], animations: [
1080
+ ], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }, { propertyName: "_filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }, { propertyName: "_selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l group-hover:bg-grayscale-5\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (attach)=\"_syncPanelWidth()\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"panelWidth()\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n role=\"presentation\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "isSelected", "checkIconClass", "groupAnnouncement", "posinset", "setsize"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], animations: [
1068
1081
  trigger('visibilityChanged', [
1069
1082
  state('void', style({ opacity: 0, transform: 'scale(0.95)' })),
1070
1083
  transition(':enter', [
@@ -1103,6 +1116,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1103
1116
  animate('500ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'scale(0.95)' })),
1104
1117
  ]),
1105
1118
  ]),
1106
- ], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l group-hover:bg-grayscale-5\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n role=\"presentation\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"] }]
1119
+ ], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-medium border outline-2 outline-[var(--s-focus-ring-color,#0090ff)] outline-offset-[-2px] focus-visible:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-[10px] py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n (keydown)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex w-9 shrink-0 items-center justify-center border-l group-hover:bg-grayscale-5\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas text-base\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"_closeDropdown()\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (attach)=\"_syncPanelWidth()\"\n (detach)=\"_closeDropdown()\"\n>\n <div\n #dropdownPanel\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"panelWidth()\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n [ariaLabel]=\"selectAllCheckboxAriaLabel()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n (keydown)=\"onClearFilterButtonKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n role=\"presentation\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul\n class=\"max-h-52 overflow-auto\"\n role=\"presentation\"\n >\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [checkIconClass]=\"checkIconClass()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n [groupAnnouncement]=\"groupAnnouncementFor(option.id)\"\n [posinset]=\"optionPosinsetFor(option.id)\"\n [setsize]=\"optionSetsizeFor(option.id)\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid .select-container:not(:focus-within){&,.dropdown-container{border-color:#c13018}}\n"] }]
1107
1120
  }], ctorParameters: () => [] });
1108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFFSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUVOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FB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bm5vdW5jZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBPdmVybGF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5cbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBhZnRlck5leHRSZW5kZXIsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgSW5qZWN0b3IsXG4gICAgbW9kZWwsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsLFxuICAgIFNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgZWZmZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvY2hlY2tib3gnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2VsZWN0T3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NlbGVjdC1vcHRpb24vc2VsZWN0LW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIHNlbGXDp8OjbyBkcm9wZG93biBnZW7DqXJpY28gY29tIHN1cG9ydGUgYSBzZWxlw6fDo28gc2ltcGxlcyBlIG3Dumx0aXBsYSxcbiAqIGZpbHRybywgYWdydXBhbWVudG8sIHZpcnR1YWwgc2Nyb2xsIGUgYWNlc3NpYmlsaWRhZGUgKEFSSUEgY29tYm9ib3gpLiBJbXBsZW1lbnRhXG4gKiB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmEgaW50ZWdyYcOnw6NvIGNvbSBSZWFjdGl2ZSBGb3JtcyBlIFRlbXBsYXRlLWRyaXZlbiBGb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHMtc2VsZWN0XG4gKiAgIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3JpYVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtYSBjYXRlZ29yaWFcIlxuICogICBbb3B0aW9uc109XCJjYXRlZ29yaWFzXCJcbiAqICAgb3B0aW9uTGFiZWw9XCJub21lXCJcbiAqICAgb3B0aW9uVmFsdWU9XCJpZFwiXG4gKiAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gKiAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICB9LFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIC5zZWxlY3QtY29udGFpbmVyOm5vdCg6Zm9jdXMtd2l0aGluKSB7XG4gICAgICAgICAgICAgICAgJixcbiAgICAgICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCd2aXNpYmlsaXR5Q2hhbmdlZCcsIFtcbiAgICAgICAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjk1KScgfSkpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxKScgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnNTAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBdKSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBlc3TDoSBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGEgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgb3DDp8O1ZXMgc2ltdWx0w6JuZWFzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXG4gICAgcHVibGljIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gbGFiZWwgZGUgZXhpYmnDp8Ojby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIHZhbG9yIGEgc2VyIGVtaXRpZG8gYW8gZm9ybXVsw6FyaW8uICovXG4gICAgcHVibGljIG9wdGlvblZhbHVlID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gYm90w6NvIHBhcmEgbGltcGFyIGEgc2VsZcOnw6NvIGF0dWFsLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93Q2xlYXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHVtIGNhbXBvIGRlIGZpbHRybyB0ZXh0dWFsIHBhcmEgcGVzcXVpc2EgbmFzIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENsYXNzZSBkbyDDrWNvbmUgZGUgY2hlY2ttYXJrIGV4aWJpZG8gcXVhbmRvIGBjaGVja21hcmtgIGVzdMOhIGF0aXZvLiBAZGVmYXVsdCAnZmFyIGZhLWNoZWNrJyAqL1xuICAgIHB1YmxpYyBjaGVja0ljb25DbGFzcyA9IGlucHV0KCdmYXIgZmEtY2hlY2snKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUocykgZG8gb2JqZXRvIHVzYWRhKHMpIHBhcmEgZmlsdHJhZ2VtIHRleHR1YWwuIFF1YW5kbyBuw6NvIGluZm9ybWFkbywgdXNhIGBvcHRpb25MYWJlbGAuICovXG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhZ3J1cGFtZW50byBkZSBvcMOnw7Vlcy4gQXMgb3DDp8O1ZXMgZGV2ZW0gY29udGVyIGl0ZW5zIGZpbGhvcyBjb25mb3JtZSBhIGVzdHJ1dHVyYSBkZSBncnVwbyBzdXBvcnRhZGEuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGdyb3VwID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB2aXJ0dWFsaXphw6fDo28gZGEgbGlzdGEgcGFyYSBtZWxob3IgcGVyZm9ybWFuY2UgY29tIGdyYW5kZXMgdm9sdW1lcyBkZSBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQWx0dXJhIGZpeGEgZGUgY2FkYSBpdGVtIGRhIGxpc3RhIGVtIHBpeGVscywgbmVjZXNzw6FyaWEgcGFyYSBvIGPDoWxjdWxvIGRvIHZpcnR1YWwgc2Nyb2xsLiBAZGVmYXVsdCAzNyAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGV4aWJpZGEgcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBjb3JyZXNwb25kZSBhbyBmaWx0cm8gYXBsaWNhZG8uIEBkZWZhdWx0IG51bGwgKi9cbiAgICBwdWJsaWMgZW1wdHlNZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIG8gZXN0YWRvIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBhIHZpc2liaWxpZGFkZSBkbyBwYWluZWwgZGUgb3DDp8O1ZXMgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd09wdGlvbnMgPSBtb2RlbChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExhYmVsIGRlIGFjZXNzaWJpbGlkYWRlIGRvIGNvbXBvbmVudGUuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIGFyaWFMYWJlbCA9IGlucHV0KCcnKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSUQgZG8gZWxlbWVudG8gZXh0ZXJubyBxdWUgZGVzY3JldmUgbyBjb21wb25lbnRlIChhcmlhLWxhYmVsbGVkYnkpLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IGlucHV0KCcnKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkgPSBzaWduYWwoJycpO1xuXG4gICAgLyoqXG4gICAgICogSUQgZG8gbGFiZWwgcmVzb2x2aWRvIHBhcmEgYGFyaWEtbGFiZWxsZWRieWAgZG8gY29tYm9ib3ggaW50ZXJuby5cbiAgICAgKiBQcmlvcml6YSBvIHZhbG9yIGV4cGzDrWNpdG8gZGUgYGFyaWFMYWJlbGxlZEJ5YDsgY2FzbyBjb250csOhcmlvLCB1c2EgbyBpZCBkZSB1bVxuICAgICAqIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBleHRlcm5vIGFzc29jaWFkbyBhbyBob3N0IChkZXRlY3RhZG8gZW0gcnVudGltZSkuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc29sdmVkQXJpYUxhYmVsbGVkQnkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbGxlZEJ5KCkgfHwgdGhpcy5fZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeSgpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHZhbHVlID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oW10pO1xuICAgIHB1YmxpYyBmaWx0ZXJWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGZvY3VzZWRJbmRleCA9IHNpZ25hbCgtMSk7XG4gICAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlOiBUIHwgVFtdIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYHNlbGVjdCR7U2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyAoZXhjbHVpbmRvIGFncnVwYWRvcmVzKSBlc3RpdmVyZW0gcHJlc2VudGVzXG4gICAgICogbmEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MsIGUgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGFsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnZhbHVlcygpLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IHJldCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKG9wdGlvbi5pZCkpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogTGFiZWwgZGUgYWNlc3NpYmlsaWRhZGUgZG8gY2hlY2tib3ggXCJTZWxlY2lvbmFyIFRvZG9zXCIsIGNvbnRleHR1YWwgYW8gZXN0YWRvIGF0dWFsIOKAlFxuICAgICAqIHJlcG9ydGFkbzogc2VtIGBhcmlhTGFiZWxgIGV4cGzDrWNpdG8sIG8gbGVpdG9yIGRlIHRlbGEgc8OzIGFudW5jaWF2YSBcImNoZWNrYm94LCBuw6NvXG4gICAgICogbWFyY2Fkb1wiLCBzZW0gaW5kaWNhciBhIGHDp8OjbyAoc2VsZWNpb25hciBvdSBkZXNtYXJjYXIgdG9kYXMgYXMgb3DDp8O1ZXMpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzZWxlY3RBbGxDaGVja2JveEFyaWFMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5hbGxTZWxlY3RlZCgpXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX2Rlc2VsZWN0X2FjdGlvbidcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RfYWxsX29wdGlvbnNfc2VsZWN0X2FjdGlvbic7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpW2luZGV4XT8uZGF0YSA/PyBudWxsO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkT3B0aW9uSWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpW2luZGV4XT8uaWQgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGEgZSByZXRvcm5hIGEgbGlzdGEgaW50ZXJuYSBkZSBvcMOnw7VlcyBkbyBkcm9wZG93bi5cbiAgICAgKiAtIFNlIGFzIG9ww6fDtWVzIGVzdGl2ZXJlbSBhZ3J1cGFkYXMgKGBncm91cCgpYCByZXRvcm5hIHZlcmRhZGVpcm8pLFxuICAgICAqICAgdXRpbGl6YSBgX2dyb3VwZXJUb0ZsYXRgIHBhcmEgdHJhbnNmb3JtYXIgYXMgb3DDp8O1ZXMgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYS5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgcmV0b3JuYSBhcyBvcMOnw7VlcyBjb20gSURzIGFkaWNpb25hZG9zLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YCByZXByZXNlbnRhbmRvIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICovXG4gICAgcHVibGljIGludGVybmFsT3B0aW9ucyA9IGNvbXB1dGVkPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNXaXRoSWQgPSB0aGlzLl9hZGRJZFRvT3B0aW9ucyhvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXAoKSA/IHRoaXMuX2dyb3VwZXJUb0ZsYXQob3B0aW9uc1dpdGhJZCkgOiBvcHRpb25zV2l0aElkO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgc3RyaW5nIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwgZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbWFpcyBkZSB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sXG4gICAgICogICByZXRvcm5hIHVtYSBtZW5zYWdlbSB0cmFkdXppZGEgaW5kaWNhbmRvIG8gbsO6bWVybyB0b3RhbCBkZSByZWdpc3Ryb3Mgc2VsZWNpb25hZG9zLlxuICAgICAqIC0gU2UgYXBlbmFzIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZGVzc2UgaXRlbS5cbiAgICAgKiAtIFNlIG8gbW9kbyBtw7psdGlwbG8gbsOjbyBlc3RpdmVyIGF0aXZhZG8sIHJldG9ybmEgbyByw7N0dWxvIGRvIGl0ZW0gc2VsZWNpb25hZG8gb3UgdW1hIHN0cmluZyB2YXppYSBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBzZWxlY2lvbmFkby5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUZXh0byByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmludCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudG90YWxfcmVjb3Jkc19zZWxlY3RlZGAsIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IHNlbGVjdGVkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZFswXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkID8gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkLmRhdGEpIDogJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2UgbyBzZWxldG9yIGVzdMOhIFwibGltcG9cIiwgb3Ugc2VqYSwgc2VtIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkby5cbiAgICAgKiAtIE5vIG1vZG8gbcO6bHRpcGxvIChgbXVsdGlwbGVgKSwgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvIChgdmFsdWVzYCBlc3TDoSB2YXppbykuXG4gICAgICogLSBObyBtb2RvIHNpbXBsZXMsIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIHZhbG9yIHNlbGVjaW9uYWRvIChgdmFsdWVgIMOpIGZhbHN5KS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgc2VsZcOnw6NvLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDbGVhbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUoKSA/ICF0aGlzLnZhbHVlcygpLmxlbmd0aCA6ICF0aGlzLnZhbHVlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIG8gZXN0YWRvIGRlIHNlbGXDp8OjbyBcIlNlbGVjaW9uYXIgVG9kb3NcIiBlc3TDoSBpbmRldGVybWluYWRvLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHF1YW5kbyBuZW0gdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIGVzdMOjbyBzZWxlY2lvbmFkb3MgZSBuZW0gdG9kb3MgZXN0w6NvIGRlc21hcmNhZG9zLFxuICAgICAqIG91IHNlamEsIHF1YW5kbyBow6EgdW1hIHNlbGXDp8OjbyBwYXJjaWFsIGRvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSBhIHNlbGXDp8OjbyBmb3IgcGFyY2lhbCwgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKS5zb21lKChvKSA9PiBvLmlkID09PSBvcHRpb24uaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IGFsbCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuICAgICAgICBjb25zdCBub25lID0gb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiAhc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG5cbiAgICAgICAgcmV0dXJuICFhbGwgJiYgIW5vbmU7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMgY29tIGJhc2Ugbm8gdmFsb3IgZGUgYnVzY2EgKGBmaWx0ZXJWYWx1ZWApIGUgbm9zIGNyaXTDqXJpb3MgZGVmaW5pZG9zLlxuICAgICAqIC0gU2UgbyBmaWx0cm8gZXN0aXZlciBkZXNhYmlsaXRhZG8gb3UgbyB2YWxvciBkZSBidXNjYSBlc3RpdmVyIHZhemlvLCByZXRvcm5hIHRvZGFzIGFzIG9ww6fDtWVzLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCBmaWx0cmEgYXMgb3DDp8O1ZXMgdXRpbGl6YW5kbyBvKHMpIGNhbXBvKHMpIGVzcGVjaWZpY2FkbyhzKSBlbSBgZmlsdGVyQnlgLlxuICAgICAqIC0gSWdub3JhIG9ww6fDtWVzIHF1ZSBwb3NzdWVtIGEgcHJvcHJpZWRhZGUgYGdyb3VwZXJgIGRlZmluaWRhLlxuICAgICAqIEByZXR1cm5zIEFzIG9ww6fDtWVzIGZpbHRyYWRhcyBjb25mb3JtZSBvIHZhbG9yIGRlIGJ1c2NhIGUgY3JpdMOpcmlvcyBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYWxsT3B0aW9ucyA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuZmlsdGVyVmFsdWUoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyKCkgfHwgIXNlYXJjaCkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbE9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJCeSA9IHRoaXMuZmlsdGVyQnkoKTtcbiAgICAgICAgcmV0dXJuIGFsbE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuXG4gICAgICAgICAgICBpZiAoIWZpbHRlckJ5KSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb24uZGF0YVtvcHRpb25MYWJlbF0pIDogU3RyaW5nKG9wdGlvbi5kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJCeSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGZpbHRlckJ5Lm1hcCgoYnkpID0+IFN0cmluZyhvcHRpb24uZGF0YVtieV0gPz8gJycpKS5qb2luKCcgJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gU3RyaW5nKG9wdGlvbi5kYXRhW2ZpbHRlckJ5XSA/PyAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBsYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogTWFwZWlhIG8gaWQgZGUgY2FkYSBvcMOnw6NvIHF1ZSDDqSBhIFBSSU1FSVJBIGRlIHVtIGdydXBvIChgZ3JvdXAoKWAgaGFiaWxpdGFkbykgYW8gdGV4dG9cbiAgICAgKiBhbnVuY2lhZG8gdmlhIGBhcmlhLWRlc2NyaWJlZGJ5YCAoZXguOiBcIkFncnVwYWRvIHBvciBBbcOpcmljYSBkbyBTdWxcIikuIE8gYWdydXBhZG9yIHZpc3VhbFxuICAgICAqIHRlbSBgcm9sZT1cInByZXNlbnRhdGlvblwiYCAoc2lsZW5jaW9zbyBwcm8gbGVpdG9yIGRlIHRlbGEpIOKAlCByZXBvcnRhZG86IGFvIG5hdmVnYXIgcHJhXG4gICAgICogZGVudHJvIGRlIHVtIGdydXBvLCBuYWRhIGluZGljYXZhIGEgcXVlIGdydXBvIGEgb3DDp8OjbyBwZXJ0ZW5jaWEuIFPDsyBhIHByaW1laXJhIG9ww6fDo28gZGVcbiAgICAgKiBjYWRhIGdydXBvIHJlY2ViZSBvIGFuw7puY2lvLCBwcmEgbsOjbyByZXBldGlyIGEgY2FkYSBvcMOnw6NvIHN1YnNlcXVlbnRlIGRvIG1lc21vIGdydXBvLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBncm91cEFubm91bmNlbWVudHMgPSBjb21wdXRlZDxNYXA8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFubm91bmNlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICBpZiAoIXRoaXMuZ3JvdXAoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFubm91bmNlbWVudHM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGVuZGluZ0dyb3VwTGFiZWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nR3JvdXBMYWJlbCA9IHRoaXMuZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBlbmRpbmdHcm91cExhYmVsKSB7XG4gICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50cy5zZXQoXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2dyb3VwZWRfYnknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cDogcGVuZGluZ0dyb3VwTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0dyb3VwTGFiZWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbm5vdW5jZW1lbnRzO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogTWFwZWlhIG8gaWQgZGUgY2FkYSBvcMOnw6NvIMOgIHN1YSBwb3Npw6fDo28gKGBwb3NpbnNldGApIGUgYW8gdGFtYW5obyB0b3RhbCBkbyBjb25qdW50b1xuICAgICAqIChgc2V0c2l6ZWApLCBpZ25vcmFuZG8gYWdydXBhZG9yZXMgKHF1ZSBuw6NvIHPDo28gYHJvbGU9XCJvcHRpb25cImApLiBOZWNlc3PDoXJpbyBwb3JxdWUsIGNvbVxuICAgICAqIGB2aXJ0dWFsU2Nyb2xsYCwgc8OzIHVtYSBqYW5lbGEgZGUgb3DDp8O1ZXMgZXhpc3RlIGRlIGZhdG8gbm8gRE9NIGEgY2FkYSBtb21lbnRvIOKAlCBzZW1cbiAgICAgKiBgYXJpYS1wb3NpbnNldGAvYGFyaWEtc2V0c2l6ZWAgZXhwbMOtY2l0b3MsIG8gbGVpdG9yIGRlIHRlbGEgdGVudGEgaW5mZXJpciBhIHBvc2nDp8Ojb1xuICAgICAqIGNvbnRhbmRvIG9zIGByb2xlPVwib3B0aW9uXCJgIGlybcOjb3MgcHJlc2VudGVzIG5vIERPTSwgbyBxdWUgZmljYSBlcnJhZG8gcHJhIHVtYSBsaXN0YVxuICAgICAqIHZpcnR1YWxpemFkYSAocmVwb3J0YWRvIHZpYSBOVkRBOiBhbyBzZWxlY2lvbmFyIGEgM8KqIG9ww6fDo28gZGUgdW1hIGxpc3RhIGRlIH4yNDAgcGHDrXNlc1xuICAgICAqIGNvbSBgdmlydHVhbFNjcm9sbGAsIG8gYW7Dum5jaW8gZGUgcG9zacOnw6NvIFwidm9sdGF2YVwiIHByYSAxIGFudGVzIGRlIHNlIGNvcnJpZ2lyKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uUG9zaXRpb25zID0gY29tcHV0ZWQ8TWFwPHN0cmluZywgeyBwb3NpbnNldDogbnVtYmVyOyBzZXRzaXplOiBudW1iZXIgfT4+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHsgcG9zaW5zZXQ6IG51bWJlcjsgc2V0c2l6ZTogbnVtYmVyIH0+KCk7XG4gICAgICAgIGNvbnN0IG5vbkdyb3VwZXJPcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2V0c2l6ZSA9IG5vbkdyb3VwZXJPcHRpb25zLmxlbmd0aDtcblxuICAgICAgICBub25Hcm91cGVyT3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnMuc2V0KG9wdGlvbi5pZCwgeyBwb3NpbnNldDogaW5kZXggKyAxLCBzZXRzaXplIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcG9zaXRpb25zO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwPHsgZmlsdGVyOiBGb3JtQ29udHJvbDxzdHJpbmc+IH0+KHtcbiAgICAgICAgZmlsdGVyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lckRpdiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2NvbnRhaW5lckRpdicpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcklucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdmaWx0ZXJJbnB1dCcpO1xuICAgIC8vIGByZWFkOiBFbGVtZW50UmVmYCDDqSBvYnJpZ2F0w7NyaW8gYXF1aTogYCNzZWxlY3RBbGxDaGVja2JveGAgZXN0w6EgbnVtIGVsZW1lbnRvIGRlXG4gICAgLy8gY29tcG9uZW50ZSAoYDxzLWNoZWNrYm94PmApLCBlbnTDo28gc2VtIGlzc28gbyB2aWV3Q2hpbGQgcmVzb2x2ZSBwcmEgaW5zdMOibmNpYSBkb1xuICAgIC8vIGBDaGVja2JveENvbXBvbmVudGAgKHF1ZSBuw6NvIHRlbSBgLm5hdGl2ZUVsZW1lbnRgKSwgbsOjbyBwcm8gYEVsZW1lbnRSZWZgIGRvIGhvc3Qg4oCUXG4gICAgLy8gcmVzdWx0YWRvLCBvIGZvY28gYXV0b23DoXRpY28gbm8gY2hlY2tib3ggYW8gYWJyaXIgKGB0b2dnbGUoKWApIG51bmNhIGZ1bmNpb25hdmEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0QWxsQ2hlY2tib3g6IFNpZ25hbDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZD4gPSB2aWV3Q2hpbGQoJ3NlbGVjdEFsbENoZWNrYm94Jywge1xuICAgICAgICByZWFkOiBFbGVtZW50UmVmLFxuICAgIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ryb3Bkb3duUGFuZWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdkcm9wZG93blBhbmVsJyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9jbGlja2FibGVMYWJlbDogSFRNTExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saXZlQW5ub3VuY2VyID0gaW5qZWN0KExpdmVBbm5vdW5jZXIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gYGZvY3VzZWRJbmRleGAgw6kgdW0gw61uZGljZSBjcnUgZGVudHJvIGRlIGBmaWx0ZXJlZE9wdGlvbnMoKWAg4oCUIGFvIGRpZ2l0YXIgdW1cbiAgICAgICAgICAgICAgICAvLyBmaWx0cm8gcXVlIHJlZHV6IGEgbGlzdGEgKG91IGxpbXBhciBvIGZpbHRybywgcXVlIGEgYXVtZW50YSBkZSB2b2x0YSksIG8gw61uZGljZVxuICAgICAgICAgICAgICAgIC8vIGFudGlnbyBwYXNzYSBhIGFwb250YXIgcHJhIHVtYSBwb3Npw6fDo28gaW52w6FsaWRhIG91IHByYSB1bWEgb3DDp8OjbyBjb21wbGV0YW1lbnRlXG4gICAgICAgICAgICAgICAgLy8gZGlmZXJlbnRlIGRhIHF1ZSBlc3RhdmEgZm9jYWRhIGFudGVzLiBSZXBvcnRhZG8gdmlhIE5WREE6IHNlbSByZXNldGFyIGFxdWksXG4gICAgICAgICAgICAgICAgLy8gQXJyb3dEb3duL0VzcGHDp28vRW50ZXIgdmlyYXZhbSBuby1vcCBzaWxlbmNpb3NvIHNlbXByZSBxdWUgbyDDrW5kaWNlIGZpY2F2YSBmb3JhXG4gICAgICAgICAgICAgICAgLy8gZG9zIGxpbWl0ZXMgZGEgbm92YSBsaXN0YSBmaWx0cmFkYSDigJQgbyB1c3XDoXJpbyBzw7MgY29udGludWF2YSBvdXZpbmRvIG8gYW7Dum5jaW9cbiAgICAgICAgICAgICAgICAvLyBkYSDDmkxUSU1BIHNlbGXDp8OjbyB2w6FsaWRhLCBzZW0gbmVuaHVtIGZlZWRiYWNrIGRlIHF1ZSBhIHRlY2xhIG7Do28gZmV6IG5hZGEuXG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVmZWl0byBwYXJhIHRlbnRhciBhcGxpY2FyIHZhbG9yIHBlbmRlbnRlIHF1YW5kbyBvcHRpb25zIG11ZGFyLlxuICAgICAgICAvLyBBIGVzY3JpdGEgZW0gdmFsdWUvdmFsdWVzIMOpIG5lY2Vzc8OhcmlhIHBhcmEgc2luY3Jvbml6YXIgbyBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5sZW5ndGggJiYgdGhpcy5fcGVuZGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5UGVuZGluZ1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBzZWxlY2lvbmFkbyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgTyB2YWxvciBhIHNlciBkZWZpbmlkby4gUG9kZSBzZXIgdW0gb2JqZXRvIGRvIHRpcG8gYFRgLCB1bSBhcnJheSBkZSBgVGAgKHF1YW5kbyBtw7psdGlwbGEgc2VsZcOnw6NvIGVzdMOhIGhhYmlsaXRhZGEpLCBvdSBgbnVsbGAuXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG8gdmFsb3IgbsOjbyBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGRlc2F0aXZhZG8gZSBvIHZhbG9yIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIG1hcGVpYSBvKHMpIHZhbG9yKGVzKSBmb3JuZWNpZG8ocykgcGFyYSBhcyBvcMOnw7VlcyBpbnRlcm5hcyBkbyBjb21wb25lbnRlLFxuICAgICAqIGdhcmFudGluZG8gcXVlIGFwZW5hcyBvcMOnw7VlcyB2w6FsaWRhcyBzZWphbSBzZWxlY2lvbmFkYXMgY29uZm9ybWUgbyBtb2RvIGRlIHNlbGXDp8OjbyAow7puaWNvIG91IG3Dumx0aXBsbykuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIEFybWF6ZW5hIHZhbG9yIHBlbmRlbnRlIGUgdGVudGEgYXBsaWNhclxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZW50YSBhcGxpY2FyIG8gdmFsb3IgcGVuZGVudGUgKF9wZW5kaW5nVmFsdWUpIGFvIGVzdGFkbyBkbyBjb21wb25lbnRlLFxuICAgICAqIG1hcGVhbmRvIHBhcmEgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiBjb25mb3JtZSBvcHRpb25zIGRpc3BvbsOtdmVpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hcHBseVBlbmRpbmdWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWU7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gdikgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHYpKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHQpOiBvcHQgaXMgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiA9PiAhIW9wdCk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBvcHRpb25WYWx1ZSBpbiB2YWx1ZSA/IHZhbHVlW29wdGlvblZhbHVlXSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IGNvbXBhcmVWYWx1ZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG1hcHBlZCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHJlY2ViZSBvIG5vdm8gdmFsb3Igc2VsZWNpb25hZG8gb3UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgZXhlY3V0YWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIG1hcmNhZG8gY29tbyBcInRvY2Fkb1wiLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGVzdGFkbyBkZSBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWQgSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBkZXZlIHNlciBkZXNhYmlsaXRhZG8gKGB0cnVlYCkgb3UgaGFiaWxpdGFkbyAoYGZhbHNlYCkuXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRhcyBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gcmVhbGl6YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGludmVydGUgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMuXG4gICAgICogQW8gYWJyaXIsIG1vdmUgbyBmb2NvIHBhcmEgbyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkT3BlbiA9ICF0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gc2hvdWxkT3BlbjtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoc2hvdWxkT3Blbik7XG5cbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gY29tIG3Dumx0aXBsYSBzZWxlw6fDo28sIGZvY28gdmFpIHBhcmEgbyBjaGVja2JveCBwcmltZWlybztcbiAgICAgICAgICAgICAgICAvLyBjYXNvIGNvbnRyw6FyaW8sIHZhaSBkaXJldG8gcGFyYSBvIGlucHV0IGRlIGZpbHRyby5cbiAgICAgICAgICAgICAgICAvLyBPIGZvY28gw6kgbW92aWRvIGFww7NzIGEgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheS5cbiAgICAgICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2JveEhvc3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3goKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSBjaGVja2JveEhvc3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbdGFiaW5kZXhdJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlPy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJJbnB1dCgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZE9wdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHVtIGl0ZW0gbm8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogQHBhcmFtIGl0ZW0gTyBpdGVtIGEgc2VyIHNlbGVjaW9uYWRvIG91IGRlc21hcmNhZG8uXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBhIGZ1bsOnw6NvIHJldG9ybmEgaW1lZGlhdGFtZW50ZS5cbiAgICAgKiBObyBtb2RvIG3Dumx0aXBsbywgYWRpY2lvbmEgb3UgcmVtb3ZlIG8gaXRlbSBkYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGRlZmluZSBvIGl0ZW0gY29tbyB2YWxvciBzZWxlY2lvbmFkbyBlIGZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogU2VtcHJlIG5vdGlmaWNhIGFzIG11ZGFuw6dhcyBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIHRvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0SXRlbShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gWy4uLnRoaXMudmFsdWVzKCldO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5maW5kSW5kZXgoKHNlbGVjdGVkSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPT09IGl0ZW07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGlzTm93U2VsZWN0ZWQgPSBpbmRleCA9PT0gLTE7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoc3RvcmUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBzdG9yZS5tYXAoKGl0ZW0pID0+IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0pIDogc3RvcmU7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VPcHRpb25Ub2dnbGUoaXRlbSwgaXNOb3dTZWxlY3RlZCk7XG5cbiAgICAgICAgICAgIC8vIEFjb21wYW5oYSBvIGl0ZW0gcXVlIGFjYWJvdSBkZSBzZXIgc2VsZWNpb25hZG8vZGVzbWFyY2FkbyB2aWEgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICAgICAgICAvLyDigJQgc2VtIGlzc28sIGNsaWNhciBjb20gbyBtb3VzZSAoZW0gdmV6IGRlIG5hdmVnYXIgcG9yIHRlY2xhZG8pIG51bmNhIG1vdmUgb1xuICAgICAgICAgICAgLy8gXCJmb2NvXCIgdmlydHVhbCwgcXVlIGZpY2EgcGFyYWRvIG9uZGUgZXN0YXZhIChvdSBudWxvKSwgZSBvIGxlaXRvciBkZSB0ZWxhIHBhc3NhIGFcbiAgICAgICAgICAgIC8vIGFudW5jaWFyIHNlbXByZSBhIG1lc21hIG9ww6fDo28gKGEgcHJpbWVpcmEsIG91IGEgw7psdGltYSBhbGNhbsOnYWRhIHBvciB0ZWNsYWRvKSBlbVxuICAgICAgICAgICAgLy8gdmV6IGRhIHF1ZSBmb2kgZGUgZmF0byBjbGljYWRhLlxuICAgICAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSBpdGVtLmlkKTtcbiAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChpdGVtSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoaXRlbSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IGl0ZW0uZGF0YVtvcHRpb25WYWx1ZV0gOiBpdGVtLmRhdGE7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyZXN1bHQpO1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VPcHRpb25Ub2dnbGUoaXRlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBEZXZvbHZlIG8gZm9jbyBwcm8gY29udGFpbmVyIHPDsyBzZSBlbGUgZXN0YXZhIGRlbnRybyBkbyBwYWluZWwgKGV4Ljogb3DDp8Ojb1xuICAgICAgICAgICAgLy8gZXNjb2xoaWRhIGNvbSBvIGZpbHRybyBmb2NhZG8pIOKAlCB2ZXIgYF9jbG9zZURyb3Bkb3duKClgLlxuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW51bmNpYSB2aWEgYExpdmVBbm5vdW5jZXJgIGEgb3DDp8OjbyBzZWxlY2lvbmFkYS9kZXNtYXJjYWRhLiBOZWNlc3PDoXJpbyBwb3JxdWUsIG5hIHByw6F0aWNhLFxuICAgICAqIG5lbSB0b2RvIG5hdmVnYWRvci9sZWl0b3IgZGUgdGVsYSBhbnVuY2lhIHNvemluaG8gYSBtdWRhbsOnYSBkZSBgYXJpYS1zZWxlY3RlZGAgZGEgb3DDp8Ojb1xuICAgICAqIGFwb250YWRhIHBvciBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YCAocmVwb3J0YWRvIHZpYSBOVkRBIG5vIENocm9tZTogbmVuaHVtYSBtZW5zYWdlbSBlcmFcbiAgICAgKiBvdXZpZGEgYW8gc2VsZWNpb25hcikuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYW5ub3VuY2VPcHRpb25Ub2dnbGUoaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiwgaXNOb3dTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBpc05vd1NlbGVjdGVkXG4gICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X29wdGlvbl9zZWxlY3RlZCdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3Rfb3B0aW9uX2Rlc2VsZWN0ZWQnO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSwgeyBvcHRpb246IHRoaXMuZ2V0T3B0aW9uTGFiZWwoaXRlbS5kYXRhKSB9KTtcbiAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyBleGVjdXRhIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIG3Dumx0aXBsYSwgcmVtb3ZlIHRvZG9zIG9zIHZhbG9yZXMgc2VsZWNpb25hZG9zIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyDDum5pY2EsIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsbyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIFwidG9jYWRvXCIuXG4gICAgICogSW1wZWRlIGEgcHJvcGFnYcOnw6NvIGRvIGV2ZW50byBkbyBtb3VzZS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRvIG1vdXNlIHF1ZSBhY2lvbm91IGEgbGltcGV6YSBkYSBzZWxlw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3RfYWxsX29wdGlvbnNfY2xlYXJlZCcpLFxuICAgICAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRMYWJlbCA9IHRoaXMudmFsdWUoKSA/IHRoaXMuZ2V0T3B0aW9uTGFiZWwodGhpcy52YWx1ZSgpIS5kYXRhKSA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWUoKSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZExhYmVsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3Rfb3B0aW9uX3JlbW92ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb246IHJlbW92ZWRMYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICdwb2xpdGUnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG5cbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vIE8gYm90w6NvIFwiTGltcGFyXCIgc8OzIMOpIHJlbmRlcml6YWRvIGVucXVhbnRvIGAhaXNDbGVhbigpYCDigJQgYW8gY2hhbWFyIGBjbGVhcigpYCBlbGVcbiAgICAgICAgLy8gZGVpeGEgZGUgZXhpc3RpciBubyBET00gbmEgbWVzbWEgcmUtcmVuZGVyaXphw6fDo28gZW0gcXVlIGFjYWJvdSBkZSBzZXIgY2xpY2FkbyxcbiAgICAgICAgLy8gbGV2YW5kbyBvIGZvY28ganVudG8gcHJhIGBkb2N1bWVudC5ib2R5YCAocGVyZGlkbykgc2UgbmFkYSBvIHJlc2dhdGFyIGV4cGxpY2l0YW1lbnRlLlxuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyBmaWx0cm8gZG8gZm9ybXVsw6FyaW8sIHJlc2V0YW5kbyBvIGNhbXBvICdmaWx0ZXInIGRvIGZvcm11bMOhcmlvIGRlIGZpbHRyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gcmVkZWZpbmUgbyB2YWxvciBkbyBjYW1wbyAnZmlsdGVyJyBwYXJhIHNldSBlc3RhZG8gaW5pY2lhbCxcbiAgICAgKiByZW1vdmVuZG8gcXVhbHF1ZXIgdGV4dG8gb3UgdmFsb3IgcHJldmlhbWVudGUgaW5zZXJpZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYS5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGNhc28gZWxlIGVzdGVqYSB2aXPDrXZlbCBhbyByZWRpbWVuc2lvbmFyIGEgamFuZWxhLlxuICAgICAqIEBwYXJhbSBfIEV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoXzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgY2xpcXVlIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBkYSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIGFsdGVybmEgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkbyBjb21wb25lbnRlIHNlbGVjdCBlLFxuICAgICAqIGVtIHNlZ3VpZGEsIGRlZmluZSBvIGZvY28gbm8gZWxlbWVudG8gY29udGFpbmVyIGNvcnJlc3BvbmRlbnRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbnRhaW5lckRpdkNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBpbnB1dCBkZSBmaWx0cm8gZG8gb3ZlcmxheS5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHJpbWVpcmEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIMO6bHRpbWEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdUYWInIChzZW0gU2hpZnQpOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkYSBsaXN0YSwgZW0gdmV6IGRlIGRlaXhhciBvIFRhYlxuICAgICAqICAgbmF0aXZvIHRlbnRhciBzYWlyIGRvIG92ZXJsYXkgKGFzIG9ww6fDtWVzIG7Do28gc8OjbyBlbGVtZW50b3MgdGFidWzDoXZlaXMsIGVudMOjbyBvIFRhYlxuICAgICAqICAgbmF0aXZvIFwidmF6YXZhXCIgbyBmb2NvIHByYSBmb3JhIGRvIHBhaW5lbCBzZW0gbnVuY2EgYWxjYW7Dp2FyIGEgbGlzdGEpLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24gZSByZXRvcm5hIG8gZm9jbyBhbyBjb21ib2JveC5cbiAgICAgKiAtICdFbnRlcicgLyAnRXNwYcOnbyc6IFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhLCBzZSBob3V2ZXIuIEVzcGHDp28gc8OzIMOpIGludGVyY2VwdGFkb1xuICAgICAqICAgcXVhbmRvIGrDoSBleGlzdGUgdW1hIG9ww6fDo28gY29tIGZvY28gdmlydHVhbCAoYGZvY3VzZWRJbmRleCgpID49IDBgKSDigJQgc2VtIHVtYSBvcMOnw6NvXG4gICAgICogICBmb2NhZGEsIG8gZXNwYcOnbyDDqSBkZWl4YWRvIHBhc3NhciBwcm8gY29tcG9ydGFtZW50byBuYXRpdm8gZG8gYDxpbnB1dD5gIChkaWdpdGFyIHVtXG4gICAgICogICBlc3Bhw6dvLCBuZWNlc3PDoXJpbyBwcmEgYnVzY2FzIGNvbSBtw7psdGlwbGFzIHBhbGF2cmFzKS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgTyBldmVudG8gZGUgdGVjbGFkbyBkaXNwYXJhZG8gbm8gaW5wdXQgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZpbHRlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZW5odW0gaXRlbSBmb2NhZG86IGZvY2EgbyDDumx0aW1vIGRpc3BvbsOtdmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEluZGV4ID0gb3B0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxhc3RJbmRleCA+PSAwICYmIG9wdGlvbnNbbGFzdEluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSB0ZWNsYWRvIG5vIGJvdMOjbyBcIkxpbXBhciBmaWx0cm9cIiBkbyBvdmVybGF5LlxuICAgICAqIMOJIG8gw7psdGltbyBjb250cm9sZSByZWFsICh0YWJ1bMOhdmVsKSBkbyBvdmVybGF5IGFudGVzIGRhIGxpc3RhIGRlIG9ww6fDtWVzIOKAlCBzZW1cbiAgICAgKiBpbnRlcmNlcHRhciBvIFRhYiBhcXVpLCBlbGUgXCJ2YXphdmFcIiBvIGZvY28gcHJhIGZvcmEgZG8gcGFpbmVsIHNlbSBudW5jYSBhbGNhbsOnYXIgYVxuICAgICAqIGxpc3RhLCBqw6EgcXVlIGFzIG9ww6fDtWVzIG7Do28gc8OjbyBlbGVtZW50b3MgdGFidWzDoXZlaXMgKGZvY28gdmlydHVhbCB2aWFcbiAgICAgKiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBubyBib3TDo28uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2xlYXJGaWx0ZXJCdXR0b25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbih0aGlzLmZpbHRlcmVkT3B0aW9ucygpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBwYXJhIG5hdmVnYcOnw6NvIGUgc2VsZcOnw6NvIGRlIG9ww6fDtWVzIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvci5cbiAgICAgKiAtICdUYWInLydTaGlmdCtUYWInOiBDb20gbyBkcm9wZG93biBhYmVydG8gZSBzZW0gZmlsdHJvLCBuYXZlZ2EgZW50cmUgYXMgb3DDp8O1ZXMgKG1lc21vXG4gICAgICogICBlZmVpdG8gZGUgQXJyb3dEb3duL0Fycm93VXApIGVtIHZleiBkZSBmZWNoYXIgbyBwYWluZWwgZSBcInZhemFyXCIgbyBmb2NvIHBybyBwcsOzeGltb1xuICAgICAqICAgY2FtcG8gZGEgcMOhZ2luYSBzZW0gbyB1c3XDoXJpbyBudW5jYSB0ZXIgYWxjYW7Dp2FkbyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtICdFbnRlcic6IFNlbGVjaW9uYSBhIG9ww6fDo28gZm9jYWRhIHNlIG8gZHJvcGRvd24gZXN0aXZlciBhYmVydG8sIG91IGFsdGVybmEgYSBhYmVydHVyYSBkbyBkcm9wZG93bi5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJyAnOiAoYmFycmEgZGUgZXNwYcOnbykgU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIFByZXZpbmUgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gbmF2ZWdhZG9yIHF1YW5kbyBuZWNlc3PDoXJpbyBwYXJhIGdhcmFudGlyIGEgbmF2ZWdhw6fDo28gYWRlcXVhZGEgcGVsbyB0ZWNsYWRvLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCAmJiBldmVudC5rZXkgIT09ICdFc2NhcGUnICYmIGV2ZW50LmtleSAhPT0gJ0VudGVyJyAmJiBldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX3NlbGVjdE9wdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbSBmaWx0cm8sIFRhYiBuYXZlZ2EgcGVsb3MgY29udHJvbGVzIHJlYWlzIGRvIG92ZXJsYXkgKGNoZWNrYm94IOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQg4oaSIGJvdMOjbyBcIkxpbXBhciBmaWx0cm9cIik7IGEgcGFydGlyIGRvIMO6bHRpbW8gZGVsZXMsIG8gcHLDs3ByaW9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2xlIGludGVyY2VwdGEgbyBUYWIgcHJhIGVudHJhciBuYSBsaXN0YSDigJQgdmVyIG9uRmlsdGVyS2V5RG93biAvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbkNsZWFyRmlsdGVyQnV0dG9uS2V5RG93bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBTZW0gZmlsdHJvLCBvIGZvY28gRE9NIG51bmNhIHNhaSBkbyBjb21ib2JveCAobmF2ZWdhw6fDo28gdmlydHVhbCB2aWFcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJpYS1hY3RpdmVkZXNjZW5kYW50KSDigJQgcmVwb3J0YWRvOiBzZW0gaW50ZXJjZXB0YXIsIFRhYiBmZWNoYXZhIG9cbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcGRvd24gZSBvIGZvY28gXCJ2YXphdmFcIiBwcm8gcHLDs3hpbW8gY2FtcG8gZGEgcMOhZ2luYSBzZW0gbyB1c3XDoXJpb1xuICAgICAgICAgICAgICAgICAgICAvLyBudW5jYSB0ZXIgYWxjYW7Dp2FkbyBhcyBvcMOnw7Vlcy4gVGFiIHBhc3NhIGEgZnVuY2lvbmFyIGNvbW8gQXJyb3dEb3duL1VwLlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c05leHRPcHRpb24ob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGFzc29jaWFkbyBhIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGRvIHRpcG8gVCBwYXJhIGEgcXVhbCBvIHLDs3R1bG8gZGV2ZSBzZXIgb2J0aWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyB0ZXh0byBkZSBhbsO6bmNpbyBkZSBncnVwbyAoZXguOiBcIkFncnVwYWRvIHBvciBBbcOpcmljYSBkbyBTdWxcIikgcHJhIHVtYSBvcMOnw6NvLFxuICAgICAqIGNhc28gZWxhIHNlamEgYSBwcmltZWlyYSBkbyBzZXUgZ3J1cG8g4oCUIHZlciBgZ3JvdXBBbm5vdW5jZW1lbnRzYC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uSWQgSWQgZGEgb3DDp8OjbyBpbnRlcm5hLlxuICAgICAqIEByZXR1cm5zIE8gdGV4dG8gZGUgYW7Dum5jaW8sIG91IGBudWxsYCBzZSBhIG9ww6fDo28gbsOjbyBmb3IgYSBwcmltZWlyYSBkbyBncnVwby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ3JvdXBBbm5vdW5jZW1lbnRGb3Iob3B0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cEFubm91bmNlbWVudHMoKS5nZXQob3B0aW9uSWQpID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBhIHBvc2nDp8OjbyAoMS1iYXNlZCkgZGUgdW1hIG9ww6fDo28gZGVudHJvIGRvIGNvbmp1bnRvIG5hdmVnw6F2ZWwg4oCUIHZlciBgb3B0aW9uUG9zaXRpb25zYC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uSWQgSWQgZGEgb3DDp8OjbyBpbnRlcm5hLlxuICAgICAqIEByZXR1cm5zIEEgcG9zacOnw6NvLCBvdSBgbnVsbGAgc2UgYSBvcMOnw6NvIG7Do28gZm9yIGVuY29udHJhZGEgKGV4Ljogw6kgdW0gYWdydXBhZG9yKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3B0aW9uUG9zaW5zZXRGb3Iob3B0aW9uSWQ6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25Qb3NpdGlvbnMoKS5nZXQob3B0aW9uSWQpPy5wb3NpbnNldCA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyB0YW1hbmhvIHRvdGFsIGRvIGNvbmp1bnRvIG5hdmVnw6F2ZWwgYW8gcXVhbCB1bWEgb3DDp8OjbyBwZXJ0ZW5jZSDigJQgdmVyIGBvcHRpb25Qb3NpdGlvbnNgLlxuICAgICAqIEBwYXJhbSBvcHRpb25JZCBJZCBkYSBvcMOnw6NvIGludGVybmEuXG4gICAgICogQHJldHVybnMgTyB0YW1hbmhvIHRvdGFsLCBvdSBgbnVsbGAgc2UgYSBvcMOnw6NvIG7Do28gZm9yIGVuY29udHJhZGEgKGV4Ljogw6kgdW0gYWdydXBhZG9yKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3B0aW9uU2V0c2l6ZUZvcihvcHRpb25JZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvblBvc2l0aW9ucygpLmdldChvcHRpb25JZCk/LnNldHNpemUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW7Dp8OjbyBkZSB0cmFja0J5IHV0aWxpemFkYSBlbSBibG9jb3MgQGZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VTZWxlY3RBbGxUb2dnbGUoZmFsc2UsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fYW5ub3VuY2VTZWxlY3RBbGxUb2dnbGUodHJ1ZSwgb3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW51bmNpYSB2aWEgYExpdmVBbm5vdW5jZXJgIG8gcmVzdWx0YWRvIGRlIFwiU2VsZWNpb25hciBUb2Rvc1wiL1wiTGltcGFyIFRvZG9zXCIuIE5lY2Vzc8OhcmlvXG4gICAgICogcG9ycXVlIG8gY2hlY2tib3ggcXVlIGRpc3BhcmEgYSBhw6fDo28gdGVtIGZvY28gcmVhbCBlIGFudW5jaWEgc2V1IHByw7NwcmlvIGBhcmlhLWNoZWNrZWRgXG4gICAgICogbm9ybWFsbWVudGUsIG1hcyBhcyBOIG9ww6fDtWVzIGFmZXRhZGFzIChxdWUgbsOjbyBlc3TDo28gZm9jYWRhcykgbsOjbyDigJQgYW8gY29udHLDoXJpbyBkbyB0b2dnbGVcbiAgICAgKiBkZSB1bWEgb3DDp8OjbyBpbmRpdmlkdWFsLCBjdWpvIGBhcmlhLXNlbGVjdGVkYCBqw6Egw6kgbGlkbyBwZWxvIGxlaXRvciBkZSB0ZWxhIHBvcnF1ZSBlbGEgw6kgb1xuICAgICAqIGVsZW1lbnRvIGFwb250YWRvIHBvciBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YCBubyBtb21lbnRvIGRhIG11ZGFuw6dhLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2Fubm91bmNlU2VsZWN0QWxsVG9nZ2xlKGlzTm93U2VsZWN0ZWQ6IGJvb2xlYW4sIGNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGlzTm93U2VsZWN0ZWRcbiAgICAgICAgICAgID8gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY291bnRfaXRlbXNfc2VsZWN0ZWQnLCB7IGNvdW50IH0pXG4gICAgICAgICAgICA6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19jbGVhcmVkJyk7XG4gICAgICAgIHZvaWQgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShtZXNzYWdlLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzb2NpYSB1bSBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZXh0ZXJubyAocXVlIGFwb250YSBwYXJhIG8gYGlkYCBkbyBob3N0KSBhb1xuICAgICAqIGNvbWJvYm94IGludGVybm8sIHJlc29sdmVuZG8gbyBwcm9ibGVtYSBkZSBcIm9ycGhhbmVkIGxhYmVsXCIuXG4gICAgICpcbiAgICAgKiBDb21vIG8gaG9zdCBgcy1zZWxlY3RgIG7Do28gw6kgdW0gZWxlbWVudG8gcm90dWzDoXZlbCAobGFiZWxhYmxlKSwgbyBgZm9yYCBuw6NvXG4gICAgICogY3JpYSB2w61uY3VsbyBwcm9ncmFtw6F0aWNvLiBFc3RlIG3DqXRvZG86XG4gICAgICogLSBsb2NhbGl6YSBvIGxhYmVsIHF1ZSByZWZlcmVuY2lhIG8gYGlkYCBkbyBob3N0O1xuICAgICAqIC0gZ2FyYW50ZSBxdWUgZXNzZSBsYWJlbCB0ZW5oYSB1bSBgaWRgO1xuICAgICAqIC0gYXBvbnRhIG8gYGFyaWEtbGFiZWxsZWRieWAgZG8gY29tYm9ib3ggcGFyYSBlc3NlIGxhYmVsO1xuICAgICAqIC0gYWRpY2lvbmEgdW0gY2xpcXVlIG5vIGxhYmVsIHBhcmEgZm9jYXIgbyBjb21ib2JveCAoZXF1aXZhbGVudGUgYW8gYGZvcmApLlxuICAgICAqXG4gICAgICogTsOjbyBzb2JyZXNjcmV2ZSB1bSBgYXJpYUxhYmVsbGVkQnlgIGV4cGzDrWNpdG8gaW5mb3JtYWRvIHBlbG8gY29uc3VtaWRvci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Fzc29jaWF0ZUV4dGVybmFsTGFiZWwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFyaWFMYWJlbGxlZEJ5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvc3RJZCA9IHRoaXMuX2hvc3RSZWYubmF0aXZlRWxlbWVudC5pZDtcbiAgICAgICAgaWYgKCFob3N0SWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fZmluZExhYmVsRm9yKGhvc3RJZCk7XG4gICAgICAgIGlmICghbGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGFiZWwuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEF0dHJpYnV0ZShsYWJlbCwgJ2lkJywgYCR7dGhpcy5jb21wb25lbnRJZH0tbGFiZWxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkuc2V0KGxhYmVsLmlkKTtcblxuICAgICAgICAvLyBPIGF0cmlidXRvIGBmb3JgIG7Do28gZnVuY2lvbmxkYSBlbSBob3N0IG7Do28tcm90dWzDoXZlbCwgZW50w6NvIHJlcGxpY2Ftb3NcbiAgICAgICAgLy8gbyBjb21wb3J0YW1lbnRvIGRlIFwiY2xpY2FyIG5vIGxhYmVsIGZvY2EgbyBjb250cm9sZVwiIG1hbnVhbG1lbnRlLlxuICAgICAgICB0aGlzLl9jbGlja2FibGVMYWJlbCA9IGxhYmVsO1xuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uTGFiZWxDbGljayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jYWxpemEgbyBgPGxhYmVsPmAgY3VqbyBhdHJpYnV0byBgZm9yYCBjb3JyZXNwb25kZSBhbyBpZCBpbmZvcm1hZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gaG9zdElkIElkIGRvIGhvc3QgcmVmZXJlbmNpYWRvIHBlbG8gbGFiZWwuXG4gICAgICogQHJldHVybnMgTyBlbGVtZW50byBsYWJlbCBjb3JyZXNwb25kZW50ZSBvdSBgbnVsbGAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZmluZExhYmVsRm9yKGhvc3RJZDogc3RyaW5nKTogSFRNTExhYmVsRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxMYWJlbEVsZW1lbnQ+KCdsYWJlbFtmb3JdJyk7XG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgQXJyYXkuZnJvbShsYWJlbHMpKSB7XG4gICAgICAgICAgICBpZiAobGFiZWwuZ2V0QXR0cmlidXRlKCdmb3InKSA9PT0gaG9zdElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgbyBjb21ib2JveCBpbnRlcm5vIGFvIGNsaWNhciBubyBsYWJlbCBleHRlcm5vIGFzc29jaWFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uTGFiZWxDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9jdWx0YSBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgZSByZWRlZmluZSBvIMOtbmRpY2UgZG8gaXRlbSBmb2NhZG8gcGFyYSAtMSxcbiAgICAgKiBpbmRpY2FuZG8gcXVlIG5lbmh1bSBpdGVtIGVzdMOhIGF0dWFsbWVudGUgZm9jYWRvLiBTZSBvIGZvY28gZXN0YXZhIGRlbnRybyBkbyBwYWluZWxcbiAgICAgKiBzZW5kbyBmZWNoYWRvIChleC46IGNhbXBvIGRlIGZpbHRybyksIGRldm9sdmUgbyBmb2NvIHBybyBjb250YWluZXIvY29tYm9ib3gg4oCUIG51bmNhXG4gICAgICogZm9yw6dhIG8gZm9jbyBzZSBlbGUgasOhIGVzdGl2ZXIgZW0gb3V0cm8gbHVnYXIgKGV4Ljogb3DDp8OjbyBlc2NvbGhpZGEgdmlhIGNsaXF1ZSBkbyBtb3VzZVxuICAgICAqIHNlbSBmaWx0cm8sIG9uZGUgbyBmb2NvIERPTSBudW5jYSBzYWl1IGRvIGNvbWJvYm94IHBvciBjYXVzYSBkbyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpLlxuICAgICAqIGBwcm90ZWN0ZWRgIChuw6NvIGBwcml2YXRlYCkgcG9ycXVlIHRhbWLDqW0gw6kgY2hhbWFkbyBhIHBhcnRpciBkbyB0ZW1wbGF0ZVxuICAgICAqIChgYmFja2Ryb3BDbGlja2AvYGRldGFjaGAgZG8gYGNka0Nvbm5lY3RlZE92ZXJsYXlgKS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsRWxlbWVudCA9IHRoaXMuX2Ryb3Bkb3duUGFuZWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuXG4gICAgICAgIGNvbnN0IGZvY3VzSXNJbnNpZGVQYW5lbCA9XG4gICAgICAgICAgICBwYW5lbEVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgTm9kZSAmJiBwYW5lbEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmICghZm9jdXNJc0luc2lkZVBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIFBhcmEgY2FkYSBpdGVtIG5vIGFycmF5IGRlIG9ww6fDtWVzLCBnZXJhIHVtIG9iamV0byBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbmAgY29udGVuZG8gbyBkYWRvIG9yaWdpbmFsXG4gICAgICogZSB1bSBjYW1wbyBgaWRgIMO6bmljbyBiYXNlYWRvIG5vIGBjb21wb25lbnRJZGAgZGVzdGEgaW5zdMOibmNpYSwgbm8gdGltZXN0YW1wIGF0dWFsIGUgbm8gw61uZGljZSBkb1xuICAgICAqIGl0ZW0uIENhc28gYSBvcMOnw6NvIHNlamEgdW0gZ3J1cG8gKGRldGVjdGFkbyBwZWxhIHByZXNlbsOnYSBkZSB1bSBhcnJheSBgaXRlbXNgKSwgYWRpY2lvbmEgdGFtYsOpbSBhXG4gICAgICogcHJvcHJpZWRhZGUgYGdyb3VwZXI6IHRydWVgLlxuICAgICAqXG4gICAgICogTyBgY29tcG9uZW50SWRgIMOpIG9icmlnYXTDs3JpbyBubyBwcmVmaXhvOiBgRGF0ZS5ub3coKWAgc296aW5obyB0ZW0gcmVzb2x1w6fDo28gZGUgYXBlbmFzIDFtcywgZSBkdWFzXG4gICAgICogaW5zdMOibmNpYXMgZGUgYHMtc2VsZWN0YCBuYSBtZXNtYSBww6FnaW5hIGZyZXF1ZW50ZW1lbnRlIGluaWNpYWxpemFtIGRlbnRybyBkbyBtZXNtbyBtaWxpc3NlZ3VuZG9cbiAgICAgKiAoY29uZmlybWFkbyB2aWEgdGVzdGUgbWFudWFsIOKAlCByZXBvcnRhZG8gdmlhIE5WREE6IHVtYSBvcMOnw6NvIGrDoSBzZWxlY2lvbmFkYSBlbSBPVVRSTyBgcy1zZWxlY3RgIGRhXG4gICAgICogcMOhZ2luYSBlcmEgYW51bmNpYWRhIGVtIHZleiBkYSBvcMOnw6NvIGRlIGZhdG8gY2xpY2FkYSkuIFNlbSBvIGBjb21wb25lbnRJZGAsIG9zIGlkcyBjb2xpZGlhbSBlbnRyZVxuICAgICAqIGluc3TDom5jaWFzIGRpZmVyZW50ZXMgKGBpZF88bWVzbW8tdGltZXN0YW1wPl8wYCBlbSBhbWJhcyksIGUgYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAvYGdldEVsZW1lbnRCeUlkYFxuICAgICAqIHJlc29sdmlhbSBwcm8gZWxlbWVudG8gZXJyYWRvIOKAlCBkZSBvdXRybyBzZWxlY3QuIE8gdGltZXN0YW1wIGNvbnRpbnVhIG5vIGlkIChhbMOpbSBkbyBgY29tcG9uZW50SWRgKVxuICAgICAqIHByYSBtYW50ZXIgaWRzIMO6bmljb3MgZW50cmUgcmVjb21wdXRhw6fDtWVzIGRhIE1FU01BIGluc3TDom5jaWEgcXVhbmRvIGBvcHRpb25zKClgIG11ZGEgZGUgcmVmZXLDqm5jaWEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBvcMOnw7VlcyBkbyB0aXBvIGBUYCBhIHNlcmVtIHByb2Nlc3NhZGFzLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvT3B0aW9ucyhvcHRpb25zOiBUW10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAoKSAmJiBBcnJheS5pc0FycmF5KChvcHRpb24gYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHt0aGlzLmNvbXBvbmVudElkfV9pZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMuY29tcG9uZW50SWR9X2lkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRlIHVtYSBsaXN0YSBkZSBvcMOnw7VlcyBwb3NzaXZlbG1lbnRlIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMuXG4gICAgICogUGFyYSBjYWRhIG9ww6fDo28gcXVlIHBvc3N1aSB1bSBhZ3J1cGFkb3IgKGBncm91cGVyYCkgZSB1bSBhcnJheSBkZSBpdGVucyBlbSBgZGF0YS5pdGVtc2AsXG4gICAgICogYWRpY2lvbmEgYSBvcMOnw6NvIGRvIGFncnVwYWRvciBlLCBlbSBzZWd1aWRhLCBhZGljaW9uYSBjYWRhIGl0ZW0gZG8gZ3J1cG8gY29tbyB1bWEgbm92YSBvcMOnw6NvXG4gICAgICogaW5kaXZpZHVhbCwgYXRyaWJ1aW5kbyB1bSBgaWRgIMO6bmljbyBwYXJhIGNhZGEgaXRlbSBkbyBncnVwby5cbiAgICAgKiBDYXNvIGEgb3DDp8OjbyBuw6NvIHNlamEgdW0gYWdydXBhZG9yLCBlbGEgw6kgYWRpY2lvbmFkYSBkaXJldGFtZW50ZSBhbyByZXN1bHRhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93biwgcG9kZW5kbyBjb250ZXIgYWdydXBhZG9yZXMuXG4gICAgICogQHJldHVybnMgTGlzdGEgcGxhbmEgZGUgb3DDp8O1ZXMsIGluY2x1aW5kbyBhZ3J1cGFkb3JlcyBlIHNldXMgaXRlbnMgZXhwYW5kaWRvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9ncm91cGVyVG9GbGF0KG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdID0gW107XG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb24uZ3JvdXBlciAmJiBBcnJheS5pc0FycmF5KChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtcyA9IChvcHRpb24uZGF0YSBhcyBhbnkpLml0ZW1zLm1hcCgoaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke29wdGlvbi5pZH1faXRlbV8ke2luZGV4fWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLmdyb3VwSXRlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRpc3BvbsOtdmVsIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgcXVlIHNlamFtIGFncnVwYWRvcmVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSArIDE7XG5cbiAgICAgICAgd2hpbGUgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoICYmIG9wdGlvbnNbbmV4dEluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KG5leHRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yIG5hIGxpc3RhLCBpZ25vcmFuZG8gb3DDp8O1ZXMgZG8gdGlwbyBcImdyb3VwZXJcIi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzUHJldmlvdXNPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpIC0gMTtcblxuICAgICAgICB3aGlsZSAocHJldkluZGV4ID49IDAgJiYgb3B0aW9uc1twcmV2SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIHByZXZJbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQocHJldkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm9sYSBhIGxpc3RhIGRlIG9ww6fDtWVzIHBhcmEgZ2FyYW50aXIgcXVlIGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBlc3RlamEgdmlzw612ZWwuXG4gICAgICogRXN0ZSBtw6l0b2RvIG9idMOpbSBvIElEIGRhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgYSBwYXJ0aXIgZGEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIFNlIHVtIElEIHbDoWxpZG8gZm9yIGVuY29udHJhZG8sIGJ1c2NhIG8gZWxlbWVudG8gY29ycmVzcG9uZGVudGUgbm8gRE9NIGUgdXRpbGl6YVxuICAgICAqIGBzY3JvbGxJbnRvVmlld2AgcGFyYSByb2xhciBhdMOpIGEgb3DDp8OjbywgYWxpbmhhbmRvLWEgYW8gYmxvY28gbWFpcyBwcsOzeGltby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpW3RoaXMuZm9jdXNlZEluZGV4KCldPy5pZDtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgZWw/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBmb2NvIG5vIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkbyBhbyBhYnJpciBvIGRyb3Bkb3duLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZm9jYSBvIGl0ZW0gc2VsZWNpb25hZG8uIE5vIG1vZG8gbcO6bHRpcGxvLCBmb2NhIG8gcHJpbWVpcm8gaXRlbSBzZWxlY2lvbmFkby5cbiAgICAgKiBBcMOzcyByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LCByb2xhIGEgbGlzdGEgYXTDqSBvIGl0ZW0gZm9jYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCk7XG4gICAgICAgIGxldCBzZWxlY3RlZEluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZCA9IHRoaXMudmFsdWVzKClbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3RTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gZmlyc3RTZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gc2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHNlbGVjdGVkSW5kZXgpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lciBncm91cCBmbGV4IGgtWzM1cHhdIHctZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZWRpdW0gYm9yZGVyIG91dGxpbmUtMiBvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildIG91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmVcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtNV09XCJkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtYXV0b109XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dPcHRpb25zKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgW2F0dHIuYXJpYS1vd25zXT1cInNob3dPcHRpb25zKCkgPyBjb21wb25lbnRJZCArICctbGlzdGJveCcgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwic2hvd09wdGlvbnMoKSA/IGZvY3VzZWRPcHRpb25JZCgpIDogbnVsbFwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWNvbWJvYm94J1wiXG4gICAgKGNsaWNrKT1cIm9uQ29udGFpbmVyRGl2Q2xpY2soKVwiXG4gICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkKCkgPyAtMSA6IDBcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsKCkgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInJlc29sdmVkQXJpYUxhYmVsbGVkQnkoKSB8fCBudWxsXCJcbj5cbiAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1ncm93IHNlbGVjdC1ub25lIHB4LVsxMHB4XSBweS1bN3B4XVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKSAmJiAhaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTYwXT1cIiFkaXNhYmxlZCgpICYmIGlzQ2xlYW4oKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICA+XG4gICAgICAgIHt7IHByaW50KCkgfHwgcGxhY2Vob2xkZXIoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAoIWRpc2FibGVkKCkgJiYgc2hvd0NsZWFyKCkgJiYgIWlzQ2xlYW4oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm14LTNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5hcmlhX2NsZWFyX3NlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBmbGV4IHctOSBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgZ3JvdXAtaG92ZXI6YmctZ3JheXNjYWxlLTVcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzIHRleHQtYmFzZVwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC1kb3duXT1cIiFzaG93T3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtjbGFzcy5mYS1jYXJldC11cF09XCJzaG93T3B0aW9ucygpXCJcbiAgICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICAjZHJvcGRvd25UZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJfY2xvc2VEcm9wZG93bigpXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICAoZGV0YWNoKT1cIl9jbG9zZURyb3Bkb3duKClcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI2Ryb3Bkb3duUGFuZWxcbiAgICAgICAgW2lkXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtdWx0aXBsZSgpID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICBbQHZpc2liaWxpdHlDaGFuZ2VkXVxuICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgPlxuICAgICAgICBAaWYgKGZpbHRlcigpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGdhcC0zIHB4LTMgcHktMS41XCI+XG4gICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAjc2VsZWN0QWxsQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0QWxsSXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJzZWxlY3RBbGxDaGVja2JveEFyaWFMYWJlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLVszNXB4XSBncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZ3JvdyByb3VuZGVkLVszcHhdIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHBsLTIuNSBwci03IGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uRmlsdGVyS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZmlsdGVyX29wdGlvbnMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbXBvbmVudElkICsgJy1saXN0Ym94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImZvY3VzZWRPcHRpb25JZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtc2VhcmNoIGFic29sdXRlIHJpZ2h0LTIuNSB0b3AtMi41IHRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uQ2xlYXJGaWx0ZXJCdXR0b25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY2xlYXJfZmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIHNjcm9sbCAtLT5cbiAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja0ljb25DbGFzc109XCJjaGVja0ljb25DbGFzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBBbm5vdW5jZW1lbnRdPVwiZ3JvdXBBbm5vdW5jZW1lbnRGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9zaW5zZXRdPVwib3B0aW9uUG9zaW5zZXRGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2V0c2l6ZV09XCJvcHRpb25TZXRzaXplRm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgLS0+XG4gICAgICAgIEBpZiAoIXZpcnR1YWxTY3JvbGwoKSB8fCBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPD0gMTApIHtcbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrSWNvbkNsYXNzXT1cImNoZWNrSWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEFubm91bmNlbWVudF09XCJncm91cEFubm91bmNlbWVudEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3NpbnNldF09XCJvcHRpb25Qb3NpbnNldEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZXRzaXplXT1cIm9wdGlvblNldHNpemVGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0zIHRleHQtZ3JheXNjYWxlLTYwXCI+XG4gICAgICAgICAgICAgICAge3sgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
1121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpELE9BQU8sRUFFSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFHTCxTQUFTLEVBQ1QsTUFBTSxFQUVOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FB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LEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDOzZCQUM1RixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2pCLE9BQU8sQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDOzZCQUNqRyxDQUFDO3lCQUNMLENBQUM7cUJBQ0wiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaXZlQW5ub3VuY2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIEluamVjdG9yLFxuICAgIG1vZGVsLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIHNpZ25hbCxcbiAgICBTaWduYWwsXG4gICAgdmlld0NoaWxkLFxuICAgIGVmZmVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3Qtb3B0aW9uL3NlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5pbnRlcmZhY2UgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB7XG4gICAgZGF0YTogVDtcbiAgICBpZDogc3RyaW5nO1xuICAgIGdyb3VwZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBzZWxlw6fDo28gZHJvcGRvd24gZ2Vuw6lyaWNvIGNvbSBzdXBvcnRlIGEgc2VsZcOnw6NvIHNpbXBsZXMgZSBtw7psdGlwbGEsXG4gKiBmaWx0cm8sIGFncnVwYW1lbnRvLCB2aXJ0dWFsIHNjcm9sbCBlIGFjZXNzaWJpbGlkYWRlIChBUklBIGNvbWJvYm94KS4gSW1wbGVtZW50YVxuICoge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gUmVhY3RpdmUgRm9ybXMgZSBUZW1wbGF0ZS1kcml2ZW4gRm9ybXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXNlbGVjdFxuICogICBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yaWFcIlxuICogICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bWEgY2F0ZWdvcmlhXCJcbiAqICAgW29wdGlvbnNdPVwiY2F0ZWdvcmlhc1wiXG4gKiAgIG9wdGlvbkxhYmVsPVwibm9tZVwiXG4gKiAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICogICBbZmlsdGVyXT1cInRydWVcIlxuICogICBbc2hvd0NsZWFyXT1cInRydWVcIiAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IElucHV0c1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgICAgICBTZWxlY3RPcHRpb25Db21wb25lbnQsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE92ZXJsYXlNb2R1bGUsXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoJGV2ZW50KScsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCAuc2VsZWN0LWNvbnRhaW5lcjpub3QoOmZvY3VzLXdpdGhpbikge1xuICAgICAgICAgICAgICAgICYsXG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcigndmlzaWJpbGl0eUNoYW5nZWQnLCBbXG4gICAgICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCc1MDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOTUpJyB9KSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgXSksXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gZXN0w6Egc2VsZWNpb25hZGEuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIG9ww6fDtWVzIHNpbXVsdMOibmVhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8Ojby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIGxhYmVsIGRlIGV4aWJpw6fDo28uICovXG4gICAgcHVibGljIG9wdGlvbkxhYmVsID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyB2YWxvciBhIHNlciBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIGJvdMOjbyBwYXJhIGxpbXBhciBhIHNlbGXDp8OjbyBhdHVhbC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB1bSBjYW1wbyBkZSBmaWx0cm8gdGV4dHVhbCBwYXJhIHBlc3F1aXNhIG5hcyBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSDDrWNvbmUgZGUgY2hlY2ttYXJrIGFvIGxhZG8gZGEgb3DDp8OjbyBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgY2hlY2ttYXJrID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDbGFzc2UgZG8gw61jb25lIGRlIGNoZWNrbWFyayBleGliaWRvIHF1YW5kbyBgY2hlY2ttYXJrYCBlc3TDoSBhdGl2by4gQGRlZmF1bHQgJ2ZhciBmYS1jaGVjaycgKi9cbiAgICBwdWJsaWMgY2hlY2tJY29uQ2xhc3MgPSBpbnB1dCgnZmFyIGZhLWNoZWNrJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlKHMpIGRvIG9iamV0byB1c2FkYShzKSBwYXJhIGZpbHRyYWdlbSB0ZXh0dWFsLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sIHVzYSBgb3B0aW9uTGFiZWxgLiAqL1xuICAgIHB1YmxpYyBmaWx0ZXJCeSA9IGlucHV0PGtleW9mIFQgfCAoa2V5b2YgVClbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYWdydXBhbWVudG8gZGUgb3DDp8O1ZXMuIEFzIG9ww6fDtWVzIGRldmVtIGNvbnRlciBpdGVucyBmaWxob3MgY29uZm9ybWUgYSBlc3RydXR1cmEgZGUgZ3J1cG8gc3Vwb3J0YWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIHBhcmEgbWVsaG9yIHBlcmZvcm1hbmNlIGNvbSBncmFuZGVzIHZvbHVtZXMgZGUgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGwgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEFsdHVyYSBmaXhhIGRlIGNhZGEgaXRlbSBkYSBsaXN0YSBlbSBwaXhlbHMsIG5lY2Vzc8OhcmlhIHBhcmEgbyBjw6FsY3VsbyBkbyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBNZW5zYWdlbSBleGliaWRhIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gY29ycmVzcG9uZGUgYW8gZmlsdHJvIGFwbGljYWRvLiBAZGVmYXVsdCBudWxsICovXG4gICAgcHVibGljIGVtcHR5TWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZSB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgYSB2aXNpYmlsaWRhZGUgZG8gcGFpbmVsIGRlIG9ww6fDtWVzIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dPcHRpb25zID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMYWJlbCBkZSBhY2Vzc2liaWxpZGFkZSBkbyBjb21wb25lbnRlLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIElEIGRvIGVsZW1lbnRvIGV4dGVybm8gcXVlIGRlc2NyZXZlIG8gY29tcG9uZW50ZSAoYXJpYS1sYWJlbGxlZGJ5KS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnkgPSBpbnB1dCgnJyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9leHRlcm5hbEFyaWFMYWJlbGxlZEJ5ID0gc2lnbmFsKCcnKTtcblxuICAgIC8qKlxuICAgICAqIElEIGRvIGxhYmVsIHJlc29sdmlkbyBwYXJhIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IGludGVybm8uXG4gICAgICogUHJpb3JpemEgbyB2YWxvciBleHBsw61jaXRvIGRlIGBhcmlhTGFiZWxsZWRCeWA7IGNhc28gY29udHLDoXJpbywgdXNhIG8gaWQgZGUgdW1cbiAgICAgKiBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZXh0ZXJubyBhc3NvY2lhZG8gYW8gaG9zdCAoZGV0ZWN0YWRvIGVtIHJ1bnRpbWUpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZXNvbHZlZEFyaWFMYWJlbGxlZEJ5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxsZWRCeSgpIHx8IHRoaXMuX2V4dGVybmFsQXJpYUxhYmVsbGVkQnkoKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyB2YWx1ZSA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHZhbHVlcyA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KFtdKTtcbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSBzaWduYWwoJycpO1xuICAgIHB1YmxpYyBmb2N1c2VkSW5kZXggPSBzaWduYWwoLTEpO1xuICAgIHByaXZhdGUgX3BlbmRpbmdWYWx1ZTogVCB8IFRbXSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBzZWxlY3Qke1NlbGVjdENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcy5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgKGV4Y2x1aW5kbyBhZ3J1cGFkb3JlcykgZXN0aXZlcmVtIHByZXNlbnRlc1xuICAgICAqIG5hIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLCBlIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy52YWx1ZXMoKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmlkKTtcblxuICAgICAgICBjb25zdCByZXQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhvcHRpb24uaWQpKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIExhYmVsIGRlIGFjZXNzaWJpbGlkYWRlIGRvIGNoZWNrYm94IFwiU2VsZWNpb25hciBUb2Rvc1wiLCBjb250ZXh0dWFsIGFvIGVzdGFkbyBhdHVhbCDigJRcbiAgICAgKiByZXBvcnRhZG86IHNlbSBgYXJpYUxhYmVsYCBleHBsw61jaXRvLCBvIGxlaXRvciBkZSB0ZWxhIHPDsyBhbnVuY2lhdmEgXCJjaGVja2JveCwgbsOjb1xuICAgICAqIG1hcmNhZG9cIiwgc2VtIGluZGljYXIgYSBhw6fDo28gKHNlbGVjaW9uYXIgb3UgZGVzbWFyY2FyIHRvZGFzIGFzIG9ww6fDtWVzKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0QWxsQ2hlY2tib3hBcmlhTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuYWxsU2VsZWN0ZWQoKVxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19kZXNlbGVjdF9hY3Rpb24nXG4gICAgICAgICAgICA6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX3NlbGVjdF9hY3Rpb24nO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmRhdGEgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZE9wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmlkID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcGVpYSBvIGlkIGRlIGNhZGEgb3DDp8OjbyBxdWUgw6kgYSBQUklNRUlSQSBkZSB1bSBncnVwbyAoYGdyb3VwKClgIGhhYmlsaXRhZG8pIGFvIHRleHRvXG4gICAgICogYW51bmNpYWRvIHZpYSBgYXJpYS1kZXNjcmliZWRieWAgKGV4LjogXCJBZ3J1cGFkbyBwb3IgQW3DqXJpY2EgZG8gU3VsXCIpLiBPIGFncnVwYWRvciB2aXN1YWxcbiAgICAgKiB0ZW0gYHJvbGU9XCJwcmVzZW50YXRpb25cImAgKHNpbGVuY2lvc28gcHJvIGxlaXRvciBkZSB0ZWxhKSDigJQgcmVwb3J0YWRvOiBhbyBuYXZlZ2FyIHByYVxuICAgICAqIGRlbnRybyBkZSB1bSBncnVwbywgbmFkYSBpbmRpY2F2YSBhIHF1ZSBncnVwbyBhIG9ww6fDo28gcGVydGVuY2lhLiBTw7MgYSBwcmltZWlyYSBvcMOnw6NvIGRlXG4gICAgICogY2FkYSBncnVwbyByZWNlYmUgbyBhbsO6bmNpbywgcHJhIG7Do28gcmVwZXRpciBhIGNhZGEgb3DDp8OjbyBzdWJzZXF1ZW50ZSBkbyBtZXNtbyBncnVwby5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZ3JvdXBBbm5vdW5jZW1lbnRzID0gY29tcHV0ZWQ8TWFwPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhbm5vdW5jZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhbm5vdW5jZW1lbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBlbmRpbmdHcm91cExhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5maWx0ZXJlZE9wdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0dyb3VwTGFiZWwgPSB0aGlzLmdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwZW5kaW5nR3JvdXBMYWJlbCkge1xuICAgICAgICAgICAgICAgIGFubm91bmNlbWVudHMuc2V0KFxuICAgICAgICAgICAgICAgICAgICBvcHRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9ncm91cGVkX2J5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IHBlbmRpbmdHcm91cExhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdHcm91cExhYmVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50cztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIE1hcGVpYSBvIGlkIGRlIGNhZGEgb3DDp8OjbyDDoCBzdWEgcG9zacOnw6NvIChgcG9zaW5zZXRgKSBlIGFvIHRhbWFuaG8gdG90YWwgZG8gY29uanVudG9cbiAgICAgKiAoYHNldHNpemVgKSwgaWdub3JhbmRvIGFncnVwYWRvcmVzIChxdWUgbsOjbyBzw6NvIGByb2xlPVwib3B0aW9uXCJgKS4gTmVjZXNzw6FyaW8gcG9ycXVlLCBjb21cbiAgICAgKiBgdmlydHVhbFNjcm9sbGAsIHPDsyB1bWEgamFuZWxhIGRlIG9ww6fDtWVzIGV4aXN0ZSBkZSBmYXRvIG5vIERPTSBhIGNhZGEgbW9tZW50byDigJQgc2VtXG4gICAgICogYGFyaWEtcG9zaW5zZXRgL2BhcmlhLXNldHNpemVgIGV4cGzDrWNpdG9zLCBvIGxlaXRvciBkZSB0ZWxhIHRlbnRhIGluZmVyaXIgYSBwb3Npw6fDo29cbiAgICAgKiBjb250YW5kbyBvcyBgcm9sZT1cIm9wdGlvblwiYCBpcm3Do29zIHByZXNlbnRlcyBubyBET00sIG8gcXVlIGZpY2EgZXJyYWRvIHByYSB1bWEgbGlzdGFcbiAgICAgKiB2aXJ0dWFsaXphZGEgKHJlcG9ydGFkbyB2aWEgTlZEQTogYW8gc2VsZWNpb25hciBhIDPCqiBvcMOnw6NvIGRlIHVtYSBsaXN0YSBkZSB+MjQwIHBhw61zZXNcbiAgICAgKiBjb20gYHZpcnR1YWxTY3JvbGxgLCBvIGFuw7puY2lvIGRlIHBvc2nDp8OjbyBcInZvbHRhdmFcIiBwcmEgMSBhbnRlcyBkZSBzZSBjb3JyaWdpcikuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvblBvc2l0aW9ucyA9IGNvbXB1dGVkPE1hcDxzdHJpbmcsIHsgcG9zaW5zZXQ6IG51bWJlcjsgc2V0c2l6ZTogbnVtYmVyIH0+PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCB7IHBvc2luc2V0OiBudW1iZXI7IHNldHNpemU6IG51bWJlciB9PigpO1xuICAgICAgICBjb25zdCBub25Hcm91cGVyT3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNldHNpemUgPSBub25Hcm91cGVyT3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgICAgbm9uR3JvdXBlck9wdGlvbnMuZm9yRWFjaCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcG9zaXRpb25zLnNldChvcHRpb24uaWQsIHsgcG9zaW5zZXQ6IGluZGV4ICsgMSwgc2V0c2l6ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcblxuICAgIC8qKlxuICAgICAqIExhcmd1cmEgZG8gcGFpbmVsIChpZ3VhbCDDoCBkbyB0cmlnZ2VyKSwgbWVkaWRhIHF1YW5kbyBvIG92ZXJsYXkgw6kgYW5leGFkby4gTGVyIGBvZmZzZXRXaWR0aGBcbiAgICAgKiBkaXJldG8gbm8gdGVtcGxhdGUgbWVkZSBsYXlvdXQgZHVyYW50ZSBvIGNoYW5nZSBkZXRlY3Rpb24gZSBkaXNwYXJhIE5HMDEwMCBxdWFuZG8gYSBsYXJndXJhXG4gICAgICogbXVkYSBlbnRyZSBkdWFzIHZlcmlmaWNhw6fDtWVzLiBVbSByZXNpemUgZGEgamFuZWxhIGZlY2hhIG8gcGFpbmVsIChgb25XaW5kb3dSZXNpemVgKSwgZW50w6NvXG4gICAgICogbWVkaXIgbmEgYWJlcnR1cmEgYmFzdGEuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhbmVsV2lkdGggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVySW5wdXQgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pj4oJ2ZpbHRlcklucHV0Jyk7XG4gICAgLy8gYHJlYWQ6IEVsZW1lbnRSZWZgIMOpIG9icmlnYXTDs3JpbyBhcXVpOiBgI3NlbGVjdEFsbENoZWNrYm94YCBlc3TDoSBudW0gZWxlbWVudG8gZGVcbiAgICAvLyBjb21wb25lbnRlIChgPHMtY2hlY2tib3g+YCksIGVudMOjbyBzZW0gaXNzbyBvIHZpZXdDaGlsZCByZXNvbHZlIHByYSBpbnN0w6JuY2lhIGRvXG4gICAgLy8gYENoZWNrYm94Q29tcG9uZW50YCAocXVlIG7Do28gdGVtIGAubmF0aXZlRWxlbWVudGApLCBuw6NvIHBybyBgRWxlbWVudFJlZmAgZG8gaG9zdCDigJRcbiAgICAvLyByZXN1bHRhZG8sIG8gZm9jbyBhdXRvbcOhdGljbyBubyBjaGVja2JveCBhbyBhYnJpciAoYHRvZ2dsZSgpYCkgbnVuY2EgZnVuY2lvbmF2YS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RBbGxDaGVja2JveDogU2lnbmFsPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPiA9IHZpZXdDaGlsZCgnc2VsZWN0QWxsQ2hlY2tib3gnLCB7XG4gICAgICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25QYW5lbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2Ryb3Bkb3duUGFuZWwnKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgX2NsaWNrYWJsZUxhYmVsOiBIVE1MTGFiZWxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xpdmVBbm5vdW5jZXIgPSBpbmplY3QoTGl2ZUFubm91bmNlcik7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtXG4gICAgICAgICAgICAuZ2V0KCdmaWx0ZXInKSFcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBgZm9jdXNlZEluZGV4YCDDqSB1bSDDrW5kaWNlIGNydSBkZW50cm8gZGUgYGZpbHRlcmVkT3B0aW9ucygpYCDigJQgYW8gZGlnaXRhciB1bVxuICAgICAgICAgICAgICAgIC8vIGZpbHRybyBxdWUgcmVkdXogYSBsaXN0YSAob3UgbGltcGFyIG8gZmlsdHJvLCBxdWUgYSBhdW1lbnRhIGRlIHZvbHRhKSwgbyDDrW5kaWNlXG4gICAgICAgICAgICAgICAgLy8gYW50aWdvIHBhc3NhIGEgYXBvbnRhciBwcmEgdW1hIHBvc2nDp8OjbyBpbnbDoWxpZGEgb3UgcHJhIHVtYSBvcMOnw6NvIGNvbXBsZXRhbWVudGVcbiAgICAgICAgICAgICAgICAvLyBkaWZlcmVudGUgZGEgcXVlIGVzdGF2YSBmb2NhZGEgYW50ZXMuIFJlcG9ydGFkbyB2aWEgTlZEQTogc2VtIHJlc2V0YXIgYXF1aSxcbiAgICAgICAgICAgICAgICAvLyBBcnJvd0Rvd24vRXNwYcOnby9FbnRlciB2aXJhdmFtIG5vLW9wIHNpbGVuY2lvc28gc2VtcHJlIHF1ZSBvIMOtbmRpY2UgZmljYXZhIGZvcmFcbiAgICAgICAgICAgICAgICAvLyBkb3MgbGltaXRlcyBkYSBub3ZhIGxpc3RhIGZpbHRyYWRhIOKAlCBvIHVzdcOhcmlvIHPDsyBjb250aW51YXZhIG91dmluZG8gbyBhbsO6bmNpb1xuICAgICAgICAgICAgICAgIC8vIGRhIMOaTFRJTUEgc2VsZcOnw6NvIHbDoWxpZGEsIHNlbSBuZW5odW0gZmVlZGJhY2sgZGUgcXVlIGEgdGVjbGEgbsOjbyBmZXogbmFkYS5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoLTEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRWZlaXRvIHBhcmEgdGVudGFyIGFwbGljYXIgdmFsb3IgcGVuZGVudGUgcXVhbmRvIG9wdGlvbnMgbXVkYXIuXG4gICAgICAgIC8vIEEgZXNjcml0YSBlbSB2YWx1ZS92YWx1ZXMgw6kgbmVjZXNzw6FyaWEgcGFyYSBzaW5jcm9uaXphciBvIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmxlbmd0aCAmJiB0aGlzLl9wZW5kaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jbGlja2FibGVMYWJlbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIHZhbG9yIHNlbGVjaW9uYWRvIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEBwYXJhbSB2YWx1ZSBPIHZhbG9yIGEgc2VyIGRlZmluaWRvLiBQb2RlIHNlciB1bSBvYmpldG8gZG8gdGlwbyBgVGAsIHVtIGFycmF5IGRlIGBUYCAocXVhbmRvIG3Dumx0aXBsYSBzZWxlw6fDo28gZXN0w6EgaGFiaWxpdGFkYSksIG91IGBudWxsYC5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvIGUgbyB2YWxvciBuw6NvIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgZGVzYXRpdmFkbyBlIG8gdmFsb3IgZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gbWFwZWlhIG8ocykgdmFsb3IoZXMpIGZvcm5lY2lkbyhzKSBwYXJhIGFzIG9ww6fDtWVzIGludGVybmFzIGRvIGNvbXBvbmVudGUsXG4gICAgICogZ2FyYW50aW5kbyBxdWUgYXBlbmFzIG9ww6fDtWVzIHbDoWxpZGFzIHNlamFtIHNlbGVjaW9uYWRhcyBjb25mb3JtZSBvIG1vZG8gZGUgc2VsZcOnw6NvICjDum5pY28gb3UgbcO6bHRpcGxvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IFRbXSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgLy8gQXJtYXplbmEgdmFsb3IgcGVuZGVudGUgZSB0ZW50YSBhcGxpY2FyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9hcHBseVBlbmRpbmdWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlbnRhIGFwbGljYXIgbyB2YWxvciBwZW5kZW50ZSAoX3BlbmRpbmdWYWx1ZSkgYW8gZXN0YWRvIGRvIGNvbXBvbmVudGUsXG4gICAgICogbWFwZWFuZG8gcGFyYSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IGNvbmZvcm1lIG9wdGlvbnMgZGlzcG9uw612ZWlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FwcGx5UGVuZGluZ1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BlbmRpbmdWYWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZSgpO1xuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmZpbmQoKG9wdCkgPT4gb3B0LmRhdGFbb3B0aW9uVmFsdWVdID09PSB2KSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodikpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG9wdCk6IG9wdCBpcyBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+ID0+ICEhb3B0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQobWFwcGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvblZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIG9wdGlvblZhbHVlIGluIHZhbHVlID8gdmFsdWVbb3B0aW9uVmFsdWVdIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gY29tcGFyZVZhbHVlKSB8fCBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID0gb3B0cy5maW5kKChvcHQpID0+IEpTT04uc3RyaW5naWZ5KG9wdC5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobWFwcGVkID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHNlbXByZSBxdWUgbyB2YWxvciBkbyBjb21wb25lbnRlIG11ZGFyLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZSBGdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgcmVjZWJlIG8gbm92byB2YWxvciBzZWxlY2lvbmFkbyBvdSBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IFQgfCBUW10gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gb25DaGFuZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0cmEgdW1hIGZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSBzZXLDoSBjaGFtYWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIHRvY2FkbyAocGVyZGVyIG8gZm9jbykuXG4gICAgICogQHBhcmFtIG9uVG91Y2hlZCBGdW7Dp8OjbyBkZSBjYWxsYmFjayBhIHNlciBleGVjdXRhZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgbWFyY2FkbyBjb21vIFwidG9jYWRvXCIuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZXN0YWRvIGRlIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLlxuICAgICAqIEBwYXJhbSBkaXNhYmxlZCBJbmRpY2Egc2UgbyBjb21wb25lbnRlIGRldmUgc2VyIGRlc2FiaWxpdGFkbyAoYHRydWVgKSBvdSBoYWJpbGl0YWRvIChgZmFsc2VgKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyByZWFsaXphIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIENhc28gY29udHLDoXJpbywgaW52ZXJ0ZSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRhcyBvcMOnw7Vlcy5cbiAgICAgKiBBbyBhYnJpciwgbW92ZSBvIGZvY28gcGFyYSBvIGl0ZW0gYXR1YWxtZW50ZSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRPcGVuID0gIXRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBzaG91bGRPcGVuO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcblxuICAgICAgICBpZiAoc2hvdWxkT3Blbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBRdWFuZG8gaMOhIGZpbHRybyBjb20gbcO6bHRpcGxhIHNlbGXDp8OjbywgZm9jbyB2YWkgcGFyYSBvIGNoZWNrYm94IHByaW1laXJvO1xuICAgICAgICAgICAgICAgIC8vIGNhc28gY29udHLDoXJpbywgdmFpIGRpcmV0byBwYXJhIG8gaW5wdXQgZGUgZmlsdHJvLlxuICAgICAgICAgICAgICAgIC8vIE8gZm9jbyDDqSBtb3ZpZG8gYXDDs3MgYSByZW5kZXJpemHDp8OjbyBkbyBvdmVybGF5LlxuICAgICAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94SG9zdDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB0aGlzLl9zZWxlY3RBbGxDaGVja2JveCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IGNoZWNrYm94SG9zdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1t0YWJpbmRleF0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGU/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaXNOb3dTZWxlY3RlZCA9IGluZGV4ID09PSAtMTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChzdG9yZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb25WYWx1ZSA/IHN0b3JlLm1hcCgoaXRlbSkgPT4gaXRlbS5kYXRhW29wdGlvblZhbHVlXSkgOiBzdG9yZTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCBpc05vd1NlbGVjdGVkKTtcblxuICAgICAgICAgICAgLy8gQWNvbXBhbmhhIG8gaXRlbSBxdWUgYWNhYm91IGRlIHNlciBzZWxlY2lvbmFkby9kZXNtYXJjYWRvIHZpYSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgICAgIC8vIOKAlCBzZW0gaXNzbywgY2xpY2FyIGNvbSBvIG1vdXNlIChlbSB2ZXogZGUgbmF2ZWdhciBwb3IgdGVjbGFkbykgbnVuY2EgbW92ZSBvXG4gICAgICAgICAgICAvLyBcImZvY29cIiB2aXJ0dWFsLCBxdWUgZmljYSBwYXJhZG8gb25kZSBlc3RhdmEgKG91IG51bG8pLCBlIG8gbGVpdG9yIGRlIHRlbGEgcGFzc2EgYVxuICAgICAgICAgICAgLy8gYW51bmNpYXIgc2VtcHJlIGEgbWVzbWEgb3DDp8OjbyAoYSBwcmltZWlyYSwgb3UgYSDDumx0aW1hIGFsY2Fuw6dhZGEgcG9yIHRlY2xhZG8pIGVtXG4gICAgICAgICAgICAvLyB2ZXogZGEgcXVlIGZvaSBkZSBmYXRvIGNsaWNhZGEuXG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KGl0ZW1JbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gaXRlbS5kYXRhW29wdGlvblZhbHVlXSA6IGl0ZW0uZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIERldm9sdmUgbyBmb2NvIHBybyBjb250YWluZXIgc8OzIHNlIGVsZSBlc3RhdmEgZGVudHJvIGRvIHBhaW5lbCAoZXguOiBvcMOnw6NvXG4gICAgICAgICAgICAvLyBlc2NvbGhpZGEgY29tIG8gZmlsdHJvIGZvY2Fkbykg4oCUIHZlciBgX2Nsb3NlRHJvcGRvd24oKWAuXG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgYSBvcMOnw6NvIHNlbGVjaW9uYWRhL2Rlc21hcmNhZGEuIE5lY2Vzc8OhcmlvIHBvcnF1ZSwgbmEgcHLDoXRpY2EsXG4gICAgICogbmVtIHRvZG8gbmF2ZWdhZG9yL2xlaXRvciBkZSB0ZWxhIGFudW5jaWEgc296aW5obyBhIG11ZGFuw6dhIGRlIGBhcmlhLXNlbGVjdGVkYCBkYSBvcMOnw6NvXG4gICAgICogYXBvbnRhZGEgcG9yIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIChyZXBvcnRhZG8gdmlhIE5WREEgbm8gQ2hyb21lOiBuZW5odW1hIG1lbnNhZ2VtIGVyYVxuICAgICAqIG91dmlkYSBhbyBzZWxlY2lvbmFyKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hbm5vdW5jZU9wdGlvblRvZ2dsZShpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+LCBpc05vd1NlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGlzTm93U2VsZWN0ZWRcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5zZWxlY3Rfb3B0aW9uX3NlbGVjdGVkJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9vcHRpb25fZGVzZWxlY3RlZCc7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoa2V5LCB7IG9wdGlvbjogdGhpcy5nZXRPcHRpb25MYWJlbChpdGVtLmRhdGEpIH0pO1xuICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UobWVzc2FnZSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9hbGxfb3B0aW9uc19jbGVhcmVkJyksXG4gICAgICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZExhYmVsID0gdGhpcy52YWx1ZSgpID8gdGhpcy5nZXRPcHRpb25MYWJlbCh0aGlzLnZhbHVlKCkhLmRhdGEpIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuX2xpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdF9vcHRpb25fcmVtb3ZlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjogcmVtb3ZlZExhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gTyBib3TDo28gXCJMaW1wYXJcIiBzw7Mgw6kgcmVuZGVyaXphZG8gZW5xdWFudG8gYCFpc0NsZWFuKClgIOKAlCBhbyBjaGFtYXIgYGNsZWFyKClgIGVsZVxuICAgICAgICAvLyBkZWl4YSBkZSBleGlzdGlyIG5vIERPTSBuYSBtZXNtYSByZS1yZW5kZXJpemHDp8OjbyBlbSBxdWUgYWNhYm91IGRlIHNlciBjbGljYWRvLFxuICAgICAgICAvLyBsZXZhbmRvIG8gZm9jbyBqdW50byBwcmEgYGRvY3VtZW50LmJvZHlgIChwZXJkaWRvKSBzZSBuYWRhIG8gcmVzZ2F0YXIgZXhwbGljaXRhbWVudGUuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3luY1BhbmVsV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhbmVsV2lkdGguc2V0KHdpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIG5vIGlucHV0IGRlIGZpbHRybyBkbyBvdmVybGF5LlxuICAgICAqIC0gJ0Fycm93RG93bic6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcmltZWlyYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ0Fycm93VXAnOiBNb3ZlIG8gZm9jbyBwYXJhIGEgw7psdGltYSBvcMOnw6NvIGRhIGxpc3RhLlxuICAgICAqIC0gJ1RhYicgKHNlbSBTaGlmdCk6IE1vdmUgbyBmb2NvIHBhcmEgYSBwcsOzeGltYSBvcMOnw6NvIGRhIGxpc3RhLCBlbSB2ZXogZGUgZGVpeGFyIG8gVGFiXG4gICAgICogICBuYXRpdm8gdGVudGFyIHNhaXIgZG8gb3ZlcmxheSAoYXMgb3DDp8O1ZXMgbsOjbyBzw6NvIGVsZW1lbnRvcyB0YWJ1bMOhdmVpcywgZW50w6NvIG8gVGFiXG4gICAgICogICBuYXRpdm8gXCJ2YXphdmFcIiBvIGZvY28gcHJhIGZvcmEgZG8gcGFpbmVsIHNlbSBudW5jYSBhbGNhbsOnYXIgYSBsaXN0YSkuXG4gICAgICogLSAnRXNjYXBlJzogRmVjaGEgbyBkcm9wZG93biBlIHJldG9ybmEgbyBmb2NvIGFvIGNvbWJvYm94LlxuICAgICAqIC0gJ0VudGVyJyAvICdFc3Bhw6dvJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEsIHNlIGhvdXZlci4gRXNwYcOnbyBzw7Mgw6kgaW50ZXJjZXB0YWRvXG4gICAgICogICBxdWFuZG8gasOhIGV4aXN0ZSB1bWEgb3DDp8OjbyBjb20gZm9jbyB2aXJ0dWFsIChgZm9jdXNlZEluZGV4KCkgPj0gMGApIOKAlCBzZW0gdW1hIG9ww6fDo29cbiAgICAgKiAgIGZvY2FkYSwgbyBlc3Bhw6dvIMOpIGRlaXhhZG8gcGFzc2FyIHBybyBjb21wb3J0YW1lbnRvIG5hdGl2byBkbyBgPGlucHV0PmAgKGRpZ2l0YXIgdW1cbiAgICAgKiAgIGVzcGHDp28sIG5lY2Vzc8OhcmlvIHByYSBidXNjYXMgY29tIG3Dumx0aXBsYXMgcGFsYXZyYXMpLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBubyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lbmh1bSBpdGVtIGZvY2FkbzogZm9jYSBvIMO6bHRpbW8gZGlzcG9uw612ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SW5kZXggPSBvcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgb3B0aW9uc1tsYXN0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG9wdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXgoKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWRJbmRleCgpID49IDAgJiYgdGhpcy5mb2N1c2VkSW5kZXgoKSA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHRlY2xhZG8gbm8gYm90w6NvIFwiTGltcGFyIGZpbHRyb1wiIGRvIG92ZXJsYXkuXG4gICAgICogw4kgbyDDumx0aW1vIGNvbnRyb2xlIHJlYWwgKHRhYnVsw6F2ZWwpIGRvIG92ZXJsYXkgYW50ZXMgZGEgbGlzdGEgZGUgb3DDp8O1ZXMg4oCUIHNlbVxuICAgICAqIGludGVyY2VwdGFyIG8gVGFiIGFxdWksIGVsZSBcInZhemF2YVwiIG8gZm9jbyBwcmEgZm9yYSBkbyBwYWluZWwgc2VtIG51bmNhIGFsY2Fuw6dhciBhXG4gICAgICogbGlzdGEsIGrDoSBxdWUgYXMgb3DDp8O1ZXMgbsOjbyBzw6NvIGVsZW1lbnRvcyB0YWJ1bMOhdmVpcyAoZm9jbyB2aXJ0dWFsIHZpYVxuICAgICAqIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkuXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIG5vIGJvdMOjby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25DbGVhckZpbHRlckJ1dHRvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKHRoaXMuZmlsdGVyZWRPcHRpb25zKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYicvJ1NoaWZ0K1RhYic6IENvbSBvIGRyb3Bkb3duIGFiZXJ0byBlIHNlbSBmaWx0cm8sIG5hdmVnYSBlbnRyZSBhcyBvcMOnw7VlcyAobWVzbW9cbiAgICAgKiAgIGVmZWl0byBkZSBBcnJvd0Rvd24vQXJyb3dVcCkgZW0gdmV6IGRlIGZlY2hhciBvIHBhaW5lbCBlIFwidmF6YXJcIiBvIGZvY28gcHJvIHByw7N4aW1vXG4gICAgICogICBjYW1wbyBkYSBww6FnaW5hIHNlbSBvIHVzdcOhcmlvIG51bmNhIHRlciBhbGNhbsOnYWRvIGFzIG9ww6fDtWVzLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoICYmIGV2ZW50LmtleSAhPT0gJ0VzY2FwZScgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tIGZpbHRybywgVGFiIG5hdmVnYSBwZWxvcyBjb250cm9sZXMgcmVhaXMgZG8gb3ZlcmxheSAoY2hlY2tib3gg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCDihpIgYm90w6NvIFwiTGltcGFyIGZpbHRyb1wiKTsgYSBwYXJ0aXIgZG8gw7psdGltbyBkZWxlcywgbyBwcsOzcHJpb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbGUgaW50ZXJjZXB0YSBvIFRhYiBwcmEgZW50cmFyIG5hIGxpc3RhIOKAlCB2ZXIgb25GaWx0ZXJLZXlEb3duIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uQ2xlYXJGaWx0ZXJCdXR0b25LZXlEb3duLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbSBmaWx0cm8sIG8gZm9jbyBET00gbnVuY2Egc2FpIGRvIGNvbWJvYm94IChuYXZlZ2HDp8OjbyB2aXJ0dWFsIHZpYVxuICAgICAgICAgICAgICAgICAgICAvLyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpIOKAlCByZXBvcnRhZG86IHNlbSBpbnRlcmNlcHRhciwgVGFiIGZlY2hhdmEgb1xuICAgICAgICAgICAgICAgICAgICAvLyBkcm9wZG93biBlIG8gZm9jbyBcInZhemF2YVwiIHBybyBwcsOzeGltbyBjYW1wbyBkYSBww6FnaW5hIHNlbSBvIHVzdcOhcmlvXG4gICAgICAgICAgICAgICAgICAgIC8vIG51bmNhIHRlciBhbGNhbsOnYWRvIGFzIG9ww6fDtWVzLiBUYWIgcGFzc2EgYSBmdW5jaW9uYXIgY29tbyBBcnJvd0Rvd24vVXAuXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHRleHRvIGRlIGFuw7puY2lvIGRlIGdydXBvIChleC46IFwiQWdydXBhZG8gcG9yIEFtw6lyaWNhIGRvIFN1bFwiKSBwcmEgdW1hIG9ww6fDo28sXG4gICAgICogY2FzbyBlbGEgc2VqYSBhIHByaW1laXJhIGRvIHNldSBncnVwbyDigJQgdmVyIGBncm91cEFubm91bmNlbWVudHNgLlxuICAgICAqIEBwYXJhbSBvcHRpb25JZCBJZCBkYSBvcMOnw6NvIGludGVybmEuXG4gICAgICogQHJldHVybnMgTyB0ZXh0byBkZSBhbsO6bmNpbywgb3UgYG51bGxgIHNlIGEgb3DDp8OjbyBuw6NvIGZvciBhIHByaW1laXJhIGRvIGdydXBvLlxuICAgICAqL1xuICAgIHB1YmxpYyBncm91cEFubm91bmNlbWVudEZvcihvcHRpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwQW5ub3VuY2VtZW50cygpLmdldChvcHRpb25JZCkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIGEgcG9zacOnw6NvICgxLWJhc2VkKSBkZSB1bWEgb3DDp8OjbyBkZW50cm8gZG8gY29uanVudG8gbmF2ZWfDoXZlbCDigJQgdmVyIGBvcHRpb25Qb3NpdGlvbnNgLlxuICAgICAqIEBwYXJhbSBvcHRpb25JZCBJZCBkYSBvcMOnw6NvIGludGVybmEuXG4gICAgICogQHJldHVybnMgQSBwb3Npw6fDo28sIG91IGBudWxsYCBzZSBhIG9ww6fDo28gbsOjbyBmb3IgZW5jb250cmFkYSAoZXguOiDDqSB1bSBhZ3J1cGFkb3IpLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcHRpb25Qb3NpbnNldEZvcihvcHRpb25JZDogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvblBvc2l0aW9ucygpLmdldChvcHRpb25JZCk/LnBvc2luc2V0ID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHRhbWFuaG8gdG90YWwgZG8gY29uanVudG8gbmF2ZWfDoXZlbCBhbyBxdWFsIHVtYSBvcMOnw6NvIHBlcnRlbmNlIOKAlCB2ZXIgYG9wdGlvblBvc2l0aW9uc2AuXG4gICAgICogQHBhcmFtIG9wdGlvbklkIElkIGRhIG9ww6fDo28gaW50ZXJuYS5cbiAgICAgKiBAcmV0dXJucyBPIHRhbWFuaG8gdG90YWwsIG91IGBudWxsYCBzZSBhIG9ww6fDo28gbsOjbyBmb3IgZW5jb250cmFkYSAoZXguOiDDqSB1bSBhZ3J1cGFkb3IpLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcHRpb25TZXRzaXplRm9yKG9wdGlvbklkOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uUG9zaXRpb25zKCkuZ2V0KG9wdGlvbklkKT8uc2V0c2l6ZSA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIGRlIHRyYWNrQnkgdXRpbGl6YWRhIGVtIGJsb2NvcyBAZm9yIHBhcmEgb3RpbWl6YXIgYSByZW5kZXJpemHDp8OjbyBkZSBsaXN0YXMuXG4gICAgICogUmV0b3JuYSBvIGlkZW50aWZpY2Fkb3Igw7puaWNvIChgaWRgKSBkZSBjYWRhIGl0ZW0gZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHBhcmFtIF8gLSDDjW5kaWNlIGRvIGl0ZW0gbmEgbGlzdGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKiBAcGFyYW0gaXRlbSAtIE8gaXRlbSBhdHVhbCBkYSBsaXN0YSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcmV0dXJucyBPIGlkZW50aWZpY2Fkb3Igw7puaWNvIGRvIGl0ZW0gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0J5SWQoXzogbnVtYmVyLCBpdGVtOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpY2Egc2UgYSBvcMOnw6NvIGZvcm5lY2lkYSBlc3TDoSBzZWxlY2lvbmFkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGludGVybmEgZG8gZHJvcGRvd24gYSBzZXIgdmVyaWZpY2FkYS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgc2UgYSBvcMOnw6NvIGVzdGl2ZXIgc2VsZWNpb25hZGEsIGNhc28gY29udHLDoXJpbyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy52YWx1ZXMoKS5maW5kKChvKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG8gPT09IG9wdGlvbjtcbiAgICAgICAgICAgIH0pICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgc2VsZcOnw6NvIGRlIHRvZG9zIG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbywgc2VsZWNpb25hIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBxdWUgbsOjbyBzw6NvIGFncnVwYWRvcmVzXG4gICAgICogY2FzbyBuZW0gdG9kb3MgZXN0ZWphbSBzZWxlY2lvbmFkb3MsIG91IGxpbXBhIGEgc2VsZcOnw6NvIGNhc28gdG9kb3MgasOhIGVzdGVqYW0gc2VsZWNpb25hZG9zLlxuICAgICAqIEFww7NzIGEgYWx0ZXJhw6fDo28sIG5vdGlmaWNhIGEgbXVkYW7Dp2EgZGUgdmFsb3IuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZVNlbGVjdEFsbFRvZ2dsZShmYWxzZSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hbm5vdW5jZVNlbGVjdEFsbFRvZ2dsZSh0cnVlLCBvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbnVuY2lhIHZpYSBgTGl2ZUFubm91bmNlcmAgbyByZXN1bHRhZG8gZGUgXCJTZWxlY2lvbmFyIFRvZG9zXCIvXCJMaW1wYXIgVG9kb3NcIi4gTmVjZXNzw6FyaW9cbiAgICAgKiBwb3JxdWUgbyBjaGVja2JveCBxdWUgZGlzcGFyYSBhIGHDp8OjbyB0ZW0gZm9jbyByZWFsIGUgYW51bmNpYSBzZXUgcHLDs3ByaW8gYGFyaWEtY2hlY2tlZGBcbiAgICAgKiBub3JtYWxtZW50ZSwgbWFzIGFzIE4gb3DDp8O1ZXMgYWZldGFkYXMgKHF1ZSBuw6NvIGVzdMOjbyBmb2NhZGFzKSBuw6NvIOKAlCBhbyBjb250csOhcmlvIGRvIHRvZ2dsZVxuICAgICAqIGRlIHVtYSBvcMOnw6NvIGluZGl2aWR1YWwsIGN1am8gYGFyaWEtc2VsZWN0ZWRgIGrDoSDDqSBsaWRvIHBlbG8gbGVpdG9yIGRlIHRlbGEgcG9ycXVlIGVsYSDDqSBvXG4gICAgICogZWxlbWVudG8gYXBvbnRhZG8gcG9yIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIG5vIG1vbWVudG8gZGEgbXVkYW7Dp2EuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYW5ub3VuY2VTZWxlY3RBbGxUb2dnbGUoaXNOb3dTZWxlY3RlZDogYm9vbGVhbiwgY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNOb3dTZWxlY3RlZFxuICAgICAgICAgICAgPyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jb3VudF9pdGVtc19zZWxlY3RlZCcsIHsgY291bnQgfSlcbiAgICAgICAgICAgIDogdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc2VsZWN0X2FsbF9vcHRpb25zX2NsZWFyZWQnKTtcbiAgICAgICAgdm9pZCB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UsICdwb2xpdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGRlIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdXRpbGl6YSBhIHByb3ByaWVkYWRlIGRlZmluaWRhIHBvciBgb3B0aW9uTGFiZWxgIHBhcmEgZXh0cmFpciBvIHZhbG9yIGRvIHLDs3R1bG8gZGEgb3DDp8Ojby5cbiAgICAgKiBDYXNvIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RlamEgZGVmaW5pZG8sIHJldG9ybmEgYSByZXByZXNlbnRhw6fDo28gZW0gc3RyaW5nIGRhIHByw7NwcmlhIG9ww6fDo28uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9uIEEgb3DDp8OjbyBkYSBxdWFsIG8gcsOzdHVsbyBzZXLDoSBleHRyYcOtZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbltvcHRpb25MYWJlbF0pIDogU3RyaW5nKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhIGFzIGVudHJhZGFzIGRvIGNvbXBvbmVudGUgZGUgc2VsZcOnw6NvLlxuICAgICAqIEVzdGUgbcOpdG9kbyB2ZXJpZmljYSBzZSBhcyBvcMOnw7VlcyBmb3JuZWNpZGFzIHPDo28gdsOhbGlkYXMuIENhc28gYXMgb3DDp8O1ZXMgc2VqYW0gb2JqZXRvcyxcbiAgICAgKiBnYXJhbnRlIHF1ZSBhIHByb3ByaWVkYWRlIGBvcHRpb25MYWJlbGAgZXN0ZWphIGRlZmluaWRhLCBsYW7Dp2FuZG8gdW0gZXJybyBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogU2UgbsOjbyBob3V2ZXIgb3DDp8O1ZXMsIGEgdmFsaWRhw6fDo28gw6kgaWdub3JhZGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2UgYXMgb3DDp8O1ZXMgZm9yZW0gb2JqZXRvcyBlIGBvcHRpb25MYWJlbGAgbsOjbyBlc3RpdmVyIGRlZmluaWRvLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzT2JqZWN0T3B0aW9ucyA9IG9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb24gIT09IG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNPYmplY3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uTGFiZWwoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwib3B0aW9uTGFiZWxcIiBpbnB1dCBpcyByZXF1aXJlZCB3aGVuIG9wdGlvbnMgYXJlIG9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NvY2lhIHVtIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBleHRlcm5vIChxdWUgYXBvbnRhIHBhcmEgbyBgaWRgIGRvIGhvc3QpIGFvXG4gICAgICogY29tYm9ib3ggaW50ZXJubywgcmVzb2x2ZW5kbyBvIHByb2JsZW1hIGRlIFwib3JwaGFuZWQgbGFiZWxcIi5cbiAgICAgKlxuICAgICAqIENvbW8gbyBob3N0IGBzLXNlbGVjdGAgbsOjbyDDqSB1bSBlbGVtZW50byByb3R1bMOhdmVsIChsYWJlbGFibGUpLCBvIGBmb3JgIG7Do29cbiAgICAgKiBjcmlhIHbDrW5jdWxvIHByb2dyYW3DoXRpY28uIEVzdGUgbcOpdG9kbzpcbiAgICAgKiAtIGxvY2FsaXphIG8gbGFiZWwgcXVlIHJlZmVyZW5jaWEgbyBgaWRgIGRvIGhvc3Q7XG4gICAgICogLSBnYXJhbnRlIHF1ZSBlc3NlIGxhYmVsIHRlbmhhIHVtIGBpZGA7XG4gICAgICogLSBhcG9udGEgbyBgYXJpYS1sYWJlbGxlZGJ5YCBkbyBjb21ib2JveCBwYXJhIGVzc2UgbGFiZWw7XG4gICAgICogLSBhZGljaW9uYSB1bSBjbGlxdWUgbm8gbGFiZWwgcGFyYSBmb2NhciBvIGNvbWJvYm94IChlcXVpdmFsZW50ZSBhbyBgZm9yYCkuXG4gICAgICpcbiAgICAgKiBOw6NvIHNvYnJlc2NyZXZlIHVtIGBhcmlhTGFiZWxsZWRCeWAgZXhwbMOtY2l0byBpbmZvcm1hZG8gcGVsbyBjb25zdW1pZG9yLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYXJpYUxhYmVsbGVkQnkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaG9zdElkID0gdGhpcy5faG9zdFJlZi5uYXRpdmVFbGVtZW50LmlkO1xuICAgICAgICBpZiAoIWhvc3RJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLl9maW5kTGFiZWxGb3IoaG9zdElkKTtcbiAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsYWJlbC5pZCkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKGxhYmVsLCAnaWQnLCBgJHt0aGlzLmNvbXBvbmVudElkfS1sYWJlbGApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXh0ZXJuYWxBcmlhTGFiZWxsZWRCeS5zZXQobGFiZWwuaWQpO1xuXG4gICAgICAgIC8vIE8gYXRyaWJ1dG8gYGZvcmAgbsOjbyBmdW5jaW9ubGRhIGVtIGhvc3QgbsOjby1yb3R1bMOhdmVsLCBlbnTDo28gcmVwbGljYW1vc1xuICAgICAgICAvLyBvIGNvbXBvcnRhbWVudG8gZGUgXCJjbGljYXIgbm8gbGFiZWwgZm9jYSBvIGNvbnRyb2xlXCIgbWFudWFsbWVudGUuXG4gICAgICAgIHRoaXMuX2NsaWNrYWJsZUxhYmVsID0gbGFiZWw7XG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2NhbGl6YSBvIGA8bGFiZWw+YCBjdWpvIGF0cmlidXRvIGBmb3JgIGNvcnJlc3BvbmRlIGFvIGlkIGluZm9ybWFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBob3N0SWQgSWQgZG8gaG9zdCByZWZlcmVuY2lhZG8gcGVsbyBsYWJlbC5cbiAgICAgKiBAcmV0dXJucyBPIGVsZW1lbnRvIGxhYmVsIGNvcnJlc3BvbmRlbnRlIG91IGBudWxsYC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9maW5kTGFiZWxGb3IoaG9zdElkOiBzdHJpbmcpOiBIVE1MTGFiZWxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxhYmVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTExhYmVsRWxlbWVudD4oJ2xhYmVsW2Zvcl0nKTtcbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBBcnJheS5mcm9tKGxhYmVscykpIHtcbiAgICAgICAgICAgIGlmIChsYWJlbC5nZXRBdHRyaWJ1dGUoJ2ZvcicpID09PSBob3N0SWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBvIGNvbWJvYm94IGludGVybm8gYW8gY2xpY2FyIG5vIGxhYmVsIGV4dGVybm8gYXNzb2NpYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25MYWJlbENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uIFNlIG8gZm9jbyBlc3RhdmEgZGVudHJvIGRvIHBhaW5lbFxuICAgICAqIHNlbmRvIGZlY2hhZG8gKGV4LjogY2FtcG8gZGUgZmlsdHJvKSwgZGV2b2x2ZSBvIGZvY28gcHJvIGNvbnRhaW5lci9jb21ib2JveCDigJQgbnVuY2FcbiAgICAgKiBmb3LDp2EgbyBmb2NvIHNlIGVsZSBqw6EgZXN0aXZlciBlbSBvdXRybyBsdWdhciAoZXguOiBvcMOnw6NvIGVzY29saGlkYSB2aWEgY2xpcXVlIGRvIG1vdXNlXG4gICAgICogc2VtIGZpbHRybywgb25kZSBvIGZvY28gRE9NIG51bmNhIHNhaXUgZG8gY29tYm9ib3ggcG9yIGNhdXNhIGRvIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkuXG4gICAgICogYHByb3RlY3RlZGAgKG7Do28gYHByaXZhdGVgKSBwb3JxdWUgdGFtYsOpbSDDqSBjaGFtYWRvIGEgcGFydGlyIGRvIHRlbXBsYXRlXG4gICAgICogKGBiYWNrZHJvcENsaWNrYC9gZGV0YWNoYCBkbyBgY2RrQ29ubmVjdGVkT3ZlcmxheWApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWxFbGVtZW50ID0gdGhpcy5fZHJvcGRvd25QYW5lbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNJc0luc2lkZVBhbmVsID1cbiAgICAgICAgICAgIHBhbmVsRWxlbWVudCAhPSBudWxsICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlICYmIHBhbmVsRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKCFmb2N1c0lzSW5zaWRlUGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gYGNvbXBvbmVudElkYCBkZXN0YSBpbnN0w6JuY2lhLCBubyB0aW1lc3RhbXAgYXR1YWwgZSBubyDDrW5kaWNlIGRvXG4gICAgICogaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwbyAoZGV0ZWN0YWRvIHBlbGEgcHJlc2Vuw6dhIGRlIHVtIGFycmF5IGBpdGVtc2ApLCBhZGljaW9uYSB0YW1iw6ltIGFcbiAgICAgKiBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBPIGBjb21wb25lbnRJZGAgw6kgb2JyaWdhdMOzcmlvIG5vIHByZWZpeG86IGBEYXRlLm5vdygpYCBzb3ppbmhvIHRlbSByZXNvbHXDp8OjbyBkZSBhcGVuYXMgMW1zLCBlIGR1YXNcbiAgICAgKiBpbnN0w6JuY2lhcyBkZSBgcy1zZWxlY3RgIG5hIG1lc21hIHDDoWdpbmEgZnJlcXVlbnRlbWVudGUgaW5pY2lhbGl6YW0gZGVudHJvIGRvIG1lc21vIG1pbGlzc2VndW5kb1xuICAgICAqIChjb25maXJtYWRvIHZpYSB0ZXN0ZSBtYW51YWwg4oCUIHJlcG9ydGFkbyB2aWEgTlZEQTogdW1hIG9ww6fDo28gasOhIHNlbGVjaW9uYWRhIGVtIE9VVFJPIGBzLXNlbGVjdGAgZGFcbiAgICAgKiBww6FnaW5hIGVyYSBhbnVuY2lhZGEgZW0gdmV6IGRhIG9ww6fDo28gZGUgZmF0byBjbGljYWRhKS4gU2VtIG8gYGNvbXBvbmVudElkYCwgb3MgaWRzIGNvbGlkaWFtIGVudHJlXG4gICAgICogaW5zdMOibmNpYXMgZGlmZXJlbnRlcyAoYGlkXzxtZXNtby10aW1lc3RhbXA+XzBgIGVtIGFtYmFzKSwgZSBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YC9gZ2V0RWxlbWVudEJ5SWRgXG4gICAgICogcmVzb2x2aWFtIHBybyBlbGVtZW50byBlcnJhZG8g4oCUIGRlIG91dHJvIHNlbGVjdC4gTyB0aW1lc3RhbXAgY29udGludWEgbm8gaWQgKGFsw6ltIGRvIGBjb21wb25lbnRJZGApXG4gICAgICogcHJhIG1hbnRlciBpZHMgw7puaWNvcyBlbnRyZSByZWNvbXB1dGHDp8O1ZXMgZGEgTUVTTUEgaW5zdMOibmNpYSBxdWFuZG8gYG9wdGlvbnMoKWAgbXVkYSBkZSByZWZlcsOqbmNpYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke3RoaXMuY29tcG9uZW50SWR9X2lkXyR7dGltZXN0YW1wfV8ke2luZGV4Kyt9YCxcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICBpZDogYCR7dGhpcy5jb21wb25lbnRJZH1faWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGZvY28gbm8gaXRlbSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRvIGFvIGFicmlyIG8gZHJvcGRvd24uXG4gICAgICogTm8gbW9kbyBzaW1wbGVzLCBmb2NhIG8gaXRlbSBzZWxlY2lvbmFkby4gTm8gbW9kbyBtw7psdGlwbG8sIGZvY2EgbyBwcmltZWlybyBpdGVtIHNlbGVjaW9uYWRvLlxuICAgICAqIEFww7NzIHJlbmRlcml6YcOnw6NvIGRvIG92ZXJsYXksIHJvbGEgYSBsaXN0YSBhdMOpIG8gaXRlbSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKVswXTtcbiAgICAgICAgICAgIGlmIChmaXJzdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBmaXJzdFNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBzZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpLCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1lZGl1bSBib3JkZXIgb3V0bGluZS0yIG91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV0gb3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZVwiXG4gICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1hdXRvXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwic2hvd09wdGlvbnMoKSA/IGNvbXBvbmVudElkICsgJy1saXN0Ym94JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJzaG93T3B0aW9ucygpID8gZm9jdXNlZE9wdGlvbklkKCkgOiBudWxsXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtpZF09XCJjb21wb25lbnRJZCArICctY29tYm9ib3gnXCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQoKSA/IC0xIDogMFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwoKSB8fCBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwicmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSgpIHx8IG51bGxcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgc2VsZWN0LW5vbmUgcHgtWzEwcHhdIHB5LVs3cHhdXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpICYmICFpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtNjBdPVwiIWRpc2FibGVkKCkgJiYgaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmFyaWFfY2xlYXJfc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggdy05IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItbCBncm91cC1ob3ZlcjpiZy1ncmF5c2NhbGUtNVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXMgdGV4dC1iYXNlXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIXNob3dPcHRpb25zKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LXVwXT1cInNob3dPcHRpb25zKClcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cIl9jbG9zZURyb3Bkb3duKClcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChhdHRhY2gpPVwiX3N5bmNQYW5lbFdpZHRoKClcIlxuICAgIChkZXRhY2gpPVwiX2Nsb3NlRHJvcGRvd24oKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICAjZHJvcGRvd25QYW5lbFxuICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1ib2R5LWNsYXNzIHotWzEwMDBdIHJvdW5kZWQtWzNweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3ctbWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInBhbmVsV2lkdGgoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIFtAdmlzaWJpbGl0eUNoYW5nZWRdXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cInNlbGVjdEFsbENoZWNrYm94QXJpYUxhYmVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtWzM1cHhdIGdyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZmlsdGVySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25GaWx0ZXJLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXJfb3B0aW9ucycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZm9jdXNlZE9wdGlvbklkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25DbGVhckZpbHRlckJ1dHRvbktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jbGVhcl9maWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrSWNvbkNsYXNzXT1cImNoZWNrSWNvbkNsYXNzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cEFubm91bmNlbWVudF09XCJncm91cEFubm91bmNlbWVudEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3NpbnNldF09XCJvcHRpb25Qb3NpbnNldEZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZXRzaXplXT1cIm9wdGlvblNldHNpemVGb3Iob3B0aW9uLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zKCk7IHRyYWNrIG9wdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJnZXRPcHRpb25MYWJlbChvcHRpb24uZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJjaGVja21hcmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tJY29uQ2xhc3NdPVwiY2hlY2tJY29uQ2xhc3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInNlbGVjdEl0ZW0ob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNHcm91cGVyXT1cIm9wdGlvbi5ncm91cGVyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0ZvY3VzZWRdPVwib3B0aW9uLmRhdGEgPT09IGZvY3VzZWRJdGVtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwQW5ub3VuY2VtZW50XT1cImdyb3VwQW5ub3VuY2VtZW50Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Bvc2luc2V0XT1cIm9wdGlvblBvc2luc2V0Rm9yKG9wdGlvbi5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NldHNpemVdPVwib3B0aW9uU2V0c2l6ZUZvcihvcHRpb24uaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj5cbiAgICAgICAgICAgICAgICB7eyBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==