@pega/angular-sdk-components 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/README.md +24 -0
  2. package/_shared/styles.scss +28 -0
  3. package/esm2022/lib/_bridge/angular-pconnect.mjs +416 -0
  4. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +114 -0
  5. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +228 -0
  6. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +142 -0
  7. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +50 -0
  8. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +29 -0
  9. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +31 -0
  10. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +51 -0
  11. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +80 -0
  12. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +37 -0
  13. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +31 -0
  14. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +36 -0
  15. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +25 -0
  16. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +28 -0
  17. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +42 -0
  18. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +136 -0
  19. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +33 -0
  20. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +93 -0
  21. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +18 -0
  22. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +286 -0
  23. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +98 -0
  24. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +157 -0
  25. package/esm2022/lib/_components/field/currency/currency.component.mjs +160 -0
  26. package/esm2022/lib/_components/field/date/date.component.mjs +219 -0
  27. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +200 -0
  28. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +157 -0
  29. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +197 -0
  30. package/esm2022/lib/_components/field/email/email.component.mjs +150 -0
  31. package/esm2022/lib/_components/field/integer/integer.component.mjs +155 -0
  32. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +44 -0
  33. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +155 -0
  34. package/esm2022/lib/_components/field/phone/phone.component.mjs +167 -0
  35. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +189 -0
  36. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +103 -0
  37. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +95 -0
  38. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +57 -0
  39. package/esm2022/lib/_components/field/text/text.component.mjs +138 -0
  40. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +155 -0
  41. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +69 -0
  42. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +152 -0
  43. package/esm2022/lib/_components/field/time/time.component.mjs +151 -0
  44. package/esm2022/lib/_components/field/url/url.component.mjs +150 -0
  45. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +175 -0
  46. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +491 -0
  47. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +68 -0
  48. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +24 -0
  49. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +314 -0
  50. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +32 -0
  51. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +219 -0
  52. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +31 -0
  53. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +387 -0
  54. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +47 -0
  55. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +88 -0
  56. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +144 -0
  57. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +18 -0
  58. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +80 -0
  59. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +132 -0
  60. package/esm2022/lib/_components/infra/reference/reference.component.mjs +133 -0
  61. package/esm2022/lib/_components/infra/region/region.component.mjs +33 -0
  62. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +228 -0
  63. package/esm2022/lib/_components/infra/stages/stages.component.mjs +62 -0
  64. package/esm2022/lib/_components/infra/view/view.component.mjs +173 -0
  65. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +140 -0
  66. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +43 -0
  67. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +72 -0
  68. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +196 -0
  69. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +68 -0
  70. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +239 -0
  71. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +61 -0
  72. package/esm2022/lib/_components/template/details/details.component.mjs +102 -0
  73. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +72 -0
  74. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +71 -0
  75. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +66 -0
  76. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +80 -0
  77. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +77 -0
  78. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +77 -0
  79. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +65 -0
  80. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +23 -0
  81. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +134 -0
  82. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +19 -0
  83. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +22 -0
  84. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +40 -0
  85. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +14 -0
  86. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +208 -0
  87. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +1198 -0
  88. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +61 -0
  89. package/esm2022/lib/_components/template/list-view/utils.mjs +660 -0
  90. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +44 -0
  91. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +30 -0
  92. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +30 -0
  93. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +16 -0
  94. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +30 -0
  95. package/esm2022/lib/_components/template/page/page.component.mjs +52 -0
  96. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +149 -0
  97. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +139 -0
  98. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +106 -0
  99. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +270 -0
  100. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +760 -0
  101. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +131 -0
  102. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +16 -0
  103. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +67 -0
  104. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +30 -0
  105. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +16 -0
  106. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +30 -0
  107. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +40 -0
  108. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +30 -0
  109. package/esm2022/lib/_components/template/utils.mjs +22 -0
  110. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +30 -0
  111. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +53 -0
  112. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +135 -0
  113. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +24 -0
  114. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +588 -0
  115. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +81 -0
  116. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +525 -0
  117. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +631 -0
  118. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +57 -0
  119. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +75 -0
  120. package/esm2022/lib/_components/widget/todo/todo.component.mjs +213 -0
  121. package/esm2022/lib/_components/widget/utility/utility.component.mjs +34 -0
  122. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +28 -0
  123. package/esm2022/lib/_helpers/case-utils.mjs +71 -0
  124. package/esm2022/lib/_helpers/common.mjs +20 -0
  125. package/esm2022/lib/_helpers/currency-utils.mjs +57 -0
  126. package/esm2022/lib/_helpers/date-format-utils.mjs +68 -0
  127. package/esm2022/lib/_helpers/event-util.mjs +19 -0
  128. package/esm2022/lib/_helpers/field-group-utils.mjs +47 -0
  129. package/esm2022/lib/_helpers/filter-utils.mjs +106 -0
  130. package/esm2022/lib/_helpers/formatters/currency-map.mjs +903 -0
  131. package/esm2022/lib/_helpers/formatters/format-utils.mjs +68 -0
  132. package/esm2022/lib/_helpers/tab-utils.mjs +59 -0
  133. package/esm2022/lib/_helpers/template-utils.mjs +56 -0
  134. package/esm2022/lib/_helpers/utils.mjs +386 -0
  135. package/esm2022/lib/_helpers/versionHelpers.mjs +12 -0
  136. package/esm2022/lib/_messages/error-messages.service.mjs +31 -0
  137. package/esm2022/lib/_messages/get-login-status.service.mjs +26 -0
  138. package/esm2022/lib/_messages/oauth-response.service.mjs +30 -0
  139. package/esm2022/lib/_messages/progress-spinner.service.mjs +30 -0
  140. package/esm2022/lib/_messages/reset-pconnect.service.mjs +31 -0
  141. package/esm2022/lib/_messages/update-worklist.service.mjs +30 -0
  142. package/esm2022/lib/_services/case.service.mjs +32 -0
  143. package/esm2022/lib/_services/datapage.service.mjs +52 -0
  144. package/esm2022/lib/_services/endpoints.mjs +61 -0
  145. package/esm2022/lib/_services/server-config.service.mjs +52 -0
  146. package/esm2022/lib/_types/PConnProps.interface.mjs +2 -0
  147. package/esm2022/pega-angular-sdk-components.mjs +5 -0
  148. package/esm2022/public-api.mjs +138 -0
  149. package/esm2022/sdk-local-component-map.mjs +9 -0
  150. package/fesm2022/pega-angular-sdk-components.mjs +17380 -0
  151. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -0
  152. package/index.d.ts +5 -0
  153. package/lib/_bridge/angular-pconnect.d.ts +140 -0
  154. package/lib/_bridge/component-mapper/component-mapper.component.d.ts +20 -0
  155. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +213 -0
  156. package/lib/_bridge/helpers/sdk_component_map.d.ts +3 -0
  157. package/lib/_components/designSystemExtension/alert/alert.component.d.ts +12 -0
  158. package/lib/_components/designSystemExtension/alert-banner/alert-banner.component.d.ts +13 -0
  159. package/lib/_components/designSystemExtension/banner/banner.component.d.ts +15 -0
  160. package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +20 -0
  161. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +18 -0
  162. package/lib/_components/designSystemExtension/material-details/material-details.component.d.ts +15 -0
  163. package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +12 -0
  164. package/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.d.ts +15 -0
  165. package/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.d.ts +9 -0
  166. package/lib/_components/designSystemExtension/material-utility/material-utility.component.d.ts +16 -0
  167. package/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.d.ts +11 -0
  168. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +25 -0
  169. package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +16 -0
  170. package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +23 -0
  171. package/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.d.ts +7 -0
  172. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +74 -0
  173. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +24 -0
  174. package/lib/_components/field/check-box/check-box.component.d.ts +48 -0
  175. package/lib/_components/field/currency/currency.component.d.ts +50 -0
  176. package/lib/_components/field/date/date.component.d.ts +65 -0
  177. package/lib/_components/field/date-time/date-time.component.d.ts +55 -0
  178. package/lib/_components/field/decimal/decimal.component.d.ts +46 -0
  179. package/lib/_components/field/dropdown/dropdown.component.d.ts +60 -0
  180. package/lib/_components/field/email/email.component.d.ts +44 -0
  181. package/lib/_components/field/integer/integer.component.d.ts +44 -0
  182. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +15 -0
  183. package/lib/_components/field/percentage/percentage.component.d.ts +44 -0
  184. package/lib/_components/field/phone/phone.component.d.ts +48 -0
  185. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +60 -0
  186. package/lib/_components/field/rich-text/rich-text.component.d.ts +42 -0
  187. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +37 -0
  188. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +30 -0
  189. package/lib/_components/field/text/text.component.d.ts +40 -0
  190. package/lib/_components/field/text-area/text-area.component.d.ts +45 -0
  191. package/lib/_components/field/text-content/text-content.component.d.ts +30 -0
  192. package/lib/_components/field/text-input/text-input.component.d.ts +45 -0
  193. package/lib/_components/field/time/time.component.d.ts +43 -0
  194. package/lib/_components/field/url/url.component.d.ts +43 -0
  195. package/lib/_components/field/user-reference/user-reference.component.d.ts +39 -0
  196. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +85 -0
  197. package/lib/_components/infra/Containers/flow-container/helpers.d.ts +2 -0
  198. package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +15 -0
  199. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +71 -0
  200. package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +15 -0
  201. package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +51 -0
  202. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +12 -0
  203. package/lib/_components/infra/assignment/assignment.component.d.ts +72 -0
  204. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +18 -0
  205. package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +20 -0
  206. package/lib/_components/infra/defer-load/defer-load.component.d.ts +46 -0
  207. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +8 -0
  208. package/lib/_components/infra/multi-step/multi-step.component.d.ts +31 -0
  209. package/lib/_components/infra/navbar/navbar.component.d.ts +51 -0
  210. package/lib/_components/infra/reference/reference.component.d.ts +16 -0
  211. package/lib/_components/infra/region/region.component.d.ts +14 -0
  212. package/lib/_components/infra/root-container/root-container.component.d.ts +35 -0
  213. package/lib/_components/infra/stages/stages.component.d.ts +29 -0
  214. package/lib/_components/infra/view/view.component.d.ts +40 -0
  215. package/lib/_components/template/app-shell/app-shell.component.d.ts +55 -0
  216. package/lib/_components/template/banner-page/banner-page.component.d.ts +27 -0
  217. package/lib/_components/template/case-summary/case-summary.component.d.ts +34 -0
  218. package/lib/_components/template/case-view/case-view.component.d.ts +56 -0
  219. package/lib/_components/template/confirmation/confirmation.component.d.ts +38 -0
  220. package/lib/_components/template/data-reference/data-reference.component.d.ts +41 -0
  221. package/lib/_components/template/default-form/default-form.component.d.ts +21 -0
  222. package/lib/_components/template/details/details.component.d.ts +20 -0
  223. package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +21 -0
  224. package/lib/_components/template/details-one-column/details-one-column.component.d.ts +22 -0
  225. package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +24 -0
  226. package/lib/_components/template/details-three-column/details-three-column.component.d.ts +25 -0
  227. package/lib/_components/template/details-two-column/details-two-column.component.d.ts +25 -0
  228. package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +24 -0
  229. package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +20 -0
  230. package/lib/_components/template/field-group-list/field-group-list.component.d.ts +9 -0
  231. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +52 -0
  232. package/lib/_components/template/field-value-list/field-value-list.component.d.ts +8 -0
  233. package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +16 -0
  234. package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +25 -0
  235. package/lib/_components/template/list-page/list-page.component.d.ts +7 -0
  236. package/lib/_components/template/list-view/DefaultViewMeta.d.ts +1 -0
  237. package/lib/_components/template/list-view/list-view.component.d.ts +157 -0
  238. package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -0
  239. package/lib/_components/template/list-view/utils.d.ts +118 -0
  240. package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +25 -0
  241. package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +14 -0
  242. package/lib/_components/template/one-column/one-column.component.d.ts +14 -0
  243. package/lib/_components/template/one-column-page/one-column-page.component.d.ts +9 -0
  244. package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +14 -0
  245. package/lib/_components/template/page/page.component.d.ts +25 -0
  246. package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +35 -0
  247. package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +37 -0
  248. package/lib/_components/template/simple-table/simple-table.component.d.ts +43 -0
  249. package/lib/_components/template/simple-table-manual/helpers.d.ts +81 -0
  250. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +159 -0
  251. package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +32 -0
  252. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +9 -0
  253. package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +26 -0
  254. package/lib/_components/template/three-column/three-column.component.d.ts +14 -0
  255. package/lib/_components/template/three-column-page/three-column-page.component.d.ts +9 -0
  256. package/lib/_components/template/two-column/two-column.component.d.ts +14 -0
  257. package/lib/_components/template/two-column-page/two-column-page.component.d.ts +17 -0
  258. package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +14 -0
  259. package/lib/_components/template/utils.d.ts +2 -0
  260. package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +14 -0
  261. package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +20 -0
  262. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +50 -0
  263. package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +19 -0
  264. package/lib/_components/widget/attachment/attachment.component.d.ts +99 -0
  265. package/lib/_components/widget/case-history/case-history.component.d.ts +24 -0
  266. package/lib/_components/widget/feed-container/feed-container.component.d.ts +49 -0
  267. package/lib/_components/widget/file-utility/file-utility.component.d.ts +150 -0
  268. package/lib/_components/widget/list-utility/list-utility.component.d.ts +23 -0
  269. package/lib/_components/widget/quick-create/quick-create.component.d.ts +29 -0
  270. package/lib/_components/widget/todo/todo.component.d.ts +64 -0
  271. package/lib/_components/widget/utility/utility.component.d.ts +25 -0
  272. package/lib/_directives/thousand-seperator.directive.d.ts +9 -0
  273. package/lib/_helpers/case-utils.d.ts +19 -0
  274. package/lib/_helpers/common.d.ts +3 -0
  275. package/lib/_helpers/currency-utils.d.ts +10 -0
  276. package/lib/_helpers/date-format-utils.d.ts +12 -0
  277. package/lib/_helpers/event-util.d.ts +2 -0
  278. package/lib/_helpers/field-group-utils.d.ts +16 -0
  279. package/lib/_helpers/filter-utils.d.ts +46 -0
  280. package/lib/_helpers/formatters/currency-map.d.ts +1132 -0
  281. package/lib/_helpers/formatters/format-utils.d.ts +8 -0
  282. package/lib/_helpers/tab-utils.d.ts +4 -0
  283. package/lib/_helpers/template-utils.d.ts +16 -0
  284. package/lib/_helpers/utils.d.ts +32 -0
  285. package/lib/_helpers/versionHelpers.d.ts +8 -0
  286. package/lib/_messages/error-messages.service.d.ts +15 -0
  287. package/lib/_messages/get-login-status.service.d.ts +10 -0
  288. package/lib/_messages/oauth-response.service.d.ts +14 -0
  289. package/lib/_messages/progress-spinner.service.d.ts +14 -0
  290. package/lib/_messages/reset-pconnect.service.d.ts +15 -0
  291. package/lib/_messages/update-worklist.service.d.ts +14 -0
  292. package/lib/_services/case.service.d.ts +12 -0
  293. package/lib/_services/datapage.service.d.ts +14 -0
  294. package/lib/_services/endpoints.d.ts +39 -0
  295. package/lib/_services/server-config.service.d.ts +31 -0
  296. package/lib/_types/PConnProps.interface.d.ts +17 -0
  297. package/package.json +28 -0
  298. package/public-api.d.ts +133 -0
  299. package/sdk-local-component-map.d.ts +2 -0
  300. package/sdk-local-component-map.ts +12 -0
@@ -0,0 +1,588 @@
1
+ import { Component, Input, forwardRef } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatButtonModule } from '@angular/material/button';
4
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
5
+ import download from 'downloadjs';
6
+ import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../../_bridge/angular-pconnect";
9
+ import * as i2 from "../../../_helpers/utils";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/material/progress-spinner";
12
+ import * as i5 from "@angular/material/button";
13
+ export class AttachmentComponent {
14
+ constructor(angularPConnect, utils, ngZone) {
15
+ this.angularPConnect = angularPConnect;
16
+ this.utils = utils;
17
+ this.ngZone = ngZone;
18
+ // For interaction with AngularPConnect
19
+ this.angularPConnectData = {};
20
+ this.label$ = '';
21
+ this.bRequired$ = false;
22
+ this.bReadonly$ = false;
23
+ this.bDisabled$ = false;
24
+ this.bVisible$ = true;
25
+ this.bLoading$ = false;
26
+ this.arFiles$ = [];
27
+ this.arFileList$ = [];
28
+ this.arMenuList$ = [];
29
+ this.bShowSelector$ = true;
30
+ this.bShowJustDelete$ = false;
31
+ this.fileTemp = {};
32
+ this.allowMultiple$ = false;
33
+ this.extensions$ = '';
34
+ this.status = '';
35
+ this.validateMessage = '';
36
+ this.fileDownload = (data, fileName, ext) => {
37
+ const file = ext ? `${fileName}.${ext}` : fileName;
38
+ download(atob(data), file);
39
+ };
40
+ this.getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
41
+ this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
42
+ let actions;
43
+ let isDownloadable = false;
44
+ if (att.progress && att.progress !== 100) {
45
+ actions = [
46
+ {
47
+ id: `Cancel-${att.ID}`,
48
+ text: this.pConn$.getLocalizedValue('Cancel', '', ''),
49
+ icon: 'times',
50
+ onClick: cancelFile
51
+ }
52
+ ];
53
+ }
54
+ else if (att.links) {
55
+ const isFile = att.type === 'FILE';
56
+ const ID = att.ID.replace(/\s/gi, '');
57
+ const actionsMap = new Map([
58
+ [
59
+ 'download',
60
+ {
61
+ id: `download-${ID}`,
62
+ text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
63
+ icon: isFile ? 'download' : 'open',
64
+ onClick: downloadFile
65
+ }
66
+ ],
67
+ [
68
+ 'delete',
69
+ {
70
+ id: `Delete-${ID}`,
71
+ text: this.pConn$.getLocalizedValue('Delete', '', ''),
72
+ icon: 'trash',
73
+ onClick: deleteFile
74
+ }
75
+ ]
76
+ ]);
77
+ actions = [];
78
+ actionsMap.forEach((action, actionKey) => {
79
+ if (att.links[actionKey]) {
80
+ actions.push(action);
81
+ }
82
+ });
83
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
84
+ isDownloadable = att.links.download;
85
+ }
86
+ else if (att.error) {
87
+ actions = [
88
+ {
89
+ id: `Remove-${att.ID}`,
90
+ text: this.pConn$.getLocalizedValue('Remove', '', ''),
91
+ icon: 'trash',
92
+ onClick: removeFile
93
+ }
94
+ ];
95
+ }
96
+ return {
97
+ id: att.ID,
98
+ visual: {
99
+ icon: this.utils.getIconForAttachment(att),
100
+ progress: att.progress == 100 ? undefined : att.progress
101
+ },
102
+ primary: {
103
+ type: att.type,
104
+ name: att.error ? att.fileName : att.name,
105
+ icon: 'trash',
106
+ click: removeFile
107
+ },
108
+ secondary: {
109
+ text: att.meta,
110
+ error: att.error
111
+ },
112
+ actions
113
+ };
114
+ };
115
+ this.validateFileExtension = (fileObj, allowedExtensions) => {
116
+ if (!allowedExtensions) {
117
+ return true;
118
+ }
119
+ const allowedExtensionList = allowedExtensions
120
+ .toLowerCase()
121
+ .split(',')
122
+ .map(item => item.replaceAll('.', '').trim());
123
+ const extension = fileObj.name.split('.').pop().toLowerCase();
124
+ return allowedExtensionList.includes(extension);
125
+ };
126
+ }
127
+ ngOnInit() {
128
+ // // First thing in initialization is registering and subscribing to the AngularPConnect service
129
+ this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
130
+ this.removeFileFromList$ = { onClick: this._removeFileFromList.bind(this) };
131
+ this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
132
+ // let configProps: any = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
133
+ this.checkAndUpdate();
134
+ }
135
+ checkAndUpdate() {
136
+ // Should always check the bridge to see if the component should
137
+ // update itself (re-render)
138
+ const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
139
+ // ONLY call updateSelf when the component should update
140
+ if (bUpdateSelf) {
141
+ this.updateSelf();
142
+ }
143
+ }
144
+ ngOnDestroy() {
145
+ if (this.angularPConnectData.unsubscribeFn) {
146
+ this.angularPConnectData.unsubscribeFn();
147
+ }
148
+ PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
149
+ }
150
+ // Callback passed when subscribing to store change
151
+ onStateChange() {
152
+ this.checkAndUpdate();
153
+ }
154
+ updateAttachmentsInfo() {
155
+ // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
156
+ if (!this.pConn$.attachmentsInfo) {
157
+ // @ts-ignore - Property 'attachmentsInfo' does not exist on type 'C11nEnv'
158
+ this.pConn$.attachmentsInfo = {
159
+ type: 'File',
160
+ attachmentFieldName: this.att_valueRef,
161
+ category: this.att_categoryName
162
+ };
163
+ }
164
+ }
165
+ processFile(file, i) {
166
+ file.props.type = file.responseProps.pyMimeFileExtension;
167
+ file.props.mimeType = file.responseProps.pyMimeFileExtension;
168
+ file.props.ID = file.responseProps.pzInsKey;
169
+ const arMenuList = [
170
+ {
171
+ icon: 'download',
172
+ text: this.pConn$.getLocalizedValue('Download', '', ''),
173
+ onClick: () => this._downloadFileFromList(this.value$.pxResults[i])
174
+ },
175
+ {
176
+ icon: 'trash',
177
+ text: this.pConn$.getLocalizedValue('Delete', '', ''),
178
+ onClick: () => this._removeFileFromList(this.arFileList$[i])
179
+ }
180
+ ];
181
+ const arFilesAttachmentIDs = [];
182
+ this.arFileList$.forEach(arFile => {
183
+ arFilesAttachmentIDs.push(arFile.id);
184
+ });
185
+ if (!arFilesAttachmentIDs.includes(file.props.ID)) {
186
+ this.arFileList$.push(this.getNewListUtilityItemProps({
187
+ att: file.props,
188
+ downloadFile: null,
189
+ cancelFile: null,
190
+ deleteFile: null,
191
+ removeFile: null
192
+ }));
193
+ }
194
+ this.arFileList$[i].actions = arMenuList;
195
+ this.arFileList$[i].noDeleteIcon = true;
196
+ this.bShowSelector$ = false;
197
+ }
198
+ updateSelf() {
199
+ const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
200
+ const stateProps = this.pConn$.getStateProps();
201
+ const { value, label, extensions } = configProps;
202
+ if (configProps.required != null) {
203
+ this.bRequired$ = this.utils.getBooleanValue(configProps.required);
204
+ }
205
+ if (configProps.visibility != null) {
206
+ this.bVisible$ = this.utils.getBooleanValue(configProps.visibility);
207
+ }
208
+ // disabled
209
+ if (configProps.disabled != undefined) {
210
+ this.bDisabled$ = this.utils.getBooleanValue(configProps.disabled);
211
+ }
212
+ if (configProps.readOnly != null) {
213
+ this.bReadonly$ = this.utils.getBooleanValue(configProps.readOnly);
214
+ }
215
+ if (configProps.allowMultiple != null) {
216
+ this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
217
+ }
218
+ this.bShowJustDelete$ = true;
219
+ this.label$ = label;
220
+ this.value$ = value;
221
+ this.status = stateProps.status;
222
+ this.validateMessage = this.angularPConnectData.validateMessage;
223
+ this.extensions$ = extensions;
224
+ this.valueRef = this.pConn$.getStateProps().value;
225
+ this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
226
+ /* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
227
+ let { required, disabled } = configProps;
228
+ [required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
229
+ this.att_categoryName = '';
230
+ if (value && value.pyCategoryName) {
231
+ this.att_categoryName = value.pyCategoryName;
232
+ }
233
+ this.att_valueRef = this.pConn$.getStateProps().value;
234
+ this.att_valueRef = this.att_valueRef.indexOf('.') === 0 ? this.att_valueRef.substring(1) : this.att_valueRef;
235
+ this.updateAttachments();
236
+ }
237
+ updateAttachments() {
238
+ const attachmentsFromServer = this.value$ && this.value$.pxResults && +this.value$.pyCount > 0;
239
+ if (attachmentsFromServer) {
240
+ this.updateAttachmentsFromServer();
241
+ }
242
+ else {
243
+ // Get the attachments from the Redux
244
+ this.myFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
245
+ if (this.myFiles?.length && this.arFiles$.length === 0) {
246
+ this.arFileList$ = this.myFiles.map(att => {
247
+ return this.getNewListUtilityItemProps({
248
+ att,
249
+ downloadFile: null,
250
+ cancelFile: null,
251
+ deleteFile: null,
252
+ removeFile: null
253
+ });
254
+ });
255
+ }
256
+ const myFilesAttachmentIDs = [];
257
+ this.myFiles.forEach(myFile => {
258
+ myFilesAttachmentIDs.push(myFile.ID);
259
+ });
260
+ this.arFiles$.forEach(arFile => {
261
+ if (!myFilesAttachmentIDs.includes(arFile.ID)) {
262
+ this.myFiles = [...this.myFiles, arFile];
263
+ }
264
+ });
265
+ }
266
+ this.bShowJustDelete$ = true;
267
+ this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
268
+ if (this.arFileList$.length > 0) {
269
+ this.CheckForInvalidAttachment();
270
+ }
271
+ PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
272
+ }
273
+ updateAttachmentsFromServer() {
274
+ this.value$.pxResults.forEach((attachment, i) => {
275
+ const file = this.buildFilePropsFromResponse(attachment);
276
+ if (file.responseProps) {
277
+ this.updateAttachmentsInfo();
278
+ if (file.responseProps.pzInsKey && !file.responseProps.pzInsKey.includes('temp')) {
279
+ this.processFile(file, i);
280
+ }
281
+ if (file) {
282
+ const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
283
+ const index = currentAttachmentList.findIndex(element => element.props.ID === file.props.ID);
284
+ let tempFiles = [];
285
+ if (index < 0) {
286
+ tempFiles = [file];
287
+ }
288
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...tempFiles], {
289
+ pageReference: 'context_data',
290
+ isArrayDeepMerge: false
291
+ });
292
+ }
293
+ }
294
+ });
295
+ }
296
+ resetAttachmentStoredState() {
297
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), undefined, {
298
+ pageReference: 'context_data',
299
+ isArrayDeepMerge: false
300
+ });
301
+ }
302
+ _downloadFileFromList(fileObj) {
303
+ PCore.getAttachmentUtils()
304
+ // @ts-ignore - 3rd parameter "responseEncoding" should be optional
305
+ .downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
306
+ .then((content) => {
307
+ const extension = fileObj.pyAttachName.split('.').pop();
308
+ this.fileDownload(content.data, fileObj.pyFileName, extension);
309
+ })
310
+ .catch(e => {
311
+ console.log(e);
312
+ });
313
+ }
314
+ CheckForInvalidAttachment() {
315
+ let isValid = true;
316
+ this.arFileList$.forEach(file => {
317
+ if (file.secondary.error) {
318
+ isValid = false;
319
+ }
320
+ });
321
+ if (isValid) {
322
+ // @ts-ignore
323
+ PCore.getMessageManager().clearMessages({
324
+ type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
325
+ property: this.pConn$.getStateProps().value,
326
+ pageReference: this.pConn$.getPageReference(),
327
+ context: this.pConn$.getContextName()
328
+ });
329
+ }
330
+ }
331
+ _removeFileFromList(item) {
332
+ const fileListIndex = this.arFileList$.findIndex(element => element?.id === item?.id);
333
+ const fileIndex = this.arFiles$.findIndex(element => element?.ID === item?.id);
334
+ const attachmentsList = [];
335
+ let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName());
336
+ if (this.value$ && this.value$.pxResults && +this.value$.pyCount > 0 && item.actions) {
337
+ const updatedAttachments = currentAttachmentList.map(attachment => {
338
+ if (attachment?.ID === this.arFileList$[fileListIndex].id || attachment?.props?.ID === this.arFileList$[fileListIndex].id) {
339
+ return { ...attachment, delete: true, label: this.valueRef };
340
+ }
341
+ return attachment;
342
+ });
343
+ // updating the redux store to help form-handler in passing the data to delete the file from server
344
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), updatedAttachments, {
345
+ pageReference: 'context_data',
346
+ isArrayDeepMerge: false
347
+ });
348
+ }
349
+ else {
350
+ currentAttachmentList = currentAttachmentList.filter(f => f.ID !== item.id);
351
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...attachmentsList], {
352
+ pageReference: 'context_data',
353
+ isArrayDeepMerge: false
354
+ });
355
+ }
356
+ if (fileListIndex > -1) {
357
+ this.arFileList$.splice(fileListIndex, 1);
358
+ }
359
+ if (fileIndex > -1) {
360
+ this.arFiles$.splice(fileIndex, 1);
361
+ }
362
+ this.CheckForInvalidAttachment();
363
+ this.bShowSelector$ = !(this.arFileList$?.length > 0) || this.allowMultiple$;
364
+ }
365
+ getCurrentAttachmentsList(key, context) {
366
+ return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
367
+ }
368
+ errorHandler(isFetchCanceled, file) {
369
+ return error => {
370
+ if (!isFetchCanceled(error)) {
371
+ let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
372
+ if (error.response && error.response.data && error.response.data.errorDetails) {
373
+ uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
374
+ }
375
+ for (const myFile of this.myFiles) {
376
+ if (myFile.ID === file.ID) {
377
+ myFile.meta = uploadFailMsg;
378
+ myFile.error = true;
379
+ myFile.fileName = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
380
+ }
381
+ }
382
+ this.bShowSelector$ = false;
383
+ this.arFileList$ = this.myFiles.map(att => {
384
+ if (att.id) {
385
+ return att;
386
+ }
387
+ return this.getNewListUtilityItemProps({
388
+ att,
389
+ downloadFile: null,
390
+ cancelFile: null,
391
+ deleteFile: null,
392
+ removeFile: null
393
+ });
394
+ });
395
+ PCore.getMessageManager().addMessages({
396
+ // @ts-ignore
397
+ messages: [
398
+ {
399
+ type: 'error',
400
+ message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
401
+ }
402
+ ],
403
+ property: this.pConn$.getStateProps().value,
404
+ pageReference: this.pConn$.getPageReference(),
405
+ context: this.pConn$.getContextName()
406
+ });
407
+ this.bShowJustDelete$ = true;
408
+ this.bLoading$ = false;
409
+ }
410
+ throw error;
411
+ };
412
+ }
413
+ uploadMyFiles(event) {
414
+ let arrAttachmentFiles = [];
415
+ if (this.arFiles$.length) {
416
+ arrAttachmentFiles = this.arFiles$;
417
+ }
418
+ else {
419
+ arrAttachmentFiles = this.arFileList$;
420
+ }
421
+ this.arFiles$ = [...arrAttachmentFiles, ...this.getFiles(event.target.files)];
422
+ // convert FileList to an array
423
+ this.myFiles = Array.from(this.arFiles$);
424
+ this.bLoading$ = true;
425
+ const filesToBeUploaded = this.myFiles
426
+ .filter(e => {
427
+ if (e.id) {
428
+ return false;
429
+ }
430
+ const isFileUploaded = e && e.progress === 100;
431
+ const fileHasError = e && e.error;
432
+ const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
433
+ return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
434
+ })
435
+ .map(f => PCore.getAttachmentUtils().uploadAttachment(f, () => {
436
+ this.onUploadProgress();
437
+ }, isFetchCanceled => {
438
+ return this.errorHandler(isFetchCanceled, f);
439
+ }, this.pConn$.getContextName()));
440
+ Promise.allSettled(filesToBeUploaded)
441
+ .then((fileResponses) => {
442
+ this.handleFileUploadSuccess(fileResponses);
443
+ })
444
+ .catch(error => {
445
+ console.log(error);
446
+ this.handleFileUploadFailure();
447
+ });
448
+ }
449
+ handleFileUploadSuccess(fileResponses) {
450
+ const successFileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
451
+ let reqObj;
452
+ if (successFileResponses.length > 0) {
453
+ const tempFilesUploaded = [...this.arFiles$.filter(file => !file.id)];
454
+ let newAttachments = [];
455
+ tempFilesUploaded.forEach(fileRes => {
456
+ const index = successFileResponses.findIndex((fr) => fr.value.clientFileID === fileRes.ID);
457
+ if (index >= 0) {
458
+ reqObj = {
459
+ type: 'File',
460
+ label: this.att_valueRef,
461
+ category: this.att_categoryName,
462
+ handle: successFileResponses[index].value.ID,
463
+ ID: fileRes.ID,
464
+ name: fileRes.name
465
+ };
466
+ newAttachments = [...newAttachments, reqObj];
467
+ }
468
+ });
469
+ const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.att_valueRef), this.pConn$.getContextName()).filter(f => f.label !== this.att_valueRef);
470
+ PCore.getStateUtils().updateState(this.pConn$.getContextName(), this.getAttachmentKey(this.att_valueRef), [...currentAttachmentList, ...newAttachments], {
471
+ pageReference: 'context_data',
472
+ isArrayDeepMerge: false
473
+ });
474
+ this.arFiles$ = tempFilesUploaded;
475
+ this.ngZone.run(() => {
476
+ this.bShowSelector$ = this.allowMultiple$;
477
+ this.arFiles$.forEach(file => {
478
+ if (!file.error) {
479
+ file.meta = this.pConn$.getLocalizedValue('File uploaded successfully', '', '');
480
+ }
481
+ });
482
+ this.arFileList$ = this.myFiles.map(att => {
483
+ if (att.id) {
484
+ return att;
485
+ }
486
+ return this.getNewListUtilityItemProps({
487
+ att,
488
+ downloadFile: null,
489
+ cancelFile: null,
490
+ deleteFile: null,
491
+ removeFile: null
492
+ });
493
+ });
494
+ this.CheckForInvalidAttachment();
495
+ this.bShowJustDelete$ = true;
496
+ this.bLoading$ = false;
497
+ });
498
+ }
499
+ }
500
+ handleFileUploadFailure() {
501
+ this.bShowJustDelete$ = true;
502
+ this.bLoading$ = false;
503
+ this.bShowSelector$ = this.allowMultiple$;
504
+ this.myFiles.forEach(file => {
505
+ if (file?.secondary?.error) {
506
+ file.meta = 'File uploaded failed';
507
+ }
508
+ });
509
+ this.arFileList$ = this.myFiles.map(att => {
510
+ return this.getNewListUtilityItemProps({
511
+ att,
512
+ downloadFile: null,
513
+ cancelFile: null,
514
+ deleteFile: null,
515
+ removeFile: null
516
+ });
517
+ });
518
+ this.bShowJustDelete$ = true;
519
+ this.bLoading$ = false;
520
+ }
521
+ onUploadProgress() { }
522
+ getFiles(arFiles) {
523
+ const files = this.allowMultiple$ ? arFiles : [arFiles[0]];
524
+ return this.setNewFiles(files);
525
+ }
526
+ setNewFiles(arFiles) {
527
+ let index = 0;
528
+ const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || 5;
529
+ for (const file of arFiles) {
530
+ file.mimeType = file.type;
531
+ file.icon = this.utils.getIconFromFileType(file.type);
532
+ file.ID = `${new Date().getTime()}I${index}`;
533
+ if (!this.validateMaxSize(file, maxAttachmentSize)) {
534
+ file.error = true;
535
+ file.meta = this.pConn$.getLocalizedValue('File is too big. Max allowed size is 5MB.', '', '');
536
+ }
537
+ else if (!this.validateFileExtension(file, this.extensions$)) {
538
+ file.error = true;
539
+ file.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
540
+ }
541
+ if (file.error) {
542
+ const fieldName = this.pConn$.getStateProps().value;
543
+ const context = this.pConn$.getContextName();
544
+ PCore.getMessageManager().addMessages({
545
+ // @ts-ignore
546
+ messages: [
547
+ {
548
+ type: 'error',
549
+ message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
550
+ }
551
+ ],
552
+ property: fieldName,
553
+ pageReference: this.pConn$.getPageReference(),
554
+ context
555
+ });
556
+ }
557
+ index++;
558
+ }
559
+ return [...arFiles];
560
+ }
561
+ validateMaxSize(fileObj, maxSizeInMB) {
562
+ const fileSize = (fileObj.size / 1048576).toFixed(2);
563
+ return parseFloat(fileSize) < parseFloat(maxSizeInMB);
564
+ }
565
+ buildFilePropsFromResponse(respObj) {
566
+ return {
567
+ props: {
568
+ meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
569
+ name: respObj.pyAttachName,
570
+ icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
571
+ },
572
+ responseProps: {
573
+ ...respObj
574
+ }
575
+ };
576
+ }
577
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
578
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, ngImport: i0, template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:#262626}.file-error{color:#e57373}.psdk-modal-file-selector-error{border:1px dashed #e57373;width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid grey}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(function () { return CommonModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgForOf; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return i3.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatProgressSpinnerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i4.MatProgressSpinner; }), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatButtonModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i5.MatButton; }), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(function () { return ComponentMapperComponent; }), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
579
+ }
580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttachmentComponent, decorators: [{
581
+ type: Component,
582
+ args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"psdk-label-infix-readonly\" *ngIf=\"bVisible$\">\n <span class=\"psdk-label-wrapper-readonly\">\n <label [ngClass]=\"{ 'psdk-label-readonly': true, 'label-required': bRequired$ === true }\" [htmlFor]=\"att_valueRef\">{{ label$ }}</label>\n </span>\n <div\n [ngClass]=\"{ 'psdk-modal-file-selector': status !== 'error', 'psdk-modal-file-selector-error': status === 'error' }\"\n id=\"attachment-container\"\n *ngIf=\"bShowSelector$\"\n >\n <mat-spinner *ngIf=\"bLoading$\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"att_valueRef\" [multiple]=\"allowMultiple$\" (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{ allowMultiple$ ? 'Upload files' : 'Upload file' }}\n </button>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n\n <div class=\"psdk-attachment-list\" *ngIf=\"arFileList$ != null && arFileList$.length > 0\">\n <div *ngFor=\"let attachment of arFileList$\">\n <component-mapper\n *ngIf=\"attachment.noDeleteIcon !== true; else showfull\"\n name=\"SummaryItem\"\n [props]=\"{ item$: attachment, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n <ng-template #showfull>\n <component-mapper name=\"SummaryItem\" [props]=\"{ item$: attachment, menuIconOverrideAction$: removeFileFromList$ }\"></component-mapper>\n </ng-template>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed #262626;width:100%;padding:.3rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:#262626}.file-error{color:#e57373}.psdk-modal-file-selector-error{border:1px dashed #e57373;width:100%;padding:.3rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid grey}::ng-deep .mat-mdc-form-field-infix{width:auto}\n"] }]
583
+ }], ctorParameters: function () { return [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }]; }, propDecorators: { pConn$: [{
584
+ type: Input
585
+ }], formGroup$: [{
586
+ type: Input
587
+ }] } });
588
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7QUFpQnhHLE1BQU0sT0FBTyxtQkFBbUI7SUFpQzlCLFlBQ1UsZUFBdUMsRUFDdkMsS0FBWSxFQUNaLE1BQWM7UUFGZCxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDdkMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFoQ3hCLHVDQUF1QztRQUN2Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixj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QUFDLFlBQVk7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQzthQUNsRTtZQUNELGFBQWEsRUFBRTtnQkFDYixHQUFHLE9BQU87YUFDWDtTQUNGLENBQUM7SUFDSixDQUFDOytHQXRxQlUsbUJBQW1CO21HQUFuQixtQkFBbUIsa0lDekJoQyxtbkRBK0JBLCt0QkRSWSxZQUFZLHlmQUFFLHdCQUF3QixnVEFBRSxlQUFlLDBWQUFtQix3QkFBd0I7OzRGQUVqRyxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBR2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztzSkFHckcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE5nWm9uZSwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IGRvd25sb2FkIGZyb20gJ2Rvd25sb2FkanMnO1xuaW1wb3J0IHsgQW5ndWxhclBDb25uZWN0RGF0YSwgQW5ndWxhclBDb25uZWN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvYW5ndWxhci1wY29ubmVjdCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL19oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL19icmlkZ2UvY29tcG9uZW50LW1hcHBlci9jb21wb25lbnQtbWFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQQ29ubkZpZWxkUHJvcHMgfSBmcm9tICcuLi8uLi8uLi9fdHlwZXMvUENvbm5Qcm9wcy5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgQXR0YWNobWVudFByb3BzIGV4dGVuZHMgT21pdDxQQ29ubkZpZWxkUHJvcHMsICd2YWx1ZSc+IHtcbiAgLy8gSWYgYW55LCBlbnRlciBhZGRpdGlvbmFsIHByb3BzIHRoYXQgb25seSBleGlzdCBvbiB0aGlzIGNvbXBvbmVudFxuICB2YWx1ZTogYW55O1xuICBleHRlbnNpb25zOiBhbnk7XG4gIGFsbG93TXVsdGlwbGU6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdHRhY2htZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBmb3J3YXJkUmVmKCgpID0+IENvbXBvbmVudE1hcHBlckNvbXBvbmVudCldXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuICBASW5wdXQoKSBmb3JtR3JvdXAkOiBGb3JtR3JvdXA7XG5cbiAgLy8gRm9yIGludGVyYWN0aW9uIHdpdGggQW5ndWxhclBDb25uZWN0XG4gIGFuZ3VsYXJQQ29ubmVjdERhdGE6IEFuZ3VsYXJQQ29ubmVjdERhdGEgPSB7fTtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBhckZpbGVzJDogYW55W10gPSBbXTtcbiAgYXJGaWxlTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUZpbGVGcm9tTGlzdCQ6IGFueTtcbiAgYXJNZW51TGlzdCQ6IGFueVtdID0gW107XG4gIGJTaG93U2VsZWN0b3IkID0gdHJ1ZTtcbiAgYlNob3dKdXN0RGVsZXRlJCA9IGZhbHNlO1xuICBhdHRfdmFsdWVSZWY6IGFueTtcbiAgYXR0X2NhdGVnb3J5TmFtZTogc3RyaW5nO1xuICBhdHRfaWQ6IHN0cmluZztcbiAgbXlGaWxlczogYW55O1xuICBmaWxlVGVtcDogYW55ID0ge307XG4gIGNhc2VJRDogYW55O1xuICBhbGxvd011bHRpcGxlJCA9IGZhbHNlO1xuICBleHRlbnNpb25zJCA9ICcnO1xuICBzdGF0dXMgPSAnJztcbiAgdmFsaWRhdGVNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnJztcbiAgdmFsdWVSZWY6IHN0cmluZztcbiAgaW1hZ2VQYXRoJDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYW5ndWxhclBDb25uZWN0OiBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIC8vIEZpcnN0IHRoaW5nIGluIGluaXRpYWxpemF0aW9uIGlzIHJlZ2lzdGVyaW5nIGFuZCBzdWJzY3JpYmluZyB0byB0aGUgQW5ndWxhclBDb25uZWN0IHNlcnZpY2VcbiAgICB0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5yZWdpc3RlckFuZFN1YnNjcmliZUNvbXBvbmVudCh0aGlzLCB0aGlzLm9uU3RhdGVDaGFuZ2UpO1xuXG4gICAgdGhpcy5yZW1vdmVGaWxlRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLl9yZW1vdmVGaWxlRnJvbUxpc3QuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAvLyBsZXQgY29uZmlnUHJvcHM6IGFueSA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKTtcbiAgICB0aGlzLmNoZWNrQW5kVXBkYXRlKCk7XG4gIH1cblxuICBjaGVja0FuZFVwZGF0ZSgpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkXG4gICAgLy8gdXBkYXRlIGl0c2VsZiAocmUtcmVuZGVyKVxuICAgIGNvbnN0IGJVcGRhdGVTZWxmID0gdGhpcy5hbmd1bGFyUENvbm5lY3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKHRoaXMpO1xuXG4gICAgLy8gT05MWSBjYWxsIHVwZGF0ZVNlbGYgd2hlbiB0aGUgY29tcG9uZW50IHNob3VsZCB1cGRhdGVcbiAgICBpZiAoYlVwZGF0ZVNlbGYpIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHNJbmZvKCkge1xuICAgIC8vIEB0cy1pZ25vcmUgLSBQcm9wZXJ0eSAnYXR0YWNobWVudHNJbmZvJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdDMTFuRW52J1xuICAgIGlmICghdGhpcy5wQ29ubiQuYXR0YWNobWVudHNJbmZvKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIC0gUHJvcGVydHkgJ2F0dGFjaG1lbnRzSW5mbycgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQzExbkVudidcbiAgICAgIHRoaXMucENvbm4kLmF0dGFjaG1lbnRzSW5mbyA9IHtcbiAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICBhdHRhY2htZW50RmllbGROYW1lOiB0aGlzLmF0dF92YWx1ZVJlZixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzRmlsZShmaWxlLCBpKSB7XG4gICAgZmlsZS5wcm9wcy50eXBlID0gZmlsZS5yZXNwb25zZVByb3BzLnB5TWltZUZpbGVFeHRlbnNpb247XG4gICAgZmlsZS5wcm9wcy5taW1lVHlwZSA9IGZpbGUucmVzcG9uc2VQcm9wcy5weU1pbWVGaWxlRXh0ZW5zaW9uO1xuICAgIGZpbGUucHJvcHMuSUQgPSBmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG5cbiAgICBjb25zdCBhck1lbnVMaXN0ID0gW1xuICAgICAge1xuICAgICAgICBpY29uOiAnZG93bmxvYWQnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRG93bmxvYWQnLCAnJywgJycpLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLl9kb3dubG9hZEZpbGVGcm9tTGlzdCh0aGlzLnZhbHVlJC5weFJlc3VsdHNbaV0pXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRGVsZXRlJywgJycsICcnKSxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5fcmVtb3ZlRmlsZUZyb21MaXN0KHRoaXMuYXJGaWxlTGlzdCRbaV0pXG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IGFyRmlsZXNBdHRhY2htZW50SURzOiBhbnkgPSBbXTtcbiAgICB0aGlzLmFyRmlsZUxpc3QkLmZvckVhY2goYXJGaWxlID0+IHtcbiAgICAgIGFyRmlsZXNBdHRhY2htZW50SURzLnB1c2goYXJGaWxlLmlkKTtcbiAgICB9KTtcblxuICAgIGlmICghYXJGaWxlc0F0dGFjaG1lbnRJRHMuaW5jbHVkZXMoZmlsZS5wcm9wcy5JRCkpIHtcbiAgICAgIHRoaXMuYXJGaWxlTGlzdCQucHVzaChcbiAgICAgICAgdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgYXR0OiBmaWxlLnByb3BzLFxuICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFyRmlsZUxpc3QkW2ldLmFjdGlvbnMgPSBhck1lbnVMaXN0O1xuICAgIHRoaXMuYXJGaWxlTGlzdCRbaV0ubm9EZWxldGVJY29uID0gdHJ1ZTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgfVxuXG4gIHVwZGF0ZVNlbGYoKSB7XG4gICAgY29uc3QgY29uZmlnUHJvcHM6IEF0dGFjaG1lbnRQcm9wcyA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKSBhcyBBdHRhY2htZW50UHJvcHM7XG4gICAgY29uc3Qgc3RhdGVQcm9wczogYW55ID0gdGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpO1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMgfSA9IGNvbmZpZ1Byb3BzO1xuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlcXVpcmVkICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlcXVpcmVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlcXVpcmVkKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ1Byb3BzLnZpc2liaWxpdHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iVmlzaWJsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy52aXNpYmlsaXR5KTtcbiAgICB9XG5cbiAgICAvLyBkaXNhYmxlZFxuICAgIGlmIChjb25maWdQcm9wcy5kaXNhYmxlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYkRpc2FibGVkJCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLmRpc2FibGVkKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMucmVhZE9ubHkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5iUmVhZG9ubHkkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMucmVhZE9ubHkpO1xuICAgIH1cblxuICAgIGlmIChjb25maWdQcm9wcy5hbGxvd011bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWxsb3dNdWx0aXBsZSQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5hbGxvd011bHRpcGxlKTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMubGFiZWwkID0gbGFiZWw7XG4gICAgdGhpcy52YWx1ZSQgPSB2YWx1ZTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXRlUHJvcHMuc3RhdHVzO1xuICAgIHRoaXMudmFsaWRhdGVNZXNzYWdlID0gdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnZhbGlkYXRlTWVzc2FnZTtcbiAgICB0aGlzLmV4dGVuc2lvbnMkID0gZXh0ZW5zaW9ucztcbiAgICB0aGlzLnZhbHVlUmVmID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIHRoaXMudmFsdWVSZWYgPSB0aGlzLnZhbHVlUmVmLnN0YXJ0c1dpdGgoJy4nKSA/IHRoaXMudmFsdWVSZWYuc3Vic3RyaW5nKDEpIDogdGhpcy52YWx1ZVJlZjtcblxuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuYXR0X2NhdGVnb3J5TmFtZSA9ICcnO1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5weUNhdGVnb3J5TmFtZSkge1xuICAgICAgdGhpcy5hdHRfY2F0ZWdvcnlOYW1lID0gdmFsdWUucHlDYXRlZ29yeU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgdGhpcy5hdHRfdmFsdWVSZWYgPSB0aGlzLmF0dF92YWx1ZVJlZi5pbmRleE9mKCcuJykgPT09IDAgPyB0aGlzLmF0dF92YWx1ZVJlZi5zdWJzdHJpbmcoMSkgOiB0aGlzLmF0dF92YWx1ZVJlZjtcblxuICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIHVwZGF0ZUF0dGFjaG1lbnRzKCkge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzRnJvbVNlcnZlciA9IHRoaXMudmFsdWUkICYmIHRoaXMudmFsdWUkLnB4UmVzdWx0cyAmJiArdGhpcy52YWx1ZSQucHlDb3VudCA+IDA7XG5cbiAgICBpZiAoYXR0YWNobWVudHNGcm9tU2VydmVyKSB7XG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzRnJvbVNlcnZlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIGF0dGFjaG1lbnRzIGZyb20gdGhlIFJlZHV4XG4gICAgICB0aGlzLm15RmlsZXMgPSB0aGlzLmdldEN1cnJlbnRBdHRhY2htZW50c0xpc3QodGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG5cbiAgICAgIGlmICh0aGlzLm15RmlsZXM/Lmxlbmd0aCAmJiB0aGlzLmFyRmlsZXMkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmFyRmlsZUxpc3QkID0gdGhpcy5teUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgICAgIGF0dCxcbiAgICAgICAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXlGaWxlc0F0dGFjaG1lbnRJRHM6IGFueSA9IFtdO1xuICAgICAgdGhpcy5teUZpbGVzLmZvckVhY2gobXlGaWxlID0+IHtcbiAgICAgICAgbXlGaWxlc0F0dGFjaG1lbnRJRHMucHVzaChteUZpbGUuSUQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXJGaWxlcyQuZm9yRWFjaChhckZpbGUgPT4ge1xuICAgICAgICBpZiAoIW15RmlsZXNBdHRhY2htZW50SURzLmluY2x1ZGVzKGFyRmlsZS5JRCkpIHtcbiAgICAgICAgICB0aGlzLm15RmlsZXMgPSBbLi4udGhpcy5teUZpbGVzLCBhckZpbGVdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG5cbiAgICBpZiAodGhpcy5hckZpbGVMaXN0JC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcbiAgICB9XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVBdHRhY2htZW50c0Zyb21TZXJ2ZXIoKSB7XG4gICAgdGhpcy52YWx1ZSQucHhSZXN1bHRzLmZvckVhY2goKGF0dGFjaG1lbnQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGU6IGFueSA9IHRoaXMuYnVpbGRGaWxlUHJvcHNGcm9tUmVzcG9uc2UoYXR0YWNobWVudCk7XG4gICAgICBpZiAoZmlsZS5yZXNwb25zZVByb3BzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0YWNobWVudHNJbmZvKCk7XG4gICAgICAgIGlmIChmaWxlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXkgJiYgIWZpbGUucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzRmlsZShmaWxlLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50LnByb3BzLklEID09PSBmaWxlLnByb3BzLklEKTtcbiAgICAgICAgICBsZXQgdGVtcEZpbGVzOiBhbnkgPSBbXTtcbiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0ZW1wRmlsZXMgPSBbZmlsZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUENvcmUuZ2V0U3RhdGVVdGlscygpLnVwZGF0ZVN0YXRlKFxuICAgICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgICAgICBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgICAgICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXNldEF0dGFjaG1lbnRTdG9yZWRTdGF0ZSgpIHtcbiAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdW5kZWZpbmVkLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBfZG93bmxvYWRGaWxlRnJvbUxpc3QoZmlsZU9iajogYW55KSB7XG4gICAgUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKClcbiAgICAgIC8vIEB0cy1pZ25vcmUgLSAzcmQgcGFyYW1ldGVyIFwicmVzcG9uc2VFbmNvZGluZ1wiIHNob3VsZCBiZSBvcHRpb25hbFxuICAgICAgLmRvd25sb2FkQXR0YWNobWVudChmaWxlT2JqLnB6SW5zS2V5LCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKVxuICAgICAgLnRoZW4oKGNvbnRlbnQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLnB5QXR0YWNoTmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZChjb250ZW50LmRhdGEsIGZpbGVPYmoucHlGaWxlTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgfSk7XG4gIH1cblxuICBmaWxlRG93bmxvYWQgPSAoZGF0YSwgZmlsZU5hbWUsIGV4dCkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBleHQgPyBgJHtmaWxlTmFtZX0uJHtleHR9YCA6IGZpbGVOYW1lO1xuICAgIGRvd25sb2FkKGF0b2IoZGF0YSksIGZpbGUpO1xuICB9O1xuXG4gIGdldEF0dGFjaG1lbnRLZXkgPSAobmFtZSA9ICcnKSA9PiAobmFtZSA/IGBhdHRhY2htZW50c0xpc3QuJHtuYW1lfWAgOiAnYXR0YWNobWVudHNMaXN0Jyk7XG5cbiAgQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgdGhpcy5hckZpbGVMaXN0JC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgaWYgKGZpbGUuc2Vjb25kYXJ5LmVycm9yKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5jbGVhck1lc3NhZ2VzKHtcbiAgICAgICAgdHlwZTogUENvcmUuZ2V0Q29uc3RhbnRzKCkuTUVTU0FHRVMuTUVTU0FHRVNfVFlQRV9FUlJPUixcbiAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICBjb250ZXh0OiB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfcmVtb3ZlRmlsZUZyb21MaXN0KGl0ZW06IGFueSkge1xuICAgIGNvbnN0IGZpbGVMaXN0SW5kZXggPSB0aGlzLmFyRmlsZUxpc3QkLmZpbmRJbmRleChlbGVtZW50ID0+IGVsZW1lbnQ/LmlkID09PSBpdGVtPy5pZCk7XG4gICAgY29uc3QgZmlsZUluZGV4ID0gdGhpcy5hckZpbGVzJC5maW5kSW5kZXgoZWxlbWVudCA9PiBlbGVtZW50Py5JRCA9PT0gaXRlbT8uaWQpO1xuXG4gICAgY29uc3QgYXR0YWNobWVudHNMaXN0ID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKTtcbiAgICBpZiAodGhpcy52YWx1ZSQgJiYgdGhpcy52YWx1ZSQucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJC5weUNvdW50ID4gMCAmJiBpdGVtLmFjdGlvbnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5tYXAoYXR0YWNobWVudCA9PiB7XG4gICAgICAgIGlmIChhdHRhY2htZW50Py5JRCA9PT0gdGhpcy5hckZpbGVMaXN0JFtmaWxlTGlzdEluZGV4XS5pZCB8fCBhdHRhY2htZW50Py5wcm9wcz8uSUQgPT09IHRoaXMuYXJGaWxlTGlzdCRbZmlsZUxpc3RJbmRleF0uaWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5hdHRhY2htZW50LCBkZWxldGU6IHRydWUsIGxhYmVsOiB0aGlzLnZhbHVlUmVmIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gdXBkYXRpbmcgdGhlIHJlZHV4IHN0b3JlIHRvIGhlbHAgZm9ybS1oYW5kbGVyIGluIHBhc3NpbmcgdGhlIGRhdGEgdG8gZGVsZXRlIHRoZSBmaWxlIGZyb20gc2VydmVyXG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUodGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSwgdXBkYXRlZEF0dGFjaG1lbnRzLCB7XG4gICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICBpc0FycmF5RGVlcE1lcmdlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBpdGVtLmlkKTtcbiAgICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZShcbiAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSxcbiAgICAgICAgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMuYXR0X3ZhbHVlUmVmKSxcbiAgICAgICAgWy4uLmN1cnJlbnRBdHRhY2htZW50TGlzdCwgLi4uYXR0YWNobWVudHNMaXN0XSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVMaXN0SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVMaXN0JC5zcGxpY2UoZmlsZUxpc3RJbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChmaWxlSW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5hckZpbGVzJC5zcGxpY2UoZmlsZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLkNoZWNrRm9ySW52YWxpZEF0dGFjaG1lbnQoKTtcblxuICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSAhKHRoaXMuYXJGaWxlTGlzdCQ/Lmxlbmd0aCA+IDApIHx8IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gIH1cblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG15RmlsZSBvZiB0aGlzLm15RmlsZXMpIHtcbiAgICAgICAgICBpZiAobXlGaWxlLklEID09PSBmaWxlLklEKSB7XG4gICAgICAgICAgICBteUZpbGUubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBteUZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgbXlGaWxlLmZpbGVOYW1lID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ1VuYWJsZSB0byB1cGxvYWQgZmlsZScsICcnLCAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgICAgICBpZiAoYXR0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyh7XG4gICAgICAgICAgICBhdHQsXG4gICAgICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgICAgICBjYW5jZWxGaWxlOiBudWxsLFxuICAgICAgICAgICAgZGVsZXRlRmlsZTogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dDogdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgICAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfTtcbiAgfVxuXG4gIHVwbG9hZE15RmlsZXMoZXZlbnQ6IGFueSkge1xuICAgIGxldCBhcnJBdHRhY2htZW50RmlsZXM6IGFueSA9IFtdO1xuICAgIGlmICh0aGlzLmFyRmlsZXMkLmxlbmd0aCkge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVzJDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyQXR0YWNobWVudEZpbGVzID0gdGhpcy5hckZpbGVMaXN0JDtcbiAgICB9XG4gICAgdGhpcy5hckZpbGVzJCA9IFsuLi5hcnJBdHRhY2htZW50RmlsZXMsIC4uLnRoaXMuZ2V0RmlsZXMoZXZlbnQudGFyZ2V0LmZpbGVzKV07XG5cbiAgICAvLyBjb252ZXJ0IEZpbGVMaXN0IHRvIGFuIGFycmF5XG4gICAgdGhpcy5teUZpbGVzID0gQXJyYXkuZnJvbSh0aGlzLmFyRmlsZXMkKTtcblxuICAgIHRoaXMuYkxvYWRpbmckID0gdHJ1ZTtcblxuICAgIGNvbnN0IGZpbGVzVG9CZVVwbG9hZGVkID0gdGhpcy5teUZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBpZiAoZS5pZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUgJiYgZS5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlICYmIGUuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKS51cGxvYWRBdHRhY2htZW50KFxuICAgICAgICAgIGYsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblVwbG9hZFByb2dyZXNzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc0ZldGNoQ2FuY2VsZWQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyKGlzRmV0Y2hDYW5jZWxlZCwgZik7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICBQcm9taXNlLmFsbFNldHRsZWQoZmlsZXNUb0JlVXBsb2FkZWQpXG4gICAgICAudGhlbigoZmlsZVJlc3BvbnNlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZVVwbG9hZFN1Y2Nlc3MoZmlsZVJlc3BvbnNlcyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVVcGxvYWRGYWlsdXJlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVVcGxvYWRTdWNjZXNzKGZpbGVSZXNwb25zZXMpIHtcbiAgICBjb25zdCBzdWNjZXNzRmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICBsZXQgcmVxT2JqO1xuICAgIGlmIChzdWNjZXNzRmlsZVJlc3BvbnNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0ZW1wRmlsZXNVcGxvYWRlZCA9IFsuLi50aGlzLmFyRmlsZXMkLmZpbHRlcihmaWxlID0+ICFmaWxlLmlkKV07XG4gICAgICBsZXQgbmV3QXR0YWNobWVudHM6IGFueSA9IFtdO1xuICAgICAgdGVtcEZpbGVzVXBsb2FkZWQuZm9yRWFjaChmaWxlUmVzID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdWNjZXNzRmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZmlsZVJlcy5JRCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmVxT2JqID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZpbGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXR0X3ZhbHVlUmVmLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuYXR0X2NhdGVnb3J5TmFtZSxcbiAgICAgICAgICAgIGhhbmRsZTogc3VjY2Vzc0ZpbGVSZXNwb25zZXNbaW5kZXhdLnZhbHVlLklELFxuICAgICAgICAgICAgSUQ6IGZpbGVSZXMuSUQsXG4gICAgICAgICAgICBuYW1lOiBmaWxlUmVzLm5hbWVcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzID0gWy4uLm5ld0F0dGFjaG1lbnRzLCByZXFPYmpdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy5hdHRfdmFsdWVSZWYpLCB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpKS5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5sYWJlbCAhPT0gdGhpcy5hdHRfdmFsdWVSZWZcbiAgICAgICk7XG4gICAgICBQQ29yZS5nZXRTdGF0ZVV0aWxzKCkudXBkYXRlU3RhdGUoXG4gICAgICAgIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCksXG4gICAgICAgIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLmF0dF92YWx1ZVJlZiksXG4gICAgICAgIFsuLi5jdXJyZW50QXR0YWNobWVudExpc3QsIC4uLm5ld0F0dGFjaG1lbnRzXSxcbiAgICAgICAge1xuICAgICAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmFyRmlsZXMkID0gdGVtcEZpbGVzVXBsb2FkZWQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYlNob3dTZWxlY3RvciQgPSB0aGlzLmFsbG93TXVsdGlwbGUkO1xuICAgICAgICB0aGlzLmFyRmlsZXMkLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgaWYgKCFmaWxlLmVycm9yKSB7XG4gICAgICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHknLCAnJywgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYXJGaWxlTGlzdCQgPSB0aGlzLm15RmlsZXMubWFwKGF0dCA9PiB7XG4gICAgICAgICAgaWYgKGF0dC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICAgICAgYXR0LFxuICAgICAgICAgICAgZG93bmxvYWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgY2FuY2VsRmlsZTogbnVsbCxcbiAgICAgICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgICAgICByZW1vdmVGaWxlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuQ2hlY2tGb3JJbnZhbGlkQXR0YWNobWVudCgpO1xuXG4gICAgICAgIHRoaXMuYlNob3dKdXN0RGVsZXRlJCA9IHRydWU7XG4gICAgICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVGaWxlVXBsb2FkRmFpbHVyZSgpIHtcbiAgICB0aGlzLmJTaG93SnVzdERlbGV0ZSQgPSB0cnVlO1xuICAgIHRoaXMuYkxvYWRpbmckID0gZmFsc2U7XG4gICAgdGhpcy5iU2hvd1NlbGVjdG9yJCA9IHRoaXMuYWxsb3dNdWx0aXBsZSQ7XG4gICAgdGhpcy5teUZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBpZiAoZmlsZT8uc2Vjb25kYXJ5Py5lcnJvcikge1xuICAgICAgICBmaWxlLm1ldGEgPSAnRmlsZSB1cGxvYWRlZCBmYWlsZWQnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IHRoaXMubXlGaWxlcy5tYXAoYXR0ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5ld0xpc3RVdGlsaXR5SXRlbVByb3BzKHtcbiAgICAgICAgYXR0LFxuICAgICAgICBkb3dubG9hZEZpbGU6IG51bGwsXG4gICAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICAgIGRlbGV0ZUZpbGU6IG51bGwsXG4gICAgICAgIHJlbW92ZUZpbGU6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5iU2hvd0p1c3REZWxldGUkID0gdHJ1ZTtcbiAgICB0aGlzLmJMb2FkaW5nJCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMgPSAoeyBhdHQsIGNhbmNlbEZpbGUsIGRvd25sb2FkRmlsZSwgZGVsZXRlRmlsZSwgcmVtb3ZlRmlsZSB9KSA9PiB7XG4gICAgbGV0IGFjdGlvbnM7XG4gICAgbGV0IGlzRG93bmxvYWRhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoYXR0LnByb2dyZXNzICYmIGF0dC5wcm9ncmVzcyAhPT0gMTAwKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBDYW5jZWwtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQ2FuY2VsJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndGltZXMnLFxuICAgICAgICAgIG9uQ2xpY2s6IGNhbmNlbEZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKGF0dC5saW5rcykge1xuICAgICAgY29uc3QgaXNGaWxlID0gYXR0LnR5cGUgPT09ICdGSUxFJztcbiAgICAgIGNvbnN0IElEID0gYXR0LklELnJlcGxhY2UoL1xccy9naSwgJycpO1xuICAgICAgY29uc3QgYWN0aW9uc01hcCA9IG5ldyBNYXAoW1xuICAgICAgICBbXG4gICAgICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYGRvd25sb2FkLSR7SUR9YCxcbiAgICAgICAgICAgIHRleHQ6IGlzRmlsZSA/IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdEb3dubG9hZCcsICcnLCAnJykgOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnT3BlbicsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiBpc0ZpbGUgPyAnZG93bmxvYWQnIDogJ29wZW4nLFxuICAgICAgICAgICAgb25DbGljazogZG93bmxvYWRGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGBEZWxldGUtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0RlbGV0ZScsICcnLCAnJyksXG4gICAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgICAgb25DbGljazogZGVsZXRlRmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgXSk7XG4gICAgICBhY3Rpb25zID0gW107XG4gICAgICBhY3Rpb25zTWFwLmZvckVhY2goKGFjdGlvbiwgYWN0aW9uS2V5KSA9PiB7XG4gICAgICAgIGlmIChhdHQubGlua3NbYWN0aW9uS2V5XSkge1xuICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGlzRG93bmxvYWRhYmxlID0gYXR0LmxpbmtzLmRvd25sb2FkO1xuICAgIH0gZWxzZSBpZiAoYXR0LmVycm9yKSB7XG4gICAgICBhY3Rpb25zID0gW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGBSZW1vdmUtJHthdHQuSUR9YCxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnUmVtb3ZlJywgJycsICcnKSxcbiAgICAgICAgICBpY29uOiAndHJhc2gnLFxuICAgICAgICAgIG9uQ2xpY2s6IHJlbW92ZUZpbGVcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGF0dC5JRCxcbiAgICAgIHZpc3VhbDoge1xuICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gb3JBdHRhY2htZW50KGF0dCksXG4gICAgICAgIHByb2dyZXNzOiBhdHQucHJvZ3Jlc3MgPT0gMTAwID8gdW5kZWZpbmVkIDogYXR0LnByb2dyZXNzXG4gICAgICB9LFxuICAgICAgcHJpbWFyeToge1xuICAgICAgICB0eXBlOiBhdHQudHlwZSxcbiAgICAgICAgbmFtZTogYXR0LmVycm9yID8gYXR0LmZpbGVOYW1lIDogYXR0Lm5hbWUsXG4gICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgIGNsaWNrOiByZW1vdmVGaWxlXG4gICAgICB9LFxuICAgICAgc2Vjb25kYXJ5OiB7XG4gICAgICAgIHRleHQ6IGF0dC5tZXRhLFxuICAgICAgICBlcnJvcjogYXR0LmVycm9yXG4gICAgICB9LFxuICAgICAgYWN0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgb25VcGxvYWRQcm9ncmVzcygpIHt9XG5cbiAgZ2V0RmlsZXMoYXJGaWxlczogYW55W10pOiBhbnlbXSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYXJGaWxlcyA6IFthckZpbGVzWzBdXTtcbiAgICByZXR1cm4gdGhpcy5zZXROZXdGaWxlcyhmaWxlcyk7XG4gIH1cblxuICBzZXROZXdGaWxlcyhhckZpbGVzKSB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgNTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXJGaWxlcykge1xuICAgICAgZmlsZS5taW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgIGZpbGUuaWNvbiA9IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShmaWxlLnR5cGUpO1xuICAgICAgZmlsZS5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZmlsZSwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRmlsZSBpcyB0b28gYmlnLiBNYXggYWxsb3dlZCBzaXplIGlzIDVNQi4nLCAnJywgJycpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy52YWxpZGF0ZUZpbGVFeHRlbnNpb24oZmlsZSwgdGhpcy5leHRlbnNpb25zJCkpIHtcbiAgICAgICAgZmlsZS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZpbGUubWV0YSA9IGAke3RoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdGaWxlIGhhcyBpbnZhbGlkIGV4dGVuc2lvbi4gQWxsb3dlZCBleHRlbnNpb25zIGFyZTonLCAnJywgJycpfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbChcbiAgICAgICAgICAnLicsXG4gICAgICAgICAgJydcbiAgICAgICAgKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGUuZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgUENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlcyh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5hckZpbGVzXTtcbiAgfVxuXG4gIHZhbGlkYXRlTWF4U2l6ZShmaWxlT2JqLCBtYXhTaXplSW5NQik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpbGVTaXplID0gKGZpbGVPYmouc2l6ZSAvIDEwNDg1NzYpLnRvRml4ZWQoMik7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZmlsZVNpemUpIDwgcGFyc2VGbG9hdChtYXhTaXplSW5NQik7XG4gIH1cblxuICB2YWxpZGF0ZUZpbGVFeHRlbnNpb24gPSAoZmlsZU9iaiwgYWxsb3dlZEV4dGVuc2lvbnMpID0+IHtcbiAgICBpZiAoIWFsbG93ZWRFeHRlbnNpb25zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbkxpc3QgPSBhbGxvd2VkRXh0ZW5zaW9uc1xuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAubWFwKGl0ZW0gPT4gaXRlbS5yZXBsYWNlQWxsKCcuJywgJycpLnRyaW0oKSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU9iai5uYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gYWxsb3dlZEV4dGVuc2lvbkxpc3QuaW5jbHVkZXMoZXh0ZW5zaW9uKTtcbiAgfTtcblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHNkay1sYWJlbC1pbmZpeC1yZWFkb25seVwiICpuZ0lmPVwiYlZpc2libGUkXCI+XG4gIDxzcGFuIGNsYXNzPVwicHNkay1sYWJlbC13cmFwcGVyLXJlYWRvbmx5XCI+XG4gICAgPGxhYmVsIFtuZ0NsYXNzXT1cInsgJ3BzZGstbGFiZWwtcmVhZG9ubHknOiB0cnVlLCAnbGFiZWwtcmVxdWlyZWQnOiBiUmVxdWlyZWQkID09PSB0cnVlIH1cIiBbaHRtbEZvcl09XCJhdHRfdmFsdWVSZWZcIj57eyBsYWJlbCQgfX08L2xhYmVsPlxuICA8L3NwYW4+XG4gIDxkaXZcbiAgICBbbmdDbGFzc109XCJ7ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3InOiBzdGF0dXMgIT09ICdlcnJvcicsICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InOiBzdGF0dXMgPT09ICdlcnJvcicgfVwiXG4gICAgaWQ9XCJhdHRhY2htZW50LWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJiU2hvd1NlbGVjdG9yJFwiXG4gID5cbiAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJiTG9hZGluZyRcIiBjbGFzcz1cInByb2dyZXNzLXNwaW5uZXJcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8aW5wdXQgaGlkZGVuIHR5cGU9XCJmaWxlXCIgW3JlcXVpcmVkXT1cImJSZXF1aXJlZCRcIiAjdXBsb2FkZXIgW2lkXT1cImF0dF92YWx1ZVJlZlwiIFttdWx0aXBsZV09XCJhbGxvd011bHRpcGxlJFwiIChjaGFuZ2UpPVwidXBsb2FkTXlGaWxlcygkZXZlbnQpXCIgLz5cblxuICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCJiRGlzYWJsZWQkXCIgKGNsaWNrKT1cInVwbG9hZGVyLmNsaWNrKClcIj5cbiAgICAgIHt7IGFsbG93TXVsdGlwbGUkID8gJ1VwbG9hZCBmaWxlcycgOiAnVXBsb2FkIGZpbGUnIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8c3BhbiAqbmdJZj1cInZhbGlkYXRlTWVzc2FnZVwiIGNsYXNzPVwiZmlsZS1lcnJvclwiPnt7IHZhbGlkYXRlTWVzc2FnZSB9fTwvc3Bhbj5cblxuICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWxpc3RcIiAqbmdJZj1cImFyRmlsZUxpc3QkICE9IG51bGwgJiYgYXJGaWxlTGlzdCQubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGF0dGFjaG1lbnQgb2YgYXJGaWxlTGlzdCRcIj5cbiAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICpuZ0lmPVwiYXR0YWNobWVudC5ub0RlbGV0ZUljb24gIT09IHRydWU7IGVsc2Ugc2hvd2Z1bGxcIlxuICAgICAgICBuYW1lPVwiU3VtbWFyeUl0ZW1cIlxuICAgICAgICBbcHJvcHNdPVwieyBpdGVtJDogYXR0YWNobWVudCwgbWVudUljb25PdmVycmlkZSQ6ICd0cmFzaCcsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVGaWxlRnJvbUxpc3QkIH1cIlxuICAgICAgPjwvY29tcG9uZW50LW1hcHBlcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd2Z1bGw+XG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyIG5hbWU9XCJTdW1tYXJ5SXRlbVwiIFtwcm9wc109XCJ7IGl0ZW0kOiBhdHRhY2htZW50LCBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==