@wavemaker/app-ng-runtime 12.0.0-next.45752 → 12.0.0-next.46502

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +53 -45
  2. app-ng-runtime/build-task/esm2022/basic/default/anchor/anchor.build.mjs +2 -2
  3. app-ng-runtime/build-task/esm2022/basic/default/html/html.build.mjs +2 -2
  4. app-ng-runtime/build-task/esm2022/basic/default/icon/icon.build.mjs +2 -2
  5. app-ng-runtime/build-task/esm2022/basic/default/label/label.build.mjs +2 -2
  6. app-ng-runtime/build-task/esm2022/basic/default/picture/picture.build.mjs +2 -2
  7. app-ng-runtime/build-task/esm2022/basic/default/spinner/spinner.build.mjs +2 -2
  8. app-ng-runtime/build-task/esm2022/basic/progress/progress-circle/progress-circle.build.mjs +7 -2
  9. app-ng-runtime/build-task/esm2022/basic/rich-text-editor/rich-text-editor.build.mjs +2 -2
  10. app-ng-runtime/build-task/esm2022/containers/accordion/accordion-pane/accordion-pane.build.mjs +2 -2
  11. app-ng-runtime/build-task/esm2022/containers/accordion/accordion.build.mjs +3 -3
  12. app-ng-runtime/build-task/esm2022/containers/tile/tile.build.mjs +2 -2
  13. app-ng-runtime/build-task/esm2022/containers/wizard/wizard.build.mjs +2 -2
  14. app-ng-runtime/build-task/esm2022/data/form/form-field/form-field.build.mjs +4 -4
  15. app-ng-runtime/build-task/esm2022/device/barcode-scanner/barcode-scanner.build.mjs +2 -2
  16. app-ng-runtime/build-task/esm2022/device/camera/camera.build.mjs +2 -2
  17. app-ng-runtime/build-task/esm2022/dialogs/alert-dialog/alert-dialog.build.mjs +2 -2
  18. app-ng-runtime/build-task/esm2022/input/calendar/calendar.build.mjs +2 -2
  19. app-ng-runtime/build-task/esm2022/input/chips/chips.build.mjs +2 -2
  20. app-ng-runtime/build-task/esm2022/input/color-picker/color-picker.build.mjs +3 -3
  21. app-ng-runtime/build-task/esm2022/input/currency/currency.build.mjs +3 -3
  22. app-ng-runtime/build-task/esm2022/input/default/button/button.build.mjs +2 -2
  23. app-ng-runtime/build-task/esm2022/input/default/button-group/button-group.build.mjs +2 -2
  24. app-ng-runtime/build-task/esm2022/input/default/switch/switch.build.mjs +2 -2
  25. app-ng-runtime/build-task/esm2022/input/file-upload/file-upload.build.mjs +6 -2
  26. app-ng-runtime/build-task/esm2022/page/footer/footer.build.mjs +2 -2
  27. app-ng-runtime/build-task/esm2022/page/header/header.build.mjs +2 -2
  28. app-ng-runtime/build-task/esm2022/page/layout.build.mjs +2 -2
  29. app-ng-runtime/build-task/esm2022/page/left-panel/left-panel.build.mjs +2 -2
  30. app-ng-runtime/build-task/esm2022/page/page.build.mjs +2 -2
  31. app-ng-runtime/build-task/esm2022/page/right-panel/right-panel.build.mjs +2 -2
  32. app-ng-runtime/build-task/esm2022/page/top-nav/top-nav.build.mjs +2 -2
  33. app-ng-runtime/build-task/fesm2022/index.mjs +53 -45
  34. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  35. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +1 -1
  36. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +2 -2
  37. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +1 -1
  38. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  39. app-ng-runtime/components/base/bundles/index.umd.js +1 -6
  40. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +3 -3
  41. app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +1 -6
  42. app-ng-runtime/components/base/fesm2022/index.mjs +1 -6
  43. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  44. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  45. app-ng-runtime/components/basic/default/anchor/anchor.component.d.ts +1 -0
  46. app-ng-runtime/components/basic/default/audio/audio.component.d.ts +3 -0
  47. app-ng-runtime/components/basic/default/bundles/index.umd.js +39 -19
  48. app-ng-runtime/components/basic/default/esm2022/anchor/anchor.component.mjs +4 -4
  49. app-ng-runtime/components/basic/default/esm2022/anchor/anchor.props.mjs +2 -1
  50. app-ng-runtime/components/basic/default/esm2022/audio/audio.component.mjs +14 -6
  51. app-ng-runtime/components/basic/default/esm2022/audio/audio.props.mjs +2 -1
  52. app-ng-runtime/components/basic/default/esm2022/html/html.props.mjs +2 -1
  53. app-ng-runtime/components/basic/default/esm2022/icon/icon.component.mjs +6 -7
  54. app-ng-runtime/components/basic/default/esm2022/icon/icon.props.mjs +2 -1
  55. app-ng-runtime/components/basic/default/esm2022/iframe/iframe.component.mjs +3 -3
  56. app-ng-runtime/components/basic/default/esm2022/iframe/iframe.props.mjs +3 -2
  57. app-ng-runtime/components/basic/default/esm2022/label/label.props.mjs +1 -1
  58. app-ng-runtime/components/basic/default/esm2022/picture/picture.directive.mjs +2 -2
  59. app-ng-runtime/components/basic/default/esm2022/picture/picture.props.mjs +3 -1
  60. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.props.mjs +3 -2
  61. app-ng-runtime/components/basic/default/esm2022/video/video.component.mjs +8 -4
  62. app-ng-runtime/components/basic/default/esm2022/video/video.props.mjs +2 -1
  63. app-ng-runtime/components/basic/default/fesm2022/index.mjs +39 -19
  64. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  65. app-ng-runtime/components/basic/default/icon/icon.component.d.ts +1 -0
  66. app-ng-runtime/components/basic/default/iframe/iframe.component.d.ts +1 -0
  67. app-ng-runtime/components/basic/default/picture/picture.directive.d.ts +2 -1
  68. app-ng-runtime/components/basic/default/video/video.component.d.ts +2 -0
  69. app-ng-runtime/components/basic/progress/bundles/index.umd.js +17 -9
  70. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +9 -5
  71. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.props.mjs +2 -1
  72. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +8 -6
  73. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.props.mjs +2 -1
  74. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +17 -9
  75. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  76. app-ng-runtime/components/basic/progress/progress-bar/progress-bar.component.d.ts +2 -0
  77. app-ng-runtime/components/basic/progress/progress-circle/progress-circle.component.d.ts +3 -1
  78. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +2 -0
  79. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +2 -1
  80. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.props.mjs +2 -1
  81. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +2 -0
  82. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  83. app-ng-runtime/components/basic/search/bundles/index.umd.js +16 -9
  84. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +19 -13
  85. app-ng-runtime/components/basic/search/esm2022/search.props.mjs +2 -1
  86. app-ng-runtime/components/basic/search/fesm2022/index.mjs +16 -9
  87. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  88. app-ng-runtime/components/basic/search/search.component.d.ts +4 -2
  89. app-ng-runtime/components/chart/bundles/index.umd.js +1 -0
  90. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +2 -1
  91. app-ng-runtime/components/chart/fesm2022/index.mjs +1 -0
  92. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  93. app-ng-runtime/components/containers/accordion/accordion-pane/accordion-pane.component.d.ts +1 -0
  94. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +15 -9
  95. app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.component.mjs +13 -10
  96. app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +4 -1
  97. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +15 -9
  98. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  99. app-ng-runtime/components/containers/panel/bundles/index.umd.js +14 -14
  100. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +15 -15
  101. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +14 -14
  102. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  103. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +2 -2
  104. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +3 -3
  105. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +2 -2
  106. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  107. app-ng-runtime/components/containers/wizard/bundles/index.umd.js +6 -6
  108. app-ng-runtime/components/containers/wizard/esm2022/wizard.component.mjs +7 -7
  109. app-ng-runtime/components/containers/wizard/fesm2022/index.mjs +6 -6
  110. app-ng-runtime/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  111. app-ng-runtime/components/data/list/bundles/index.umd.js +19 -11
  112. app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +10 -1
  113. app-ng-runtime/components/data/list/esm2022/list.component.mjs +12 -12
  114. app-ng-runtime/components/data/list/fesm2022/index.mjs +20 -12
  115. app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
  116. app-ng-runtime/components/data/live-table/bundles/index.umd.js +2 -2
  117. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +3 -3
  118. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +2 -2
  119. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  120. app-ng-runtime/components/data/pagination/bundles/index.umd.js +2 -0
  121. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +3 -1
  122. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +2 -0
  123. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  124. app-ng-runtime/components/data/table/bundles/index.umd.js +42 -8
  125. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +14 -5
  126. app-ng-runtime/components/data/table/esm2022/table.component.mjs +28 -5
  127. app-ng-runtime/components/data/table/esm2022/table.props.mjs +3 -1
  128. app-ng-runtime/components/data/table/fesm2022/index.mjs +43 -9
  129. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  130. app-ng-runtime/components/data/table/table.component.d.ts +7 -0
  131. app-ng-runtime/components/dialogs/alert-dialog/bundles/index.umd.js +6 -4
  132. app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.component.mjs +7 -5
  133. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs +6 -4
  134. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs.map +1 -1
  135. app-ng-runtime/components/dialogs/confirm-dialog/bundles/index.umd.js +8 -5
  136. app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.component.mjs +9 -6
  137. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs +8 -5
  138. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs.map +1 -1
  139. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +9 -3
  140. app-ng-runtime/components/dialogs/default/dialog-header/dialog-header.component.d.ts +2 -1
  141. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +2 -1
  142. app-ng-runtime/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +9 -4
  143. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +9 -3
  144. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  145. app-ng-runtime/components/dialogs/design-dialog/bundles/index.umd.js +4 -4
  146. app-ng-runtime/components/dialogs/design-dialog/esm2022/dialog.component.mjs +5 -5
  147. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs +4 -4
  148. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
  149. app-ng-runtime/components/dialogs/iframe-dialog/bundles/index.umd.js +9 -5
  150. app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +10 -6
  151. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs +9 -5
  152. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
  153. app-ng-runtime/components/dialogs/partial-dialog/bundles/index.umd.js +9 -5
  154. app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +10 -6
  155. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs +9 -5
  156. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
  157. app-ng-runtime/components/input/calendar/bundles/index.umd.js +2 -4
  158. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +3 -5
  159. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +2 -4
  160. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  161. app-ng-runtime/components/input/chips/bundles/index.umd.js +25 -7
  162. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +25 -8
  163. app-ng-runtime/components/input/chips/esm2022/chips.props.mjs +2 -1
  164. app-ng-runtime/components/input/chips/fesm2022/index.mjs +25 -7
  165. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  166. app-ng-runtime/components/input/color-picker/bundles/index.umd.js +5 -3
  167. app-ng-runtime/components/input/color-picker/color-picker.component.d.ts +1 -0
  168. app-ng-runtime/components/input/color-picker/esm2022/color-picker.component.mjs +6 -5
  169. app-ng-runtime/components/input/color-picker/esm2022/color-picker.props.mjs +2 -1
  170. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs +5 -3
  171. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs.map +1 -1
  172. app-ng-runtime/components/input/currency/bundles/index.umd.js +4 -3
  173. app-ng-runtime/components/input/currency/currency.component.d.ts +1 -0
  174. app-ng-runtime/components/input/currency/esm2022/currency.component.mjs +6 -6
  175. app-ng-runtime/components/input/currency/esm2022/currency.props.mjs +2 -1
  176. app-ng-runtime/components/input/currency/fesm2022/index.mjs +4 -3
  177. app-ng-runtime/components/input/currency/fesm2022/index.mjs.map +1 -1
  178. app-ng-runtime/components/input/default/bundles/index.umd.js +171 -94
  179. app-ng-runtime/components/input/default/button/button.component.d.ts +1 -0
  180. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +1 -0
  181. app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +3 -3
  182. app-ng-runtime/components/input/default/esm2022/button/button.component.mjs +1 -1
  183. app-ng-runtime/components/input/default/esm2022/button/button.props.mjs +2 -1
  184. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +8 -7
  185. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +7 -7
  186. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.props.mjs +2 -1
  187. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +21 -16
  188. app-ng-runtime/components/input/default/esm2022/number/number.component.mjs +5 -5
  189. app-ng-runtime/components/input/default/esm2022/number/number.props.mjs +3 -1
  190. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +28 -23
  191. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +7 -7
  192. app-ng-runtime/components/input/default/esm2022/select/select.props.mjs +2 -1
  193. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +6 -5
  194. app-ng-runtime/components/input/default/esm2022/switch/switch.props.mjs +2 -1
  195. app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.component.mjs +5 -5
  196. app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.props.mjs +2 -1
  197. app-ng-runtime/components/input/default/esm2022/text/color/input-color.component.mjs +5 -5
  198. app-ng-runtime/components/input/default/esm2022/text/color/input-color.props.mjs +2 -1
  199. app-ng-runtime/components/input/default/esm2022/text/email/input-email.component.mjs +5 -5
  200. app-ng-runtime/components/input/default/esm2022/text/email/input-email.props.mjs +2 -1
  201. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +66 -13
  202. app-ng-runtime/components/input/default/esm2022/text/number/input-number.component.mjs +5 -5
  203. app-ng-runtime/components/input/default/esm2022/text/number/input-number.props.mjs +2 -1
  204. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +5 -5
  205. app-ng-runtime/components/input/default/esm2022/text/text/input-text.props.mjs +2 -1
  206. app-ng-runtime/components/input/default/esm2022/textarea/textarea.component.mjs +6 -6
  207. app-ng-runtime/components/input/default/esm2022/textarea/textarea.props.mjs +2 -1
  208. app-ng-runtime/components/input/default/fesm2022/index.mjs +171 -94
  209. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  210. app-ng-runtime/components/input/default/number/number.component.d.ts +1 -0
  211. app-ng-runtime/components/input/default/select/select.component.d.ts +2 -0
  212. app-ng-runtime/components/input/default/text/calendar/input-calendar.component.d.ts +1 -0
  213. app-ng-runtime/components/input/default/text/color/input-color.component.d.ts +1 -0
  214. app-ng-runtime/components/input/default/text/email/input-email.component.d.ts +1 -0
  215. app-ng-runtime/components/input/default/text/locale/number-locale.d.ts +1 -0
  216. app-ng-runtime/components/input/default/text/number/input-number.component.d.ts +1 -0
  217. app-ng-runtime/components/input/default/text/text/input-text.component.d.ts +1 -0
  218. app-ng-runtime/components/input/default/textarea/textarea.component.d.ts +1 -0
  219. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +2 -1
  220. app-ng-runtime/components/input/epoch/bundles/index.umd.js +28 -21
  221. app-ng-runtime/components/input/epoch/date/date.component.d.ts +1 -0
  222. app-ng-runtime/components/input/epoch/date-time/date-time.component.d.ts +2 -1
  223. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +10 -6
  224. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +8 -8
  225. app-ng-runtime/components/input/epoch/esm2022/date/date.props.mjs +2 -1
  226. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +9 -9
  227. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.props.mjs +2 -1
  228. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +7 -7
  229. app-ng-runtime/components/input/epoch/esm2022/time/time.props.mjs +2 -1
  230. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +25 -18
  231. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  232. app-ng-runtime/components/input/epoch/time/time.component.d.ts +1 -0
  233. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +224 -121
  234. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +220 -123
  235. app-ng-runtime/components/input/file-upload/esm2022/file-upload.props.mjs +7 -1
  236. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +225 -122
  237. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  238. app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +18 -11
  239. app-ng-runtime/components/input/rating/bundles/index.umd.js +2 -2
  240. app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +3 -3
  241. app-ng-runtime/components/input/rating/fesm2022/index.mjs +2 -2
  242. app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
  243. app-ng-runtime/components/input/slider/bundles/index.umd.js +5 -6
  244. app-ng-runtime/components/input/slider/esm2022/slider.component.mjs +6 -8
  245. app-ng-runtime/components/input/slider/esm2022/slider.props.mjs +2 -1
  246. app-ng-runtime/components/input/slider/fesm2022/index.mjs +5 -6
  247. app-ng-runtime/components/input/slider/fesm2022/index.mjs.map +1 -1
  248. app-ng-runtime/components/input/slider/slider.component.d.ts +1 -0
  249. app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +6 -6
  250. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +7 -7
  251. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +6 -6
  252. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  253. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +8 -6
  254. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +8 -7
  255. app-ng-runtime/components/navigation/menu/esm2022/menu.props.mjs +2 -1
  256. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +8 -6
  257. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  258. app-ng-runtime/components/navigation/menu/menu.component.d.ts +1 -0
  259. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +121 -13
  260. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +122 -15
  261. app-ng-runtime/components/navigation/popover/esm2022/popover.props.mjs +2 -1
  262. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +121 -13
  263. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  264. app-ng-runtime/components/navigation/popover/popover.component.d.ts +15 -3
  265. app-ng-runtime/components/page/default/bundles/index.umd.js +2 -1
  266. app-ng-runtime/components/page/default/esm2022/page.props.mjs +4 -3
  267. app-ng-runtime/components/page/default/fesm2022/index.mjs +2 -1
  268. app-ng-runtime/components/page/default/fesm2022/index.mjs.map +1 -1
  269. app-ng-runtime/components/page/footer/bundles/index.umd.js +2 -1
  270. app-ng-runtime/components/page/footer/esm2022/footer.props.mjs +3 -2
  271. app-ng-runtime/components/page/footer/fesm2022/index.mjs +2 -1
  272. app-ng-runtime/components/page/footer/fesm2022/index.mjs.map +1 -1
  273. app-ng-runtime/components/page/header/bundles/index.umd.js +2 -1
  274. app-ng-runtime/components/page/header/esm2022/header.props.mjs +3 -2
  275. app-ng-runtime/components/page/header/fesm2022/index.mjs +2 -1
  276. app-ng-runtime/components/page/header/fesm2022/index.mjs.map +1 -1
  277. app-ng-runtime/components/page/left-panel/bundles/index.umd.js +2 -1
  278. app-ng-runtime/components/page/left-panel/esm2022/left-panel.props.mjs +3 -2
  279. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs +2 -1
  280. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs.map +1 -1
  281. app-ng-runtime/components/page/right-panel/bundles/index.umd.js +2 -1
  282. app-ng-runtime/components/page/right-panel/esm2022/right-panel.props.mjs +3 -2
  283. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs +2 -1
  284. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs.map +1 -1
  285. app-ng-runtime/components/page/top-nav/bundles/index.umd.js +2 -1
  286. app-ng-runtime/components/page/top-nav/esm2022/top-nav.props.mjs +3 -2
  287. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs +2 -1
  288. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs.map +1 -1
  289. app-ng-runtime/core/bundles/index.umd.js +15 -13
  290. app-ng-runtime/core/esm2022/public_api.mjs +2 -2
  291. app-ng-runtime/core/esm2022/utils/build-utils.mjs +7 -7
  292. app-ng-runtime/core/esm2022/utils/utils.mjs +4 -5
  293. app-ng-runtime/core/fesm2022/index.mjs +11 -11
  294. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  295. app-ng-runtime/core/public_api.d.ts +1 -1
  296. app-ng-runtime/core/utils/utils.d.ts +1 -1
  297. app-ng-runtime/mobile/components/device/barcode-scanner/bundles/index.umd.js +2 -1
  298. app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.props.mjs +3 -2
  299. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs +2 -1
  300. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs.map +1 -1
  301. app-ng-runtime/mobile/components/device/camera/bundles/index.umd.js +2 -1
  302. app-ng-runtime/mobile/components/device/camera/esm2022/camera.props.mjs +3 -2
  303. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs +2 -1
  304. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs.map +1 -1
  305. app-ng-runtime/package.json +1 -1
  306. app-ng-runtime/runtime/base/bundles/index.umd.js +6 -4
  307. app-ng-runtime/runtime/base/components/app-component/app.component.d.ts +2 -3
  308. app-ng-runtime/runtime/base/esm2022/components/app-component/app.component.mjs +5 -5
  309. app-ng-runtime/runtime/base/esm2022/guards/can-deactivate-page.guard.mjs +5 -4
  310. app-ng-runtime/runtime/base/fesm2022/index.mjs +6 -4
  311. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  312. app-ng-runtime/runtime/base/guards/can-deactivate-page.guard.d.ts +2 -1
  313. app-ng-runtime/scripts/datatable/datatable.js +32 -31
  314. app-ng-runtime/variables/bundles/index.umd.js +34 -16
  315. app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +35 -17
  316. app-ng-runtime/variables/fesm2022/index.mjs +34 -16
  317. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  318. app-ng-runtime/variables/manager/variable/web-socket-variable.manager.d.ts +0 -4
@@ -1,6 +1,6 @@
1
1
  import { Attribute, Component, Inject, Injector, Optional } from '@angular/core';
2
2
  import { Subject } from 'rxjs';
3
- import { App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile } from '@wm/core';
3
+ import { App, DataSource, getWmProjectProperties, isAudioFile, isImageFile, isVideoFile, AbstractDialogService, IDGenerator } from '@wm/core';
4
4
  import { provideAsWidgetRef, StylableComponent, styler } from '@wm/components/base';
5
5
  import { registerProps } from './file-upload.props';
6
6
  import { forEach, includes, isEmpty, toLower } from "lodash-es";
@@ -14,7 +14,7 @@ const _c2 = (a0, a1) => ({ height: a0, overflow: a1 });
14
14
  const _c3 = a0 => ({ width: a0 });
15
15
  function FileUploadComponent_div_1_input_6_Template(rf, ctx) { if (rf & 1) {
16
16
  const _r3 = i0.ɵɵgetCurrentView();
17
- i0.ɵɵelementStart(0, "input", 13);
17
+ i0.ɵɵelementStart(0, "input", 15);
18
18
  i0.ɵɵlistener("click", function FileUploadComponent_div_1_input_6_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_1_input_6_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
19
19
  i0.ɵɵelementEnd();
20
20
  } if (rf & 2) {
@@ -22,6 +22,23 @@ function FileUploadComponent_div_1_input_6_Template(rf, ctx) { if (rf & 1) {
22
22
  i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
23
23
  i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
24
24
  } }
25
+ function FileUploadComponent_div_1_label_9_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelement(0, "label", 16);
27
+ } if (rf & 2) {
28
+ const ctx_r1 = i0.ɵɵnextContext(2);
29
+ i0.ɵɵproperty("innerHtml", ctx_r1.chooseFilter + " only ", i0.ɵɵsanitizeHtml);
30
+ } }
31
+ function FileUploadComponent_div_1_span_10_Template(rf, ctx) { if (rf & 1) {
32
+ i0.ɵɵelementStart(0, "span", 17);
33
+ i0.ɵɵtext(1, " . ");
34
+ i0.ɵɵelementEnd();
35
+ } }
36
+ function FileUploadComponent_div_1_label_11_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelement(0, "label", 16);
38
+ } if (rf & 2) {
39
+ const ctx_r1 = i0.ɵɵnextContext(2);
40
+ i0.ɵɵproperty("innerHtml", ctx_r1.maxfilesize + "MB max", i0.ɵɵsanitizeHtml);
41
+ } }
25
42
  function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
26
43
  const _r1 = i0.ɵɵgetCurrentView();
27
44
  i0.ɵɵelementStart(0, "div", 6)(1, "div", 7);
@@ -33,11 +50,13 @@ function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
33
50
  i0.ɵɵtemplate(6, FileUploadComponent_div_1_input_6_Template, 1, 3, "input", 11);
34
51
  i0.ɵɵelementStart(7, "a", 12);
35
52
  i0.ɵɵtext(8);
36
- i0.ɵɵelementEnd()()()()();
53
+ i0.ɵɵelementEnd()();
54
+ i0.ɵɵtemplate(9, FileUploadComponent_div_1_label_9_Template, 1, 1, "label", 13)(10, FileUploadComponent_div_1_span_10_Template, 2, 0, "span", 14)(11, FileUploadComponent_div_1_label_11_Template, 1, 1, "label", 13);
55
+ i0.ɵɵelementEnd()()();
37
56
  } if (rf & 2) {
38
57
  const ctx_r1 = i0.ɵɵnextContext();
39
58
  i0.ɵɵadvance();
40
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(8, _c1, ctx_r1.highlightDropArea));
59
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c1, ctx_r1.highlightDropArea));
41
60
  i0.ɵɵadvance();
42
61
  i0.ɵɵclassMap(ctx_r1.iconclass);
43
62
  i0.ɵɵadvance(2);
@@ -48,34 +67,40 @@ function FileUploadComponent_div_1_Template(rf, ctx) { if (rf & 1) {
48
67
  i0.ɵɵproperty("ngIf", ctx_r1.multiple);
49
68
  i0.ɵɵadvance(2);
50
69
  i0.ɵɵtextInterpolate(ctx_r1.fileUploadMessage);
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵproperty("ngIf", ctx_r1.chooseFilter);
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵproperty("ngIf", ctx_r1.chooseFilter && ctx_r1.maxfilesize);
74
+ i0.ɵɵadvance();
75
+ i0.ɵɵproperty("ngIf", ctx_r1.maxfilesize);
51
76
  } }
52
77
  function FileUploadComponent_div_2_input_3_Template(rf, ctx) { if (rf & 1) {
53
78
  const _r4 = i0.ɵɵgetCurrentView();
54
- i0.ɵɵelementStart(0, "input", 13);
55
- i0.ɵɵlistener("click", function FileUploadComponent_div_2_input_3_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_2_input_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
79
+ i0.ɵɵelementStart(0, "input", 26);
80
+ i0.ɵɵlistener("change", function FileUploadComponent_div_2_input_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); })("click", function FileUploadComponent_div_2_input_3_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); });
56
81
  i0.ɵɵelementEnd();
57
82
  } if (rf & 2) {
58
83
  const ctx_r1 = i0.ɵɵnextContext(2);
59
- i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
60
- i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
84
+ i0.ɵɵproperty("accept", ctx_r1.chooseFilter)("disabled", ctx_r1.disabled);
85
+ i0.ɵɵattribute("aria-label", ctx_r1.arialabel || "File selection field");
61
86
  } }
62
87
  function FileUploadComponent_div_2_input_4_Template(rf, ctx) { if (rf & 1) {
63
88
  const _r5 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "input", 21);
65
- i0.ɵɵlistener("click", function FileUploadComponent_div_2_input_4_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); })("change", function FileUploadComponent_div_2_input_4_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); });
89
+ i0.ɵɵelementStart(0, "input", 27);
90
+ i0.ɵɵlistener("change", function FileUploadComponent_div_2_input_4_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileSelect($event, $event.target.files)); })("click", function FileUploadComponent_div_2_input_4_Template_input_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileElemClick($event)); });
66
91
  i0.ɵɵelementEnd();
67
92
  } if (rf & 2) {
68
93
  const ctx_r1 = i0.ɵɵnextContext(2);
69
- i0.ɵɵproperty("disabled", ctx_r1.disabled)("accept", ctx_r1.chooseFilter);
70
- i0.ɵɵattribute("aria-label", ctx_r1.hint || "File selection field");
94
+ i0.ɵɵproperty("accept", ctx_r1.chooseFilter)("disabled", ctx_r1.disabled);
95
+ i0.ɵɵattribute("aria-label", ctx_r1.arialabel || "File selection field");
71
96
  } }
72
97
  function FileUploadComponent_div_2_Template(rf, ctx) { if (rf & 1) {
73
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 15)(2, "form", 10);
74
- i0.ɵɵtemplate(3, FileUploadComponent_div_2_input_3_Template, 1, 3, "input", 11)(4, FileUploadComponent_div_2_input_4_Template, 1, 3, "input", 16);
75
- i0.ɵɵelementStart(5, "button", 17);
76
- i0.ɵɵelement(6, "i", 18)(7, "span", 19);
98
+ i0.ɵɵelementStart(0, "div", 18)(1, "div", 19)(2, "form", 10);
99
+ i0.ɵɵtemplate(3, FileUploadComponent_div_2_input_3_Template, 1, 3, "input", 20)(4, FileUploadComponent_div_2_input_4_Template, 1, 3, "input", 21);
100
+ i0.ɵɵelementStart(5, "button", 22);
101
+ i0.ɵɵelement(6, "i", 23)(7, "span", 24);
77
102
  i0.ɵɵelementEnd()()();
78
- i0.ɵɵelement(8, "div", 20);
103
+ i0.ɵɵelement(8, "div", 25);
79
104
  i0.ɵɵelementEnd();
80
105
  } if (rf & 2) {
81
106
  const ctx_r1 = i0.ɵɵnextContext();
@@ -94,9 +119,9 @@ function FileUploadComponent_div_2_Template(rf, ctx) { if (rf & 1) {
94
119
  } }
95
120
  function FileUploadComponent_button_3_Template(rf, ctx) { if (rf & 1) {
96
121
  const _r6 = i0.ɵɵgetCurrentView();
97
- i0.ɵɵelementStart(0, "button", 22);
122
+ i0.ɵɵelementStart(0, "button", 28);
98
123
  i0.ɵɵlistener("click", function FileUploadComponent_button_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openFileSelector()); });
99
- i0.ɵɵelement(1, "i")(2, "span", 19);
124
+ i0.ɵɵelement(1, "i")(2, "span", 24);
100
125
  i0.ɵɵelementEnd();
101
126
  } if (rf & 2) {
102
127
  const ctx_r1 = i0.ɵɵnextContext();
@@ -106,8 +131,15 @@ function FileUploadComponent_button_3_Template(rf, ctx) { if (rf & 1) {
106
131
  i0.ɵɵadvance();
107
132
  i0.ɵɵproperty("innerHTML", ctx_r1.caption, i0.ɵɵsanitizeHtml);
108
133
  } }
109
- function FileUploadComponent_ul_4_div_1_li_1_span_9_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelementStart(0, "span", 36);
134
+ function FileUploadComponent_ul_4_ng_container_1_li_1_span_8_Template(rf, ctx) { if (rf & 1) {
135
+ i0.ɵɵelement(0, "span");
136
+ i0.ɵɵpipe(1, "stateClass");
137
+ } if (rf & 2) {
138
+ const ft_r7 = i0.ɵɵnextContext(2).$implicit;
139
+ i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(1, 3, ft_r7.status), "");
140
+ } }
141
+ function FileUploadComponent_ul_4_ng_container_1_li_1_span_10_Template(rf, ctx) { if (rf & 1) {
142
+ i0.ɵɵelementStart(0, "span", 47);
111
143
  i0.ɵɵtext(1);
112
144
  i0.ɵɵpipe(2, "filesize");
113
145
  i0.ɵɵelementEnd();
@@ -116,130 +148,152 @@ function FileUploadComponent_ul_4_div_1_li_1_span_9_Template(rf, ctx) { if (rf &
116
148
  i0.ɵɵadvance();
117
149
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ft_r7.size, 0));
118
150
  } }
119
- function FileUploadComponent_ul_4_div_1_li_1_div_10_Template(rf, ctx) { if (rf & 1) {
120
- i0.ɵɵelementStart(0, "div", 37);
121
- i0.ɵɵelement(1, "div", 38);
151
+ function FileUploadComponent_ul_4_ng_container_1_li_1_span_11_Template(rf, ctx) { if (rf & 1) {
152
+ i0.ɵɵelement(0, "span", 34);
153
+ i0.ɵɵpipe(1, "stateClass");
154
+ } if (rf & 2) {
155
+ const ft_r7 = i0.ɵɵnextContext(2).$implicit;
156
+ const ctx_r1 = i0.ɵɵnextContext(2);
157
+ i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(1, 4, ft_r7.status), "");
158
+ i0.ɵɵpropertyInterpolate("title", ft_r7.errMsg || ctx_r1.appLocale.MESSAGE_FILE_UPLOAD_FAILED);
159
+ } }
160
+ function FileUploadComponent_ul_4_ng_container_1_li_1_span_12_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "span", 48);
162
+ i0.ɵɵtext(1, "Upload Failed");
163
+ i0.ɵɵelementEnd();
164
+ } }
165
+ function FileUploadComponent_ul_4_ng_container_1_li_1_div_13_Template(rf, ctx) { if (rf & 1) {
166
+ i0.ɵɵelementStart(0, "div", 49);
167
+ i0.ɵɵelement(1, "div", 50);
122
168
  i0.ɵɵelementEnd();
123
169
  } if (rf & 2) {
124
170
  const ft_r7 = i0.ɵɵnextContext(2).$implicit;
125
171
  i0.ɵɵadvance();
126
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(1, _c3, ft_r7.progress + "%"));
172
+ i0.ɵɵproperty("ngClass", ft_r7.status === "error" ? "progress-bar-danger" : "progress-bar-info")("ngStyle", i0.ɵɵpureFunction1(2, _c3, ft_r7.progress + "%"));
127
173
  } }
128
- function FileUploadComponent_ul_4_div_1_li_1_div_11_Template(rf, ctx) { if (rf & 1) {
129
- const _r8 = i0.ɵɵgetCurrentView();
130
- i0.ɵɵelementStart(0, "div", 39)(1, "a", 40);
131
- i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_11_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r8); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.abortFileUpload(ft_r7)); });
132
- i0.ɵɵelement(2, "i", 41);
133
- i0.ɵɵelementEnd()();
134
- } }
135
- function FileUploadComponent_ul_4_div_1_li_1_div_12_Template(rf, ctx) { if (rf & 1) {
136
- i0.ɵɵelementStart(0, "div", 39);
137
- i0.ɵɵelement(1, "span");
138
- i0.ɵɵpipe(2, "stateClass");
174
+ function FileUploadComponent_ul_4_ng_container_1_li_1_div_14_Template(rf, ctx) { if (rf & 1) {
175
+ i0.ɵɵelementStart(0, "div", 51);
176
+ i0.ɵɵtext(1);
139
177
  i0.ɵɵelementEnd();
140
178
  } if (rf & 2) {
141
179
  const ft_r7 = i0.ɵɵnextContext(2).$implicit;
142
180
  i0.ɵɵadvance();
143
- i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(2, 3, ft_r7.status), "");
181
+ i0.ɵɵtextInterpolate1("", ft_r7.progress + "%", " ");
144
182
  } }
145
- function FileUploadComponent_ul_4_div_1_li_1_div_13_Template(rf, ctx) { if (rf & 1) {
146
- const _r9 = i0.ɵɵgetCurrentView();
147
- i0.ɵɵelementStart(0, "div", 39)(1, "a", 42);
148
- i0.ɵɵlistener("click", function FileUploadComponent_ul_4_div_1_li_1_div_13_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r9); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clear(ft_r7)); });
149
- i0.ɵɵelement(2, "i");
183
+ function FileUploadComponent_ul_4_ng_container_1_li_1_div_15_Template(rf, ctx) { if (rf & 1) {
184
+ const _r8 = i0.ɵɵgetCurrentView();
185
+ i0.ɵɵelementStart(0, "div", 45)(1, "a", 52);
186
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_ng_container_1_li_1_div_15_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r8); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.abortFileUpload(ft_r7)); });
187
+ i0.ɵɵelement(2, "i", 53);
150
188
  i0.ɵɵelementEnd()();
189
+ } }
190
+ function FileUploadComponent_ul_4_ng_container_1_li_1_a_17_Template(rf, ctx) { if (rf & 1) {
191
+ const _r9 = i0.ɵɵgetCurrentView();
192
+ i0.ɵɵelementStart(0, "a", 54);
193
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_ng_container_1_li_1_a_17_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r9); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clear(ft_r7)); });
194
+ i0.ɵɵelement(1, "i");
195
+ i0.ɵɵelementEnd();
151
196
  } if (rf & 2) {
152
197
  const ctx_r1 = i0.ɵɵnextContext(4);
153
- i0.ɵɵadvance();
154
198
  i0.ɵɵpropertyInterpolate("title", ctx_r1.cleariconhint);
155
199
  i0.ɵɵadvance();
156
200
  i0.ɵɵclassMap(ctx_r1.cleariconclass);
157
201
  } }
158
- function FileUploadComponent_ul_4_div_1_li_1_div_14_Template(rf, ctx) { if (rf & 1) {
159
- i0.ɵɵelementStart(0, "div", 43);
160
- i0.ɵɵelement(1, "span");
161
- i0.ɵɵpipe(2, "stateClass");
162
- i0.ɵɵelementEnd();
202
+ function FileUploadComponent_ul_4_ng_container_1_li_1_div_18_Template(rf, ctx) { if (rf & 1) {
203
+ const _r10 = i0.ɵɵgetCurrentView();
204
+ i0.ɵɵelementStart(0, "div", 45)(1, "a", 54);
205
+ i0.ɵɵlistener("click", function FileUploadComponent_ul_4_ng_container_1_li_1_div_18_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r10); const ft_r7 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onFileDelete($event, ft_r7)); });
206
+ i0.ɵɵelement(2, "i", 55);
207
+ i0.ɵɵelementEnd()();
163
208
  } if (rf & 2) {
164
- const ft_r7 = i0.ɵɵnextContext(2).$implicit;
165
- const ctx_r1 = i0.ɵɵnextContext(2);
166
- i0.ɵɵpropertyInterpolate("title", ft_r7.errMsg || ctx_r1.appLocale.MESSAGE_FILE_UPLOAD_FAILED);
209
+ const ctx_r1 = i0.ɵɵnextContext(4);
167
210
  i0.ɵɵadvance();
168
- i0.ɵɵclassMapInterpolate1("status-icon ", i0.ɵɵpipeBind1(2, 4, ft_r7.status), "");
211
+ i0.ɵɵpropertyInterpolate("title", ctx_r1.deleteiconhint);
169
212
  } }
170
- function FileUploadComponent_ul_4_div_1_li_1_Template(rf, ctx) { if (rf & 1) {
171
- i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
172
- i0.ɵɵelement(2, "div", 28);
213
+ function FileUploadComponent_ul_4_ng_container_1_li_1_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "li", 32)(1, "div", 33);
215
+ i0.ɵɵelement(2, "div", 34);
173
216
  i0.ɵɵpipe(3, "fileIconClass");
174
- i0.ɵɵelementStart(4, "div", 29)(5, "p", 30)(6, "label", 31);
217
+ i0.ɵɵelementStart(4, "div", 35)(5, "p", 36)(6, "span", 37);
175
218
  i0.ɵɵtext(7);
176
219
  i0.ɵɵelementEnd();
177
- i0.ɵɵelement(8, "br");
178
- i0.ɵɵtemplate(9, FileUploadComponent_ul_4_div_1_li_1_span_9_Template, 3, 4, "span", 32);
220
+ i0.ɵɵtemplate(8, FileUploadComponent_ul_4_ng_container_1_li_1_span_8_Template, 2, 5, "span", 38);
221
+ i0.ɵɵelement(9, "br");
222
+ i0.ɵɵtemplate(10, FileUploadComponent_ul_4_ng_container_1_li_1_span_10_Template, 3, 4, "span", 39)(11, FileUploadComponent_ul_4_ng_container_1_li_1_span_11_Template, 2, 6, "span", 40)(12, FileUploadComponent_ul_4_ng_container_1_li_1_span_12_Template, 2, 0, "span", 41);
179
223
  i0.ɵɵelementEnd();
180
- i0.ɵɵtemplate(10, FileUploadComponent_ul_4_div_1_li_1_div_10_Template, 2, 3, "div", 33);
224
+ i0.ɵɵtemplate(13, FileUploadComponent_ul_4_ng_container_1_li_1_div_13_Template, 2, 4, "div", 42)(14, FileUploadComponent_ul_4_ng_container_1_li_1_div_14_Template, 2, 1, "div", 43);
181
225
  i0.ɵɵelementEnd();
182
- i0.ɵɵtemplate(11, FileUploadComponent_ul_4_div_1_li_1_div_11_Template, 3, 0, "div", 34)(12, FileUploadComponent_ul_4_div_1_li_1_div_12_Template, 3, 5, "div", 34)(13, FileUploadComponent_ul_4_div_1_li_1_div_13_Template, 3, 4, "div", 34)(14, FileUploadComponent_ul_4_div_1_li_1_div_14_Template, 3, 6, "div", 35);
226
+ i0.ɵɵtemplate(15, FileUploadComponent_ul_4_ng_container_1_li_1_div_15_Template, 3, 0, "div", 44);
227
+ i0.ɵɵelementStart(16, "div", 45);
228
+ i0.ɵɵtemplate(17, FileUploadComponent_ul_4_ng_container_1_li_1_a_17_Template, 2, 4, "a", 46);
229
+ i0.ɵɵelementEnd();
230
+ i0.ɵɵtemplate(18, FileUploadComponent_ul_4_ng_container_1_li_1_div_18_Template, 3, 1, "div", 44);
183
231
  i0.ɵɵelementEnd()();
184
232
  } if (rf & 2) {
185
233
  const ft_r7 = i0.ɵɵnextContext().$implicit;
186
234
  const ctx_r1 = i0.ɵɵnextContext(2);
187
235
  i0.ɵɵadvance(2);
188
- i0.ɵɵclassMapInterpolate1("media-left media-middle file-icon ", i0.ɵɵpipeBind1(3, 11, ctx_r1.getFileExtension(ft_r7.name)), "");
236
+ i0.ɵɵclassMapInterpolate1("media-left media-middle file-icon ", i0.ɵɵpipeBind1(3, 14, ctx_r1.getFileExtension(ft_r7.name)), "");
189
237
  i0.ɵɵpropertyInterpolate("title", ctx_r1.getFileExtension(ft_r7.name));
190
238
  i0.ɵɵadvance(5);
191
- i0.ɵɵtextInterpolate(ft_r7.name);
239
+ i0.ɵɵtextInterpolate(ft_r7.storageName || ft_r7.name);
240
+ i0.ɵɵadvance();
241
+ i0.ɵɵproperty("ngIf", ft_r7.status === "success" && (!ctx_r1.datasource || ctx_r1.datasource && (ft_r7._response == null ? null : ft_r7._response.success)));
192
242
  i0.ɵɵadvance(2);
193
243
  i0.ɵɵproperty("ngIf", ft_r7.fileLength !== 0);
194
244
  i0.ɵɵadvance();
195
- i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress");
245
+ i0.ɵɵproperty("ngIf", ft_r7.status === "error");
196
246
  i0.ɵɵadvance();
197
- i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ft_r7.status === "queued");
247
+ i0.ɵɵproperty("ngIf", ft_r7.status === "error");
198
248
  i0.ɵɵadvance();
199
- i0.ɵɵproperty("ngIf", ft_r7.status === "success");
249
+ i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ctx_r1.showprogressbar);
200
250
  i0.ɵɵadvance();
251
+ i0.ɵɵproperty("ngIf", (ft_r7.status === "onProgress" || ctx_r1.showprogressbar && ctx_r1.showprogressbarpercentage) && ft_r7.progress);
252
+ i0.ɵɵadvance();
253
+ i0.ɵɵproperty("ngIf", ft_r7.status === "onProgress" || ft_r7.status === "queued");
254
+ i0.ɵɵadvance(2);
201
255
  i0.ɵɵproperty("ngIf", ctx_r1.cleariconclass !== "" && ft_r7.status !== "onProgress");
202
256
  i0.ɵɵadvance();
203
- i0.ɵɵproperty("ngIf", ft_r7.status === "error");
257
+ i0.ɵɵproperty("ngIf", ft_r7.status === "success" && (!ctx_r1.datasource || ctx_r1.datasource && (ft_r7._response == null ? null : ft_r7._response.success)));
204
258
  } }
205
- function FileUploadComponent_ul_4_div_1_Template(rf, ctx) { if (rf & 1) {
206
- i0.ɵɵelementStart(0, "div");
207
- i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_li_1_Template, 15, 13, "li", 25);
208
- i0.ɵɵelementEnd();
259
+ function FileUploadComponent_ul_4_ng_container_1_Template(rf, ctx) { if (rf & 1) {
260
+ i0.ɵɵelementContainerStart(0);
261
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_4_ng_container_1_li_1_Template, 19, 16, "li", 31);
262
+ i0.ɵɵelementContainerEnd();
209
263
  } if (rf & 2) {
210
264
  const ft_r7 = ctx.$implicit;
211
265
  i0.ɵɵadvance();
212
266
  i0.ɵɵproperty("ngIf", ft_r7.status !== "abort");
213
267
  } }
214
268
  function FileUploadComponent_ul_4_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelementStart(0, "ul", 23);
216
- i0.ɵɵtemplate(1, FileUploadComponent_ul_4_div_1_Template, 2, 1, "div", 24);
269
+ i0.ɵɵelementStart(0, "ul", 29);
270
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_4_ng_container_1_Template, 2, 1, "ng-container", 30);
217
271
  i0.ɵɵelementEnd();
218
272
  } if (rf & 2) {
219
273
  const ctx_r1 = i0.ɵɵnextContext();
220
274
  i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction2(2, _c2, ctx_r1.filelistheight, ctx_r1.overflow));
221
275
  i0.ɵɵadvance();
222
- i0.ɵɵproperty("ngForOf", ctx_r1.multiple ? ctx_r1.multipleSelectedFiles : ctx_r1.selectedFiles);
276
+ i0.ɵɵproperty("ngForOf", ctx_r1.uploadedFiles);
223
277
  } }
224
278
  function FileUploadComponent_ul_5_li_1_Template(rf, ctx) { if (rf & 1) {
225
- i0.ɵɵelementStart(0, "li", 26)(1, "div", 27);
226
- i0.ɵɵelement(2, "div", 46);
227
- i0.ɵɵelementStart(3, "div", 29)(4, "p", 30)(5, "label", 31);
279
+ i0.ɵɵelementStart(0, "li", 58)(1, "div", 33);
280
+ i0.ɵɵelement(2, "div", 59);
281
+ i0.ɵɵelementStart(3, "div", 35)(4, "p", 60)(5, "label", 37);
228
282
  i0.ɵɵtext(6);
229
283
  i0.ɵɵelementEnd();
230
284
  i0.ɵɵelement(7, "br");
231
285
  i0.ɵɵelementEnd()();
232
- i0.ɵɵelementStart(8, "div", 39);
233
- i0.ɵɵelement(9, "span", 47);
286
+ i0.ɵɵelementStart(8, "div", 45);
287
+ i0.ɵɵelement(9, "span", 61);
234
288
  i0.ɵɵelementEnd()()();
235
289
  } if (rf & 2) {
236
- const ft_r10 = ctx.$implicit;
290
+ const ft_r11 = ctx.$implicit;
237
291
  i0.ɵɵadvance(6);
238
- i0.ɵɵtextInterpolate(ft_r10.name);
292
+ i0.ɵɵtextInterpolate(ft_r11.name);
239
293
  } }
240
294
  function FileUploadComponent_ul_5_Template(rf, ctx) { if (rf & 1) {
241
- i0.ɵɵelementStart(0, "ul", 44);
242
- i0.ɵɵtemplate(1, FileUploadComponent_ul_5_li_1_Template, 10, 1, "li", 45);
295
+ i0.ɵɵelementStart(0, "ul", 56);
296
+ i0.ɵɵtemplate(1, FileUploadComponent_ul_5_li_1_Template, 10, 1, "li", 57);
243
297
  i0.ɵɵelementEnd();
244
298
  } if (rf & 2) {
245
299
  const ctx_r1 = i0.ɵɵnextContext();
@@ -356,8 +410,11 @@ export class FileUploadComponent extends StylableComponent {
356
410
  * @param $files
357
411
  */
358
412
  onSelectEventCall($event, $files) {
359
- this.multipleSelectedFiles = this.multiple ? [...this.multipleSelectedFiles, ...$files] : $files;
413
+ $files.forEach(file => {
414
+ file.uniqueId = this.idGenerator.nextUid();
415
+ });
360
416
  this.selectedFiles = $files;
417
+ this.uploadedFiles = this.multiple ? [...this.uploadedFiles, ...$files] : $files;
361
418
  setTimeout(() => {
362
419
  this.invokeEventCallback('select', {
363
420
  $event: $.extend($event.$files || {}, $files),
@@ -379,12 +436,11 @@ export class FileUploadComponent extends StylableComponent {
379
436
  }
380
437
  /*this function to clear the specified file. if argument is not provided, it clears the complete list */
381
438
  clear(fileObj) {
382
- if (this.multiple) {
383
- this.multipleSelectedFiles = (fileObj) ? this.multipleSelectedFiles.filter((file) => file !== fileObj) : [];
384
- }
385
- else {
386
- this.selectedFiles = (fileObj) ? this.selectedFiles.filter((file) => file !== fileObj) : [];
387
- }
439
+ this.selectedFiles = (fileObj) ? this.clearFile(this.selectedFiles, fileObj) : [];
440
+ this.uploadedFiles = (fileObj) ? this.clearFile(this.uploadedFiles, fileObj) : [];
441
+ }
442
+ clearFile(files, fileObj) {
443
+ return files.filter((file) => file?._response?.fileName !== fileObj?._response?.fileName || file?.name !== fileObj?.name || file !== fileObj);
388
444
  }
389
445
  /*this function to set the class names for clear icon */
390
446
  setClearIconClass(classValue) {
@@ -412,34 +468,36 @@ export class FileUploadComponent extends StylableComponent {
412
468
  }
413
469
  // Make call if there are valid files else no call is made
414
470
  if ($files.length) {
415
- this.progressObservable = new Subject();
416
471
  // EVENT: ON_BEFORE_SELECT
417
472
  beforeSelectVal = this.invokeEventCallback('beforeselect', {
418
473
  $event: $.extend($event.$files || {}, $files),
419
474
  files: $files
420
475
  });
421
476
  if (this.datasource) {
422
- this.datasource._progressObservable = this.progressObservable;
423
- this.datasource._progressObservable.asObservable().subscribe((progressObj) => {
424
- forEach(this.selectedFiles, (file) => {
425
- if (file.name === progressObj.fileName) {
426
- file.progress = progressObj.progress;
427
- if (file.progress === 100) {
428
- file.status = 'success';
429
- }
430
- else {
431
- file.status = progressObj.status;
432
- if (progressObj.errMsg) {
433
- file.errMsg = progressObj.errMsg;
434
- this.invokeEventCallback('error', {
435
- $event,
436
- files: file
437
- });
477
+ if (!this.uploadProgressSubscription) {
478
+ this.progressObservable = new Subject();
479
+ this.datasource._progressObservable = this.progressObservable;
480
+ this.uploadProgressSubscription = this.datasource._progressObservable.asObservable().subscribe((progressObj) => {
481
+ forEach(this.uploadedFiles, (file) => {
482
+ if (file.name === progressObj.fileName && file.uniqueId === progressObj.uniqueId) {
483
+ file.progress = progressObj.progress;
484
+ if (file.progress === 100) {
485
+ file.status = 'success';
486
+ }
487
+ else {
488
+ file.status = progressObj.status;
489
+ if (progressObj.errMsg) {
490
+ file.errMsg = progressObj.errMsg;
491
+ this.invokeEventCallback('error', {
492
+ $event,
493
+ files: file
494
+ });
495
+ }
438
496
  }
439
497
  }
440
- }
498
+ });
441
499
  });
442
- });
500
+ }
443
501
  }
444
502
  else {
445
503
  this.selectedFiles = $files;
@@ -450,6 +508,43 @@ export class FileUploadComponent extends StylableComponent {
450
508
  }
451
509
  }
452
510
  }
511
+ onFileDelete($event, file) {
512
+ if (!file) {
513
+ return;
514
+ }
515
+ const beforeDeleteVal = this.invokeEventCallback('beforedelete', { $event: file });
516
+ if (beforeDeleteVal !== false) {
517
+ this.dialogService.showAppConfirmDialog({
518
+ title: "Delete file",
519
+ message: "Are you sure you want to delete this file?",
520
+ oktext: "Ok",
521
+ canceltext: "Cancel",
522
+ onOk: () => {
523
+ if (this.deletedatasource) {
524
+ this.deletedatasource.setInput('file', file._response.fileName || file.name);
525
+ if (!this.deleteProgressSubscription) {
526
+ this.deleteFileObservable = new Subject();
527
+ this.deletedatasource._deleteFileObservable = this.deleteFileObservable;
528
+ this.deletedatasource._deleteFileObservable.asObservable().subscribe((response) => {
529
+ if (response.status === "success") {
530
+ this.selectedFiles = this.selectedFiles.filter((fileObj) => file !== fileObj) || [];
531
+ this.uploadedFiles = this.uploadedFiles.filter((fileObj) => file !== fileObj) || [];
532
+ }
533
+ });
534
+ }
535
+ }
536
+ this.invokeEventCallback('delete', { $event: file });
537
+ this.dialogService.closeAppConfirmDialog();
538
+ },
539
+ onCancel: () => {
540
+ this.dialogService.closeAppConfirmDialog();
541
+ },
542
+ onOpen: () => {
543
+ $('.cancel-action').focus();
544
+ }
545
+ });
546
+ }
547
+ }
453
548
  // Prevent default behavior (Prevent file from being opened)
454
549
  dragOverHandler($event) {
455
550
  $event.preventDefault();
@@ -527,12 +622,13 @@ export class FileUploadComponent extends StylableComponent {
527
622
  }
528
623
  super.onPropertyChange(key, nv, ov);
529
624
  }
530
- constructor(inj, app, onSelectEvt, explicitContext) {
625
+ constructor(inj, app, onSelectEvt, dialogService, explicitContext) {
531
626
  super(inj, WIDGET_CONFIG, explicitContext);
532
627
  this.app = app;
533
628
  this.onSelectEvt = onSelectEvt;
629
+ this.dialogService = dialogService;
534
630
  this.selectedFiles = [];
535
- this.multipleSelectedFiles = [];
631
+ this.uploadedFiles = [];
536
632
  this.selectedFolders = [];
537
633
  this.fileTransfers = {};
538
634
  this.caption = 'Upload';
@@ -558,12 +654,7 @@ export class FileUploadComponent extends StylableComponent {
558
654
  this.defaultAllowedExtensions = this.allowedFileUploadExtensions.split(',').map(item => item.trim()).map(item => item.endsWith('/*') ? item : `.${item}`);
559
655
  this.chooseFilter = this.defaultAllowedExtensions.includes('*/*') ? '' : this.defaultAllowedExtensions;
560
656
  this.fileUploadMessage = 'Drop your files here or click here to browse';
561
- this.uploadedFiles = {
562
- fileName: '',
563
- path: '',
564
- length: '',
565
- status: ''
566
- };
657
+ this.idGenerator = new IDGenerator('file-');
567
658
  this.uploadUrl = 'services';
568
659
  // styler(this.nativeElement, this);
569
660
  }
@@ -583,13 +674,19 @@ export class FileUploadComponent extends StylableComponent {
583
674
  document.removeEventListener('drop', this.dropCb);
584
675
  document.removeEventListener('mouseleave', this.dropCb);
585
676
  super.ngOnDestroy();
677
+ const subscriptions = [this.uploadProgressSubscription, this.deleteProgressSubscription];
678
+ subscriptions.forEach(subscription => {
679
+ if (subscription) {
680
+ subscription.unsubscribe();
681
+ }
682
+ });
586
683
  }
587
- static { this.ɵfac = function FileUploadComponent_Factory(t) { return new (t || FileUploadComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵinjectAttribute('select.event'), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
684
+ static { this.ɵfac = function FileUploadComponent_Factory(t) { return new (t || FileUploadComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.App), i0.ɵɵinjectAttribute('select.event'), i0.ɵɵdirectiveInject(i1.AbstractDialogService), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
588
685
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FileUploadComponent, selectors: [["", "wmFileUpload", ""]], features: [i0.ɵɵProvidersFeature([
589
686
  provideAsWidgetRef(FileUploadComponent)
590
- ]), i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 6, vars: 5, consts: [["init-widget", "", 1, "app-fileupload"], ["class", "app-multi-file-upload", 4, "ngIf"], ["class", "app-single-file-upload", 4, "ngIf"], ["focus-target", "", "class", "app-button btn btn-default", 3, "disabled", "click", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", "title", 4, "ngIf"], [1, "app-multi-file-upload"], ["id", "dropzone", 1, "drop-box", 3, "click", "dragover", "drop", "ngClass"], [1, "message"], [1, "caption", 3, "innerHtml"], [1, "form-horizontal", 3, "name"], ["class", "file-input", "type", "file", "name", "files", "multiple", "", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["href", "javascript:void(0);", 1, "app-anchor"], ["type", "file", "name", "files", "multiple", "", 1, "file-input", 3, "click", "change", "disabled", "accept"], [1, "app-single-file-upload"], [1, "app-button-wrapper"], ["class", "file-input", "type", "file", "name", "files", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["id", "dropzone", "focus-target", "", 1, "app-button", "btn", "btn-default", 3, "ngClass"], ["aria-hidden", "true"], [1, "caption", 3, "innerHTML"], [1, "app-files-upload-status", "single"], ["type", "file", "name", "files", 1, "file-input", 3, "click", "change", "disabled", "accept"], ["focus-target", "", 1, "app-button", "btn", "btn-default", 3, "click", "disabled"], [1, "list-group", "file-upload", 3, "ngStyle"], [4, "ngFor", "ngForOf"], ["class", "list-group-item file-upload-status", 4, "ngIf"], [1, "list-group-item", "file-upload-status"], [1, "media", "upload-file-list"], [3, "title"], [1, "media-body", "media-middle", "file-details"], [1, "uploaddetails"], [1, "upload-title"], ["class", "filesize", 4, "ngIf"], ["class", "progress", 4, "ngIf"], ["class", "media-right media-middle", 4, "ngIf"], ["class", "media-right media-middle", 3, "title", 4, "ngIf"], [1, "filesize"], [1, "progress"], [1, "progress-bar", "progress-bar-striped", "progress-bar-info", 3, "ngStyle"], [1, "media-right", "media-middle"], ["type", "button", 1, "btn", "btn-transparent", "file-upload-stop", 3, "click"], [1, "wi", "wi-close"], ["type", "button", 1, "btn", "btn-transparent", "btn-default", "status-icon", 3, "click", "title"], [1, "media-right", "media-middle", 3, "title"], [1, "list-group", "file-upload", 3, "ngStyle", "title"], ["class", "list-group-item file-upload-status", 4, "ngFor", "ngForOf"], [1, "media-left", "media-middle", "file-icon", "fa", "fa-folder-o"], [1, "status-icon", "wi", "wi-cancel", "text-danger"]], template: function FileUploadComponent_Template(rf, ctx) { if (rf & 1) {
687
+ ]), i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 6, vars: 5, consts: [["init-widget", "", 1, "app-fileupload"], ["class", "app-multi-file-upload", 4, "ngIf"], ["class", "app-single-file-upload", 4, "ngIf"], ["focus-target", "", "class", "app-button btn btn-default", 3, "disabled", "click", 4, "ngIf"], ["class", "list-group file-upload", "tabindex", "0", 3, "ngStyle", 4, "ngIf"], ["class", "list-group file-upload", 3, "ngStyle", "title", 4, "ngIf"], [1, "app-multi-file-upload"], ["id", "dropzone", 1, "drop-box", 3, "click", "dragover", "drop", "ngClass"], [1, "message"], [1, "upload-label", 3, "innerHtml"], [1, "form-horizontal", 3, "name"], ["class", "file-input", "type", "file", "name", "files", "multiple", "", 3, "disabled", "accept", "click", "change", 4, "ngIf"], ["href", "javascript:void(0);", 1, "app-anchor", "upload-label"], ["class", "upload-extensions", 3, "innerHtml", 4, "ngIf"], ["class", "upload-extensions", 4, "ngIf"], ["type", "file", "name", "files", "multiple", "", 1, "file-input", 3, "click", "change", "disabled", "accept"], [1, "upload-extensions", 3, "innerHtml"], [1, "upload-extensions"], [1, "app-single-file-upload"], [1, "app-button-wrapper"], ["class", "file-input", "multiple", "", "name", "files", "type", "file", 3, "accept", "disabled", "change", "click", 4, "ngIf"], ["class", "file-input", "name", "files", "type", "file", 3, "accept", "disabled", "change", "click", 4, "ngIf"], ["id", "dropzone", "focus-target", "", 1, "app-button", "btn", "btn-default", 3, "ngClass"], ["aria-hidden", "true"], [1, "caption", 3, "innerHTML"], [1, "app-files-upload-status", "single"], ["multiple", "", "name", "files", "type", "file", 1, "file-input", 3, "change", "click", "accept", "disabled"], ["name", "files", "type", "file", 1, "file-input", 3, "change", "click", "accept", "disabled"], ["focus-target", "", 1, "app-button", "btn", "btn-default", 3, "click", "disabled"], ["tabindex", "0", 1, "list-group", "file-upload", 3, "ngStyle"], [4, "ngFor", "ngForOf"], ["class", "list-group-item file-upload-status", "tabindex", "0", 4, "ngIf"], ["tabindex", "0", 1, "list-group-item", "file-upload-status"], [1, "media", "upload-file-list"], [3, "title"], [1, "media-body", "media-middle", "file-details"], [1, "uploaddetails", "col-md-3"], [1, "upload-title"], [3, "class", 4, "ngIf"], ["class", "filesize", 4, "ngIf"], [3, "class", "title", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], ["class", "progress col-md-7 upload-progress", 4, "ngIf"], ["class", "col-md-1 upload-progress-percentage", 4, "ngIf"], ["class", "media-right media-middle", 4, "ngIf"], [1, "media-right", "media-middle"], ["href", "javascript:void(0)", "class", "btn btn-transparent btn-default status-icon", "type", "button", 3, "title", "click", 4, "ngIf"], [1, "filesize"], [1, "error-message"], [1, "progress", "col-md-7", "upload-progress"], [1, "progress-bar", "progress-bar-striped", 3, "ngClass", "ngStyle"], [1, "col-md-1", "upload-progress-percentage"], ["href", "javascript:void(0)", "type", "button", 1, "btn", "btn-transparent", "file-upload-stop", 3, "click"], [1, "wi", "wi-close"], ["href", "javascript:void(0)", "type", "button", 1, "btn", "btn-transparent", "btn-default", "status-icon", 3, "click", "title"], [1, "wi", "wi-delete"], [1, "list-group", "file-upload", 3, "ngStyle", "title"], ["class", "list-group-item file-upload-status", 4, "ngFor", "ngForOf"], [1, "list-group-item", "file-upload-status"], [1, "media-left", "media-middle", "file-icon", "fa", "fa-folder-o"], [1, "uploaddetails"], [1, "status-icon", "wi", "wi-cancel", "text-danger"]], template: function FileUploadComponent_Template(rf, ctx) { if (rf & 1) {
591
688
  i0.ɵɵelementStart(0, "div", 0);
592
- i0.ɵɵtemplate(1, FileUploadComponent_div_1_Template, 9, 10, "div", 1)(2, FileUploadComponent_div_2_Template, 9, 10, "div", 2)(3, FileUploadComponent_button_3_Template, 3, 5, "button", 3)(4, FileUploadComponent_ul_4_Template, 2, 5, "ul", 4)(5, FileUploadComponent_ul_5_Template, 2, 6, "ul", 5);
689
+ i0.ɵɵtemplate(1, FileUploadComponent_div_1_Template, 12, 13, "div", 1)(2, FileUploadComponent_div_2_Template, 9, 10, "div", 2)(3, FileUploadComponent_button_3_Template, 3, 5, "button", 3)(4, FileUploadComponent_ul_4_Template, 2, 5, "ul", 4)(5, FileUploadComponent_ul_5_Template, 2, 6, "ul", 5);
593
690
  i0.ɵɵelementEnd();
594
691
  } if (rf & 2) {
595
692
  i0.ɵɵadvance();
@@ -599,7 +696,7 @@ export class FileUploadComponent extends StylableComponent {
599
696
  i0.ɵɵadvance();
600
697
  i0.ɵɵproperty("ngIf", ctx._isCordova);
601
698
  i0.ɵɵadvance();
602
- i0.ɵɵproperty("ngIf", ctx.selectedFiles.length > 0);
699
+ i0.ɵɵproperty("ngIf", ctx.uploadedFiles.length > 0);
603
700
  i0.ɵɵadvance();
604
701
  i0.ɵɵproperty("ngIf", ctx.selectedFolders.length > 0);
605
702
  } }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i2.NgStyle, i3.FileIconClassPipe, i3.FileSizePipe, i3.StateClassPipe], encapsulation: 2 }); }
@@ -608,15 +705,15 @@ export class FileUploadComponent extends StylableComponent {
608
705
  type: Component,
609
706
  args: [{ selector: '[wmFileUpload]', providers: [
610
707
  provideAsWidgetRef(FileUploadComponent)
611
- ], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"caption\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a href=\"javascript:void(0);\" class=\"app-anchor\">{{fileUploadMessage}}</a>\n </form>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple>\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"!multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" >\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" *ngIf=\"selectedFiles.length > 0\" >\n <div *ngFor=\"let ft of (multiple ? multipleSelectedFiles : selectedFiles)\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n </p>\n <div class=\"progress\" *ngIf=\"ft.status === 'onProgress'\">\n <div class=\"progress-bar progress-bar-striped progress-bar-info\" [ngStyle]=\"{width: (ft.progress +'%')}\"></div>\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a class=\"btn btn-transparent file-upload-stop\" type=\"button\" (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success'\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n <div *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\" class=\"media-right media-middle\">\n <a (click)=\"clear(ft)\" class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'error'\" title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\">\n <span class=\"status-icon {{ft.status | stateClass }}\"></span>\n </div>\n </div>\n </li>\n </div>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
708
+ ], template: "<div class=\"app-fileupload\" init-widget>\n <!-- drag and drop files UI in web -->\n <div class=\"app-multi-file-upload\" *ngIf=\"!_isMobileType && multiple\">\n <div id=\"dropzone\" class=\"drop-box\" (click)=\"triggerFileSelect()\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\" (dragover)=\"dragOverHandler($event);\" (drop)=\"onFileDrop($event);\">\n <i class=\"{{iconclass}}\"></i>\n <div class=\"message\">\n <label [innerHtml]=\"caption\" class=\"upload-label\"></label>\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <input class=\"file-input\" [attr.aria-label]=\"hint || 'File selection field'\" type=\"file\" name=\"files\" *ngIf=\"multiple\" [disabled]=\"disabled\" [accept]=\"chooseFilter\" (click)=\"onFileElemClick($event)\" (change)=\"onFileSelect($event, $event.target.files)\" multiple >\n <a class=\"app-anchor upload-label\" href=\"javascript:void(0);\">{{ fileUploadMessage }}</a>\n </form>\n <label *ngIf=\"chooseFilter\" [innerHtml]=\"chooseFilter + ' only '\" class=\"upload-extensions\"></label>\n <span *ngIf=\"chooseFilter && maxfilesize\" class=\"upload-extensions\"> . </span>\n <label *ngIf=\"maxfilesize\" [innerHtml]=\"maxfilesize + 'MB max'\" class=\"upload-extensions\"></label>\n </div>\n </div>\n </div>\n <!-- single file upload in web and single , multiple file upload UI in mobile runmode -->\n <div class=\"app-single-file-upload\" *ngIf=\"!_isCordova && (!multiple || _isMobileType)\">\n <div class=\"app-button-wrapper\">\n <form class=\"form-horizontal\" name=\"{{formName}}\">\n <!-- support for file upload in Mobileapp in its runmode (Web) -->\n <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\" *ngIf=\"multiple\"\n [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n multiple name=\"files\" type=\"file\">\n <input (change)=\"onFileSelect($event, $event.target.files)\" (click)=\"onFileElemClick($event)\" *ngIf=\"!multiple\"\n [accept]=\"chooseFilter\" [attr.aria-label]=\"arialabel || 'File selection field'\" [disabled]=\"disabled\" class=\"file-input\"\n name=\"files\" type=\"file\">\n <button id=\"dropzone\" focus-target class=\"app-button btn btn-default\" [ngClass]=\"{'highlight-drop-box' : highlightDropArea}\">\n <i class=\"{{iconclass}}\" aria-hidden=\"true\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n </form>\n </div>\n <div class=\"app-files-upload-status single\"></div>\n </div>\n <!-- support for file upload in Mobile Application (device) -->\n <button *ngIf=\"_isCordova\" focus-target class=\"app-button btn btn-default\" (click)=\"openFileSelector()\" [disabled]=\"disabled\">\n <i class=\"{{iconclass}}\"></i>\n <span class=\"caption\" [innerHTML]=\"caption\"></span>\n </button>\n <!-- list of selectedfiles UI -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\"\n *ngIf=\"uploadedFiles.length > 0\" tabindex=\"0\">\n <ng-container *ngFor=\"let ft of uploadedFiles\">\n <li class=\"list-group-item file-upload-status\" *ngIf=\"ft.status !== 'abort'\" tabindex=\"0\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon {{getFileExtension(ft.name) | fileIconClass}}\" title=\"{{getFileExtension(ft.name)}}\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails col-md-3\">\n <span class=\"upload-title\">{{ ft.storageName || ft.name }}</span>\n <span *ngIf=\"ft.status === 'success' && (!datasource || (datasource && ft._response?.success))\"\n class=\"status-icon {{ft.status | stateClass }}\"></span>\n <br/>\n <span class=\"filesize\" *ngIf=\"ft.fileLength !== 0\">{{ft.size | filesize:0}}</span>\n <span *ngIf=\"ft.status === 'error'\"\n class=\"status-icon {{ft.status | stateClass }}\"\n title=\"{{ft.errMsg || this.appLocale.MESSAGE_FILE_UPLOAD_FAILED}}\"></span>\n <span *ngIf=\"ft.status === 'error'\" class=\"error-message\">Upload Failed</span>\n </p>\n <div *ngIf=\"ft.status === 'onProgress' || showprogressbar\"\n class=\"progress col-md-7 upload-progress\">\n <div [ngClass]=\"ft.status === 'error' ? 'progress-bar-danger' : 'progress-bar-info'\"\n [ngStyle]=\"{width: (ft.progress +'%')}\"\n class=\"progress-bar progress-bar-striped\"></div>\n </div>\n <div *ngIf=\"(ft.status === 'onProgress' || showprogressbar && showprogressbarpercentage) && ft.progress \"\n class=\"col-md-1 upload-progress-percentage\">{{ ft.progress + '%' }}\n </div>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'onProgress' || ft.status === 'queued'\">\n <a href=\"javascript:void(0)\" class=\"btn btn-transparent file-upload-stop\" type=\"button\"\n (click)=\"abortFileUpload(ft)\">\n <i class=\"wi wi-close\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\">\n <a href=\"javascript:void(0)\" (click)=\"clear(ft)\"\n *ngIf=\"cleariconclass !== '' && ft.status !== 'onProgress'\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{cleariconhint}}\" type=\"button\">\n <i class=\"{{cleariconclass}}\"></i>\n </a>\n </div>\n <div class=\"media-right media-middle\" *ngIf=\"ft.status === 'success' && (!datasource || (datasource && ft._response?.success))\">\n <a href=\"javascript:void(0)\" (click)=\"onFileDelete($event, ft)\"\n class=\"btn btn-transparent btn-default status-icon\" title=\"{{deleteiconhint}}\" type=\"button\">\n <i class=\"wi wi-delete\"></i>\n </a>\n </div>\n </div>\n </li>\n </ng-container>\n </ul>\n <!-- list of selectedfolders UI to show the error in title -->\n <ul class=\"list-group file-upload\" [ngStyle]=\"{height: filelistheight, overflow: overflow}\" title=\"{{this.appLocale.MESSAGE_FOLDER_UPLOADS_NOT_ALLOWED}}\" *ngIf=\"selectedFolders.length > 0\" >\n <li *ngFor=\"let ft of selectedFolders\" class=\"list-group-item file-upload-status\">\n <div class=\"media upload-file-list\">\n <div class=\"media-left media-middle file-icon fa fa-folder-o\"></div>\n <div class=\"media-body media-middle file-details\">\n <p class=\"uploaddetails\">\n <label class=\"upload-title\">{{ft.name}}</label><br/>\n </p>\n </div>\n <div class=\"media-right media-middle\" >\n <span class=\"status-icon wi wi-cancel text-danger\"></span>\n </div>\n </div>\n </li>\n </ul>\n</div>\n" }]
612
709
  }], () => [{ type: i0.Injector }, { type: i1.App }, { type: undefined, decorators: [{
613
710
  type: Attribute,
614
711
  args: ['select.event']
615
- }] }, { type: undefined, decorators: [{
712
+ }] }, { type: i1.AbstractDialogService }, { type: undefined, decorators: [{
616
713
  type: Inject,
617
714
  args: ['EXPLICIT_CONTEXT']
618
715
  }, {
619
716
  type: Optional
620
717
  }] }], null); })();
621
718
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FileUploadComponent, { className: "FileUploadComponent", filePath: "file-upload.component.ts", lineNumber: 27 }); })();
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN4RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0lDQTFDLGlDQUFzUTtJQUEvRCxBQUFsQyw2TEFBUyw4QkFBdUIsS0FBQyxrTEFBVyxnREFBeUMsS0FBQztJQUEzUCxpQkFBc1E7OztJQUF6SCxBQUF0QiwwQ0FBcUIsK0JBQXdCOzs7OztJQUxoTCxBQURKLDhCQUFzRSxhQUMwSDtJQUE3QixBQUF0QyxBQUFyRiw0S0FBUywwQkFBbUIsS0FBQywyS0FBb0UsOEJBQXVCLEtBQUUsbUtBQVMseUJBQWtCLEtBQUU7SUFDdkws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d0M7WUF1RXBDLEFBcENBLEFBTEEsQUFmQSxBQWJBLHFFQUFzRSx3REFha0IsNkRBZXNDLHFEQUtBLHFEQW9DZ0U7WUFlbE0saUJBQU07O1lBcEZrQyxjQUFnQztZQUFoQyx5REFBZ0M7WUFhL0IsY0FBaUQ7WUFBakQsOEVBQWlEO1lBZTdFLGNBQWdCO1lBQWhCLHFDQUFnQjtZQUtvRSxjQUE4QjtZQUE5QixtREFBOEI7WUFvQ2dDLGNBQWdDO1lBQWhDLHFEQUFnQzs7O2lGRDdDbEwsbUJBQW1CO2NBUi9CLFNBQVM7MkJBQ0ksZ0JBQWdCLGFBRWY7b0JBQ1Asa0JBQWtCLHFCQUFxQjtpQkFDMUM7O3NCQWtXNkMsU0FBUzt1QkFBQyxjQUFjOztzQkFBdUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQS9WeEgsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBBdHRyaWJ1dGUsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBcHAsIERhdGFTb3VyY2UsIGdldFdtUHJvamVjdFByb3BlcnRpZXMsIGlzQXVkaW9GaWxlLCBpc0ltYWdlRmlsZSwgaXNWaWRlb0ZpbGV9IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7cHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyfSBmcm9tICdAd20vY29tcG9uZW50cy9iYXNlJztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2ZpbGUtdXBsb2FkLnByb3BzJztcbmltcG9ydCB7Zm9yRWFjaCwgaW5jbHVkZXMsIGlzRW1wdHksIHRvTG93ZXJ9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtZmlsZXVwbG9hZCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge1xuICAgIHdpZGdldFR5cGU6ICd3bS1maWxldXBsb2FkJyxcbiAgICBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t3bUZpbGVVcGxvYWRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRmlsZVVwbG9hZENvbXBvbmVudClcbiAgICBdXG59KVxuXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgc2VsZWN0ZWRGaWxlczogYW55ID0gW107XG4gICAgbXVsdGlwbGVTZWxlY3RlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICBzZWxlY3RlZEZvbGRlcnM6IGFueSA9IFtdO1xuICAgIHByb2dyZXNzT2JzZXJ2YWJsZTtcbiAgICBuYW1lO1xuICAgIGhpbnQ7XG4gICAgbXVsdGlwbGU7XG4gICAgZmlsZVRyYW5zZmVycyA9IHt9O1xuICAgIGNhcHRpb24gPSAnVXBsb2FkJztcbiAgICBmb3JtTmFtZSA9ICcnO1xuICAgIG1heGZpbGVzaXplO1xuICAgIGNsZWFyaWNvbmNsYXNzO1xuICAgIGNsZWFyaWNvbmhpbnQ7XG4gICAgc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aDtcbiAgICBERUZBVUxUX0NBUFRJT05TID0ge1xuICAgICAgICBNVUxUSVBMRV9TRUxFQ1Q6ICdEcm9wIHlvdXIgZmlsZXMgaGVyZS4nLFxuICAgICAgICBTRUxFQ1Q6ICdTZWxlY3QnXG4gICAgfTtcbiAgICBERVZJQ0VfQ09OVEVOVFRZUEVTID0ge1xuICAgICAgICBJTUFHRTogJ2ltYWdlJyxcbiAgICAgICAgVklERU86ICd2aWRlbycsXG4gICAgICAgIEFVRElPOiAnYXVkaW8nLFxuICAgICAgICBGSUxFUzogJ2ZpbGVzJ1xuICAgIH07XG4gICAgRklMRVNJWkVfTUIgPSAxMDQ4NTc2O1xuICAgIHdpZGdldFByb3BzO1xuICAgIF9pc01vYmlsZVR5cGU7XG4gICAgX2lzQ29yZG92YTtcbiAgICAvLyBwYXJlbnRQcmVmYWJTY29wZSA9IGVsZW1lbnQuY2xvc2VzdCgnLmFwcC1wcmVmYWInKS5pc29sYXRlU2NvcGUoKSxcbiAgICBDT05TVEFOVF9GSUxFX1NFUlZJQ0UgPSAnRmlsZVNlcnZpY2UnO1xuICAgIHVwbG9hZERhdGEgPSB7XG4gICAgICAgIGZpbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgdXBsb2FkUGF0aDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBhbGxvd2VkRmlsZVVwbG9hZEV4dGVuc2lvbnMgPSBnZXRXbVByb2plY3RQcm9wZXJ0aWVzKCkuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zO1xuICAgIGRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucyA9IHRoaXMuYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpLm1hcChpdGVtID0+IGl0ZW0uZW5kc1dpdGgoJy8qJykgPyBpdGVtIDogYC4ke2l0ZW19YCk7XG4gICAgY2hvb3NlRmlsdGVyID0gdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJyovKicpID8gJycgOiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucztcbiAgICBkYXRhc291cmNlO1xuICAgIGZpbGVVcGxvYWRNZXNzYWdlID0gJ0Ryb3AgeW91ciBmaWxlcyBoZXJlIG9yIGNsaWNrIGhlcmUgdG8gYnJvd3NlJztcbiAgICB1cGxvYWRlZEZpbGVzID0ge1xuICAgICAgICBmaWxlTmFtZTogJycsXG4gICAgICAgIHBhdGg6ICcnLFxuICAgICAgICBsZW5ndGg6ICcnLFxuICAgICAgICBzdGF0dXM6ICcnXG4gICAgfTtcbiAgICBoaWdobGlnaHREcm9wQXJlYTtcbiAgICAvKl9oYXNPblN1Y2Nlc3NFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25TdWNjZXNzKTtcbiAgICAgX2hhc09uRXJyb3JFdnQgPSBXTS5pc0RlZmluZWQoYXR0cnMub25FcnJvcik7Ki9cblxuICAgIC8vIENoZWNraW5nIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIHZhbGlkIGZvciB0aGUgY2hvb3NlbiBmaWx0ZXIgdHlwZVxuICAgIGlzVmFsaWRGaWxlKGZpbGVuYW1lLCBjb250ZW50dHlwZSwgZXh0ZW5zaW9uTmFtZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGxldCBpc1ZhbGlkLCBjb250ZW50VHlwZXM7XG5cbiAgICAgICAgaWYgKCFjb250ZW50dHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudFR5cGVzID0gdG9Mb3dlcihjb250ZW50dHlwZSkuc3BsaXQoJywnKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UvKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdpbWFnZScpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0ltYWdlRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgaW1hZ2UgYW5kIHVzZXIgdXBsb2FkcyBpbWFnZSBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpby8qJykgfHwgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2F1ZGlvJykgJiYgaXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzQXVkaW9GaWxlKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aGUgY29udGVudCB0eXBlIGNob3NlbiBpcyBhdWRpby8qIGFuZCB1c2VyIHVwbG9hZHMgYXVkaW8gaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICd2aWRlbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc1ZpZGVvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgdmlkZW8vKiBhbmQgdXNlciB1cGxvYWRzIHZpZGVvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLypjb250ZW50IHR5cGUgYW5kIHRoZSB1cGxvYWRlZCBmaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUgc2FtZSovXG4gICAgICAgIGlmIChpbmNsdWRlcyhjb250ZW50VHlwZXMsICcuJyArIHRvTG93ZXIoZXh0ZW5zaW9uTmFtZSkpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICAvKiB0aGlzIHJldHVybiB0aGUgYXJyYXkgb2YgZmlsZXMgd2hpY2ggYXJlIGhhdmluZyB0aGUgZmlsZSBzaXplIG5vdCBtb3JlIHRoYW4gbWF4ZmlsZXNpemUgYW5kIGZpbHRlcnMgYmFzZWQgb24gY29udGVudHR5cGUgKi9cbiAgICBnZXRWYWxpZEZpbGVzKCRmaWxlcykge1xuICAgICAgICBjb25zdCB2YWxpZEZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yRmlsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTUFYRklMRVVQTE9BRF9TSVpFID0gcGFyc2VGbG9hdCh0aGlzLm1heGZpbGVzaXplKSAqIHRoaXMuRklMRVNJWkVfTUIgfHwgdGhpcy5GSUxFU0laRV9NQjtcbiAgICAgICAgY29uc3QgTUFYX0ZJTEVfVVBMT0FEX0ZPUk1BVFRFRF9TSVpFID0gKHRoaXMubWF4ZmlsZXNpemUgfHwgJzEnKSArICdNQic7XG5cbiAgICAgICAgLy8gaWYgY29udGVudHR5cGUgaXMgZmlsZXMgZm9yIG1vYmlsZSBwcm9qZWN0cy5cbiAgICAgICAgaWYgKHRoaXMuY2hvb3NlRmlsdGVyID09PSB0aGlzLkRFVklDRV9DT05URU5UVFlQRVMuRklMRVMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JFYWNoKCRmaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIC8qIGNoZWNrIGZvciB0aGUgZmlsZSBjb250ZW50IHR5cGUgYmVmb3JlIHVwbG9hZGluZyAqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRGaWxlKGZpbGUubmFtZSwgdGhpcy5jaG9vc2VGaWx0ZXIsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLm5hbWUpLCB0aGlzLl9pc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWFRFTlRJT05fVkFMSURBVElPTl9NRVNTQUdFfSAke3RoaXMuY2hvb3NlRmlsdGVyfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvckZpbGVzKCdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZS5zaXplID4gTUFYRklMRVVQTE9BRF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7dGhpcy5hcHBMb2NhbGUuTEFCRUxfRklMRV9FWENFRURfVkFMSURBVElPTl9NRVNTQUdFfSAke01BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRX1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX1NJWkUnLCBtc2csIGZpbGUsIGVycm9yRmlsZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZEZpbGVzOiB2YWxpZEZpbGVzLFxuICAgICAgICAgICAgZXJyb3JGaWxlczogZXJyb3JGaWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yRmlsZXMoa2V5LCBtc2csIGZpbGUsIGVycm9yRmlsZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXJyb3IgY2FsbGJhY2sgZXhpc3Qgb3Igbm90LiBJZiBpdCBleGlzdHMgdGhlbiBkb250IHNob3cgdGFvc3RlciBtZXNzYWdlXG4gICAgICAgIGlmICghdGhpcy5oYXNFdmVudENhbGxiYWNrKCdlcnJvcicpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnlBcHAobXNnLCAnRXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbWVzc2FnZTogbXNnXG4gICAgICAgIH07XG4gICAgICAgIGZpbGUuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgZXJyb3JGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8qT3ZlcndyaXRlIHRoZSBjYXB0aW9uIG9ubHkgaWYgdGhleSBhcmUgZGVmYXVsdCovXG4gICAgZ2V0Q2FwdGlvbihjYXB0aW9uLCBpc011bHRpcGxlLCBpc01vYmlsZVR5cGUpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzKHRoaXMuREVGQVVMVF9DQVBUSU9OUywgY2FwdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc011bHRpcGxlICYmICFpc01vYmlsZVR5cGUgPyB0aGlzLkRFRkFVTFRfQ0FQVElPTlMuTVVMVElQTEVfU0VMRUNUIDogdGhpcy5ERUZBVUxUX0NBUFRJT05TLlNFTEVDVDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdGlvbjtcbiAgICB9XG5cbiAgICB1cGxvYWRVcmwgPSAnc2VydmljZXMnO1xuXG4gICAgLyogY2hhbmdlIHNlcnZlciBwYXRoIGJhc2VkIG9uIHVzZXIgb3B0aW9uICovXG4gICAgY2hhbmdlU2VydmVyVXBsb2FkUGF0aChwYXRoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRVcGxvYWRUeXBlUGF0aCA9IHBhdGg7XG4gICAgfVxuXG4gICAgLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaWxlZXh0ZW5zaW9uICovXG4gICAgZ2V0RmlsZUV4dGVuc2lvbihmaWxlTmFtZSkge1xuICAgICAgICBpZiAoZmlsZU5hbWUgJiYgaW5jbHVkZXMoZmlsZU5hbWUsICcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZmlsZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgc2VsZWN0IEV2ZW50XG4gICAgICogQHBhcmFtICRldmVudFxuICAgICAqIEBwYXJhbSAkZmlsZXNcbiAgICAgKi9cbiAgICBvblNlbGVjdEV2ZW50Q2FsbCgkZXZlbnQsICRmaWxlcykge1xuICAgICAgICB0aGlzLm11bHRpcGxlU2VsZWN0ZWRGaWxlcyA9IHRoaXMubXVsdGlwbGUgPyBbLi4udGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMsIC4uLiRmaWxlc10gOiAkZmlsZXM7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICQuZXh0ZW5kKCRldmVudC4kZmlsZXMgfHwge30sICRmaWxlcyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWxlRWxlbUNsaWNrKCRldmVudCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gdHJ1ZTtcblxuICAgICAgICAvL1RoZSBmaWxlIHVwbG9hZCB3aWRnZXQgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIHRvIHJldXBsb2FkIHRoZSBzYW1lIGZpbGUuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZpbGUtaW5wdXQnKVswXS52YWx1ZSA9IG51bGw7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBmaWxlcGlja2VyIGlzIG5vdCB0aGVyZSBvbiB0aGUgd2luZG93LCByZW1vdmUgdGhlIGRyb3B6b25lIGhpZ2hsaWdodFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmRpc2FibGVEcm9wWm9uZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlRHJvcFpvbmUoKSB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RHJvcEFyZWEgPSBmYWxzZTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUpO1xuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBjbGVhciB0aGUgc3BlY2lmaWVkIGZpbGUuIGlmIGFyZ3VtZW50IGlzIG5vdCBwcm92aWRlZCwgaXQgY2xlYXJzIHRoZSBjb21wbGV0ZSBsaXN0ICAqL1xuICAgIGNsZWFyKGZpbGVPYmopIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5tdWx0aXBsZVNlbGVjdGVkRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlICE9PSBmaWxlT2JqKSA6IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAhPT0gZmlsZU9iaikgOiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGNsYXNzIG5hbWVzIGZvciBjbGVhciBpY29uICovXG4gICAgc2V0Q2xlYXJJY29uQ2xhc3MoY2xhc3NWYWx1ZSkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmNsYXNzID0gY2xhc3NWYWx1ZTtcbiAgICB9XG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgaGludCBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkhpbnQoaGludCkge1xuICAgICAgICB0aGlzLmNsZWFyaWNvbmhpbnQgPSBoaW50O1xuICAgIH1cblxuXG4gICAgLyp0aGlzIGZ1bmN0aW9uIHRvIGFwcGVuZCB1cGxvYWQgc3RhdHVzIGRvbSBlbGVtZW50cyB0byB3aWRnZXQgKi9cbiAgICBvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgbGV0IGJlZm9yZVNlbGVjdFZhbDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmdldFZhbGlkRmlsZXMoJGZpbGVzKTtcbiAgICAgICAgJGZpbGVzID0gZmlsZXMudmFsaWRGaWxlcztcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcHJldmlvdXNseSB0cmllZCB1cGxvYWRpbmcgZm9sZGVycyB1c2luZyBkcm9wLCBhbmQgdGhlbiB1cGxvYWRpbmcgdXNpbmcgY2xpY2sgbWV0aG9kIHdlIGNsZWFyIHRoZSBmb2xkZXJzIGRvbVxuICAgICAgICBpZiAoJGV2ZW50LnR5cGUgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIGVycm9yIGNhbGxiYWNrIGV2ZW50IGlmIGFueSBpbnZhbGlkIGZpbGUgZm91bmQuXG4gICAgICAgIGlmICghaXNFbXB0eShmaWxlcy5lcnJvckZpbGVzKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLmVycm9yRmlsZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBjYWxsIGlmIHRoZXJlIGFyZSB2YWxpZCBmaWxlcyBlbHNlIG5vIGNhbGwgaXMgbWFkZVxuICAgICAgICBpZiAoJGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX0JFRk9SRV9TRUxFQ1RcbiAgICAgICAgICAgIGJlZm9yZVNlbGVjdFZhbCA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc2VsZWN0Jywge1xuICAgICAgICAgICAgICAgICRldmVudDogJC5leHRlbmQoJGV2ZW50LiRmaWxlcyB8fCB7fSwgJGZpbGVzKSxcbiAgICAgICAgICAgICAgICBmaWxlczogJGZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5fcHJvZ3Jlc3NPYnNlcnZhYmxlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgocHJvZ3Jlc3NPYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnNlbGVjdGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5uYW1lID09PSBwcm9ncmVzc09iai5maWxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSBwcm9ncmVzc09iai5wcm9ncmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NPYmouZXJyTXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVyck1zZyA9IHByb2dyZXNzT2JqLmVyck1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55KSB7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0KTtcbiAgICAgICAgLy8gc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIC8vIGFkZGluZywgZHJhZ292ZXIgYW5kIGRyb3Agb24gdGhlIGRvY3VtZW50IGFzIHdoZW4gZmlsZSBpcyBkcmFnZ2VkIG9uIHRvIHRoZSBwYWdlIGhpZ2hsaWdodCB0aGUgZHJvcHpvbmVzIGFuZCByZW1vdmUgaGlnaGxpZ2h0IG9uIGZpbGUgZHJvcFxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ092ZXJDYi5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuXG4gICAgICAgIC8vIGFkZGluZyBtb3VzZWxlYXZlIGV2bnQgdG8gcmVtb3ZlIGhpZ2hsaWdodCB3aGVuIGZpbGUgaXMgZHJvcHBlZCBvdXRzaWRlIHRoZSB3aW5kb3dcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc3R5bGVyKCB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFwcC1idXR0b24sIC5kcm9wLWJveCcpLCB0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5kcm9wQ2IpO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcHAtZmlsZXVwbG9hZFwiIGluaXQtd2lkZ2V0PlxuICAgIDwhLS0gZHJhZyBhbmQgZHJvcCBmaWxlcyBVSSBpbiB3ZWIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1tdWx0aS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc01vYmlsZVR5cGUgJiYgbXVsdGlwbGVcIj5cbiAgICAgICAgPGRpdiBpZD1cImRyb3B6b25lXCIgY2xhc3M9XCJkcm9wLWJveFwiIChjbGljayk9XCJ0cmlnZ2VyRmlsZVNlbGVjdCgpXCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCIgKGRyYWdvdmVyKT1cImRyYWdPdmVySGFuZGxlcigkZXZlbnQpO1wiIChkcm9wKT1cIm9uRmlsZURyb3AoJGV2ZW50KTtcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtpbm5lckh0bWxdPVwiY2FwdGlvblwiIGNsYXNzPVwiY2FwdGlvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZpbGUtaW5wdXRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImhpbnQgfHwgJ0ZpbGUgc2VsZWN0aW9uIGZpZWxkJ1wiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVzXCIgKm5nSWY9XCJtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIG11bHRpcGxlID5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cImFwcC1hbmNob3JcIj57e2ZpbGVVcGxvYWRNZXNzYWdlfX08L2E+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc2luZ2xlIGZpbGUgdXBsb2FkIGluIHdlYiBhbmQgc2luZ2xlICwgbXVsdGlwbGUgZmlsZSB1cGxvYWQgVUkgaW4gbW9iaWxlIHJ1bm1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zaW5nbGUtZmlsZS11cGxvYWRcIiAqbmdJZj1cIiFfaXNDb3Jkb3ZhICYmICghbXVsdGlwbGUgfHwgX2lzTW9iaWxlVHlwZSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1idXR0b24td3JhcHBlclwiPlxuICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiBuYW1lPVwie3tmb3JtTmFtZX19XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzdXBwb3J0IGZvciBmaWxlIHVwbG9hZCBpbiBNb2JpbGVhcHAgaW4gaXRzIHJ1bm1vZGUgKFdlYikgLS0+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIm11bHRpcGxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2FjY2VwdF09XCJjaG9vc2VGaWx0ZXJcIiAoY2xpY2spPVwib25GaWxlRWxlbUNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgbXVsdGlwbGU+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZmlsZS1pbnB1dFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiaGludCB8fCAnRmlsZSBzZWxlY3Rpb24gZmllbGQnXCIgdHlwZT1cImZpbGVcIiBuYW1lPVwiZmlsZXNcIiAqbmdJZj1cIiFtdWx0aXBsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFthY2NlcHRdPVwiY2hvb3NlRmlsdGVyXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZHJvcHpvbmVcIiBmb2N1cy10YXJnZXQgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tZGVmYXVsdFwiIFtuZ0NsYXNzXT1cInsnaGlnaGxpZ2h0LWRyb3AtYm94JyA6IGhpZ2hsaWdodERyb3BBcmVhfVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtZmlsZXMtdXBsb2FkLXN0YXR1cyBzaW5nbGVcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZSBBcHBsaWNhdGlvbiAoZGV2aWNlKSAtLT5cbiAgICA8YnV0dG9uICpuZ0lmPVwiX2lzQ29yZG92YVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cIm9wZW5GaWxlU2VsZWN0b3IoKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8aSBjbGFzcz1cInt7aWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2FwdGlvblwiIFtpbm5lckhUTUxdPVwiY2FwdGlvblwiPjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIGxpc3Qgb2Ygc2VsZWN0ZWRmaWxlcyBVSSAtLT5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGZpbGUtdXBsb2FkXCIgW25nU3R5bGVdPVwie2hlaWdodDogZmlsZWxpc3RoZWlnaHQsIG92ZXJmbG93OiBvdmVyZmxvd31cIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiID5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZnQgb2YgKG11bHRpcGxlID8gbXVsdGlwbGVTZWxlY3RlZEZpbGVzIDogc2VsZWN0ZWRGaWxlcylcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIiAqbmdJZj1cImZ0LnN0YXR1cyAhPT0gJ2Fib3J0J1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24ge3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpIHwgZmlsZUljb25DbGFzc319XCIgdGl0bGU9XCJ7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSl9fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ1cGxvYWQtdGl0bGVcIj57e2Z0Lm5hbWV9fTwvbGFiZWw+PGJyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGVzaXplXCIgKm5nSWY9XCJmdC5maWxlTGVuZ3RoICAhPT0gMFwiPnt7ZnQuc2l6ZSB8IGZpbGVzaXplOjB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdHJpcGVkIHByb2dyZXNzLWJhci1pbmZvXCIgW25nU3R5bGVdPVwie3dpZHRoOiAoZnQucHJvZ3Jlc3MgKyclJyl9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1yaWdodCBtZWRpYS1taWRkbGVcIiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IGZ0LnN0YXR1cyA9PT0gJ3F1ZXVlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBmaWxlLXVwbG9hZC1zdG9wXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhYm9ydEZpbGVVcGxvYWQoZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjbGVhcmljb25jbGFzcyAhPT0gJycgJiYgZnQuc3RhdHVzICE9PSAnb25Qcm9ncmVzcydcIiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cImNsZWFyKGZ0KVwiIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBidG4tZGVmYXVsdCBzdGF0dXMtaWNvblwiIHRpdGxlPVwie3tjbGVhcmljb25oaW50fX1cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2NsZWFyaWNvbmNsYXNzfX1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnZXJyb3InXCIgdGl0bGU9XCJ7e2Z0LmVyck1zZyB8fCB0aGlzLmFwcExvY2FsZS5NRVNTQUdFX0ZJTEVfVVBMT0FEX0ZBSUxFRH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uIHt7ZnQuc3RhdHVzIHwgc3RhdGVDbGFzcyB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3VsPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZvbGRlcnMgVUkgdG8gc2hvdyB0aGUgZXJyb3IgaW4gdGl0bGUgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBmaWxlLXVwbG9hZFwiIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IGZpbGVsaXN0aGVpZ2h0LCBvdmVyZmxvdzogb3ZlcmZsb3d9XCIgdGl0bGU9XCJ7e3RoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRk9MREVSX1VQTE9BRFNfTk9UX0FMTE9XRUR9fVwiICpuZ0lmPVwic2VsZWN0ZWRGb2xkZXJzLmxlbmd0aCA+IDBcIiA+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZnQgb2Ygc2VsZWN0ZWRGb2xkZXJzXCIgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmlsZS11cGxvYWQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEgdXBsb2FkLWZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24gZmEgZmEtZm9sZGVyLW9cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidXBsb2FkLXRpdGxlXCI+e3tmdC5uYW1lfX08L2xhYmVsPjxici8+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uICB3aSB3aS1jYW5jZWwgdGV4dC1kYW5nZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG4iXX0=
719
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy93aWRnZXRzL2lucHV0L2ZpbGUtdXBsb2FkL3NyYy9maWxlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZmlsZS11cGxvYWQvc3JjL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFxQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlJLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7SUNBMUMsaUNBQXNRO0lBQS9ELEFBQWxDLDZMQUFTLDhCQUF1QixLQUFDLGtMQUFXLGdEQUF5QyxLQUFDO0lBQTNQLGlCQUFzUTs7O0lBQXpILEFBQXRCLDBDQUFxQiwrQkFBd0I7Ozs7SUFHeEssNEJBQW9HOzs7SUFBeEUsNkVBQXFDOzs7SUFDakUsZ0NBQW9FO0lBQUMsbUJBQUU7SUFBQSxpQkFBTzs7O0lBQzlFLDRCQUFrRzs7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LFNBQVM7dUJBQUMsY0FBYzs7c0JBQXFFLE1BQU07dUJBQUMsa0JBQWtCOztzQkFBRyxRQUFROztrRkFqWnRLLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcHAsIERhdGFTb3VyY2UsIGdldFdtUHJvamVjdFByb3BlcnRpZXMsIGlzQXVkaW9GaWxlLCBpc0ltYWdlRmlsZSwgaXNWaWRlb0ZpbGUsIEFic3RyYWN0RGlhbG9nU2VydmljZSwgSURHZW5lcmF0b3IgfSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge3Byb3ZpZGVBc1dpZGdldFJlZiwgU3R5bGFibGVDb21wb25lbnQsIHN0eWxlcn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5cbmltcG9ydCB7cmVnaXN0ZXJQcm9wc30gZnJvbSAnLi9maWxlLXVwbG9hZC5wcm9wcyc7XG5pbXBvcnQge2ZvckVhY2gsIGluY2x1ZGVzLCBpc0VtcHR5LCB0b0xvd2VyfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLWZpbGV1cGxvYWQnO1xuY29uc3QgV0lER0VUX0NPTkZJRyA9IHtcbiAgICB3aWRnZXRUeXBlOiAnd20tZmlsZXVwbG9hZCcsXG4gICAgaG9zdENsYXNzOiBERUZBVUxUX0NMU1xufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdbd21GaWxlVXBsb2FkXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKEZpbGVVcGxvYWRDb21wb25lbnQpXG4gICAgXVxufSlcblxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuICAgIHNlbGVjdGVkRmlsZXM6IGFueSA9IFtdO1xuICAgIHVwbG9hZGVkRmlsZXM6IGFueSA9IFtdO1xuICAgIHNlbGVjdGVkRm9sZGVyczogYW55ID0gW107XG4gICAgcHJvZ3Jlc3NPYnNlcnZhYmxlOiBTdWJqZWN0PGFueT47XG4gICAgZGVsZXRlRmlsZU9ic2VydmFibGU6IFN1YmplY3Q8YW55PjtcbiAgICBuYW1lO1xuICAgIGhpbnQ7XG4gICAgYXJpYWxhYmVsO1xuICAgIG11bHRpcGxlO1xuICAgIGZpbGVUcmFuc2ZlcnMgPSB7fTtcbiAgICBjYXB0aW9uID0gJ1VwbG9hZCc7XG4gICAgZm9ybU5hbWUgPSAnJztcbiAgICBtYXhmaWxlc2l6ZTtcbiAgICBjbGVhcmljb25jbGFzcztcbiAgICBjbGVhcmljb25oaW50O1xuICAgIHNlbGVjdGVkVXBsb2FkVHlwZVBhdGg7XG4gICAgREVGQVVMVF9DQVBUSU9OUyA9IHtcbiAgICAgICAgTVVMVElQTEVfU0VMRUNUOiAnRHJvcCB5b3VyIGZpbGVzIGhlcmUuJyxcbiAgICAgICAgU0VMRUNUOiAnU2VsZWN0J1xuICAgIH07XG4gICAgREVWSUNFX0NPTlRFTlRUWVBFUyA9IHtcbiAgICAgICAgSU1BR0U6ICdpbWFnZScsXG4gICAgICAgIFZJREVPOiAndmlkZW8nLFxuICAgICAgICBBVURJTzogJ2F1ZGlvJyxcbiAgICAgICAgRklMRVM6ICdmaWxlcydcbiAgICB9O1xuICAgIEZJTEVTSVpFX01CID0gMTA0ODU3NjtcbiAgICB3aWRnZXRQcm9wcztcbiAgICBfaXNNb2JpbGVUeXBlO1xuICAgIF9pc0NvcmRvdmE7XG4gICAgLy8gcGFyZW50UHJlZmFiU2NvcGUgPSBlbGVtZW50LmNsb3Nlc3QoJy5hcHAtcHJlZmFiJykuaXNvbGF0ZVNjb3BlKCksXG4gICAgQ09OU1RBTlRfRklMRV9TRVJWSUNFID0gJ0ZpbGVTZXJ2aWNlJztcbiAgICB1cGxvYWREYXRhID0ge1xuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIHVwbG9hZFBhdGg6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgYWxsb3dlZEZpbGVVcGxvYWRFeHRlbnNpb25zID0gZ2V0V21Qcm9qZWN0UHJvcGVydGllcygpLmFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucztcbiAgICBkZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMgPSB0aGlzLmFsbG93ZWRGaWxlVXBsb2FkRXh0ZW5zaW9ucy5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKS5tYXAoaXRlbSA9PiBpdGVtLmVuZHNXaXRoKCcvKicpID8gaXRlbSA6IGAuJHtpdGVtfWApO1xuICAgIGNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCcqLyonKSA/ICcnIDogdGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgZGF0YXNvdXJjZTtcbiAgICBkZWxldGVkYXRhc291cmNlO1xuICAgIGZpbGVVcGxvYWRNZXNzYWdlID0gJ0Ryb3AgeW91ciBmaWxlcyBoZXJlIG9yIGNsaWNrIGhlcmUgdG8gYnJvd3NlJztcbiAgICBoaWdobGlnaHREcm9wQXJlYTtcbiAgICBzaG93cHJvZ3Jlc3NiYXI7XG4gICAgc2hvd3Byb2dyZXNzYmFycGVyY2VudGFnZTtcbiAgICBkZWxldGVpY29uaGludDtcbiAgICBwcml2YXRlIHVwbG9hZFByb2dyZXNzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBkZWxldGVQcm9ncmVzc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgaWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ2ZpbGUtJyk7XG4gICAgLypfaGFzT25TdWNjZXNzRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uU3VjY2Vzcyk7XG4gICAgIF9oYXNPbkVycm9yRXZ0ID0gV00uaXNEZWZpbmVkKGF0dHJzLm9uRXJyb3IpOyovXG5cbiAgICAvLyBDaGVja2luZyBpZiB0aGUgc2VsZWN0ZWQgZmlsZSBpcyB2YWxpZCBmb3IgdGhlIGNob29zZW4gZmlsdGVyIHR5cGVcbiAgICBpc1ZhbGlkRmlsZShmaWxlbmFtZSwgY29udGVudHR5cGUsIGV4dGVuc2lvbk5hbWUsIGlzTW9iaWxlVHlwZSkge1xuICAgICAgICBsZXQgaXNWYWxpZCwgY29udGVudFR5cGVzO1xuXG4gICAgICAgIGlmICghY29udGVudHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnRUeXBlcyA9IHRvTG93ZXIoY29udGVudHR5cGUpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ2ltYWdlLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnaW1hZ2UnKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNJbWFnZUZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIGltYWdlIGFuZCB1c2VyIHVwbG9hZHMgaW1hZ2UgaXQgaXMgdmFsaWQgZmlsZVxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnYXVkaW8vKicpIHx8IChpbmNsdWRlcyhjb250ZW50VHlwZXMsICdhdWRpbycpICYmIGlzTW9iaWxlVHlwZSkpIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSBpc0F1ZGlvRmlsZShmaWxlbmFtZSk7XG4gICAgICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGNvbnRlbnQgdHlwZSBjaG9zZW4gaXMgYXVkaW8vKiBhbmQgdXNlciB1cGxvYWRzIGF1ZGlvIGl0IGlzIHZhbGlkIGZpbGVcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVzKGNvbnRlbnRUeXBlcywgJ3ZpZGVvLyonKSB8fCAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAndmlkZW8nKSAmJiBpc01vYmlsZVR5cGUpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNWaWRlb0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBjb250ZW50IHR5cGUgY2hvc2VuIGlzIHZpZGVvLyogYW5kIHVzZXIgdXBsb2FkcyB2aWRlbyBpdCBpcyB2YWxpZCBmaWxlXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qY29udGVudCB0eXBlIGFuZCB0aGUgdXBsb2FkZWQgZmlsZSBleHRlbnNpb24gc2hvdWxkIGJlIHNhbWUqL1xuICAgICAgICBpZiAoaW5jbHVkZXMoY29udGVudFR5cGVzLCAnLicgKyB0b0xvd2VyKGV4dGVuc2lvbk5hbWUpKSkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgLyogdGhpcyByZXR1cm4gdGhlIGFycmF5IG9mIGZpbGVzIHdoaWNoIGFyZSBoYXZpbmcgdGhlIGZpbGUgc2l6ZSBub3QgbW9yZSB0aGFuIG1heGZpbGVzaXplIGFuZCBmaWx0ZXJzIGJhc2VkIG9uIGNvbnRlbnR0eXBlICovXG4gICAgZ2V0VmFsaWRGaWxlcygkZmlsZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRGaWxlcyA9IFtdO1xuICAgICAgICBjb25zdCBlcnJvckZpbGVzID0gW107XG4gICAgICAgIGNvbnN0IE1BWEZJTEVVUExPQURfU0laRSA9IHBhcnNlRmxvYXQodGhpcy5tYXhmaWxlc2l6ZSkgKiB0aGlzLkZJTEVTSVpFX01CIHx8IHRoaXMuRklMRVNJWkVfTUI7XG4gICAgICAgIGNvbnN0IE1BWF9GSUxFX1VQTE9BRF9GT1JNQVRURURfU0laRSA9ICh0aGlzLm1heGZpbGVzaXplIHx8ICcxJykgKyAnTUInO1xuXG4gICAgICAgIC8vIGlmIGNvbnRlbnR0eXBlIGlzIGZpbGVzIGZvciBtb2JpbGUgcHJvamVjdHMuXG4gICAgICAgIGlmICh0aGlzLmNob29zZUZpbHRlciA9PT0gdGhpcy5ERVZJQ0VfQ09OVEVOVFRZUEVTLkZJTEVTKSB7XG4gICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yRWFjaCgkZmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAvKiBjaGVjayBmb3IgdGhlIGZpbGUgY29udGVudCB0eXBlIGJlZm9yZSB1cGxvYWRpbmcgKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkRmlsZShmaWxlLm5hbWUsIHRoaXMuY2hvb3NlRmlsdGVyLCB0aGlzLmdldEZpbGVFeHRlbnNpb24oZmlsZS5uYW1lKSwgdGhpcy5faXNNb2JpbGVUeXBlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhURU5USU9OX1ZBTElEQVRJT05fTUVTU0FHRX0gJHt0aGlzLmNob29zZUZpbHRlcn1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3JGaWxlcygnSU5WQUxJRF9GSUxFX0VYVEVOU0lPTicsIG1zZywgZmlsZSwgZXJyb3JGaWxlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IE1BWEZJTEVVUExPQURfU0laRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3RoaXMuYXBwTG9jYWxlLkxBQkVMX0ZJTEVfRVhDRUVEX1ZBTElEQVRJT05fTUVTU0FHRX0gJHtNQVhfRklMRV9VUExPQURfRk9STUFUVEVEX1NJWkV9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yRmlsZXMoJ0lOVkFMSURfRklMRV9TSVpFJywgbXNnLCBmaWxlLCBlcnJvckZpbGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsaWRGaWxlczogdmFsaWRGaWxlcyxcbiAgICAgICAgICAgIGVycm9yRmlsZXM6IGVycm9yRmlsZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvckZpbGVzKGtleSwgbXNnLCBmaWxlLCBlcnJvckZpbGVzKSB7XG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGNhbGxiYWNrIGV4aXN0IG9yIG5vdC4gSWYgaXQgZXhpc3RzIHRoZW4gZG9udCBzaG93IHRhb3N0ZXIgbWVzc2FnZVxuICAgICAgICBpZiAoIXRoaXMuaGFzRXZlbnRDYWxsYmFjaygnZXJyb3InKSkge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5QXBwKG1zZywgJ0Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3IgPSB7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1zZ1xuICAgICAgICB9O1xuICAgICAgICBmaWxlLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGVycm9yRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvKk92ZXJ3cml0ZSB0aGUgY2FwdGlvbiBvbmx5IGlmIHRoZXkgYXJlIGRlZmF1bHQqL1xuICAgIGdldENhcHRpb24oY2FwdGlvbiwgaXNNdWx0aXBsZSwgaXNNb2JpbGVUeXBlKSB7XG4gICAgICAgIGlmIChpbmNsdWRlcyh0aGlzLkRFRkFVTFRfQ0FQVElPTlMsIGNhcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNNdWx0aXBsZSAmJiAhaXNNb2JpbGVUeXBlID8gdGhpcy5ERUZBVUxUX0NBUFRJT05TLk1VTFRJUExFX1NFTEVDVCA6IHRoaXMuREVGQVVMVF9DQVBUSU9OUy5TRUxFQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHRpb247XG4gICAgfVxuXG4gICAgdXBsb2FkVXJsID0gJ3NlcnZpY2VzJztcblxuICAgIC8qIGNoYW5nZSBzZXJ2ZXIgcGF0aCBiYXNlZCBvbiB1c2VyIG9wdGlvbiAqL1xuICAgIGNoYW5nZVNlcnZlclVwbG9hZFBhdGgocGF0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXBsb2FkVHlwZVBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIC8qIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZWV4dGVuc2lvbiAqL1xuICAgIGdldEZpbGVFeHRlbnNpb24oZmlsZU5hbWUpIHtcbiAgICAgICAgaWYgKGZpbGVOYW1lICYmIGluY2x1ZGVzKGZpbGVOYW1lLCAnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxzIHNlbGVjdCBFdmVudFxuICAgICAqIEBwYXJhbSAkZXZlbnRcbiAgICAgKiBAcGFyYW0gJGZpbGVzXG4gICAgICovXG4gICAgb25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpIHtcbiAgICAgICAgJGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICBmaWxlLnVuaXF1ZUlkID0gdGhpcy5pZEdlbmVyYXRvci5uZXh0VWlkKCk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy5tdWx0aXBsZSA/IFsuLi50aGlzLnVwbG9hZGVkRmlsZXMsIC4uLiRmaWxlc10gOiAkZmlsZXM7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3QnLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50OiAkLmV4dGVuZCgkZXZlbnQuJGZpbGVzIHx8IHt9LCAkZmlsZXMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsZXM6ICRmaWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRmlsZUVsZW1DbGljaygkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHREcm9wQXJlYSA9IHRydWU7XG5cbiAgICAgICAgLy9UaGUgZmlsZSB1cGxvYWQgd2lkZ2V0IHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gbnVsbCB0byByZXVwbG9hZCB0aGUgc2FtZSBmaWxlLlxuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JylbMF0udmFsdWUgPSBudWxsO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gd2hlbiB0aGUgZmlsZXBpY2tlciBpcyBub3QgdGhlcmUgb24gdGhlIHdpbmRvdywgcmVtb3ZlIHRoZSBkcm9wem9uZSBoaWdobGlnaHRcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5kaXNhYmxlRHJvcFpvbmUuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZURyb3Bab25lKCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodERyb3BBcmVhID0gZmFsc2U7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZGlzYWJsZURyb3Bab25lKTtcbiAgICB9XG5cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIHNwZWNpZmllZCBmaWxlLiBpZiBhcmd1bWVudCBpcyBub3QgcHJvdmlkZWQsIGl0IGNsZWFycyB0aGUgY29tcGxldGUgbGlzdCAgKi9cbiAgICBjbGVhcihmaWxlT2JqKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IChmaWxlT2JqKSA/IHRoaXMuY2xlYXJGaWxlKHRoaXMuc2VsZWN0ZWRGaWxlcywgZmlsZU9iaikgOiBbXTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gKGZpbGVPYmopID8gdGhpcy5jbGVhckZpbGUodGhpcy51cGxvYWRlZEZpbGVzLCBmaWxlT2JqKSA6IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJGaWxlKGZpbGVzLCBmaWxlT2JqKSB7XG4gICAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGU/Ll9yZXNwb25zZT8uZmlsZU5hbWUgIT09IGZpbGVPYmo/Ll9yZXNwb25zZT8uZmlsZU5hbWUgfHwgZmlsZT8ubmFtZSAhPT0gZmlsZU9iaj8ubmFtZSB8fCBmaWxlICE9PSBmaWxlT2JqKTtcbiAgICB9XG5cbiAgICAvKnRoaXMgZnVuY3Rpb24gdG8gc2V0IHRoZSBjbGFzcyBuYW1lcyBmb3IgY2xlYXIgaWNvbiAqL1xuICAgIHNldENsZWFySWNvbkNsYXNzKGNsYXNzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jbGVhcmljb25jbGFzcyA9IGNsYXNzVmFsdWU7XG4gICAgfVxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIGhpbnQgZm9yIGNsZWFyIGljb24gKi9cbiAgICBzZXRDbGVhckljb25IaW50KGhpbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhcmljb25oaW50ID0gaGludDtcbiAgICB9XG5cblxuICAgIC8qdGhpcyBmdW5jdGlvbiB0byBhcHBlbmQgdXBsb2FkIHN0YXR1cyBkb20gZWxlbWVudHMgdG8gd2lkZ2V0ICovXG4gICAgb25GaWxlU2VsZWN0KCRldmVudCwgJGZpbGVzKSB7XG4gICAgICAgIGxldCBiZWZvcmVTZWxlY3RWYWw7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5nZXRWYWxpZEZpbGVzKCRmaWxlcyk7XG4gICAgICAgICRmaWxlcyA9IGZpbGVzLnZhbGlkRmlsZXM7XG5cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHByZXZpb3VzbHkgdHJpZWQgdXBsb2FkaW5nIGZvbGRlcnMgdXNpbmcgZHJvcCwgYW5kIHRoZW4gdXBsb2FkaW5nIHVzaW5nIGNsaWNrIG1ldGhvZCB3ZSBjbGVhciB0aGUgZm9sZGVycyBkb21cbiAgICAgICAgaWYgKCRldmVudC50eXBlID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBlcnJvciBjYWxsYmFjayBldmVudCBpZiBhbnkgaW52YWxpZCBmaWxlIGZvdW5kLlxuICAgICAgICBpZiAoIWlzRW1wdHkoZmlsZXMuZXJyb3JGaWxlcykpIHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgJGV2ZW50LFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcy5lcnJvckZpbGVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2UgY2FsbCBpZiB0aGVyZSBhcmUgdmFsaWQgZmlsZXMgZWxzZSBubyBjYWxsIGlzIG1hZGVcbiAgICAgICAgaWYgKCRmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEVWRU5UOiBPTl9CRUZPUkVfU0VMRUNUXG4gICAgICAgICAgICBiZWZvcmVTZWxlY3RWYWwgPSB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXNlbGVjdCcsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICQuZXh0ZW5kKCRldmVudC4kZmlsZXMgfHwge30sICRmaWxlcyksXG4gICAgICAgICAgICAgICAgZmlsZXM6ICRmaWxlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhc291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMudXBsb2FkUHJvZ3Jlc3NTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc09ic2VydmFibGUgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuX3Byb2dyZXNzT2JzZXJ2YWJsZSA9IHRoaXMucHJvZ3Jlc3NPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhc291cmNlLl9wcm9ncmVzc09ic2VydmFibGUuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKChwcm9ncmVzc09iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaCh0aGlzLnVwbG9hZGVkRmlsZXMsIChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUubmFtZSA9PT0gcHJvZ3Jlc3NPYmouZmlsZU5hbWUgJiYgZmlsZS51bmlxdWVJZCA9PT0gcHJvZ3Jlc3NPYmoudW5pcXVlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5wcm9ncmVzcyA9IHByb2dyZXNzT2JqLnByb2dyZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5wcm9ncmVzcyA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3RhdHVzID0gcHJvZ3Jlc3NPYmouc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzT2JqLmVyck1zZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZXJyTXNnID0gcHJvZ3Jlc3NPYmouZXJyTXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9ICRmaWxlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiZWZvcmVTZWxlY3RWYWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gRVZFTlQ6IE9OX1NFTEVDVFxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RFdmVudENhbGwoJGV2ZW50LCAkZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25GaWxlRGVsZXRlKCRldmVudCwgZmlsZSkge1xuICAgICAgICBpZighZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmVmb3JlRGVsZXRlVmFsID0gdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVkZWxldGUnLCB7ICRldmVudDogZmlsZSB9KTtcblxuICAgICAgICBpZiAoYmVmb3JlRGVsZXRlVmFsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dBcHBDb25maXJtRGlhbG9nKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJEZWxldGUgZmlsZVwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/XCIsXG4gICAgICAgICAgICAgICAgb2t0ZXh0OiBcIk9rXCIsXG4gICAgICAgICAgICAgICAgY2FuY2VsdGV4dDogXCJDYW5jZWxcIixcbiAgICAgICAgICAgICAgICBvbk9rOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZGF0YXNvdXJjZS5zZXRJbnB1dCgnZmlsZScsIGZpbGUuX3Jlc3BvbnNlLmZpbGVOYW1lIHx8IGZpbGUubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmRlbGV0ZVByb2dyZXNzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWxlT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkYXRhc291cmNlLl9kZWxldGVGaWxlT2JzZXJ2YWJsZSA9IHRoaXMuZGVsZXRlRmlsZU9ic2VydmFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkYXRhc291cmNlLl9kZWxldGVGaWxlT2JzZXJ2YWJsZS5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IHRoaXMuc2VsZWN0ZWRGaWxlcy5maWx0ZXIoKGZpbGVPYmopID0+IGZpbGUgIT09IGZpbGVPYmopIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVzID0gdGhpcy51cGxvYWRlZEZpbGVzLmZpbHRlcigoZmlsZU9iaikgPT4gZmlsZSAhPT0gZmlsZU9iaikgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2RlbGV0ZScsIHsgJGV2ZW50OiBmaWxlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xvc2VBcHBDb25maXJtRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xvc2VBcHBDb25maXJtRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbk9wZW46ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLmNhbmNlbC1hY3Rpb24nKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGJlaGF2aW9yIChQcmV2ZW50IGZpbGUgZnJvbSBiZWluZyBvcGVuZWQpXG4gICAgZHJhZ092ZXJIYW5kbGVyKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgY2FsbCB0aGUgb25GaWxlU2VsZWN0IGZ1bmN0aW9uXG4gICAgb25GaWxlRHJvcCgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGxldCBsaXN0T2ZGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlc0RhdGEgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zO1xuICAgICAgICBpZiAoZmlsZXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBEYXRhVHJhbnNmZXJJdGVtTGlzdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZSBmaWxlKHMpXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBmaWxlcyBhbmQgcHVzaCB0aGVtIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXNEYXRhW2ldLndlYmtpdEdldEFzRW50cnkoKS5pc0ZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mRmlsZXMucHVzaChmaWxlc0RhdGFbaV0uZ2V0QXNGaWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNlbGVjdGVkIGl0ZW0gaXMgZGlyZWN0b3J5IHB1c2ggdGhlIGZvbGRlciBlbGVtZW50IGludG8gYW4gYXJyYXkgYW5kIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSBieSBhZGRpbmcgdG8gZG9tXG4gICAgICAgICAgICAgICAgZWxzZSBpZihmaWxlc0RhdGFbaV0ud2Via2l0R2V0QXNFbnRyeSgpLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2xkZXJzLnB1c2goZmlsZXNEYXRhW2ldLmdldEFzRmlsZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRmlsZVNlbGVjdCgkZXZlbnQsIGxpc3RPZkZpbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYWdPdmVyQ2IoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcjZHJvcHpvbmUnKS5hZGRDbGFzcygnaGlnaGxpZ2h0LWRyb3AtYm94Jyk7XG4gICAgfVxuXG4gICAgZHJvcENiKCkge1xuICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnI2Ryb3B6b25lJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodC1kcm9wLWJveCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgZmlsZSBzZWxlY3Qgd2luZG93LCB3aGVuIGNsaWNrZWQgYW55d2hlcmUgb24gdGhlIGZpbGUgdXBsb2FkIHdpZGdldCBpbiBjYXNlIG9mIG11bHRpIHNlbGVjdFxuICAgIHRyaWdnZXJGaWxlU2VsZWN0KCkge1xuICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5maWxlLWlucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBmaWxlIHVwbG9hZCByZXF1ZXN0XG4gICAgICogQHBhcmFtICRmaWxlLCB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgdG8gYmUgYWJvcnRlZFxuICAgICAqL1xuICAgIGFib3J0RmlsZVVwbG9hZCgkZmlsZSkge1xuICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5DQU5DRUwsICRmaWxlKTtcbiAgICB9XG5cbiAgICBpc01pbWVUeXBlKGZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdpbWFnZS8qJykgJiYgaXNJbWFnZUZpbGUoZmlsZSkpXG4gICAgICAgICAgICB8fCAodGhpcy5kZWZhdWx0QWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJ2F1ZGlvLyonKSAmJiBpc0F1ZGlvRmlsZShmaWxlKSlcbiAgICAgICAgICAgIHx8ICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygndmlkZW8vKicpICYmIGlzVmlkZW9GaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICAvKiBEZWZpbmUgdGhlIHByb3BlcnR5IGNoYW5nZSBoYW5kbGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIHdpZGdldCBwcm9wZXJ0eSAqL1xuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpIHtcbiAgICAgICAgLypNb25pdG9yaW5nIGNoYW5nZXMgZm9yIHN0eWxlcyBvciBwcm9wZXJ0aWVzIGFuZCBhY2NvcmRpbmdseSBoYW5kbGluZyByZXNwZWN0aXZlIGNoYW5nZXMuKi9cbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZHBhdGgnOlxuICAgICAgICAgICAgICAgIC8vIFRPRE8gU3Jpbml2YXM6IHdoeSBkbyB3ZSBuZWVkIHVwbG9hZHBhdGhcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZlclVwbG9hZFBhdGgobnYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29udGVudHR5cGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcygnKi8qJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaG9vc2VGaWx0ZXIgPSBudi5zcGxpdCgnICcpLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvb3NlRmlsdGVyID0gbnYuc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiB0aGlzLmRlZmF1bHRBbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhpdGVtKSB8fCB0aGlzLmlzTWltZVR5cGUoaXRlbSkpLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5jaG9vc2VGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNob29zZUZpbHRlciA9IHRoaXMuZGVmYXVsdEFsbG93ZWRFeHRlbnNpb25zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtdWx0aXBsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtTmFtZSA9IHRoaXMubmFtZSArICh0aGlzLm11bHRpcGxlID8gJy1tdWx0aXBsZS1maWxldXBsb2FkJyA6ICctc2luZ2xlLWZpbGV1cGxvYWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb24gPSB0aGlzLmdldENhcHRpb24odGhpcy5jYXB0aW9uLCB0aGlzLm11bHRpcGxlLCB0aGlzLl9pc01vYmlsZVR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlsZXVwbG9hZG1lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZE1lc3NhZ2UgPSBudjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGluajogSW5qZWN0b3IsIHByaXZhdGUgYXBwOiBBcHAsIEBBdHRyaWJ1dGUoJ3NlbGVjdC5ldmVudCcpIHB1YmxpYyBvblNlbGVjdEV2dCwgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueSkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG4gICAgICAgIC8vIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICAvLyBhZGRpbmcsIGRyYWdvdmVyIGFuZCBkcm9wIG9uIHRoZSBkb2N1bWVudCBhcyB3aGVuIGZpbGUgaXMgZHJhZ2dlZCBvbiB0byB0aGUgcGFnZSBoaWdobGlnaHQgdGhlIGRyb3B6b25lcyBhbmQgcmVtb3ZlIGhpZ2hsaWdodCBvbiBmaWxlIGRyb3BcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdPdmVyQ2IuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BDYi5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBhZGRpbmcgbW91c2VsZWF2ZSBldm50IHRvIHJlbW92ZSBoaWdobGlnaHQgd2hlbiBmaWxlIGlzIGRyb3BwZWQgb3V0c2lkZSB0aGUgd2luZG93XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmRyb3BDYi5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHN0eWxlciggdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hcHAtYnV0dG9uLCAuZHJvcC1ib3gnKSwgdGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnT3ZlckNiKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcENiKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuZHJvcENiKTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gW3RoaXMudXBsb2FkUHJvZ3Jlc3NTdWJzY3JpcHRpb24sIHRoaXMuZGVsZXRlUHJvZ3Jlc3NTdWJzY3JpcHRpb25dO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFwcC1maWxldXBsb2FkXCIgaW5pdC13aWRnZXQ+XG4gICAgPCEtLSBkcmFnIGFuZCBkcm9wIGZpbGVzIFVJIGluIHdlYiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLW11bHRpLWZpbGUtdXBsb2FkXCIgKm5nSWY9XCIhX2lzTW9iaWxlVHlwZSAmJiBtdWx0aXBsZVwiPlxuICAgICAgICA8ZGl2IGlkPVwiZHJvcHpvbmVcIiBjbGFzcz1cImRyb3AtYm94XCIgKGNsaWNrKT1cInRyaWdnZXJGaWxlU2VsZWN0KClcIiBbbmdDbGFzc109XCJ7J2hpZ2hsaWdodC1kcm9wLWJveCcgOiBoaWdobGlnaHREcm9wQXJlYX1cIiAoZHJhZ292ZXIpPVwiZHJhZ092ZXJIYW5kbGVyKCRldmVudCk7XCIgKGRyb3ApPVwib25GaWxlRHJvcCgkZXZlbnQpO1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJ7e2ljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2lubmVySHRtbF09XCJjYXB0aW9uXCIgY2xhc3M9XCJ1cGxvYWQtbGFiZWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgbmFtZT1cInt7Zm9ybU5hbWV9fVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmaWxlLWlucHV0XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJoaW50IHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiICpuZ0lmPVwibXVsdGlwbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudCwgJGV2ZW50LnRhcmdldC5maWxlcylcIiBtdWx0aXBsZSA+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYXBwLWFuY2hvciB1cGxvYWQtbGFiZWxcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPnt7IGZpbGVVcGxvYWRNZXNzYWdlIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJjaG9vc2VGaWx0ZXJcIiBbaW5uZXJIdG1sXT1cImNob29zZUZpbHRlciArICcgb25seSAnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaG9vc2VGaWx0ZXIgJiYgbWF4ZmlsZXNpemVcIiBjbGFzcz1cInVwbG9hZC1leHRlbnNpb25zXCI+IC4gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIm1heGZpbGVzaXplXCIgW2lubmVySHRtbF09XCJtYXhmaWxlc2l6ZSArICdNQiBtYXgnXCIgY2xhc3M9XCJ1cGxvYWQtZXh0ZW5zaW9uc1wiPjwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBzaW5nbGUgZmlsZSB1cGxvYWQgaW4gd2ViIGFuZCBzaW5nbGUgLCBtdWx0aXBsZSBmaWxlIHVwbG9hZCBVSSBpbiBtb2JpbGUgcnVubW9kZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpbmdsZS1maWxlLXVwbG9hZFwiICpuZ0lmPVwiIV9pc0NvcmRvdmEgJiYgKCFtdWx0aXBsZSB8fCBfaXNNb2JpbGVUeXBlKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIG5hbWU9XCJ7e2Zvcm1OYW1lfX1cIj5cbiAgICAgICAgICAgICAgICA8IS0tIHN1cHBvcnQgZm9yIGZpbGUgdXBsb2FkIGluIE1vYmlsZWFwcCBpbiBpdHMgcnVubW9kZSAoV2ViKSAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCAkZXZlbnQudGFyZ2V0LmZpbGVzKVwiIChjbGljayk9XCJvbkZpbGVFbGVtQ2xpY2soJGV2ZW50KVwiICpuZ0lmPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBuYW1lPVwiZmlsZXNcIiB0eXBlPVwiZmlsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdCgkZXZlbnQsICRldmVudC50YXJnZXQuZmlsZXMpXCIgKGNsaWNrKT1cIm9uRmlsZUVsZW1DbGljaygkZXZlbnQpXCIgKm5nSWY9XCIhbXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNob29zZUZpbHRlclwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8ICdGaWxlIHNlbGVjdGlvbiBmaWVsZCdcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZmlsZXNcIiB0eXBlPVwiZmlsZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkcm9wem9uZVwiIGZvY3VzLXRhcmdldCBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1kZWZhdWx0XCIgW25nQ2xhc3NdPVwieydoaWdobGlnaHQtZHJvcC1ib3gnIDogaGlnaGxpZ2h0RHJvcEFyZWF9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1maWxlcy11cGxvYWQtc3RhdHVzIHNpbmdsZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gc3VwcG9ydCBmb3IgZmlsZSB1cGxvYWQgaW4gTW9iaWxlIEFwcGxpY2F0aW9uIChkZXZpY2UpIC0tPlxuICAgIDxidXR0b24gKm5nSWY9XCJfaXNDb3Jkb3ZhXCIgZm9jdXMtdGFyZ2V0IGNsYXNzPVwiYXBwLWJ1dHRvbiBidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwib3BlbkZpbGVTZWxlY3RvcigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxpIGNsYXNzPVwie3tpY29uY2xhc3N9fVwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXB0aW9uXCIgW2lubmVySFRNTF09XCJjYXB0aW9uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZpbGVzIFVJIC0tPlxuICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgZmlsZS11cGxvYWRcIiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBmaWxlbGlzdGhlaWdodCwgb3ZlcmZsb3c6IG92ZXJmbG93fVwiXG4gICAgICAgICpuZ0lmPVwidXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZ0IG9mIHVwbG9hZGVkRmlsZXNcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmaWxlLXVwbG9hZC1zdGF0dXNcIiAqbmdJZj1cImZ0LnN0YXR1cyAhPT0gJ2Fib3J0J1wiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYSB1cGxvYWQtZmlsZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24ge3tnZXRGaWxlRXh0ZW5zaW9uKGZ0Lm5hbWUpIHwgZmlsZUljb25DbGFzc319XCIgdGl0bGU9XCJ7e2dldEZpbGVFeHRlbnNpb24oZnQubmFtZSl9fVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInVwbG9hZGRldGFpbHMgY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVwbG9hZC10aXRsZVwiPnt7IGZ0LnN0b3JhZ2VOYW1lIHx8IGZ0Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdzdWNjZXNzJyAmJiAoIWRhdGFzb3VyY2UgfHwgKGRhdGFzb3VyY2UgJiYgZnQuX3Jlc3BvbnNlPy5zdWNjZXNzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlc2l6ZVwiICpuZ0lmPVwiZnQuZmlsZUxlbmd0aCAgIT09IDBcIj57e2Z0LnNpemUgfCBmaWxlc2l6ZTowfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWljb24ge3tmdC5zdGF0dXMgfCBzdGF0ZUNsYXNzIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ZnQuZXJyTXNnIHx8IHRoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRklMRV9VUExPQURfRkFJTEVEfX1cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmdC5zdGF0dXMgPT09ICdlcnJvcidcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5VcGxvYWQgRmFpbGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IHNob3dwcm9ncmVzc2JhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZ3Jlc3MgY29sLW1kLTcgdXBsb2FkLXByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJmdC5zdGF0dXMgPT09ICdlcnJvcicgPyAncHJvZ3Jlc3MtYmFyLWRhbmdlcicgOiAncHJvZ3Jlc3MtYmFyLWluZm8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInt3aWR0aDogKGZ0LnByb2dyZXNzICsnJScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3RyaXBlZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKGZ0LnN0YXR1cyA9PT0gJ29uUHJvZ3Jlc3MnIHx8IHNob3dwcm9ncmVzc2JhciAmJiBzaG93cHJvZ3Jlc3NiYXJwZXJjZW50YWdlKSAmJiBmdC5wcm9ncmVzcyBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0xIHVwbG9hZC1wcm9ncmVzcy1wZXJjZW50YWdlXCI+e3sgZnQucHJvZ3Jlc3MgKyAnJScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnb25Qcm9ncmVzcycgfHwgZnQuc3RhdHVzID09PSAncXVldWVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwiYnRuIGJ0bi10cmFuc3BhcmVudCBmaWxlLXVwbG9hZC1zdG9wXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWJvcnRGaWxlVXBsb2FkKGZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwid2kgd2ktY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cImNsZWFyKGZ0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNsZWFyaWNvbmNsYXNzICE9PSAnJyAmJiBmdC5zdGF0dXMgIT09ICdvblByb2dyZXNzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tdHJhbnNwYXJlbnQgYnRuLWRlZmF1bHQgc3RhdHVzLWljb25cIiB0aXRsZT1cInt7Y2xlYXJpY29uaGludH19XCIgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tjbGVhcmljb25jbGFzc319XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZGlhLXJpZ2h0IG1lZGlhLW1pZGRsZVwiICpuZ0lmPVwiZnQuc3RhdHVzID09PSAnc3VjY2VzcycgJiYgKCFkYXRhc291cmNlIHx8IChkYXRhc291cmNlICYmIGZ0Ll9yZXNwb25zZT8uc3VjY2VzcykpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cIm9uRmlsZURlbGV0ZSgkZXZlbnQsIGZ0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tdHJhbnNwYXJlbnQgYnRuLWRlZmF1bHQgc3RhdHVzLWljb25cIiB0aXRsZT1cInt7ZGVsZXRlaWNvbmhpbnR9fVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIndpIHdpLWRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3VsPlxuICAgIDwhLS0gbGlzdCBvZiBzZWxlY3RlZGZvbGRlcnMgVUkgdG8gc2hvdyB0aGUgZXJyb3IgaW4gdGl0bGUgLS0+XG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBmaWxlLXVwbG9hZFwiIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IGZpbGVsaXN0aGVpZ2h0LCBvdmVyZmxvdzogb3ZlcmZsb3d9XCIgdGl0bGU9XCJ7e3RoaXMuYXBwTG9jYWxlLk1FU1NBR0VfRk9MREVSX1VQTE9BRFNfTk9UX0FMTE9XRUR9fVwiICpuZ0lmPVwic2VsZWN0ZWRGb2xkZXJzLmxlbmd0aCA+IDBcIiA+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZnQgb2Ygc2VsZWN0ZWRGb2xkZXJzXCIgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZmlsZS11cGxvYWQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEgdXBsb2FkLWZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWRpYS1sZWZ0IG1lZGlhLW1pZGRsZSBmaWxlLWljb24gZmEgZmEtZm9sZGVyLW9cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtYm9keSBtZWRpYS1taWRkbGUgZmlsZS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidXBsb2FkZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidXBsb2FkLXRpdGxlXCI+e3tmdC5uYW1lfX08L2xhYmVsPjxici8+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVkaWEtcmlnaHQgbWVkaWEtbWlkZGxlXCIgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pY29uICB3aSB3aS1jYW5jZWwgdGV4dC1kYW5nZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG4iXX0=