@pega/angular-sdk-components 24.2.12 → 25.1.11

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 (325) hide show
  1. package/fesm2022/pega-angular-sdk-components.mjs +4828 -3717
  2. package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
  3. package/index.d.ts +4963 -3
  4. package/package.json +21 -6
  5. package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
  6. package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -107
  7. package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
  8. package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
  9. package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
  10. package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
  11. package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
  12. package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
  13. package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
  14. package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -82
  15. package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
  16. package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -38
  17. package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
  18. package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
  19. package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
  20. package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
  21. package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -145
  22. package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
  23. package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
  24. package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
  25. package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -296
  26. package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
  27. package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -225
  28. package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -195
  29. package/esm2022/lib/_components/field/date/date.component.mjs +0 -205
  30. package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -196
  31. package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -205
  32. package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -300
  33. package/esm2022/lib/_components/field/email/email.component.mjs +0 -165
  34. package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
  35. package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -168
  36. package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -45
  37. package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -314
  38. package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
  39. package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -190
  40. package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -155
  41. package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -182
  42. package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -109
  43. package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -95
  44. package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
  45. package/esm2022/lib/_components/field/text/text.component.mjs +0 -142
  46. package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -165
  47. package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
  48. package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -165
  49. package/esm2022/lib/_components/field/time/time.component.mjs +0 -174
  50. package/esm2022/lib/_components/field/url/url.component.mjs +0 -165
  51. package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -266
  52. package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
  53. package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
  54. package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -461
  55. package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
  56. package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
  57. package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -335
  58. package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
  59. package/esm2022/lib/_components/infra/Containers/view-container/helper.mjs +0 -22
  60. package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -211
  61. package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
  62. package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -407
  63. package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
  64. package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
  65. package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -143
  66. package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
  67. package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
  68. package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
  69. package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -126
  70. package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
  71. package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -223
  72. package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
  73. package/esm2022/lib/_components/infra/view/view.component.mjs +0 -188
  74. package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -156
  75. package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
  76. package/esm2022/lib/_components/template/base/details-template-base.mjs +0 -56
  77. package/esm2022/lib/_components/template/base/form-template-base.mjs +0 -16
  78. package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
  79. package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -185
  80. package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
  81. package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -242
  82. package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -73
  83. package/esm2022/lib/_components/template/details/details.component.mjs +0 -76
  84. package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -45
  85. package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -42
  86. package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -39
  87. package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -51
  88. package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -48
  89. package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -48
  90. package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -65
  91. package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
  92. package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -131
  93. package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
  94. package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
  95. package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
  96. package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
  97. package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
  98. package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1217
  99. package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
  100. package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
  101. package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
  102. package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
  103. package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -31
  104. package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
  105. package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
  106. package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
  107. package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
  108. package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
  109. package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
  110. package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -271
  111. package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -813
  112. package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
  113. package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
  114. package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
  115. package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -31
  116. package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
  117. package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -31
  118. package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
  119. package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
  120. package/esm2022/lib/_components/template/utils.mjs +0 -38
  121. package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -31
  122. package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
  123. package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
  124. package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
  125. package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -393
  126. package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
  127. package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
  128. package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
  129. package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
  130. package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
  131. package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -230
  132. package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
  133. package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
  134. package/esm2022/lib/_helpers/case-utils.mjs +0 -71
  135. package/esm2022/lib/_helpers/common.mjs +0 -20
  136. package/esm2022/lib/_helpers/createstage-utils.mjs +0 -15
  137. package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
  138. package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
  139. package/esm2022/lib/_helpers/event-util.mjs +0 -18
  140. package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
  141. package/esm2022/lib/_helpers/filter-utils.mjs +0 -105
  142. package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
  143. package/esm2022/lib/_helpers/formatters/common.mjs +0 -17
  144. package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
  145. package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
  146. package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
  147. package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -76
  148. package/esm2022/lib/_helpers/formatters/index.mjs +0 -124
  149. package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
  150. package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
  151. package/esm2022/lib/_helpers/template-utils.mjs +0 -56
  152. package/esm2022/lib/_helpers/utils.mjs +0 -412
  153. package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
  154. package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
  155. package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
  156. package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
  157. package/esm2022/lib/_services/banner.service.mjs +0 -35
  158. package/esm2022/lib/_services/case.service.mjs +0 -32
  159. package/esm2022/lib/_services/datapage.service.mjs +0 -52
  160. package/esm2022/lib/_services/endpoints.mjs +0 -60
  161. package/esm2022/lib/_services/server-config.service.mjs +0 -52
  162. package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
  163. package/esm2022/pega-angular-sdk-components.mjs +0 -5
  164. package/esm2022/public-api.mjs +0 -145
  165. package/esm2022/sdk-local-component-map.mjs +0 -9
  166. package/lib/_bridge/angular-pconnect.d.ts +0 -142
  167. package/lib/_bridge/component-mapper/component-mapper.component.d.ts +0 -20
  168. package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +0 -219
  169. package/lib/_bridge/helpers/sdk_component_map.d.ts +0 -3
  170. package/lib/_components/designSystemExtension/alert/alert.component.d.ts +0 -12
  171. package/lib/_components/designSystemExtension/alert-banner/alert-banner.component.d.ts +0 -13
  172. package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -14
  173. package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -19
  174. package/lib/_components/designSystemExtension/field-group/field-group.component.d.ts +0 -12
  175. package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +0 -20
  176. package/lib/_components/designSystemExtension/material-details/material-details.component.d.ts +0 -15
  177. package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +0 -13
  178. package/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.d.ts +0 -15
  179. package/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.d.ts +0 -9
  180. package/lib/_components/designSystemExtension/material-utility/material-utility.component.d.ts +0 -16
  181. package/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.d.ts +0 -11
  182. package/lib/_components/designSystemExtension/operator/operator.component.d.ts +0 -25
  183. package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +0 -15
  184. package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +0 -23
  185. package/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.d.ts +0 -7
  186. package/lib/_components/field/auto-complete/auto-complete.component.d.ts +0 -79
  187. package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -23
  188. package/lib/_components/field/check-box/check-box.component.d.ts +0 -69
  189. package/lib/_components/field/currency/currency.component.d.ts +0 -54
  190. package/lib/_components/field/date/date.component.d.ts +0 -76
  191. package/lib/_components/field/date-time/date-time.component.d.ts +0 -62
  192. package/lib/_components/field/decimal/decimal.component.d.ts +0 -54
  193. package/lib/_components/field/dropdown/dropdown.component.d.ts +0 -71
  194. package/lib/_components/field/email/email.component.d.ts +0 -45
  195. package/lib/_components/field/group/group.component.d.ts +0 -32
  196. package/lib/_components/field/integer/integer.component.d.ts +0 -45
  197. package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +0 -14
  198. package/lib/_components/field/multiselect/multiselect.component.d.ts +0 -64
  199. package/lib/_components/field/multiselect/utils.d.ts +0 -8
  200. package/lib/_components/field/percentage/percentage.component.d.ts +0 -53
  201. package/lib/_components/field/phone/phone.component.d.ts +0 -43
  202. package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +0 -60
  203. package/lib/_components/field/rich-text/rich-text.component.d.ts +0 -43
  204. package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -36
  205. package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -29
  206. package/lib/_components/field/text/text.component.d.ts +0 -41
  207. package/lib/_components/field/text-area/text-area.component.d.ts +0 -46
  208. package/lib/_components/field/text-content/text-content.component.d.ts +0 -29
  209. package/lib/_components/field/text-input/text-input.component.d.ts +0 -46
  210. package/lib/_components/field/time/time.component.d.ts +0 -46
  211. package/lib/_components/field/url/url.component.d.ts +0 -45
  212. package/lib/_components/field/user-reference/user-reference.component.d.ts +0 -50
  213. package/lib/_components/infra/Containers/base-components/flow-container-base.component.d.ts +0 -8
  214. package/lib/_components/infra/Containers/base-components/helper.d.ts +0 -1
  215. package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -82
  216. package/lib/_components/infra/Containers/flow-container/helpers.d.ts +0 -3
  217. package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -14
  218. package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +0 -69
  219. package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -14
  220. package/lib/_components/infra/Containers/view-container/helper.d.ts +0 -2
  221. package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -50
  222. package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +0 -12
  223. package/lib/_components/infra/assignment/assignment.component.d.ts +0 -74
  224. package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +0 -17
  225. package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -19
  226. package/lib/_components/infra/defer-load/defer-load.component.d.ts +0 -46
  227. package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +0 -8
  228. package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -30
  229. package/lib/_components/infra/navbar/navbar.component.d.ts +0 -52
  230. package/lib/_components/infra/reference/reference.component.d.ts +0 -36
  231. package/lib/_components/infra/region/region.component.d.ts +0 -13
  232. package/lib/_components/infra/root-container/root-container.component.d.ts +0 -36
  233. package/lib/_components/infra/stages/stages.component.d.ts +0 -28
  234. package/lib/_components/infra/view/view.component.d.ts +0 -40
  235. package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -54
  236. package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -26
  237. package/lib/_components/template/base/details-template-base.d.ts +0 -21
  238. package/lib/_components/template/base/form-template-base.d.ts +0 -10
  239. package/lib/_components/template/case-summary/case-summary.component.d.ts +0 -35
  240. package/lib/_components/template/case-view/case-view.component.d.ts +0 -54
  241. package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -37
  242. package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -40
  243. package/lib/_components/template/default-form/default-form.component.d.ts +0 -22
  244. package/lib/_components/template/details/details.component.d.ts +0 -11
  245. package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +0 -12
  246. package/lib/_components/template/details-one-column/details-one-column.component.d.ts +0 -11
  247. package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +0 -13
  248. package/lib/_components/template/details-three-column/details-three-column.component.d.ts +0 -14
  249. package/lib/_components/template/details-two-column/details-two-column.component.d.ts +0 -14
  250. package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +0 -13
  251. package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +0 -20
  252. package/lib/_components/template/field-group-list/field-group-list.component.d.ts +0 -9
  253. package/lib/_components/template/field-group-template/field-group-template.component.d.ts +0 -55
  254. package/lib/_components/template/field-value-list/field-value-list.component.d.ts +0 -9
  255. package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -15
  256. package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -24
  257. package/lib/_components/template/list-page/list-page.component.d.ts +0 -6
  258. package/lib/_components/template/list-view/DefaultViewMeta.d.ts +0 -1
  259. package/lib/_components/template/list-view/list-view.component.d.ts +0 -165
  260. package/lib/_components/template/list-view/listViewHelpers.d.ts +0 -1
  261. package/lib/_components/template/list-view/utils.d.ts +0 -118
  262. package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -24
  263. package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -13
  264. package/lib/_components/template/one-column/one-column.component.d.ts +0 -14
  265. package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -8
  266. package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -13
  267. package/lib/_components/template/page/page.component.d.ts +0 -24
  268. package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -34
  269. package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -36
  270. package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -42
  271. package/lib/_components/template/simple-table-manual/helpers.d.ts +0 -82
  272. package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +0 -168
  273. package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -31
  274. package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -8
  275. package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -25
  276. package/lib/_components/template/three-column/three-column.component.d.ts +0 -14
  277. package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -8
  278. package/lib/_components/template/two-column/two-column.component.d.ts +0 -14
  279. package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -16
  280. package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -13
  281. package/lib/_components/template/utils.d.ts +0 -9
  282. package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +0 -14
  283. package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +0 -19
  284. package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +0 -51
  285. package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -18
  286. package/lib/_components/widget/attachment/attachment.component.d.ts +0 -74
  287. package/lib/_components/widget/case-history/case-history.component.d.ts +0 -23
  288. package/lib/_components/widget/feed-container/feed-container.component.d.ts +0 -48
  289. package/lib/_components/widget/file-utility/file-utility.component.d.ts +0 -149
  290. package/lib/_components/widget/list-utility/list-utility.component.d.ts +0 -23
  291. package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -28
  292. package/lib/_components/widget/todo/todo.component.d.ts +0 -61
  293. package/lib/_components/widget/utility/utility.component.d.ts +0 -24
  294. package/lib/_directives/thousand-seperator.directive.d.ts +0 -9
  295. package/lib/_helpers/case-utils.d.ts +0 -19
  296. package/lib/_helpers/common.d.ts +0 -3
  297. package/lib/_helpers/createstage-utils.d.ts +0 -1
  298. package/lib/_helpers/currency-utils.d.ts +0 -10
  299. package/lib/_helpers/date-format-utils.d.ts +0 -12
  300. package/lib/_helpers/event-util.d.ts +0 -1
  301. package/lib/_helpers/field-group-utils.d.ts +0 -16
  302. package/lib/_helpers/filter-utils.d.ts +0 -46
  303. package/lib/_helpers/formatters/boolean.d.ts +0 -3
  304. package/lib/_helpers/formatters/common.d.ts +0 -2
  305. package/lib/_helpers/formatters/currency-map.d.ts +0 -1132
  306. package/lib/_helpers/formatters/currency.d.ts +0 -8
  307. package/lib/_helpers/formatters/date.d.ts +0 -9
  308. package/lib/_helpers/formatters/format-utils.d.ts +0 -8
  309. package/lib/_helpers/formatters/index.d.ts +0 -17
  310. package/lib/_helpers/instructions-utils.d.ts +0 -4
  311. package/lib/_helpers/tab-utils.d.ts +0 -4
  312. package/lib/_helpers/template-utils.d.ts +0 -16
  313. package/lib/_helpers/utils.d.ts +0 -40
  314. package/lib/_helpers/versionHelpers.d.ts +0 -8
  315. package/lib/_messages/error-messages.service.d.ts +0 -15
  316. package/lib/_messages/progress-spinner.service.d.ts +0 -14
  317. package/lib/_messages/update-worklist.service.d.ts +0 -14
  318. package/lib/_services/banner.service.d.ts +0 -8
  319. package/lib/_services/case.service.d.ts +0 -12
  320. package/lib/_services/datapage.service.d.ts +0 -14
  321. package/lib/_services/endpoints.d.ts +0 -38
  322. package/lib/_services/server-config.service.d.ts +0 -31
  323. package/lib/_types/PConnProps.interface.d.ts +0 -17
  324. package/public-api.d.ts +0 -140
  325. package/sdk-local-component-map.d.ts +0 -2
@@ -1,662 +0,0 @@
1
- import { getDefaultViewMeta } from './DefaultViewMeta';
2
- const USER_REFERENCE = 'UserReference';
3
- const PAGE = '!P!';
4
- const PAGELIST = '!PL!';
5
- export const formatConstants = {
6
- WorkStatus: 'WorkStatus',
7
- Integer: 'Integer',
8
- WorkLink: 'WorkLink'
9
- };
10
- class DataApi {
11
- constructor() {
12
- this.originalPropertyToMappedProperty = {};
13
- this.mappedPropertyToOriginalProperty = {};
14
- this.setPropertyMaps = this.setPropertyMaps.bind(this);
15
- this.getMappedProperty = this.getMappedProperty.bind(this);
16
- this.getOriginalProperty = this.getOriginalProperty.bind(this);
17
- }
18
- setPropertyMaps(originalToMappedPropertyObj = {}, mappedToOriginalPropertyObj = {}) {
19
- this.originalPropertyToMappedProperty = {
20
- ...this.originalPropertyToMappedProperty,
21
- ...originalToMappedPropertyObj
22
- };
23
- this.mappedPropertyToOriginalProperty = {
24
- ...this.mappedPropertyToOriginalProperty,
25
- ...mappedToOriginalPropertyObj
26
- };
27
- }
28
- getMappedProperty(propertyName) {
29
- return this.originalPropertyToMappedProperty[propertyName] ?? propertyName;
30
- }
31
- getOriginalProperty(propertyName) {
32
- return this.mappedPropertyToOriginalProperty[propertyName] ?? propertyName;
33
- }
34
- }
35
- export async function getContext(componentConfig) {
36
- const { promisesArray = [] // array of promises which can be invoked paralelly,
37
- } = componentConfig;
38
- const promisesResponseArray = await Promise.all(promisesArray);
39
- const dataApi = new DataApi();
40
- return {
41
- promisesResponseArray,
42
- setPropertyMaps: dataApi.setPropertyMaps,
43
- getMappedProperty: dataApi.getMappedProperty,
44
- getOriginalProperty: dataApi.getOriginalProperty
45
- };
46
- }
47
- /**
48
- * [getFieldNameFromEmbeddedFieldName]
49
- * Description - converting embeddedField name starting with !P! or !PL! to normal field
50
- * @ignore
51
- * @param {string} propertyName EmbeddedField name starting with !P! or !PL!
52
- * @returns {string} returns converted string without !P! or !PL! and :
53
- *
54
- * @example <caption>Example for getFieldNameFromEmbeddedFieldName </caption>
55
- * getFieldNameFromEmbeddedFieldName('!P!Organisation:Name') return 'Organisation.Name'
56
- * getFieldNameFromEmbeddedFieldName('!PL!Employees:Name') return 'Employees.Name'
57
- */
58
- export function getFieldNameFromEmbeddedFieldName(propertyName) {
59
- let value = propertyName;
60
- if (value.startsWith(PAGE) || value.startsWith(PAGELIST)) {
61
- value = value.substring(value.lastIndexOf('!') + 1);
62
- value = value.replace(/:/g, '.');
63
- }
64
- return value;
65
- }
66
- /**
67
- * [updateMetaEmbeddedFieldID]
68
- * Description - If the fieldID in meta starts with '!P!' or '!PL!' and contains ':' then replace them with .(dot)
69
- * @ignore
70
- * @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
71
- */
72
- export function updateMetaEmbeddedFieldID(metaFields) {
73
- return metaFields.forEach(metaField => {
74
- if (metaField.fieldID?.startsWith(PAGE) || metaField.fieldID?.startsWith(PAGELIST)) {
75
- metaField.fieldID = getFieldNameFromEmbeddedFieldName(metaField.fieldID);
76
- }
77
- });
78
- }
79
- export const isEmbeddedField = field => {
80
- if (field?.startsWith('@')) {
81
- field = field.substring(field.indexOf(' ') + 1);
82
- if (field[0] === '.')
83
- field = field.substring(1);
84
- }
85
- return field?.indexOf('.') > 0;
86
- };
87
- /**
88
- * [isPageListProperty]
89
- * Description - checking if propertyName is pageList or not
90
- * @ignore
91
- * @param {string} propertyName PropertyName
92
- * @returns {boolean} true if property is pageList else false
93
- *
94
- * @example <caption>Example for isPageListProperty </caption>
95
- * isPageListProperty('!PL!Employees.Name') return true
96
- * isPageListProperty('!P!Employees.Name') return false
97
- * isPageListProperty('Name') return false
98
- */
99
- export function isPageListProperty(propertyName) {
100
- return propertyName.startsWith(PAGELIST);
101
- }
102
- export const isPageListInPath = (propertyName, currentClassID) => {
103
- if (!propertyName.includes('.')) {
104
- return false;
105
- }
106
- const [first, ...rest] = propertyName.split('.');
107
- const metadata = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
108
- if (metadata?.type === 'Page List') {
109
- return true;
110
- }
111
- return isPageListInPath(rest.join('.'), metadata?.pageClass);
112
- };
113
- /**
114
- * [getEmbeddedFieldName]
115
- * Description - converting normal field name to embedded field starting with !P! or !PL!
116
- * @ignore
117
- * @param {string} propertyName Field name
118
- * @param {string} classID classID of datapage
119
- * @returns {string} returns converted string with !P! or !PL! and :
120
- *
121
- * @example <caption>Example for getEmbeddedFieldName </caption>
122
- * For page property, getEmbeddedFieldName('Organisation.Name') return '!P!Organisation:Name'
123
- * For pageList property, getEmbeddedFieldName('Employees.Name') return '!PL!Employees:Name'
124
- */
125
- export function getEmbeddedFieldName(propertyName, classID) {
126
- let value = propertyName;
127
- if (isPageListInPath(value, classID)) {
128
- value = `!PL!${value.replace(/\./g, ':')}`;
129
- }
130
- else {
131
- value = `!P!${value.replace(/\./g, ':')}`;
132
- }
133
- return value;
134
- }
135
- /**
136
- * [preparePropertyMaps]
137
- * Description - preparing maps for property names and set it in dataApi context
138
- * @ignore
139
- * @param {Array} fields fields array
140
- * @param {string} classID classID of datapage
141
- * @param {string} context dataApi context
142
- * @returns {boolean} true if pageListProperty is present
143
- */
144
- export function preparePropertyMaps(fields, classID, context) {
145
- const { setPropertyMaps } = context;
146
- const maps = fields.reduce((acc, field) => {
147
- let { value } = field.config;
148
- if (value.startsWith('@')) {
149
- value = value.substring(value.indexOf(' ') + 1);
150
- if (value[0] === '.')
151
- value = value.substring(1);
152
- }
153
- let name = value;
154
- // Preparing name for embedded property
155
- if (isEmbeddedField(name)) {
156
- name = getEmbeddedFieldName(name, classID);
157
- }
158
- if (isPageListProperty(name) && !acc[2]) {
159
- acc[2] = true;
160
- }
161
- acc[0][value] = name;
162
- acc[1][name] = value;
163
- return acc;
164
- }, [{}, {}, false]);
165
- setPropertyMaps(maps[0], maps[1]);
166
- return maps[2];
167
- }
168
- /**
169
- * [getConfigEmbeddedFieldsMeta]
170
- * Description - Get the metadata for configured embedded fields
171
- * @ignore
172
- * @param {Set} configFields Set of config fields
173
- * @param {string} classID clasID of datapage
174
- * @returns {Array} Metadata of configured embedded fields
175
- */
176
- export function getConfigEmbeddedFieldsMeta(configFields, classID) {
177
- const configEmbeddedFieldsMeta = [];
178
- configFields.forEach(field => {
179
- let value = field;
180
- if (isEmbeddedField(value)) {
181
- // conversion Page.PageList[].property => Page.PageList.property
182
- if (value.includes('[')) {
183
- value = value.substring(0, value.indexOf('[')) + value.substring(value.indexOf(']') + 1);
184
- }
185
- const meta = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
186
- meta.fieldID = field;
187
- configEmbeddedFieldsMeta.push(meta);
188
- }
189
- });
190
- return configEmbeddedFieldsMeta;
191
- }
192
- /**
193
- * [mergeConfigEmbeddedFieldsMeta]
194
- * Description - Get the metadata for configured embedded fields
195
- * @ignore
196
- * @param {Array} configEmbeddedFieldsMeta config fields metadata.
197
- * @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields
198
- */
199
- export function mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields) {
200
- const mergedMetaFields = [...metaFields];
201
- configEmbeddedFieldsMeta.forEach(configFieldMeta => {
202
- const fieldMeta = metaFields.find(metaField => metaField.fieldID === configFieldMeta.fieldID);
203
- if (!fieldMeta)
204
- mergedMetaFields.push(configFieldMeta);
205
- });
206
- return mergedMetaFields;
207
- }
208
- const oldToNewFieldTypeMapping = {
209
- 'Date Time': 'Date & time',
210
- Date: 'Date only'
211
- };
212
- /**
213
- * [updateFieldType]
214
- * Description - Updates the field type if its changed in the new implementation. Such mapping is maintained in oldToNewFieldTypeMapping.
215
- * @ignore
216
- * @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
217
- */
218
- function updateFieldType(metaFields) {
219
- metaFields.forEach(metaField => {
220
- if (metaField.type)
221
- metaField.type = oldToNewFieldTypeMapping[metaField.type] || metaField.type;
222
- });
223
- }
224
- function getPresetMetaAttribute(attribute) {
225
- const { type, config: { label, value } } = attribute;
226
- return {
227
- type,
228
- name: value.startsWith('@') ? value.substring(4) : value,
229
- label: label.startsWith('@') ? label.substring(3) : label
230
- };
231
- }
232
- /**
233
- * [generateViewMetaData]
234
- * Description - Returns a list of metaobjects of the fields provided.
235
- * @ignore
236
- * @param {Array} rawFields List of fields to update meta for
237
- * @param {string} classID Class ID from the response
238
- * @returns {Array} List of fields with updated meta objects.
239
- */
240
- function generateViewMetaData(rawFields, classID, showField) {
241
- return rawFields.map(item => getDefaultViewMeta(item, classID, showField));
242
- }
243
- /**
244
- * [getConfigFields]
245
- * Description - Returns list of config fields with primary fields meta updated.
246
- * @ignore
247
- * @param {Array} configFields List of Authored fields
248
- * @param {Array} primaryFields List of Primary Fields
249
- * @param {Array} metaFields Metadata of all fields
250
- * @param {string} classID Class ID from the response
251
- * @returns {Array} List of all fields with their meta updated.
252
- */
253
- function getConfigFields(configFields, primaryFields, metaFields, classID) {
254
- const presetConfigFields = configFields;
255
- const primaryFieldsViewIndex = presetConfigFields.findIndex(field => field.config.value === 'pyPrimaryFields');
256
- if (!primaryFields || !primaryFields.length) {
257
- if (primaryFieldsViewIndex < 0)
258
- return presetConfigFields;
259
- presetConfigFields.splice(primaryFieldsViewIndex, 1);
260
- return presetConfigFields;
261
- }
262
- if (primaryFieldsViewIndex > -1) {
263
- // list of uncommon fields - non overlap of primary fields grouped view and independent entity columns of primary type
264
- const uncommonFieldsList = primaryFields.filter(primaryField => !presetConfigFields.some(presetConfigField => presetConfigField.config.value.split('.')[1] === primaryField));
265
- const uncommonFieldsRawMeta = [];
266
- uncommonFieldsList.forEach(uncommonField => {
267
- const uncommonFieldMeta = metaFields.find(metaField => metaField.fieldID === uncommonField);
268
- if (uncommonFieldMeta)
269
- uncommonFieldsRawMeta.push(uncommonFieldMeta);
270
- });
271
- const uncommonFieldsConfigMeta = generateViewMetaData(uncommonFieldsRawMeta, classID, true);
272
- presetConfigFields.splice(primaryFieldsViewIndex, 1, ...uncommonFieldsConfigMeta);
273
- }
274
- return presetConfigFields;
275
- }
276
- /**
277
- * [getTableConfigFromPresetMeta]
278
- * Description - Get the table config from the presets meta.
279
- * @ignore
280
- * @param {object} presetMeta Presets meta
281
- * @param {boolean} isMetaWithPresets true if meta has presets else false
282
- * @param {Function} getPConnect Callback to get the PConnect object
283
- * @param {string} classID Class ID from the response
284
- * @param {Array} primaryFields List of Primary Fields
285
- * @param {Array} metaFields List of all metafields
286
- * @returns {object} Table config object
287
- */
288
- export function getTableConfigFromPresetMeta(presetMeta, isMetaWithPresets, pConn$, classID, primaryFields, metaFields) {
289
- let presetId;
290
- let presetName;
291
- let cardHeader;
292
- let secondaryText;
293
- let timelineDate;
294
- let timelineTitle;
295
- let timelineStatus;
296
- let timelineIcon;
297
- let { filterExpression } = pConn$.getRawMetadata().config;
298
- let fieldsMeta;
299
- let configFields;
300
- if (isMetaWithPresets) {
301
- presetId = presetMeta.id;
302
- presetName = presetMeta.label;
303
- cardHeader = presetMeta.cardHeader && getPresetMetaAttribute(presetMeta.cardHeader);
304
- secondaryText = presetMeta.secondaryText && getPresetMetaAttribute(presetMeta.secondaryText);
305
- timelineDate = presetMeta.timelineDate && getPresetMetaAttribute(presetMeta.timelineDate);
306
- timelineTitle = presetMeta.timelineTitle && getPresetMetaAttribute(presetMeta.timelineTitle);
307
- timelineStatus = presetMeta.timelineStatus && getPresetMetaAttribute(presetMeta.timelineStatus);
308
- timelineIcon = presetMeta.timelineIcon && getPresetMetaAttribute(presetMeta.timelineIcon);
309
- filterExpression = presetMeta.config.filterExpression;
310
- [fieldsMeta] = presetMeta.children;
311
- if (presetMeta.timelineTitle &&
312
- !fieldsMeta.children.find(fieldMeta => {
313
- return fieldMeta?.config?.value === presetMeta.timelineTitle?.config?.value;
314
- })) {
315
- const { type, config } = presetMeta.timelineTitle;
316
- fieldsMeta.children.push({ type, config: { ...config, show: false } });
317
- }
318
- if (presetMeta.timelineDate &&
319
- !fieldsMeta.children.find(fieldMeta => {
320
- return fieldMeta?.config?.value === presetMeta.timelineDate?.config?.value;
321
- })) {
322
- const { type, config } = presetMeta.timelineDate;
323
- fieldsMeta.children.push({ type, config: { ...config, show: false } });
324
- }
325
- configFields = getConfigFields(fieldsMeta.children, primaryFields, metaFields, classID);
326
- }
327
- else {
328
- fieldsMeta = presetMeta.props;
329
- configFields = getConfigFields(fieldsMeta
330
- .getPConnect()
331
- .getChildren()
332
- ?.map(child => {
333
- return child.getPConnect().getRawMetadata();
334
- }), primaryFields, metaFields, classID);
335
- }
336
- return {
337
- presetId,
338
- presetName,
339
- cardHeader,
340
- secondaryText,
341
- timelineDate,
342
- timelineTitle,
343
- timelineStatus,
344
- timelineIcon,
345
- filterExpression,
346
- fieldsMeta,
347
- configFields
348
- };
349
- }
350
- /**
351
- * [getReportColumns]
352
- * Description - Returns a set of columns from the report response.
353
- * @ignore
354
- * @param {object} response -
355
- * @returns {Set} Set of columns from the report response
356
- */
357
- function getReportColumns(response) {
358
- const { data: { data: reportColumns } } = response;
359
- const reportColumnsSet = new Set();
360
- reportColumns?.forEach(item => {
361
- let val = item.pyFieldName;
362
- // Remove '.' from index 0 only, if '.' is present
363
- if (val[0] === '.') {
364
- val = val.substring(1);
365
- }
366
- reportColumnsSet.add(val);
367
- });
368
- return reportColumnsSet;
369
- }
370
- /**
371
- * [getConfigFieldValue]
372
- * Descritpion - Returns a valid value for a configuration field. Remove any annotations and also "."
373
- * @ignore
374
- * @param {object} config
375
- * config.value - Raw value
376
- * @returns {string} value - Value with out any annotations or "."
377
- */
378
- function getConfigFieldValue(config) {
379
- let { value } = config;
380
- if (value.startsWith('@')) {
381
- value = value.substring(value.indexOf(' ') + 1);
382
- if (value[0] === '.')
383
- value = value.substring(1);
384
- }
385
- return value;
386
- }
387
- /**
388
- * [prepareConfigFields]
389
- * Description - Prepares a set of configuration fields and pushes each config type to a set using the callback parameter.
390
- * @ignore
391
- * @param {object} configFields List of Authored fields
392
- * @param {Function} pushToComponentsList Callback to push the field type to a set.
393
- * @returns {Set} configFieldSet
394
- */
395
- function prepareConfigFields(configFields, pushToComponentsList) {
396
- const configFieldSet = new Set();
397
- configFields.forEach(item => {
398
- pushToComponentsList(item.type);
399
- const val = getConfigFieldValue(item.config);
400
- configFieldSet.add(val);
401
- });
402
- return configFieldSet;
403
- }
404
- /**
405
- * [findAuthoredField]
406
- * Description - Finds an authored field from yhe list of config fields.
407
- * @ignore
408
- * @param {Array} configFields List of Authored fields
409
- * @param {string} fieldID Filter
410
- * @returns {object} config with its field value equal to fieldID, which means an authored field
411
- */
412
- function findAuthoredField(configFields, fieldID) {
413
- return configFields.find(configField => {
414
- const val = getConfigFieldValue(configField.config);
415
- return val === fieldID;
416
- });
417
- }
418
- /**
419
- * [findAndUpdateAuthoredFieldConfig]
420
- * Description - Find the authored field, and update its config.
421
- * @ignore
422
- * @param {Array} configFields List of Authored fields
423
- * @param {object} item Field item to copy displayAs and category information
424
- * @param {string} classId classID from the response
425
- */
426
- function findAndUpdateAuthoredFieldConfig(configFields, item, classId) {
427
- const authoredField = findAuthoredField(configFields, item.fieldID);
428
- if (authoredField?.config) {
429
- if (item.displayAs) {
430
- authoredField.config.displayAs = item.displayAs;
431
- }
432
- authoredField.config.classID = item.classID ?? classId;
433
- if (authoredField.type === USER_REFERENCE) {
434
- authoredField.config.associationID = item.associationID || item.fieldID;
435
- }
436
- authoredField.config.category = item.category;
437
- // FieldType identifies whether the field is configured as pickList
438
- authoredField.config.fieldType = item.fieldType;
439
- // type defined on the property rule,
440
- // used for the picklist field to assign the appropriate type
441
- authoredField.config.propertyType = item.dataType || item.type;
442
- }
443
- }
444
- /**
445
- * [isAnExtraField]
446
- * Description - Returns true if the field is an extra field. Extra field is the one which is not authored but part of the report.
447
- * @ignore
448
- * @param {Array} configFields List of Authored fields
449
- * @param {Set} configFieldSet Set if Authored filed values
450
- * @param {Set} reportColumnsSet Set of columns from the report
451
- * @param {object} item Config field item
452
- * @param {string} classId Class ID from the response
453
- * @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
454
- * @returns {boolean} true If the field is an extra field else false.
455
- */
456
- function isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classId, showDynamicFields) {
457
- // Is the field already present in authoring metadata?
458
- // Mutates config fields to copy displayAs and category information
459
- if (configFieldSet.has(item.fieldID)) {
460
- findAndUpdateAuthoredFieldConfig(configFields, item, classId);
461
- return false;
462
- }
463
- // If field is not authored and not part of report columns then discard it
464
- return showDynamicFields || !!reportColumnsSet.has(item.fieldID);
465
- }
466
- /**
467
- * [prepareExtraFields]
468
- * Description - Returns a list of extra fields with their meta updated.
469
- * @ignore
470
- * @param {Array} metaFields List of fields
471
- * @param {Array} configFields List of Authored fields
472
- * @param {Set} configFieldSet Set if Authored filed values
473
- * @param {Set} reportColumnsSet Set of columns from the report
474
- * @param {string} classID Class ID from the response
475
- * @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
476
- * @returns {Array} List of extra fields with their meta updated.
477
- */
478
- function prepareExtraFields(metaFields, configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields) {
479
- // Filter all the extra fields
480
- const extraFileds = metaFields.filter(item => {
481
- return isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classID, showDynamicFields);
482
- });
483
- return generateViewMetaData(extraFileds, classID, false);
484
- // Update the meta object of each of the extra fields.
485
- }
486
- const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
487
- function populateRenderingOptions(name, config, field) {
488
- const shouldDisplayAsSemanticLink = 'displayAsLink' in field.config && field.config.displayAsLink;
489
- if (shouldDisplayAsSemanticLink) {
490
- config.customObject.isAssignmentLink = AssignDashObjects.includes(field.config.classID);
491
- if (field.config.value.startsWith('@CA')) {
492
- config.customObject.isAssociation = true;
493
- }
494
- config.cellRenderer = formatConstants.WorkLink;
495
- }
496
- else if (name === 'pyStatusWork' || name === 'pyAssignmentStatus') {
497
- config.cellRenderer = formatConstants.WorkStatus;
498
- }
499
- else if (name === 'pxUrgencyWork') {
500
- config.cellRenderer = formatConstants.Integer;
501
- }
502
- }
503
- export function initializeColumns(fields = [], getMappedProperty = null) {
504
- return fields.map((field, originalColIndex) => {
505
- let name = field.config.value;
506
- if (name.startsWith('@')) {
507
- name = name.substring(name.indexOf(' ') + 1);
508
- if (name[0] === '.')
509
- name = name.substring(1);
510
- }
511
- name = getMappedProperty?.(name) ?? name;
512
- let label = field.config.label || field.config.caption;
513
- const { show = true, displayAs } = field.config;
514
- if (label.startsWith('@')) {
515
- label = label.substring(3);
516
- }
517
- const config = {
518
- name,
519
- label,
520
- show,
521
- classID: field.config.classID,
522
- id: field.id || name || originalColIndex,
523
- displayAs,
524
- associationID: field.config.associationID,
525
- ...(field.config.classID && { category: field.config.category }),
526
- customObject: {},
527
- fieldType: field.config.fieldType,
528
- meta: {
529
- ...field
530
- }
531
- };
532
- populateRenderingOptions(name, config, field);
533
- return config;
534
- });
535
- }
536
- export const getItemKey = fields => {
537
- let itemKey;
538
- if (fields.findIndex(field => field.id === 'pyGUID') > -1) {
539
- itemKey = 'pyGUID';
540
- }
541
- else {
542
- itemKey = 'pzInsKey';
543
- }
544
- return itemKey;
545
- };
546
- export function preparePatchQueryFields(fields, isDataObject = false, classID = '') {
547
- const queryFields = [];
548
- fields.forEach(field => {
549
- const patchFields = [];
550
- if (field.cellRenderer === 'WorkLink') {
551
- if (field.customObject && field.customObject.isAssignmentLink) {
552
- const associationName = field.name.includes(':') ? `${field.name.split(':')[0]}:` : '';
553
- patchFields.push(`${associationName}pzInsKey`);
554
- patchFields.push(`${associationName}pxRefObjectClass`);
555
- }
556
- else if (field.customObject && field.customObject.isAssociation) {
557
- const associationCategory = field.name.split(':')[0];
558
- patchFields.push(`${associationCategory}:pyID`);
559
- patchFields.push(`${associationCategory}:pzInsKey`);
560
- patchFields.push(`${associationCategory}:pxObjClass`);
561
- }
562
- else if (isDataObject) {
563
- const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
564
- const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
565
- dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? patchFields.push(item.linkedField) : patchFields.push(item.keyName)));
566
- }
567
- else {
568
- patchFields.push('pyID');
569
- patchFields.push('pzInsKey');
570
- patchFields.push('pxObjClass');
571
- }
572
- }
573
- patchFields.forEach(k => {
574
- if (!queryFields.find(q => q === k)) {
575
- queryFields.push(k);
576
- }
577
- });
578
- });
579
- return queryFields;
580
- }
581
- /**
582
- * Update the renderer type for the properties of type Page.
583
- */
584
- export function updatePageFieldsConfig(configFields, parentClassID) {
585
- return configFields.forEach(item => {
586
- const { type, config: { value } } = item;
587
- const propertyName = PCore.getAnnotationUtils().getPropertyName(value);
588
- if (isEmbeddedField(value) && !isPageListInPath(propertyName, parentClassID)) {
589
- item.config.componentType = type;
590
- item.type = 'PagePropertyRenderer';
591
- }
592
- });
593
- }
594
- export const readContextResponse = async (context, params) => {
595
- const { pConn$, apiContext, children, showDynamicFields, referenceList, isDataObject } = params;
596
- // let { listContext } = params;
597
- const { promisesResponseArray, apiContext: otherContext } = context;
598
- // eslint-disable-next-line sonarjs/no-unused-collection
599
- const listOfComponents = [];
600
- const { data: { fields: metaFields, classID, isQueryable } } = promisesResponseArray[0];
601
- let { data: { primaryFields } } = promisesResponseArray[0];
602
- // When list is configured with Include all class fields configuration, provide support for Primary fields column
603
- if (showDynamicFields) {
604
- const sourceMetadata = PCore.getMetadataUtils().getDataPageMetadata(referenceList);
605
- if (sourceMetadata?.primaryFields) {
606
- primaryFields = sourceMetadata.primaryFields;
607
- }
608
- // updating metaData fieldID to normal property if it has fieldID starts with !P! or !PL!
609
- updateMetaEmbeddedFieldID(metaFields);
610
- }
611
- updateFieldType(metaFields);
612
- if (isDataObject) {
613
- const compositeKeys = [];
614
- const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
615
- const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
616
- dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? compositeKeys.push(item.linkedField) : compositeKeys.push(item.keyName)));
617
- if (compositeKeys.length && otherContext) {
618
- otherContext.setCompositeKeys(compositeKeys);
619
- }
620
- if (otherContext) {
621
- otherContext.fetchRowActionDetails = null;
622
- }
623
- }
624
- const presetArray = [];
625
- const rawMetadata = pConn$.getRawMetadata().config;
626
- const rawPresets = rawMetadata.presets;
627
- const isMetaWithPresets = rawPresets && rawPresets.length !== 0;
628
- const childrenIterator = isMetaWithPresets ? rawPresets : children;
629
- const resolvedPresets = pConn$.getConfigProps().presets;
630
- let fields;
631
- let tableConfig;
632
- childrenIterator?.forEach((presetMeta, index) => {
633
- const { configFields } = getTableConfigFromPresetMeta({ ...presetMeta, label: resolvedPresets[index].label }, isMetaWithPresets, pConn$, classID, primaryFields, metaFields);
634
- const pushToComponentsList = fieldType => {
635
- listOfComponents.push(fieldType);
636
- };
637
- // read report columns response - in case of nonqueryable ignore the response and rely only on the fields configured at authoing time in presets
638
- const reportColumnsSet = isQueryable ? getReportColumns(promisesResponseArray[1]) : new Set();
639
- const configFieldSet = prepareConfigFields(configFields, pushToComponentsList);
640
- // FIXME #EmbeddedPropertyPatch
641
- // TODO: Remove this merge logic when the metadata response includes all optimized embedded page and pagelists
642
- // merging configured embedded properties with metadata so that while preparing extra fields, config fields can get other properties from meta(eg: category, displayAsLink)
643
- // get configured embedded properties metadata and get new mergedMetaFields
644
- const configEmbeddedFieldsMeta = getConfigEmbeddedFieldsMeta(configFieldSet, classID);
645
- const mergedMetaFields = mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields);
646
- const extraFields = prepareExtraFields(mergedMetaFields, // passing new merged meta fields which has meta of configured embedded fields of current preset
647
- configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields);
648
- if (isQueryable) {
649
- updatePageFieldsConfig(configFields, classID);
650
- preparePropertyMaps([...configFields, ...extraFields], classID, context);
651
- }
652
- const { getMappedProperty } = context;
653
- fields = initializeColumns([...configFields, ...extraFields], getMappedProperty);
654
- const patchQueryFields = preparePatchQueryFields(fields, isDataObject, classID);
655
- const itemKey = getItemKey(fields);
656
- tableConfig = { fieldDefs: fields, patchQueryFields, itemKey, isQueryable };
657
- });
658
- const meta = tableConfig;
659
- params.listContext = { meta, presets: presetArray, apiContext: { ...apiContext } };
660
- return params.listContext;
661
- };
662
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvbGlzdC12aWV3L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQztBQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPO0lBR1g7UUFDRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsZUFBZSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsRUFBRSwyQkFBMkIsR0FBRyxFQUFFO1FBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRztZQUN0QyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0M7WUFDeEMsR0FBRywyQkFBMkI7U0FDL0IsQ0FBQztRQUNGLElB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QXVCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsV0FBVyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFDekIsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztJQUNuRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RGVmYXVsdFZpZXdNZXRhIH0gZnJvbSAnLi9EZWZhdWx0Vmlld01ldGEnO1xuXG5jb25zdCBVU0VSX1JFRkVSRU5DRSA9ICdVc2VyUmVmZXJlbmNlJztcbmNvbnN0IFBBR0UgPSAnIVAhJztcbmNvbnN0IFBBR0VMSVNUID0gJyFQTCEnO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0Q29uc3RhbnRzID0ge1xuICBXb3JrU3RhdHVzOiAnV29ya1N0YXR1cycsXG4gIEludGVnZXI6ICdJbnRlZ2VyJyxcbiAgV29ya0xpbms6ICdXb3JrTGluaydcbn07XG5cbmNsYXNzIERhdGFBcGkge1xuICBtYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eTogYW55O1xuICBvcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5ID0ge307XG4gICAgdGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSA9IHt9O1xuICAgIHRoaXMuc2V0UHJvcGVydHlNYXBzID0gdGhpcy5zZXRQcm9wZXJ0eU1hcHMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE1hcHBlZFByb3BlcnR5ID0gdGhpcy5nZXRNYXBwZWRQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eSA9IHRoaXMuZ2V0T3JpZ2luYWxQcm9wZXJ0eS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgc2V0UHJvcGVydHlNYXBzKG9yaWdpbmFsVG9NYXBwZWRQcm9wZXJ0eU9iaiA9IHt9LCBtYXBwZWRUb09yaWdpbmFsUHJvcGVydHlPYmogPSB7fSkge1xuICAgIHRoaXMub3JpZ2luYWxQcm9wZXJ0eVRvTWFwcGVkUHJvcGVydHkgPSB7XG4gICAgICAuLi50aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5LFxuICAgICAgLi4ub3JpZ2luYWxUb01hcHBlZFByb3BlcnR5T2JqXG4gICAgfTtcbiAgICB0aGlzLm1hcHBlZFByb3BlcnR5VG9PcmlnaW5hbFByb3BlcnR5ID0ge1xuICAgICAgLi4udGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSxcbiAgICAgIC4uLm1hcHBlZFRvT3JpZ2luYWxQcm9wZXJ0eU9ialxuICAgIH07XG4gIH1cblxuICBnZXRNYXBwZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eVtwcm9wZXJ0eU5hbWVdID8/IHByb3BlcnR5TmFtZTtcbiAgfVxuXG4gIGdldE9yaWdpbmFsUHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHlbcHJvcGVydHlOYW1lXSA/PyBwcm9wZXJ0eU5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHQoY29tcG9uZW50Q29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICBwcm9taXNlc0FycmF5ID0gW10gLy8gYXJyYXkgb2YgcHJvbWlzZXMgd2hpY2ggY2FuIGJlIGludm9rZWQgcGFyYWxlbGx5LFxuICB9ID0gY29tcG9uZW50Q29uZmlnO1xuICBjb25zdCBwcm9taXNlc1Jlc3BvbnNlQXJyYXkgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlc0FycmF5KTtcbiAgY29uc3QgZGF0YUFwaSA9IG5ldyBEYXRhQXBpKCk7XG4gIHJldHVybiB7XG4gICAgcHJvbWlzZXNSZXNwb25zZUFycmF5LFxuICAgIHNldFByb3BlcnR5TWFwczogZGF0YUFwaS5zZXRQcm9wZXJ0eU1hcHMsXG4gICAgZ2V0TWFwcGVkUHJvcGVydHk6IGRhdGFBcGkuZ2V0TWFwcGVkUHJvcGVydHksXG4gICAgZ2V0T3JpZ2luYWxQcm9wZXJ0eTogZGF0YUFwaS5nZXRPcmlnaW5hbFByb3BlcnR5XG4gIH07XG59XG5cbi8qKlxuICogW2dldEZpZWxkTmFtZUZyb21FbWJlZGRlZEZpZWxkTmFtZV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgICAgICBjb252ZXJ0aW5nIGVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhIHRvIG5vcm1hbCBmaWVsZFxuICogQGlnbm9yZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAgIEVtYmVkZGVkRmllbGQgbmFtZSBzdGFydGluZyB3aXRoICFQISBvciAhUEwhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICAgICAgcmV0dXJucyBjb252ZXJ0ZWQgc3RyaW5nIHdpdGhvdXQgIVAhIG9yICFQTCEgYW5kIDpcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGZvciBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUgPC9jYXB0aW9uPlxuICogZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKCchUCFPcmdhbmlzYXRpb246TmFtZScpIHJldHVybiAnT3JnYW5pc2F0aW9uLk5hbWUnXG4gKiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUoJyFQTCFFbXBsb3llZXM6TmFtZScpIHJldHVybiAnRW1wbG95ZWVzLk5hbWUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUocHJvcGVydHlOYW1lKSB7XG4gIGxldCB2YWx1ZSA9IHByb3BlcnR5TmFtZTtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoUEFHRSkgfHwgdmFsdWUuc3RhcnRzV2l0aChQQUdFTElTVCkpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZignIScpICsgMSk7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC86L2csICcuJyk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFt1cGRhdGVNZXRhRW1iZWRkZWRGaWVsZElEXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgSWYgdGhlIGZpZWxkSUQgaW4gbWV0YSBzdGFydHMgd2l0aCAnIVAhJyBvciAnIVBMIScgYW5kIGNvbnRhaW5zICc6JyB0aGVuIHJlcGxhY2UgdGhlbSB3aXRoIC4oZG90KVxuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcykge1xuICByZXR1cm4gbWV0YUZpZWxkcy5mb3JFYWNoKG1ldGFGaWVsZCA9PiB7XG4gICAgaWYgKG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0UpIHx8IG1ldGFGaWVsZC5maWVsZElEPy5zdGFydHNXaXRoKFBBR0VMSVNUKSkge1xuICAgICAgbWV0YUZpZWxkLmZpZWxkSUQgPSBnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWUobWV0YUZpZWxkLmZpZWxkSUQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBpc0VtYmVkZGVkRmllbGQgPSBmaWVsZCA9PiB7XG4gIGlmIChmaWVsZD8uc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcoZmllbGQuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKGZpZWxkWzBdID09PSAnLicpIGZpZWxkID0gZmllbGQuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiBmaWVsZD8uaW5kZXhPZignLicpID4gMDtcbn07XG5cbi8qKlxuICogW2lzUGFnZUxpc3RQcm9wZXJ0eV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgIGNoZWNraW5nIGlmIHByb3BlcnR5TmFtZSBpcyBwYWdlTGlzdCBvciBub3RcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgICBQcm9wZXJ0eU5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAgdHJ1ZSBpZiBwcm9wZXJ0eSBpcyBwYWdlTGlzdCBlbHNlIGZhbHNlXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBmb3IgaXNQYWdlTGlzdFByb3BlcnR5IDwvY2FwdGlvbj5cbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVBMIUVtcGxveWVlcy5OYW1lJykgcmV0dXJuIHRydWVcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnIVAhRW1wbG95ZWVzLk5hbWUnKSByZXR1cm4gZmFsc2VcbiAqIGlzUGFnZUxpc3RQcm9wZXJ0eSgnTmFtZScpIHJldHVybiBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYWdlTGlzdFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICByZXR1cm4gcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoUEFHRUxJU1QpO1xufVxuXG5leHBvcnQgY29uc3QgaXNQYWdlTGlzdEluUGF0aCA9IChwcm9wZXJ0eU5hbWUsIGN1cnJlbnRDbGFzc0lEKSA9PiB7XG4gIGlmICghcHJvcGVydHlOYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHByb3BlcnR5TmFtZS5zcGxpdCgnLicpO1xuICBjb25zdCBtZXRhZGF0YTogYW55ID0gUENvcmUuZ2V0TWV0YWRhdGFVdGlscygpLmdldFByb3BlcnR5TWV0YWRhdGEoZmlyc3QsIGN1cnJlbnRDbGFzc0lEKTtcbiAgaWYgKG1ldGFkYXRhPy50eXBlID09PSAnUGFnZSBMaXN0Jykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBpc1BhZ2VMaXN0SW5QYXRoKHJlc3Quam9pbignLicpLCBtZXRhZGF0YT8ucGFnZUNsYXNzKTtcbn07XG5cbi8qKlxuICogW2dldEVtYmVkZGVkRmllbGROYW1lXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgICAgIGNvbnZlcnRpbmcgbm9ybWFsIGZpZWxkIG5hbWUgdG8gZW1iZWRkZWQgZmllbGQgc3RhcnRpbmcgd2l0aCAhUCEgb3IgIVBMIVxuICogQGlnbm9yZVxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSAgIEZpZWxkIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc0lEICAgICAgICBjbGFzc0lEIG9mIGRhdGFwYWdlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAgICAgICAgICAgICAgcmV0dXJucyBjb252ZXJ0ZWQgc3RyaW5nIHdpdGggIVAhIG9yICFQTCEgYW5kIDpcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGZvciBnZXRFbWJlZGRlZEZpZWxkTmFtZSA8L2NhcHRpb24+XG4gKiBGb3IgcGFnZSBwcm9wZXJ0eSwgZ2V0RW1iZWRkZWRGaWVsZE5hbWUoJ09yZ2FuaXNhdGlvbi5OYW1lJykgcmV0dXJuICchUCFPcmdhbmlzYXRpb246TmFtZSdcbiAqIEZvciBwYWdlTGlzdCBwcm9wZXJ0eSwgZ2V0RW1iZWRkZWRGaWVsZE5hbWUoJ0VtcGxveWVlcy5OYW1lJykgcmV0dXJuICchUEwhRW1wbG95ZWVzOk5hbWUnXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVtYmVkZGVkRmllbGROYW1lKHByb3BlcnR5TmFtZSwgY2xhc3NJRCkge1xuICBsZXQgdmFsdWUgPSBwcm9wZXJ0eU5hbWU7XG4gIGlmIChpc1BhZ2VMaXN0SW5QYXRoKHZhbHVlLCBjbGFzc0lEKSkge1xuICAgIHZhbHVlID0gYCFQTCEke3ZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnOicpfWA7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBgIVAhJHt2YWx1ZS5yZXBsYWNlKC9cXC4vZywgJzonKX1gO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbcHJlcGFyZVByb3BlcnR5TWFwc11cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgIHByZXBhcmluZyBtYXBzIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmQgc2V0IGl0IGluIGRhdGFBcGkgY29udGV4dFxuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gZmllbGRzICAgZmllbGRzIGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NJRCAgY2xhc3NJRCBvZiBkYXRhcGFnZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgIGRhdGFBcGkgY29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgcGFnZUxpc3RQcm9wZXJ0eSBpcyBwcmVzZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUHJvcGVydHlNYXBzKGZpZWxkcywgY2xhc3NJRCwgY29udGV4dCkge1xuICBjb25zdCB7IHNldFByb3BlcnR5TWFwcyB9ID0gY29udGV4dDtcbiAgY29uc3QgbWFwcyA9IGZpZWxkcy5yZWR1Y2UoXG4gICAgKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB7IHZhbHVlIH0gPSBmaWVsZC5jb25maWc7XG4gICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyAnKSArIDEpO1xuICAgICAgICBpZiAodmFsdWVbMF0gPT09ICcuJykgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZSA9IHZhbHVlO1xuICAgICAgLy8gUHJlcGFyaW5nIG5hbWUgZm9yIGVtYmVkZGVkIHByb3BlcnR5XG4gICAgICBpZiAoaXNFbWJlZGRlZEZpZWxkKG5hbWUpKSB7XG4gICAgICAgIG5hbWUgPSBnZXRFbWJlZGRlZEZpZWxkTmFtZShuYW1lLCBjbGFzc0lEKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BhZ2VMaXN0UHJvcGVydHkobmFtZSkgJiYgIWFjY1syXSkge1xuICAgICAgICBhY2NbMl0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgYWNjWzBdW3ZhbHVlXSA9IG5hbWU7XG4gICAgICBhY2NbMV1bbmFtZV0gPSB2YWx1ZTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFt7fSwge30sIGZhbHNlXVxuICApO1xuICBzZXRQcm9wZXJ0eU1hcHMobWFwc1swXSwgbWFwc1sxXSk7XG4gIHJldHVybiBtYXBzWzJdO1xufVxuXG4vKipcbiAqIFtnZXRDb25maWdFbWJlZGRlZEZpZWxkc01ldGFdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBHZXQgdGhlIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICogQGlnbm9yZVxuICogQHBhcmFtIHtTZXR9IGNvbmZpZ0ZpZWxkcyAgU2V0IG9mIGNvbmZpZyBmaWVsZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc0lEICAgIGNsYXNJRCBvZiBkYXRhcGFnZVxuICogQHJldHVybnMge0FycmF5fSAgICAgICAgICAgTWV0YWRhdGEgb2YgY29uZmlndXJlZCBlbWJlZGRlZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdGaWVsZHMsIGNsYXNzSUQpIHtcbiAgY29uc3QgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhOiBhbnlbXSA9IFtdO1xuICBjb25maWdGaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgbGV0IHZhbHVlID0gZmllbGQ7XG4gICAgaWYgKGlzRW1iZWRkZWRGaWVsZCh2YWx1ZSkpIHtcbiAgICAgIC8vIGNvbnZlcnNpb24gUGFnZS5QYWdlTGlzdFtdLnByb3BlcnR5ID0+IFBhZ2UuUGFnZUxpc3QucHJvcGVydHlcbiAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnWycpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmluZGV4T2YoJ1snKSkgKyB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignXScpICsgMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhOiBhbnkgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RW1iZWRkZWRQcm9wZXJ0eU1ldGFkYXRhKHZhbHVlLCBjbGFzc0lEKTtcbiAgICAgIG1ldGEuZmllbGRJRCA9IGZpZWxkO1xuICAgICAgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLnB1c2gobWV0YSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YTtcbn1cblxuLyoqXG4gKiBbbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGFdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBHZXQgdGhlIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhICBjb25maWcgZmllbGRzIG1ldGFkYXRhLlxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLCBtZXRhRmllbGRzKSB7XG4gIGNvbnN0IG1lcmdlZE1ldGFGaWVsZHMgPSBbLi4ubWV0YUZpZWxkc107XG4gIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YS5mb3JFYWNoKGNvbmZpZ0ZpZWxkTWV0YSA9PiB7XG4gICAgY29uc3QgZmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gY29uZmlnRmllbGRNZXRhLmZpZWxkSUQpO1xuICAgIGlmICghZmllbGRNZXRhKSBtZXJnZWRNZXRhRmllbGRzLnB1c2goY29uZmlnRmllbGRNZXRhKTtcbiAgfSk7XG4gIHJldHVybiBtZXJnZWRNZXRhRmllbGRzO1xufVxuXG5jb25zdCBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcgPSB7XG4gICdEYXRlIFRpbWUnOiAnRGF0ZSAmIHRpbWUnLFxuICBEYXRlOiAnRGF0ZSBvbmx5J1xufTtcblxuLyoqXG4gKiBbdXBkYXRlRmllbGRUeXBlXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgVXBkYXRlcyB0aGUgZmllbGQgdHlwZSBpZiBpdHMgY2hhbmdlZCBpbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uLiBTdWNoIG1hcHBpbmcgaXMgbWFpbnRhaW5lZCBpbiBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRhRmllbGRzICBGaWVsZHMgbWV0YWRhdGEgQXJyYXkuIENvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCB0aGUgZmllbGRzLlxuICovXG5mdW5jdGlvbiB1cGRhdGVGaWVsZFR5cGUobWV0YUZpZWxkcykge1xuICBtZXRhRmllbGRzLmZvckVhY2gobWV0YUZpZWxkID0+IHtcbiAgICBpZiAobWV0YUZpZWxkLnR5cGUpIG1ldGFGaWVsZC50eXBlID0gb2xkVG9OZXdGaWVsZFR5cGVNYXBwaW5nW21ldGFGaWVsZC50eXBlXSB8fCBtZXRhRmllbGQudHlwZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZXNldE1ldGFBdHRyaWJ1dGUoYXR0cmlidXRlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGNvbmZpZzogeyBsYWJlbCwgdmFsdWUgfVxuICB9ID0gYXR0cmlidXRlO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgbmFtZTogdmFsdWUuc3RhcnRzV2l0aCgnQCcpID8gdmFsdWUuc3Vic3RyaW5nKDQpIDogdmFsdWUsXG4gICAgbGFiZWw6IGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSA/IGxhYmVsLnN1YnN0cmluZygzKSA6IGxhYmVsXG4gIH07XG59XG5cbi8qKlxuICogW2dlbmVyYXRlVmlld01ldGFEYXRhXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGEgbGlzdCBvZiAgbWV0YW9iamVjdHMgb2YgdGhlIGZpZWxkcyBwcm92aWRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICByYXdGaWVsZHMgICAgICAgICBMaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUgbWV0YSBmb3JcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZpZWxkcyB3aXRoIHVwZGF0ZWQgbWV0YSBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShyYXdGaWVsZHMsIGNsYXNzSUQsIHNob3dGaWVsZCkge1xuICByZXR1cm4gcmF3RmllbGRzLm1hcChpdGVtID0+IGdldERlZmF1bHRWaWV3TWV0YShpdGVtLCBjbGFzc0lELCBzaG93RmllbGQpKTtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRzXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGxpc3Qgb2YgY29uZmlnIGZpZWxkcyB3aXRoIHByaW1hcnkgZmllbGRzIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBjb25maWdGaWVsZHMgICAgICBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge0FycmF5fSAgIHByaW1hcnlGaWVsZHMgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgICBNZXRhZGF0YSBvZiBhbGwgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJRCAgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGFsbCBmaWVsZHMgd2l0aCB0aGVpciBtZXRhIHVwZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0ZpZWxkcyhjb25maWdGaWVsZHMsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMsIGNsYXNzSUQpIHtcbiAgY29uc3QgcHJlc2V0Q29uZmlnRmllbGRzID0gY29uZmlnRmllbGRzO1xuICBjb25zdCBwcmltYXJ5RmllbGRzVmlld0luZGV4ID0gcHJlc2V0Q29uZmlnRmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5jb25maWcudmFsdWUgPT09ICdweVByaW1hcnlGaWVsZHMnKTtcbiAgaWYgKCFwcmltYXJ5RmllbGRzIHx8ICFwcmltYXJ5RmllbGRzLmxlbmd0aCkge1xuICAgIGlmIChwcmltYXJ5RmllbGRzVmlld0luZGV4IDwgMCkgcmV0dXJuIHByZXNldENvbmZpZ0ZpZWxkcztcblxuICAgIHByZXNldENvbmZpZ0ZpZWxkcy5zcGxpY2UocHJpbWFyeUZpZWxkc1ZpZXdJbmRleCwgMSk7XG5cbiAgICByZXR1cm4gcHJlc2V0Q29uZmlnRmllbGRzO1xuICB9XG5cbiAgaWYgKHByaW1hcnlGaWVsZHNWaWV3SW5kZXggPiAtMSkge1xuICAgIC8vIGxpc3Qgb2YgdW5jb21tb24gZmllbGRzIC0gbm9uIG92ZXJsYXAgb2YgcHJpbWFyeSBmaWVsZHMgZ3JvdXBlZCB2aWV3IGFuZCBpbmRlcGVuZGVudCBlbnRpdHkgY29sdW1ucyBvZiBwcmltYXJ5IHR5cGVcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0xpc3QgPSBwcmltYXJ5RmllbGRzLmZpbHRlcihcbiAgICAgIHByaW1hcnlGaWVsZCA9PiAhcHJlc2V0Q29uZmlnRmllbGRzLnNvbWUocHJlc2V0Q29uZmlnRmllbGQgPT4gcHJlc2V0Q29uZmlnRmllbGQuY29uZmlnLnZhbHVlLnNwbGl0KCcuJylbMV0gPT09IHByaW1hcnlGaWVsZClcbiAgICApO1xuICAgIGNvbnN0IHVuY29tbW9uRmllbGRzUmF3TWV0YTogYW55W10gPSBbXTtcbiAgICB1bmNvbW1vbkZpZWxkc0xpc3QuZm9yRWFjaCh1bmNvbW1vbkZpZWxkID0+IHtcbiAgICAgIGNvbnN0IHVuY29tbW9uRmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gdW5jb21tb25GaWVsZCk7XG4gICAgICBpZiAodW5jb21tb25GaWVsZE1ldGEpIHVuY29tbW9uRmllbGRzUmF3TWV0YS5wdXNoKHVuY29tbW9uRmllbGRNZXRhKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEgPSBnZW5lcmF0ZVZpZXdNZXRhRGF0YSh1bmNvbW1vbkZpZWxkc1Jhd01ldGEsIGNsYXNzSUQsIHRydWUpO1xuXG4gICAgcHJlc2V0Q29uZmlnRmllbGRzLnNwbGljZShwcmltYXJ5RmllbGRzVmlld0luZGV4LCAxLCAuLi51bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEpO1xuICB9XG4gIHJldHVybiBwcmVzZXRDb25maWdGaWVsZHM7XG59XG5cbi8qKlxuICogW2dldFRhYmxlQ29uZmlnRnJvbVByZXNldE1ldGFdXG4gKiBEZXNjcmlwdGlvbiAtIEdldCB0aGUgdGFibGUgY29uZmlnIGZyb20gdGhlIHByZXNldHMgbWV0YS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgIHByZXNldE1ldGEgICAgICAgICAgUHJlc2V0cyBtZXRhXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gICBpc01ldGFXaXRoUHJlc2V0cyAgIHRydWUgaWYgbWV0YSBoYXMgcHJlc2V0cyBlbHNlIGZhbHNlXG4gKiBAcGFyYW0gICB7RnVuY3Rpb259ICBnZXRQQ29ubmVjdCAgICAgICAgIENhbGxiYWNrIHRvIGdldCB0aGUgUENvbm5lY3Qgb2JqZWN0XG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICBjbGFzc0lEICAgICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgICBwcmltYXJ5RmllbGRzICAgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgIG1ldGFGaWVsZHMgICAgICAgICAgTGlzdCBvZiBhbGwgbWV0YWZpZWxkc1xuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBjb25maWcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbmZpZ0Zyb21QcmVzZXRNZXRhKHByZXNldE1ldGEsIGlzTWV0YVdpdGhQcmVzZXRzLCBwQ29ubiQsIGNsYXNzSUQsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMpIHtcbiAgbGV0IHByZXNldElkO1xuICBsZXQgcHJlc2V0TmFtZTtcbiAgbGV0IGNhcmRIZWFkZXI7XG4gIGxldCBzZWNvbmRhcnlUZXh0O1xuICBsZXQgdGltZWxpbmVEYXRlO1xuICBsZXQgdGltZWxpbmVUaXRsZTtcbiAgbGV0IHRpbWVsaW5lU3RhdHVzO1xuICBsZXQgdGltZWxpbmVJY29uO1xuICBsZXQgeyBmaWx0ZXJFeHByZXNzaW9uIH0gPSBwQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKS5jb25maWc7XG4gIGxldCBmaWVsZHNNZXRhO1xuICBsZXQgY29uZmlnRmllbGRzO1xuICBpZiAoaXNNZXRhV2l0aFByZXNldHMpIHtcbiAgICBwcmVzZXRJZCA9IHByZXNldE1ldGEuaWQ7XG4gICAgcHJlc2V0TmFtZSA9IHByZXNldE1ldGEubGFiZWw7XG4gICAgY2FyZEhlYWRlciA9IHByZXNldE1ldGEuY2FyZEhlYWRlciAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuY2FyZEhlYWRlcik7XG4gICAgc2Vjb25kYXJ5VGV4dCA9IHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCk7XG4gICAgdGltZWxpbmVEYXRlID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGUgJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSk7XG4gICAgdGltZWxpbmVUaXRsZSA9IHByZXNldE1ldGEudGltZWxpbmVUaXRsZSAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEudGltZWxpbmVUaXRsZSk7XG4gICAgdGltZWxpbmVTdGF0dXMgPSBwcmVzZXRNZXRhLnRpbWVsaW5lU3RhdHVzICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS50aW1lbGluZVN0YXR1cyk7XG4gICAgdGltZWxpbmVJY29uID0gcHJlc2V0TWV0YS50aW1lbGluZUljb24gJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lSWNvbik7XG4gICAgZmlsdGVyRXhwcmVzc2lvbiA9IHByZXNldE1ldGEuY29uZmlnLmZpbHRlckV4cHJlc3Npb247XG4gICAgW2ZpZWxkc01ldGFdID0gcHJlc2V0TWV0YS5jaGlsZHJlbjtcbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGUgJiZcbiAgICAgICFmaWVsZHNNZXRhLmNoaWxkcmVuLmZpbmQoZmllbGRNZXRhID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkTWV0YT8uY29uZmlnPy52YWx1ZSA9PT0gcHJlc2V0TWV0YS50aW1lbGluZVRpdGxlPy5jb25maWc/LnZhbHVlO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgY29uZmlnIH0gPSBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSAmJlxuICAgICAgIWZpZWxkc01ldGEuY2hpbGRyZW4uZmluZChmaWVsZE1ldGEgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGRNZXRhPy5jb25maWc/LnZhbHVlID09PSBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZT8uY29uZmlnPy52YWx1ZTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGNvbmZpZyB9ID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBjb25maWdGaWVsZHMgPSBnZXRDb25maWdGaWVsZHMoZmllbGRzTWV0YS5jaGlsZHJlbiwgcHJpbWFyeUZpZWxkcywgbWV0YUZpZWxkcywgY2xhc3NJRCk7XG4gIH0gZWxzZSB7XG4gICAgZmllbGRzTWV0YSA9IHByZXNldE1ldGEucHJvcHM7XG4gICAgY29uZmlnRmllbGRzID0gZ2V0Q29uZmlnRmllbGRzKFxuICAgICAgZmllbGRzTWV0YVxuICAgICAgICAuZ2V0UENvbm5lY3QoKVxuICAgICAgICAuZ2V0Q2hpbGRyZW4oKVxuICAgICAgICA/Lm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLmdldFBDb25uZWN0KCkuZ2V0UmF3TWV0YWRhdGEoKTtcbiAgICAgICAgfSksXG4gICAgICBwcmltYXJ5RmllbGRzLFxuICAgICAgbWV0YUZpZWxkcyxcbiAgICAgIGNsYXNzSURcbiAgICApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlc2V0SWQsXG4gICAgcHJlc2V0TmFtZSxcbiAgICBjYXJkSGVhZGVyLFxuICAgIHNlY29uZGFyeVRleHQsXG4gICAgdGltZWxpbmVEYXRlLFxuICAgIHRpbWVsaW5lVGl0bGUsXG4gICAgdGltZWxpbmVTdGF0dXMsXG4gICAgdGltZWxpbmVJY29uLFxuICAgIGZpbHRlckV4cHJlc3Npb24sXG4gICAgZmllbGRzTWV0YSxcbiAgICBjb25maWdGaWVsZHNcbiAgfTtcbn1cblxuLyoqXG4gKiBbZ2V0UmVwb3J0Q29sdW1uc11cbiAqIERlc2NyaXB0aW9uIC0gUmV0dXJucyBhIHNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IHJlc3BvbnNlIC1cbiAqIEByZXR1cm5zIHtTZXR9IFNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZVxuICovXG5mdW5jdGlvbiBnZXRSZXBvcnRDb2x1bW5zKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhOiB7IGRhdGE6IHJlcG9ydENvbHVtbnMgfVxuICB9ID0gcmVzcG9uc2U7XG4gIGNvbnN0IHJlcG9ydENvbHVtbnNTZXQgPSBuZXcgU2V0KCk7XG4gIHJlcG9ydENvbHVtbnM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgbGV0IHZhbCA9IGl0ZW0ucHlGaWVsZE5hbWU7XG4gICAgLy8gUmVtb3ZlICcuJyBmcm9tIGluZGV4IDAgb25seSwgaWYgJy4nIGlzIHByZXNlbnRcbiAgICBpZiAodmFsWzBdID09PSAnLicpIHtcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJlcG9ydENvbHVtbnNTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gcmVwb3J0Q29sdW1uc1NldDtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRWYWx1ZV1cbiAqIERlc2NyaXRwaW9uIC0gUmV0dXJucyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmllbGQuIFJlbW92ZSBhbnkgYW5ub3RhdGlvbnMgYW5kIGFsc28gXCIuXCJcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IGNvbmZpZ1xuICogICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlIC0gUmF3IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHdpdGggb3V0IGFueSBhbm5vdGF0aW9ucyBvciBcIi5cIlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZykge1xuICBsZXQgeyB2YWx1ZSB9ID0gY29uZmlnO1xuICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnLicpIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbcHJlcGFyZUNvbmZpZ0ZpZWxkc11cbiAqIERlc2NyaXB0aW9uIC0gUHJlcGFyZXMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWVsZHMgYW5kIHB1c2hlcyBlYWNoIGNvbmZpZyB0eXBlIHRvIGEgc2V0IHVzaW5nIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgICBjb25maWdGaWVsZHMgICAgICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtGdW5jdGlvbn0gIHB1c2hUb0NvbXBvbmVudHNMaXN0IENhbGxiYWNrIHRvIHB1c2ggdGhlIGZpZWxkIHR5cGUgdG8gYSBzZXQuXG4gKiBAcmV0dXJucyB7U2V0fSAgICAgICBjb25maWdGaWVsZFNldFxuICovXG5mdW5jdGlvbiBwcmVwYXJlQ29uZmlnRmllbGRzKGNvbmZpZ0ZpZWxkcywgcHVzaFRvQ29tcG9uZW50c0xpc3QpIHtcbiAgY29uc3QgY29uZmlnRmllbGRTZXQgPSBuZXcgU2V0KCk7XG4gIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIHB1c2hUb0NvbXBvbmVudHNMaXN0KGl0ZW0udHlwZSk7XG4gICAgY29uc3QgdmFsID0gZ2V0Q29uZmlnRmllbGRWYWx1ZShpdGVtLmNvbmZpZyk7XG4gICAgY29uZmlnRmllbGRTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gY29uZmlnRmllbGRTZXQ7XG59XG5cbi8qKlxuICogW2ZpbmRBdXRob3JlZEZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBGaW5kcyBhbiBhdXRob3JlZCBmaWVsZCBmcm9tIHloZSBsaXN0IG9mIGNvbmZpZyBmaWVsZHMuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgZmllbGRJRCAgICAgIEZpbHRlclxuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgIGNvbmZpZyB3aXRoIGl0cyBmaWVsZCB2YWx1ZSBlcXVhbCB0byBmaWVsZElELCB3aGljaCBtZWFucyBhbiBhdXRob3JlZCBmaWVsZFxuICovXG5mdW5jdGlvbiBmaW5kQXV0aG9yZWRGaWVsZChjb25maWdGaWVsZHMsIGZpZWxkSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5maW5kKGNvbmZpZ0ZpZWxkID0+IHtcbiAgICBjb25zdCB2YWwgPSBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZ0ZpZWxkLmNvbmZpZyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gZmllbGRJRDtcbiAgfSk7XG59XG5cbi8qKlxuICogW2ZpbmRBbmRVcGRhdGVBdXRob3JlZEZpZWxkQ29uZmlnXVxuICogRGVzY3JpcHRpb24gLSBGaW5kIHRoZSBhdXRob3JlZCBmaWVsZCwgYW5kIHVwZGF0ZSBpdHMgY29uZmlnLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge29iamVjdH0gIGl0ZW0gICAgICAgIEZpZWxkIGl0ZW0gdG8gY29weSBkaXNwbGF5QXMgYW5kIGNhdGVnb3J5IGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJZCAgICAgY2xhc3NJRCBmcm9tIHRoZSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBmaW5kQW5kVXBkYXRlQXV0aG9yZWRGaWVsZENvbmZpZyhjb25maWdGaWVsZHMsIGl0ZW0sIGNsYXNzSWQpIHtcbiAgY29uc3QgYXV0aG9yZWRGaWVsZCA9IGZpbmRBdXRob3JlZEZpZWxkKGNvbmZpZ0ZpZWxkcywgaXRlbS5maWVsZElEKTtcbiAgaWYgKGF1dGhvcmVkRmllbGQ/LmNvbmZpZykge1xuICAgIGlmIChpdGVtLmRpc3BsYXlBcykge1xuICAgICAgYXV0aG9yZWRGaWVsZC5jb25maWcuZGlzcGxheUFzID0gaXRlbS5kaXNwbGF5QXM7XG4gICAgfVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLmNsYXNzSUQgPSBpdGVtLmNsYXNzSUQgPz8gY2xhc3NJZDtcblxuICAgIGlmIChhdXRob3JlZEZpZWxkLnR5cGUgPT09IFVTRVJfUkVGRVJFTkNFKSB7XG4gICAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklEID0gaXRlbS5hc3NvY2lhdGlvbklEIHx8IGl0ZW0uZmllbGRJRDtcbiAgICB9XG4gICAgYXV0aG9yZWRGaWVsZC5jb25maWcuY2F0ZWdvcnkgPSBpdGVtLmNhdGVnb3J5O1xuICAgIC8vIEZpZWxkVHlwZSBpZGVudGlmaWVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGNvbmZpZ3VyZWQgYXMgcGlja0xpc3RcbiAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5maWVsZFR5cGUgPSBpdGVtLmZpZWxkVHlwZTtcbiAgICAvLyB0eXBlIGRlZmluZWQgb24gdGhlIHByb3BlcnR5IHJ1bGUsXG4gICAgLy8gdXNlZCBmb3IgdGhlIHBpY2tsaXN0IGZpZWxkIHRvIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLnByb3BlcnR5VHlwZSA9IGl0ZW0uZGF0YVR5cGUgfHwgaXRlbS50eXBlO1xuICB9XG59XG5cbi8qKlxuICogW2lzQW5FeHRyYUZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dHJhIGZpZWxkLiBFeHRyYSBmaWVsZCBpcyB0aGUgb25lIHdoaWNoIGlzIG5vdCBhdXRob3JlZCBidXQgcGFydCBvZiB0aGUgcmVwb3J0LlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyAgICAgIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgY29uZmlnRmllbGRTZXQgICAgU2V0IGlmIEF1dGhvcmVkIGZpbGVkIHZhbHVlc1xuICogQHBhcmFtICAge1NldH0gICAgIHJlcG9ydENvbHVtbnNTZXQgU2V0IG9mIGNvbHVtbnMgZnJvbSB0aGUgcmVwb3J0XG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgaXRlbSAgICAgICAgICAgICBDb25maWcgZmllbGQgaXRlbVxuICogQHBhcmFtICAge3N0cmluZ30gIGNsYXNzSWQgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSAgIHtib29sZWFufSBzaG93RHluYW1pY0ZpZWxkcyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBmaWVsZHMgYXJlIGZldGNoZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZVxuICogQHJldHVybnMge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgdHJ1ZSBJZiB0aGUgZmllbGQgaXMgYW4gZXh0cmEgZmllbGQgZWxzZSBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gaXNBbkV4dHJhRmllbGQoY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgaXRlbSwgY2xhc3NJZCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gSXMgdGhlIGZpZWxkIGFscmVhZHkgcHJlc2VudCBpbiBhdXRob3JpbmcgbWV0YWRhdGE/XG4gIC8vIE11dGF0ZXMgY29uZmlnIGZpZWxkcyB0byBjb3B5IGRpc3BsYXlBcyBhbmQgY2F0ZWdvcnkgaW5mb3JtYXRpb25cbiAgaWYgKGNvbmZpZ0ZpZWxkU2V0LmhhcyhpdGVtLmZpZWxkSUQpKSB7XG4gICAgZmluZEFuZFVwZGF0ZUF1dGhvcmVkRmllbGRDb25maWcoY29uZmlnRmllbGRzLCBpdGVtLCBjbGFzc0lkKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBmaWVsZCBpcyBub3QgYXV0aG9yZWQgYW5kIG5vdCBwYXJ0IG9mIHJlcG9ydCBjb2x1bW5zIHRoZW4gZGlzY2FyZCBpdFxuICByZXR1cm4gc2hvd0R5bmFtaWNGaWVsZHMgfHwgISFyZXBvcnRDb2x1bW5zU2V0LmhhcyhpdGVtLmZpZWxkSUQpO1xufVxuXG4vKipcbiAqIFtwcmVwYXJlRXh0cmFGaWVsZHNdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgYSBsaXN0IG9mIGV4dHJhIGZpZWxkcyB3aXRoIHRoZWlyIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgIExpc3Qgb2YgZmllbGRzXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtTZXR9ICAgICBjb25maWdGaWVsZFNldCAgICBTZXQgaWYgQXV0aG9yZWQgZmlsZWQgdmFsdWVzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgcmVwb3J0Q29sdW1uc1NldCBTZXQgb2YgY29sdW1ucyBmcm9tIHRoZSByZXBvcnRcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gc2hvd0R5bmFtaWNGaWVsZHMgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZmllbGRzIGFyZSBmZXRjaGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWVcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZXh0cmEgZmllbGRzIHdpdGggdGhlaXIgbWV0YSB1cGRhdGVkLlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRXh0cmFGaWVsZHMobWV0YUZpZWxkcywgY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgY2xhc3NJRCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gRmlsdGVyIGFsbCB0aGUgZXh0cmEgZmllbGRzXG4gIGNvbnN0IGV4dHJhRmlsZWRzID0gbWV0YUZpZWxkcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgcmV0dXJuIGlzQW5FeHRyYUZpZWxkKGNvbmZpZ0ZpZWxkcywgY29uZmlnRmllbGRTZXQsIHJlcG9ydENvbHVtbnNTZXQsIGl0ZW0sIGNsYXNzSUQsIHNob3dEeW5hbWljRmllbGRzKTtcbiAgfSk7XG4gIHJldHVybiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShleHRyYUZpbGVkcywgY2xhc3NJRCwgZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIG1ldGEgb2JqZWN0IG9mIGVhY2ggb2YgdGhlIGV4dHJhIGZpZWxkcy5cbn1cblxuY29uc3QgQXNzaWduRGFzaE9iamVjdHMgPSBbJ0Fzc2lnbi1Xb3JrbGlzdCcsICdBc3NpZ24tV29ya0Jhc2tldCddO1xuXG5mdW5jdGlvbiBwb3B1bGF0ZVJlbmRlcmluZ09wdGlvbnMobmFtZSwgY29uZmlnLCBmaWVsZCkge1xuICBjb25zdCBzaG91bGREaXNwbGF5QXNTZW1hbnRpY0xpbmsgPSAnZGlzcGxheUFzTGluaycgaW4gZmllbGQuY29uZmlnICYmIGZpZWxkLmNvbmZpZy5kaXNwbGF5QXNMaW5rO1xuICBpZiAoc2hvdWxkRGlzcGxheUFzU2VtYW50aWNMaW5rKSB7XG4gICAgY29uZmlnLmN1c3RvbU9iamVjdC5pc0Fzc2lnbm1lbnRMaW5rID0gQXNzaWduRGFzaE9iamVjdHMuaW5jbHVkZXMoZmllbGQuY29uZmlnLmNsYXNzSUQpO1xuICAgIGlmIChmaWVsZC5jb25maWcudmFsdWUuc3RhcnRzV2l0aCgnQENBJykpIHtcbiAgICAgIGNvbmZpZy5jdXN0b21PYmplY3QuaXNBc3NvY2lhdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIGNvbmZpZy5jZWxsUmVuZGVyZXIgPSBmb3JtYXRDb25zdGFudHMuV29ya0xpbms7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B5U3RhdHVzV29yaycgfHwgbmFtZSA9PT0gJ3B5QXNzaWdubWVudFN0YXR1cycpIHtcbiAgICBjb25maWcuY2VsbFJlbmRlcmVyID0gZm9ybWF0Q29uc3RhbnRzLldvcmtTdGF0dXM7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B4VXJnZW5jeVdvcmsnKSB7XG4gICAgY29uZmlnLmNlbGxSZW5kZXJlciA9IGZvcm1hdENvbnN0YW50cy5JbnRlZ2VyO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzOiBhbnlbXSA9IFtdLCBnZXRNYXBwZWRQcm9wZXJ0eTogYW55ID0gbnVsbCkge1xuICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQsIG9yaWdpbmFsQ29sSW5kZXgpID0+IHtcbiAgICBsZXQgbmFtZSA9IGZpZWxkLmNvbmZpZy52YWx1ZTtcblxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAobmFtZVswXSA9PT0gJy4nKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIG5hbWUgPSBnZXRNYXBwZWRQcm9wZXJ0eT8uKG5hbWUpID8/IG5hbWU7XG5cbiAgICBsZXQgbGFiZWwgPSBmaWVsZC5jb25maWcubGFiZWwgfHwgZmllbGQuY29uZmlnLmNhcHRpb247XG4gICAgY29uc3QgeyBzaG93ID0gdHJ1ZSwgZGlzcGxheUFzIH0gPSBmaWVsZC5jb25maWc7XG4gICAgaWYgKGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGxhYmVsLFxuICAgICAgc2hvdyxcbiAgICAgIGNsYXNzSUQ6IGZpZWxkLmNvbmZpZy5jbGFzc0lELFxuICAgICAgaWQ6IGZpZWxkLmlkIHx8IG5hbWUgfHwgb3JpZ2luYWxDb2xJbmRleCxcbiAgICAgIGRpc3BsYXlBcyxcbiAgICAgIGFzc29jaWF0aW9uSUQ6IGZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklELFxuICAgICAgLi4uKGZpZWxkLmNvbmZpZy5jbGFzc0lEICYmIHsgY2F0ZWdvcnk6IGZpZWxkLmNvbmZpZy5jYXRlZ29yeSB9KSxcbiAgICAgIGN1c3RvbU9iamVjdDoge30sXG4gICAgICBmaWVsZFR5cGU6IGZpZWxkLmNvbmZpZy5maWVsZFR5cGUsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLmZpZWxkXG4gICAgICB9XG4gICAgfTtcblxuICAgIHBvcHVsYXRlUmVuZGVyaW5nT3B0aW9ucyhuYW1lLCBjb25maWcsIGZpZWxkKTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0SXRlbUtleSA9IGZpZWxkcyA9PiB7XG4gIGxldCBpdGVtS2V5O1xuICBpZiAoZmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5pZCA9PT0gJ3B5R1VJRCcpID4gLTEpIHtcbiAgICBpdGVtS2V5ID0gJ3B5R1VJRCc7XG4gIH0gZWxzZSB7XG4gICAgaXRlbUtleSA9ICdwekluc0tleSc7XG4gIH1cbiAgcmV0dXJuIGl0ZW1LZXk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhdGNoUXVlcnlGaWVsZHMoZmllbGRzLCBpc0RhdGFPYmplY3QgPSBmYWxzZSwgY2xhc3NJRCA9ICcnKSB7XG4gIGNvbnN0IHF1ZXJ5RmllbGRzOiBhbnlbXSA9IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgY29uc3QgcGF0Y2hGaWVsZHM6IGFueVtdID0gW107XG4gICAgaWYgKGZpZWxkLmNlbGxSZW5kZXJlciA9PT0gJ1dvcmtMaW5rJykge1xuICAgICAgaWYgKGZpZWxkLmN1c3RvbU9iamVjdCAmJiBmaWVsZC5jdXN0b21PYmplY3QuaXNBc3NpZ25tZW50TGluaykge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbk5hbWUgPSBmaWVsZC5uYW1lLmluY2x1ZGVzKCc6JykgPyBgJHtmaWVsZC5uYW1lLnNwbGl0KCc6JylbMF19OmAgOiAnJztcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHhSZWZPYmplY3RDbGFzc2ApO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jdXN0b21PYmplY3QgJiYgZmllbGQuY3VzdG9tT2JqZWN0LmlzQXNzb2NpYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25DYXRlZ29yeSA9IGZpZWxkLm5hbWUuc3BsaXQoJzonKVswXTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweUlEYCk7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goYCR7YXNzb2NpYXRpb25DYXRlZ29yeX06cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweE9iakNsYXNzYCk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGF0YU9iamVjdCkge1xuICAgICAgICBjb25zdCBkYXRhVmlld05hbWUgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0U2F2YWJsZURhdGFQYWdlKGNsYXNzSUQpO1xuICAgICAgICBjb25zdCBkYXRhUGFnZUtleXMgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0RGF0YVBhZ2VLZXlzKGRhdGFWaWV3TmFtZSk7XG4gICAgICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IHBhdGNoRmllbGRzLnB1c2goaXRlbS5saW5rZWRGaWVsZCkgOiBwYXRjaEZpZWxkcy5wdXNoKGl0ZW0ua2V5TmFtZSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goJ3B5SUQnKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHpJbnNLZXknKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHhPYmpDbGFzcycpO1xuICAgICAgfVxuICAgIH1cbiAgICBwYXRjaEZpZWxkcy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFxdWVyeUZpZWxkcy5maW5kKHEgPT4gcSA9PT0gaykpIHtcbiAgICAgICAgcXVlcnlGaWVsZHMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHF1ZXJ5RmllbGRzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdHlwZSBQYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUGFnZUZpZWxkc0NvbmZpZyhjb25maWdGaWVsZHMsIHBhcmVudENsYXNzSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWc6IHsgdmFsdWUgfVxuICAgIH0gPSBpdGVtO1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IFBDb3JlLmdldEFubm90YXRpb25VdGlscygpLmdldFByb3BlcnR5TmFtZSh2YWx1ZSk7XG4gICAgaWYgKGlzRW1iZWRkZWRGaWVsZCh2YWx1ZSkgJiYgIWlzUGFnZUxpc3RJblBhdGgocHJvcGVydHlOYW1lLCBwYXJlbnRDbGFzc0lEKSkge1xuICAgICAgaXRlbS5jb25maWcuY29tcG9uZW50VHlwZSA9IHR5cGU7XG4gICAgICBpdGVtLnR5cGUgPSAnUGFnZVByb3BlcnR5UmVuZGVyZXInO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQ29udGV4dFJlc3BvbnNlID0gYXN5bmMgKGNvbnRleHQsIHBhcmFtcykgPT4ge1xuICBjb25zdCB7IHBDb25uJCwgYXBpQ29udGV4dCwgY2hpbGRyZW4sIHNob3dEeW5hbWljRmllbGRzLCByZWZlcmVuY2VMaXN0LCBpc0RhdGFPYmplY3QgfSA9IHBhcmFtcztcbiAgLy8gbGV0IHsgbGlzdENvbnRleHQgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBwcm9taXNlc1Jlc3BvbnNlQXJyYXksIGFwaUNvbnRleHQ6IG90aGVyQ29udGV4dCB9ID0gY29udGV4dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvbm8tdW51c2VkLWNvbGxlY3Rpb25cbiAgY29uc3QgbGlzdE9mQ29tcG9uZW50czogYW55W10gPSBbXTtcbiAgY29uc3Qge1xuICAgIGRhdGE6IHsgZmllbGRzOiBtZXRhRmllbGRzLCBjbGFzc0lELCBpc1F1ZXJ5YWJsZSB9XG4gIH0gPSBwcm9taXNlc1Jlc3BvbnNlQXJyYXlbMF07XG4gIGxldCB7XG4gICAgZGF0YTogeyBwcmltYXJ5RmllbGRzIH1cbiAgfSA9IHByb21pc2VzUmVzcG9uc2VBcnJheVswXTtcbiAgLy8gV2hlbiBsaXN0IGlzIGNvbmZpZ3VyZWQgd2l0aCBJbmNsdWRlIGFsbCBjbGFzcyBmaWVsZHMgY29uZmlndXJhdGlvbiwgcHJvdmlkZSBzdXBwb3J0IGZvciBQcmltYXJ5IGZpZWxkcyBjb2x1bW5cbiAgaWYgKHNob3dEeW5hbWljRmllbGRzKSB7XG4gICAgY29uc3Qgc291cmNlTWV0YWRhdGEgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RGF0YVBhZ2VNZXRhZGF0YShyZWZlcmVuY2VMaXN0KTtcbiAgICBpZiAoc291cmNlTWV0YWRhdGE/LnByaW1hcnlGaWVsZHMpIHtcbiAgICAgIHByaW1hcnlGaWVsZHMgPSBzb3VyY2VNZXRhZGF0YS5wcmltYXJ5RmllbGRzO1xuICAgIH1cbiAgICAvLyB1cGRhdGluZyBtZXRhRGF0YSBmaWVsZElEIHRvIG5vcm1hbCBwcm9wZXJ0eSBpZiBpdCBoYXMgZmllbGRJRCBzdGFydHMgd2l0aCAhUCEgb3IgIVBMIVxuICAgIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcyk7XG4gIH1cbiAgdXBkYXRlRmllbGRUeXBlKG1ldGFGaWVsZHMpO1xuXG4gIGlmIChpc0RhdGFPYmplY3QpIHtcbiAgICBjb25zdCBjb21wb3NpdGVLZXlzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGRhdGFWaWV3TmFtZSA9IFBDb3JlLmdldERhdGFUeXBlVXRpbHMoKS5nZXRTYXZhYmxlRGF0YVBhZ2UoY2xhc3NJRCk7XG4gICAgY29uc3QgZGF0YVBhZ2VLZXlzID0gUENvcmUuZ2V0RGF0YVR5cGVVdGlscygpLmdldERhdGFQYWdlS2V5cyhkYXRhVmlld05hbWUpO1xuICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmxpbmtlZEZpZWxkKSA6IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmtleU5hbWUpKSk7XG4gICAgaWYgKGNvbXBvc2l0ZUtleXMubGVuZ3RoICYmIG90aGVyQ29udGV4dCkge1xuICAgICAgb3RoZXJDb250ZXh0LnNldENvbXBvc2l0ZUtleXMoY29tcG9zaXRlS2V5cyk7XG4gICAgfVxuICAgIGlmIChvdGhlckNvbnRleHQpIHtcbiAgICAgIG90aGVyQ29udGV4dC5mZXRjaFJvd0FjdGlvbkRldGFpbHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByZXNldEFycmF5ID0gW107XG4gIGNvbnN0IHJhd01ldGFkYXRhID0gcENvbm4kLmdldFJhd01ldGFkYXRhKCkuY29uZmlnO1xuICBjb25zdCByYXdQcmVzZXRzID0gcmF3TWV0YWRhdGEucHJlc2V0cztcbiAgY29uc3QgaXNNZXRhV2l0aFByZXNldHMgPSByYXdQcmVzZXRzICYmIHJhd1ByZXNldHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBjaGlsZHJlbkl0ZXJhdG9yID0gaXNNZXRhV2l0aFByZXNldHMgPyByYXdQcmVzZXRzIDogY2hpbGRyZW47XG4gIGNvbnN0IHJlc29sdmVkUHJlc2V0cyA9IHBDb25uJC5nZXRDb25maWdQcm9wcygpLnByZXNldHM7XG4gIGxldCBmaWVsZHM7XG4gIGxldCB0YWJsZUNvbmZpZztcbiAgY2hpbGRyZW5JdGVyYXRvcj8uZm9yRWFjaCgocHJlc2V0TWV0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpZ0ZpZWxkcyB9ID0gZ2V0VGFibGVDb25maWdGcm9tUHJlc2V0TWV0YShcbiAgICAgIHsgLi4ucHJlc2V0TWV0YSwgbGFiZWw6IHJlc29sdmVkUHJlc2V0c1tpbmRleF0ubGFiZWwgfSxcbiAgICAgIGlzTWV0YVdpdGhQcmVzZXRzLFxuICAgICAgcENvbm4kLFxuICAgICAgY2xhc3NJRCxcbiAgICAgIHByaW1hcnlGaWVsZHMsXG4gICAgICBtZXRhRmllbGRzXG4gICAgKTtcbiAgICBjb25zdCBwdXNoVG9Db21wb25lbnRzTGlzdCA9IGZpZWxkVHlwZSA9PiB7XG4gICAgICBsaXN0T2ZDb21wb25lbnRzLnB1c2goZmllbGRUeXBlKTtcbiAgICB9O1xuICAgIC8vIHJlYWQgcmVwb3J0IGNvbHVtbnMgcmVzcG9uc2UgLSBpbiBjYXNlIG9mIG5vbnF1ZXJ5YWJsZSBpZ25vcmUgdGhlIHJlc3BvbnNlIGFuZCByZWx5IG9ubHkgb24gdGhlIGZpZWxkcyBjb25maWd1cmVkIGF0IGF1dGhvaW5nIHRpbWUgaW4gcHJlc2V0c1xuICAgIGNvbnN0IHJlcG9ydENvbHVtbnNTZXQgPSBpc1F1ZXJ5YWJsZSA/IGdldFJlcG9ydENvbHVtbnMocHJvbWlzZXNSZXNwb25zZUFycmF5WzFdKSA6IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IGNvbmZpZ0ZpZWxkU2V0ID0gcHJlcGFyZUNvbmZpZ0ZpZWxkcyhjb25maWdGaWVsZHMsIHB1c2hUb0NvbXBvbmVudHNMaXN0KTtcblxuICAgIC8vIEZJWE1FICNFbWJlZGRlZFByb3BlcnR5UGF0Y2hcbiAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBtZXJnZSBsb2dpYyB3aGVuIHRoZSBtZXRhZGF0YSByZXNwb25zZSBpbmNsdWRlcyBhbGwgb3B0aW1pemVkIGVtYmVkZGVkIHBhZ2UgYW5kIHBhZ2VsaXN0c1xuICAgIC8vIG1lcmdpbmcgY29uZmlndXJlZCBlbWJlZGRlZCBwcm9wZXJ0aWVzIHdpdGggbWV0YWRhdGEgc28gdGhhdCB3aGlsZSBwcmVwYXJpbmcgZXh0cmEgZmllbGRzLCBjb25maWcgZmllbGRzIGNhbiBnZXQgb3RoZXIgcHJvcGVydGllcyBmcm9tIG1ldGEoZWc6IGNhdGVnb3J5LCBkaXNwbGF5QXNMaW5rKVxuICAgIC8vIGdldCBjb25maWd1cmVkIGVtYmVkZGVkIHByb3BlcnRpZXMgbWV0YWRhdGEgYW5kIGdldCBuZXcgbWVyZ2VkTWV0YUZpZWxkc1xuICAgIGNvbnN0IGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YSA9IGdldENvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdGaWVsZFNldCwgY2xhc3NJRCk7XG4gICAgY29uc3QgbWVyZ2VkTWV0YUZpZWxkcyA9IG1lcmdlQ29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhKGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YSwgbWV0YUZpZWxkcyk7XG5cbiAgICBjb25zdCBleHRyYUZpZWxkcyA9IHByZXBhcmVFeHRyYUZpZWxkcyhcbiAgICAgIG1lcmdlZE1ldGFGaWVsZHMsIC8vIHBhc3NpbmcgbmV3IG1lcmdlZCBtZXRhIGZpZWxkcyB3aGljaCBoYXMgbWV0YSBvZiBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkcyBvZiBjdXJyZW50IHByZXNldFxuICAgICAgY29uZmlnRmllbGRzLFxuICAgICAgY29uZmlnRmllbGRTZXQsXG4gICAgICByZXBvcnRDb2x1bW5zU2V0LFxuICAgICAgY2xhc3NJRCxcbiAgICAgIHNob3dEeW5hbWljRmllbGRzXG4gICAgKTtcblxuICAgIGlmIChpc1F1ZXJ5YWJsZSkge1xuICAgICAgdXBkYXRlUGFnZUZpZWxkc0NvbmZpZyhjb25maWdGaWVsZHMsIGNsYXNzSUQpO1xuICAgICAgcHJlcGFyZVByb3BlcnR5TWFwcyhbLi4uY29uZmlnRmllbGRzLCAuLi5leHRyYUZpZWxkc10sIGNsYXNzSUQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ2V0TWFwcGVkUHJvcGVydHkgfSA9IGNvbnRleHQ7XG5cbiAgICBmaWVsZHMgPSBpbml0aWFsaXplQ29sdW1ucyhbLi4uY29uZmlnRmllbGRzLCAuLi5leHRyYUZpZWxkc10sIGdldE1hcHBlZFByb3BlcnR5KTtcbiAgICBjb25zdCBwYXRjaFF1ZXJ5RmllbGRzID0gcHJlcGFyZVBhdGNoUXVlcnlGaWVsZHMoZmllbGRzLCBpc0RhdGFPYmplY3QsIGNsYXNzSUQpO1xuICAgIGNvbnN0IGl0ZW1LZXkgPSBnZXRJdGVtS2V5KGZpZWxkcyk7XG4gICAgdGFibGVDb25maWcgPSB7IGZpZWxkRGVmczogZmllbGRzLCBwYXRjaFF1ZXJ5RmllbGRzLCBpdGVtS2V5LCBpc1F1ZXJ5YWJsZSB9O1xuICB9KTtcbiAgY29uc3QgbWV0YSA9IHRhYmxlQ29uZmlnO1xuICBwYXJhbXMubGlzdENvbnRleHQgPSB7IG1ldGEsIHByZXNldHM6IHByZXNldEFycmF5LCBhcGlDb250ZXh0OiB7IC4uLmFwaUNvbnRleHQgfSB9O1xuICByZXR1cm4gcGFyYW1zLmxpc3RDb250ZXh0O1xufTtcbiJdfQ==