@hmcts/ccd-case-ui-toolkit 5.0.29-angular11-upgrade → 5.0.31-angular11-upgrade

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 (224) hide show
  1. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js +12829 -9709
  2. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js.map +1 -1
  3. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js +1 -1
  4. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js.map +1 -1
  5. package/esm2015/lib/app.config.js +1 -1
  6. package/esm2015/lib/components/banners/banners.module.js +13 -6
  7. package/esm2015/lib/components/banners/index.js +2 -1
  8. package/esm2015/lib/components/banners/notification-banner/domain/index.js +2 -0
  9. package/esm2015/lib/components/banners/notification-banner/domain/notification-banner-config.model.js +2 -0
  10. package/esm2015/lib/components/banners/notification-banner/enums/index.js +3 -0
  11. package/esm2015/lib/components/banners/notification-banner/enums/notification-banner-style.enum.js +8 -0
  12. package/esm2015/lib/components/banners/notification-banner/enums/notification-banner-type.enum.js +8 -0
  13. package/esm2015/lib/components/banners/notification-banner/index.js +4 -0
  14. package/esm2015/lib/components/banners/notification-banner/notification-banner.component.js +130 -0
  15. package/esm2015/lib/components/banners/notification-banner/notification-banner.module.js +19 -0
  16. package/esm2015/lib/shared/components/case-editor/case-edit-confirm/case-edit-confirm.component.js +2 -7
  17. package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.js +42 -31
  18. package/esm2015/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.js +157 -153
  19. package/esm2015/lib/shared/components/case-editor/case-editor.module.js +19 -16
  20. package/esm2015/lib/shared/components/case-list-filters/case-list-filters.component.js +2 -4
  21. package/esm2015/lib/shared/components/case-list-filters/case-list-filters.module.js +4 -1
  22. package/esm2015/lib/shared/components/case-viewer/case-challenged-access-request/case-challenged-access-request.component.js +2 -5
  23. package/esm2015/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.js +32 -17
  24. package/esm2015/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.js +197 -104
  25. package/esm2015/lib/shared/components/case-viewer/case-review-specific-access-request/case-review-specific-access-request.component.js +2 -4
  26. package/esm2015/lib/shared/components/case-viewer/case-specific-access-request/case-specific-access-request.component.js +2 -5
  27. package/esm2015/lib/shared/components/case-viewer/case-viewer.module.js +18 -10
  28. package/esm2015/lib/shared/components/case-viewer/printer/case-printer.component.js +2 -5
  29. package/esm2015/lib/shared/components/palette/address/write-address-field.component.js +2 -6
  30. package/esm2015/lib/shared/components/palette/base-field/field-read.component.js +2 -4
  31. package/esm2015/lib/shared/components/palette/base-field/field-write.component.js +5 -1
  32. package/esm2015/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.js +145 -0
  33. package/esm2015/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.js +97 -0
  34. package/esm2015/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.js +148 -0
  35. package/esm2015/lib/shared/components/palette/case-flag/components/index.js +9 -0
  36. package/esm2015/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.js +200 -0
  37. package/esm2015/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.js +295 -0
  38. package/esm2015/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.js +188 -0
  39. package/esm2015/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.js +251 -0
  40. package/esm2015/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.js +192 -0
  41. package/esm2015/lib/shared/components/palette/case-flag/domain/case-flag-state.model.js +2 -0
  42. package/esm2015/lib/shared/components/palette/case-flag/domain/case-flag.model.js +2 -0
  43. package/esm2015/lib/shared/components/palette/case-flag/domain/index.js +4 -0
  44. package/esm2015/lib/shared/components/palette/case-flag/domain/language.model.js +2 -0
  45. package/esm2015/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.js +6 -0
  46. package/esm2015/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.js +6 -0
  47. package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.js +7 -0
  48. package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.js +6 -0
  49. package/esm2015/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.js +12 -0
  50. package/esm2015/lib/shared/components/palette/case-flag/enums/index.js +14 -0
  51. package/esm2015/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.js +7 -0
  52. package/esm2015/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.js +8 -0
  53. package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.js +6 -0
  54. package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.js +6 -0
  55. package/esm2015/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.js +7 -0
  56. package/esm2015/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.js +6 -0
  57. package/esm2015/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.js +6 -0
  58. package/esm2015/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.js +14 -0
  59. package/esm2015/lib/shared/components/palette/case-flag/index.js +6 -0
  60. package/esm2015/lib/shared/components/palette/case-flag/read-case-flag-field.component.js +152 -0
  61. package/esm2015/lib/shared/components/palette/case-flag/write-case-flag-field.component.js +455 -0
  62. package/esm2015/lib/shared/components/palette/complex/read-complex-field.component.js +2 -6
  63. package/esm2015/lib/shared/components/palette/date/write-date-container-field.component.js +2 -6
  64. package/esm2015/lib/shared/components/palette/history/case-history-viewer-field.component.js +2 -3
  65. package/esm2015/lib/shared/components/palette/history/event-log/event-log.component.js +2 -5
  66. package/esm2015/lib/shared/components/palette/index.js +2 -1
  67. package/esm2015/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.js +4 -4
  68. package/esm2015/lib/shared/components/palette/label/label-field.component.js +2 -4
  69. package/esm2015/lib/shared/components/palette/order-summary/read-order-summary-field.component.js +2 -5
  70. package/esm2015/lib/shared/components/palette/order-summary/read-order-summary-row.component.js +2 -3
  71. package/esm2015/lib/shared/components/palette/order-summary/write-order-summary-field.component.js +2 -3
  72. package/esm2015/lib/shared/components/palette/organisation/read-organisation-field.component.js +2 -5
  73. package/esm2015/lib/shared/components/palette/organisation/write-organisation-field.component.js +2 -6
  74. package/esm2015/lib/shared/components/palette/palette.module.js +69 -17
  75. package/esm2015/lib/shared/components/palette/palette.service.js +5 -1
  76. package/esm2015/lib/shared/components/search-result/search-result.component.js +45 -50
  77. package/esm2015/lib/shared/domain/case-flag/flag-type.model.js +13 -0
  78. package/esm2015/lib/shared/domain/case-flag/hmcts-service-detail.model.js +9 -0
  79. package/esm2015/lib/shared/domain/case-flag/index.js +3 -0
  80. package/esm2015/lib/shared/domain/case-view/case-view.model.js +1 -1
  81. package/esm2015/lib/shared/domain/definition/field-type-enum.model.js +1 -1
  82. package/esm2015/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.js +2 -2
  83. package/esm2015/lib/shared/services/addresses/address-parser.js +6 -6
  84. package/esm2015/lib/shared/services/addresses/address-type.enum.js +7 -0
  85. package/esm2015/lib/shared/services/addresses/addresses.service.js +3 -5
  86. package/esm2015/lib/shared/services/case-flag/case-flag-refdata.service.js +75 -0
  87. package/esm2015/lib/shared/services/case-flag/index.js +3 -0
  88. package/esm2015/lib/shared/services/case-flag/refdata-case-flag-type.enum.js +6 -0
  89. package/esm2015/lib/shared/services/fields/fields.utils.js +220 -5
  90. package/esm2015/lib/shared/services/form/form-value.service.js +100 -73
  91. package/esm2015/lib/shared/services/index.js +2 -1
  92. package/fesm2015/hmcts-ccd-case-ui-toolkit.js +13996 -11169
  93. package/fesm2015/hmcts-ccd-case-ui-toolkit.js.map +1 -1
  94. package/lib/app.config.d.ts +2 -0
  95. package/lib/app.config.d.ts.map +1 -1
  96. package/lib/components/banners/banners.module.d.ts +2 -1
  97. package/lib/components/banners/banners.module.d.ts.map +1 -1
  98. package/lib/components/banners/index.d.ts +1 -0
  99. package/lib/components/banners/index.d.ts.map +1 -1
  100. package/lib/components/banners/notification-banner/domain/index.d.ts +2 -0
  101. package/lib/components/banners/notification-banner/domain/index.d.ts.map +1 -0
  102. package/lib/components/banners/notification-banner/domain/notification-banner-config.model.d.ts +13 -0
  103. package/lib/components/banners/notification-banner/domain/notification-banner-config.model.d.ts.map +1 -0
  104. package/lib/components/banners/notification-banner/enums/index.d.ts +3 -0
  105. package/lib/components/banners/notification-banner/enums/index.d.ts.map +1 -0
  106. package/lib/components/banners/notification-banner/enums/notification-banner-style.enum.d.ts +7 -0
  107. package/lib/components/banners/notification-banner/enums/notification-banner-style.enum.d.ts.map +1 -0
  108. package/lib/components/banners/notification-banner/enums/notification-banner-type.enum.d.ts +7 -0
  109. package/lib/components/banners/notification-banner/enums/notification-banner-type.enum.d.ts.map +1 -0
  110. package/lib/components/banners/notification-banner/index.d.ts +4 -0
  111. package/lib/components/banners/notification-banner/index.d.ts.map +1 -0
  112. package/lib/components/banners/notification-banner/notification-banner.component.d.ts +13 -0
  113. package/lib/components/banners/notification-banner/notification-banner.component.d.ts.map +1 -0
  114. package/lib/components/banners/notification-banner/notification-banner.module.d.ts +9 -0
  115. package/lib/components/banners/notification-banner/notification-banner.module.d.ts.map +1 -0
  116. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +11 -5
  117. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  118. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts +14 -25
  119. package/lib/shared/components/case-editor/case-edit-submit/case-edit-submit.component.d.ts.map +1 -1
  120. package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts +6 -10
  121. package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts.map +1 -1
  122. package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts +18 -4
  123. package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts.map +1 -1
  124. package/lib/shared/components/case-viewer/case-viewer.module.d.ts.map +1 -1
  125. package/lib/shared/components/palette/base-field/field-read.component.d.ts.map +1 -1
  126. package/lib/shared/components/palette/base-field/field-write.component.d.ts.map +1 -1
  127. package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts +25 -0
  128. package/lib/shared/components/palette/case-flag/components/add-comments/add-comments.component.d.ts.map +1 -0
  129. package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts +20 -0
  130. package/lib/shared/components/palette/case-flag/components/case-flag-summary-list/case-flag-summary-list.component.d.ts.map +1 -0
  131. package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts +12 -0
  132. package/lib/shared/components/palette/case-flag/components/case-flag-table/case-flag-table.component.d.ts.map +1 -0
  133. package/lib/shared/components/palette/case-flag/components/index.d.ts +9 -0
  134. package/lib/shared/components/palette/case-flag/components/index.d.ts.map +1 -0
  135. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts +28 -0
  136. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts.map +1 -0
  137. package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts +39 -0
  138. package/lib/shared/components/palette/case-flag/components/search-language-interpreter/search-language-interpreter.component.d.ts.map +1 -0
  139. package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts +26 -0
  140. package/lib/shared/components/palette/case-flag/components/select-flag-location/select-flag-location.component.d.ts.map +1 -0
  141. package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts +40 -0
  142. package/lib/shared/components/palette/case-flag/components/select-flag-type/select-flag-type.component.d.ts.map +1 -0
  143. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts +26 -0
  144. package/lib/shared/components/palette/case-flag/components/update-flag/update-flag.component.d.ts.map +1 -0
  145. package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts +18 -0
  146. package/lib/shared/components/palette/case-flag/domain/case-flag-state.model.d.ts.map +1 -0
  147. package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts +47 -0
  148. package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts.map +1 -0
  149. package/lib/shared/components/palette/case-flag/domain/index.d.ts +4 -0
  150. package/lib/shared/components/palette/case-flag/domain/index.d.ts.map +1 -0
  151. package/lib/shared/components/palette/case-flag/domain/language.model.d.ts +5 -0
  152. package/lib/shared/components/palette/case-flag/domain/language.model.d.ts.map +1 -0
  153. package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts +5 -0
  154. package/lib/shared/components/palette/case-flag/enums/add-comments-error-message.enum.d.ts.map +1 -0
  155. package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts +5 -0
  156. package/lib/shared/components/palette/case-flag/enums/add-comments-step.enum.d.ts.map +1 -0
  157. package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts +6 -0
  158. package/lib/shared/components/palette/case-flag/enums/case-flag-status.enum.d.ts.map +1 -0
  159. package/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.d.ts +5 -0
  160. package/lib/shared/components/palette/case-flag/enums/case-flag-summary-list-display-mode.enum.d.ts.map +1 -0
  161. package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts +11 -0
  162. package/lib/shared/components/palette/case-flag/enums/case-flag-wizard-step-title.enum.d.ts.map +1 -0
  163. package/lib/shared/components/palette/case-flag/enums/index.d.ts +14 -0
  164. package/lib/shared/components/palette/case-flag/enums/index.d.ts.map +1 -0
  165. package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.d.ts +6 -0
  166. package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-error-message.enum.d.ts.map +1 -0
  167. package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.d.ts +7 -0
  168. package/lib/shared/components/palette/case-flag/enums/search-language-interpreter-step.enum.d.ts.map +1 -0
  169. package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts +5 -0
  170. package/lib/shared/components/palette/case-flag/enums/select-flag-error-message.enum.d.ts.map +1 -0
  171. package/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.d.ts +5 -0
  172. package/lib/shared/components/palette/case-flag/enums/select-flag-location-error-message.enum.d.ts.map +1 -0
  173. package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts +6 -0
  174. package/lib/shared/components/palette/case-flag/enums/select-flag-type-error-message.enum.d.ts.map +1 -0
  175. package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts +5 -0
  176. package/lib/shared/components/palette/case-flag/enums/update-flag-error-message.enum.d.ts.map +1 -0
  177. package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts +5 -0
  178. package/lib/shared/components/palette/case-flag/enums/update-flag-step.enum.d.ts.map +1 -0
  179. package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts +12 -0
  180. package/lib/shared/components/palette/case-flag/enums/write-case-flag-field.enum.d.ts.map +1 -0
  181. package/lib/shared/components/palette/case-flag/index.d.ts +6 -0
  182. package/lib/shared/components/palette/case-flag/index.d.ts.map +1 -0
  183. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts +27 -0
  184. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts.map +1 -0
  185. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts +61 -0
  186. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -0
  187. package/lib/shared/components/palette/index.d.ts +1 -0
  188. package/lib/shared/components/palette/index.d.ts.map +1 -1
  189. package/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.d.ts +3 -3
  190. package/lib/shared/components/palette/judicial-user/read-judicial-user-field.component.d.ts.map +1 -1
  191. package/lib/shared/components/palette/palette.module.d.ts +94 -84
  192. package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
  193. package/lib/shared/components/palette/palette.service.d.ts.map +1 -1
  194. package/lib/shared/domain/case-flag/flag-type.model.d.ts +21 -0
  195. package/lib/shared/domain/case-flag/flag-type.model.d.ts.map +1 -0
  196. package/lib/shared/domain/case-flag/hmcts-service-detail.model.d.ts +17 -0
  197. package/lib/shared/domain/case-flag/hmcts-service-detail.model.d.ts.map +1 -0
  198. package/lib/shared/domain/case-flag/index.d.ts +3 -0
  199. package/lib/shared/domain/case-flag/index.d.ts.map +1 -0
  200. package/lib/shared/domain/case-view/case-view.model.d.ts +2 -0
  201. package/lib/shared/domain/case-view/case-view.model.d.ts.map +1 -1
  202. package/lib/shared/domain/definition/field-type-enum.model.d.ts +1 -1
  203. package/lib/shared/domain/definition/field-type-enum.model.d.ts.map +1 -1
  204. package/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.d.ts.map +1 -1
  205. package/lib/shared/services/addresses/address-type.enum.d.ts +6 -0
  206. package/lib/shared/services/addresses/address-type.enum.d.ts.map +1 -0
  207. package/lib/shared/services/addresses/addresses.service.d.ts +0 -3
  208. package/lib/shared/services/addresses/addresses.service.d.ts.map +1 -1
  209. package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts +31 -0
  210. package/lib/shared/services/case-flag/case-flag-refdata.service.d.ts.map +1 -0
  211. package/lib/shared/services/case-flag/index.d.ts +3 -0
  212. package/lib/shared/services/case-flag/index.d.ts.map +1 -0
  213. package/lib/shared/services/case-flag/refdata-case-flag-type.enum.d.ts +5 -0
  214. package/lib/shared/services/case-flag/refdata-case-flag-type.enum.d.ts.map +1 -0
  215. package/lib/shared/services/fields/fields.utils.d.ts +41 -8
  216. package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
  217. package/lib/shared/services/form/form-value.service.d.ts +20 -19
  218. package/lib/shared/services/form/form-value.service.d.ts.map +1 -1
  219. package/lib/shared/services/index.d.ts +1 -0
  220. package/lib/shared/services/index.d.ts.map +1 -1
  221. package/package.json +1 -1
  222. package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.js +0 -11
  223. package/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.d.ts +0 -10
  224. package/lib/shared/components/case-editor/case-edit-page/case-edit-page-text.enum.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { FieldsUtils } from '../fields/fields.utils';
2
+ import { FieldsUtils } from '../fields';
3
3
  import { FieldTypeSanitiser } from './field-type-sanitiser';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "./field-type-sanitiser";
@@ -25,13 +25,7 @@ export class FormValueService {
25
25
  * Other examples:
26
26
  * 1) simple field reference: form={ 'PersonFirstName': 'John' }, fieldKey=PersonFirstName, value=John
27
27
  * 2) complex field reference:
28
- * form= { complex1': {
29
- * 'simple11': 'value11',
30
- * 'simple12': 'value12',
31
- * 'complex2': {
32
- * 'simple21': 'value21'
33
- * }
34
- * }},
28
+ * form= { complex1': { 'simple11': 'value11', 'simple12': 'value12', 'complex2': { 'simple21': 'value21' } }},
35
29
  * fieldKey=complex1.complex2.simple21
36
30
  * colIndex=0,
37
31
  * value=value21
@@ -112,10 +106,6 @@ export class FormValueService {
112
106
  * If key is pointing at a complex or collection leaf (not simple, collection of simple or multiselect types) then undefined is returned.
113
107
  * Also no key referring a leaf that is contained within collection will contain index number. The index is passed as an argument to the
114
108
  * method.
115
- * @param form form
116
- * @param fieldKey dot separated reference to value
117
- * @param colIndex index of collection item being referenced or 0 otherwise
118
- * @returns string simple or combined value of a field
119
109
  */
120
110
  static getFieldValue(form, fieldKey, colIndex) {
121
111
  const fieldIds = fieldKey.split('.');
@@ -230,6 +220,66 @@ export class FormValueService {
230
220
  sanitiseDynamicLists(caseFields, editForm) {
231
221
  return this.fieldTypeSanitiser.sanitiseLists(caseFields, editForm.data);
232
222
  }
223
+ sanitiseObject(rawObject) {
224
+ if (!rawObject) {
225
+ return rawObject;
226
+ }
227
+ let sanitisedObject = {};
228
+ const documentFieldKeys = ['document_url', 'document_binary_url', 'document_filename'];
229
+ for (const key in rawObject) {
230
+ // If the key is one of documentFieldKeys, it means the field is of Document type. If the value of any of these
231
+ // properties is null, the entire sanitised object to be returned should be null
232
+ if (documentFieldKeys.indexOf(key) > -1 && rawObject[key] === null) {
233
+ sanitisedObject = null;
234
+ break;
235
+ }
236
+ else if ('CaseReference' === key) {
237
+ sanitisedObject[key] = this.sanitiseValue(this.sanitiseCaseReference(String(rawObject[key])));
238
+ }
239
+ else {
240
+ sanitisedObject[key] = this.sanitiseValue(rawObject[key]);
241
+ if (Array.isArray(sanitisedObject[key])) {
242
+ // If the 'sanitised' array is empty, whereas the original array had 1 or more items
243
+ // delete the property from the sanatised object
244
+ if (sanitisedObject[key].length === 0 && rawObject[key].length > 0) {
245
+ delete sanitisedObject[key];
246
+ }
247
+ }
248
+ }
249
+ }
250
+ return sanitisedObject;
251
+ }
252
+ sanitiseArray(rawArray) {
253
+ if (!rawArray) {
254
+ return rawArray;
255
+ }
256
+ rawArray.forEach(item => {
257
+ if (item && item.hasOwnProperty('value')) {
258
+ item.value = this.sanitiseValue(item.value);
259
+ }
260
+ });
261
+ // Filter the array to ensure only truthy values are returned; double-bang operator returns the boolean true/false
262
+ // association of a value. In addition, if the array contains items with a "value" object property, return only
263
+ // those whose value object contains non-empty values, including for any descendant objects
264
+ return rawArray
265
+ .filter(item => !!item)
266
+ .filter(item => item.hasOwnProperty('value') ? FieldsUtils.containsNonEmptyValues(item.value) : true);
267
+ }
268
+ sanitiseValue(rawValue) {
269
+ if (Array.isArray(rawValue)) {
270
+ return this.sanitiseArray(rawValue);
271
+ }
272
+ switch (typeof rawValue) {
273
+ case 'object':
274
+ return this.sanitiseObject(rawValue);
275
+ case 'string':
276
+ return rawValue.trim();
277
+ case 'number':
278
+ return String(rawValue);
279
+ default:
280
+ return rawValue;
281
+ }
282
+ }
233
283
  clearNonCaseFields(data, caseFields) {
234
284
  for (const dataKey in data) {
235
285
  if (!caseFields.find(cf => cf.id === dataKey)) {
@@ -362,7 +412,7 @@ export class FormValueService {
362
412
  delete data[field.id];
363
413
  }
364
414
  if (data[field.id] && FormValueService.isEmptyData(data[field.id]) && fromPreviousPage
365
- && currentPageCaseFields.findIndex(c_field => c_field.id === field.id) === -1) {
415
+ && currentPageCaseFields.findIndex((cField) => cField.id === field.id) === -1) {
366
416
  delete data[field.id];
367
417
  }
368
418
  break;
@@ -394,10 +444,7 @@ export class FormValueService {
394
444
  FormValueService.removeMultiSelectLabels(data);
395
445
  }
396
446
  /**
397
- * Remove any empty or invalid arry with only id
398
- *
399
- * @param data The object tree of form values on which to perform the removal
400
- * @param field domain model object for each field
447
+ * Remove any empty or invalid array with only id
401
448
  */
402
449
  removeInvalidCollectionData(data, field) {
403
450
  if (data[field.id] && data[field.id].length > 0) {
@@ -425,64 +472,44 @@ export class FormValueService {
425
472
  }
426
473
  }
427
474
  }
428
- sanitiseObject(rawObject) {
429
- if (!rawObject) {
430
- return rawObject;
431
- }
432
- let sanitisedObject = {};
433
- const documentFieldKeys = ['document_url', 'document_binary_url', 'document_filename'];
434
- for (const key in rawObject) {
435
- // If the key is one of documentFieldKeys, it means the field is of Document type. If the value of any of these
436
- // properties is null, the entire sanitised object to be returned should be null
437
- if (documentFieldKeys.indexOf(key) > -1 && rawObject[key] == null) {
438
- sanitisedObject = null;
439
- break;
440
- }
441
- else if ('CaseReference' === key) {
442
- sanitisedObject[key] = this.sanitiseValue(this.sanitiseCaseReference(String(rawObject[key])));
443
- }
444
- else {
445
- sanitisedObject[key] = this.sanitiseValue(rawObject[key]);
446
- if (Array.isArray(sanitisedObject[key])) {
447
- // If the 'sanitised' array is empty, whereas the original array had 1 or more items
448
- // delete the property from the sanatised object
449
- if (sanitisedObject[key].length === 0 && rawObject[key].length > 0) {
450
- delete sanitisedObject[key];
451
- }
452
- }
475
+ /**
476
+ * Remove the FlagLauncher case field, which is not intended to be persisted.
477
+ *
478
+ * @param data The object tree of form values on which to perform the removal
479
+ * @param caseFields The list of underlying {@link CaseField} domain model objects for each field
480
+ */
481
+ removeFlagLauncherField(data, caseFields) {
482
+ if (data && caseFields && caseFields.length > 0) {
483
+ const flagLauncherCaseField = caseFields.filter(caseField => FieldsUtils.isFlagLauncherCaseField(caseField));
484
+ if (flagLauncherCaseField.length > 0) {
485
+ // There should be only one FlagLauncher case field
486
+ delete data[flagLauncherCaseField[0].id];
453
487
  }
454
488
  }
455
- return sanitisedObject;
456
489
  }
457
- sanitiseArray(rawArray) {
458
- if (!rawArray) {
459
- return rawArray;
460
- }
461
- rawArray.forEach(item => {
462
- if (item && item.hasOwnProperty('value')) {
463
- item.value = this.sanitiseValue(item.value);
464
- }
465
- });
466
- // Filter the array to ensure only truthy values are returned; double-bang operator returns the boolean true/false
467
- // association of a value. In addition, if the array contains items with a "value" object property, return only
468
- // those whose value object contains non-empty values, including for any descendant objects
469
- return rawArray
470
- .filter(item => !!item)
471
- .filter(item => item.hasOwnProperty('value') ? FieldsUtils.containsNonEmptyValues(item.value) : true);
472
- }
473
- sanitiseValue(rawValue) {
474
- if (Array.isArray(rawValue)) {
475
- return this.sanitiseArray(rawValue);
476
- }
477
- switch (typeof rawValue) {
478
- case 'object':
479
- return this.sanitiseObject(rawValue);
480
- case 'string':
481
- return rawValue.trim();
482
- case 'number':
483
- return String(rawValue);
484
- default:
485
- return rawValue;
490
+ /**
491
+ * Populate the flag data for each Flags field, from the data held in its corresponding CaseField.
492
+ *
493
+ * @param data The object tree of form values on which to perform the data population
494
+ * @param caseFields The list of underlying {@link CaseField} domain model objects for each field
495
+ */
496
+ populateFlagDetailsFromCaseFields(data, caseFields) {
497
+ if (data && caseFields && caseFields.length > 0) {
498
+ // Cannot filter out anything other than to remove the FlagLauncher CaseField because Flags fields may be
499
+ // contained in other CaseField instances, either as a sub-field of a Complex field, or fields in a collection
500
+ // (or sub-fields of Complex fields in a collection)
501
+ caseFields.filter(caseField => !FieldsUtils.isFlagLauncherCaseField(caseField))
502
+ .forEach(caseField => {
503
+ if (data[caseField.id]) {
504
+ // Copy all values from the corresponding CaseField; this ensures all nested flag data (for example, a
505
+ // Flags field within a Complex field or a collection of Complex fields) is copied across
506
+ Object.keys(data[caseField.id]).forEach(key => {
507
+ if (caseField.value.hasOwnProperty(key)) {
508
+ data[caseField.id][key] = caseField.value[key];
509
+ }
510
+ });
511
+ }
512
+ });
486
513
  }
487
514
  }
488
515
  }
@@ -491,4 +518,4 @@ FormValueService.ɵprov = i0.ɵɵdefineInjectable({ token: FormValueService, fac
491
518
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormValueService, [{
492
519
  type: Injectable
493
520
  }], function () { return [{ type: i1.FieldTypeSanitiser }]; }, null); })();
494
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12YWx1ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9mb3JtL2Zvcm0tdmFsdWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBRzVELE1BQU0sT0FBTyxnQkFBZ0I7SUF3TTNCLFlBQTZCLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQ25FLENBQUM7SUF4TUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2R0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTtRQUNsRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsSUFBSSxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckU7YUFBTSxJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxX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UUFBUTthQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUFhO1FBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckM7UUFFRCxRQUFRLE9BQU8sUUFBUSxFQUFFO1lBQ3ZCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsS0FBSyxRQUFRO2dCQUNYLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztTQUNuQjtJQUNILENBQUM7O2dGQTVlVSxnQkFBZ0I7d0RBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0I7dUZBQWhCLGdCQUFnQjtjQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZHNVdGlscyB9IGZyb20gJy4uL2ZpZWxkcy9maWVsZHMudXRpbHMnO1xuaW1wb3J0IHsgRmllbGRUeXBlU2FuaXRpc2VyIH0gZnJvbSAnLi9maWVsZC10eXBlLXNhbml0aXNlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGb3JtVmFsdWVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdmFsdWUgb2YgYSBmaWVsZCBiYXNlZCBvbiBmaWVsZEtleSB3aGljaCBpcyBhIGRvdCBzZXBhcmF0ZWQgcmVmZXJlbmNlIHRvIHZhbHVlIGFuZCBjb2xsZWN0aW9uIGluZGV4LlxuICAgKiBUaGVyZSBhcmUgdHdvIGV4Y2VwdGlvbnM6XG4gICAqIDEpIEluIGNhc2Ugb2YgYSBtdWx0aXNlbGVjdCBiZWluZyBpZGVudGlmaWVkIGFzIGEgbGVhZiBhICctLS1MQUJFTCcgc3VmZml4IGlzIGFwcGVuZGVkIHRvIHRoZSBrZXkgYW5kIHZhbHVlcyBvZiB0aGF0IGtleSBhcmUgcmV0dXJuZWRcbiAgICogICAgICBmb3JtPSB7ICdsaXN0JzogWydjb2RlMScsICdjb2RlMiddLFxuICAgKiAgICAgICAgICAgICAgJ2xpc3QtLS1MQUJFTCc6IFsnbGFiZWwxJywgJ2xhYmVsMiddIH0sXG4gICAqICAgICAgZmllbGRLZXk9bGlzdCxcbiAgICogICAgICBjb2xJbmRleD0wLFxuICAgKiAgICAgIHZhbHVlPWxhYmVsMSwgbGFiZWwyXG4gICAqIDIpIEluIGNhc2Ugb2YgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSBmaWVsZHMgaXMgaWRlbnRpZmllZCBhcyBhIGxlYWYgYWxsIHZhbHVlcyBhcmUgam9pbmVkIHNlcGVyYXRlZCBieSBhIGNvbW1hXG4gICAqICAgICAgZm9ybT0geyAnY29sbGVjdGlvbic6IFt7ICd2YWx1ZSc6ICd2YWx1ZTEnIH0sIHsgJ3ZhbHVlJzogJ3ZhbHVlMicgfV0gfVxuICAgKiAgICAgIGZpZWxkS2V5PWNvbGxlY3Rpb25cbiAgICogICAgICBjb2xJbmRleD0xXG4gICAqICAgICAgdmFsdWU9dmFsdWUxLCB2YWx1ZTJcbiAgICpcbiAgICogT3RoZXIgZXhhbXBsZXM6XG4gICAqIDEpIHNpbXBsZSBmaWVsZCByZWZlcmVuY2U6IGZvcm09eyAnUGVyc29uRmlyc3ROYW1lJzogJ0pvaG4nIH0sIGZpZWxkS2V5PVBlcnNvbkZpcnN0TmFtZSwgdmFsdWU9Sm9oblxuICAgKiAyKSBjb21wbGV4IGZpZWxkIHJlZmVyZW5jZTpcbiAgICogICAgICBmb3JtPSB7IGNvbXBsZXgxJzoge1xuICAgKiAgICAgICAgJ3NpbXBsZTExJzogJ3ZhbHVlMTEnLFxuICAgKiAgICAgICAgJ3NpbXBsZTEyJzogJ3ZhbHVlMTInLFxuICAgKiAgICAgICAgJ2NvbXBsZXgyJzoge1xuICAgKiAgICAgICAgICAnc2ltcGxlMjEnOiAndmFsdWUyMSdcbiAgICogICAgICAgIH1cbiAgICogICAgICB9fSxcbiAgICogICAgICBmaWVsZEtleT1jb21wbGV4MS5jb21wbGV4Mi5zaW1wbGUyMVxuICAgKiAgICAgIGNvbEluZGV4PTAsXG4gICAqICAgICAgdmFsdWU9dmFsdWUyMVxuICAgKiAzKSBjb21wbGV4IGZpZWxkIHdpdGggY29sbGVjdGlvbiBmaWVsZCB3aXRoIGNvbXBsZXggZmllbGQgcmVmZXJlbmNlOlxuICAgKiAgICAgIGZvcm09IHsgJ2NvbXBsZXgxJzoge1xuICAgKiAgICAgICAgICAgICAgICdjb2xsZWN0aW9uMSc6IFtcbiAgICogICAgICAgICAgICAgICB7ICd2YWx1ZSc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgyJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUxJzogJ3ZhbHVlMScsXG4gICAqICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgzJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXg0Jzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMic6ICd2YWx1ZTEyJ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgIH0sXG4gICAqICAgICAgICAgICAgICAgeyAndmFsdWUnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICdjb21wbGV4Mic6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMSc6ICd2YWx1ZTInLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Myc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4NCc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTInOiAndmFsdWUyMSdcbiAgICogICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICB9LFxuICAgKiAgICAgICAgICAgICAgIHsgJ3ZhbHVlJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAnY29tcGxleDInOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTEnOiAndmFsdWUzJyxcbiAgICogICAgICAgICAgICAgICAgICAgICAnY29tcGxleDMnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDQnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUyJzogJ3ZhbHVlMzEnXG4gICAqICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICBdfX1cbiAgICogICAgICBmaWVsZEtleT1jb21wbGV4MS5jb2xsZWN0aW9uMS5jb21wbGV4Mi5jb21wbGV4My5jb21wbGV4NC5zaW1wbGUyXG4gICAqICAgICAgY29sSW5kZXg9MixcbiAgICogICAgICB2YWx1ZT12YWx1ZTIxXG4gICAqIDQpIGNvbGxlY3Rpb24gb2YgY29tcGxleCB0eXBlc1xuICAgKiAgICAgIGZvcm09IHsgJ2NvbGxlY3Rpb24xJzogW1xuICAgKiAgICAgICAgICAgICAgIHsgJ3ZhbHVlJzogeydjb21wbGV4MSc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUxJzogJ3ZhbHVlMTEnLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgyJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDMnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTInOiAndmFsdWUxMidcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgKiAgICAgICAgICAgICAgIH0sXG4gICAqICAgICAgICAgICAgICAgeyAndmFsdWUnOiB7J2NvbXBsZXgxJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTEnOiAndmFsdWUyMScsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDInOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Myc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMic6ICd2YWx1ZTIyJ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAqICAgICAgICAgICAgICAgfSxcbiAgICogICAgICAgICAgICAgICB7ICd2YWx1ZSc6IHsnY29tcGxleDEnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMSc6ICd2YWx1ZTMxJyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Mic6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgzJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUyJzogJ3ZhbHVlMzInXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgKiAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgXX1cbiAgICogICAgICBmaWVsZEtleT1jb2xsZWN0aW9uMS5jb21wbGV4MS5jb21wbGV4Mi5jb21wbGV4My5zaW1wbGUyXG4gICAqICAgICAgY29sSW5kZXg9MlxuICAgKiAgICAgIHZhbHVlPXZhbHVlMzJcbiAgICpcbiAgICogSWYga2V5IGlzIHBvaW50aW5nIGF0IGEgY29tcGxleCBvciBjb2xsZWN0aW9uIGxlYWYgKG5vdCBzaW1wbGUsIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIG9yIG11bHRpc2VsZWN0IHR5cGVzKSB0aGVuIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAgICogQWxzbyBubyBrZXkgcmVmZXJyaW5nIGEgbGVhZiB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gY29sbGVjdGlvbiB3aWxsIGNvbnRhaW4gaW5kZXggbnVtYmVyLiBUaGUgaW5kZXggaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZVxuICAgKiBtZXRob2QuXG4gICAqIEBwYXJhbSBmb3JtIGZvcm1cbiAgICogQHBhcmFtIGZpZWxkS2V5IGRvdCBzZXBhcmF0ZWQgcmVmZXJlbmNlIHRvIHZhbHVlXG4gICAqIEBwYXJhbSBjb2xJbmRleCBpbmRleCBvZiBjb2xsZWN0aW9uIGl0ZW0gYmVpbmcgcmVmZXJlbmNlZCBvciAwIG90aGVyd2lzZVxuICAgKiBAcmV0dXJucyBzdHJpbmcgc2ltcGxlIG9yIGNvbWJpbmVkIHZhbHVlIG9mIGEgZmllbGRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RmllbGRWYWx1ZShmb3JtLCBmaWVsZEtleSwgY29sSW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZElkcyA9IGZpZWxkS2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3QgY3VycmVudEZpZWxkSWQgPSBmaWVsZElkc1swXTtcbiAgICBjb25zdCBjdXJyZW50Rm9ybSA9IGZvcm1bY3VycmVudEZpZWxkSWRdO1xuICAgIGlmIChGaWVsZHNVdGlscy5pc011bHRpU2VsZWN0VmFsdWUoY3VycmVudEZvcm0pKSB7XG4gICAgICAgIHJldHVybiBmb3JtW2N1cnJlbnRGaWVsZElkICsgRmllbGRzVXRpbHMuTEFCRUxfU1VGRklYXS5qb2luKCcsICcpO1xuICAgIH0gZWxzZSBpZiAoRmllbGRzVXRpbHMuaXNDb2xsZWN0aW9uT2ZTaW1wbGVUeXBlcyhjdXJyZW50Rm9ybSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRGb3JtLm1hcChmaWVsZFZhbHVlID0+IGZpZWxkVmFsdWVbJ3ZhbHVlJ10pLmpvaW4oJywgJyk7XG4gICAgfSBlbHNlIGlmIChGaWVsZHNVdGlscy5pc0NvbGxlY3Rpb24oY3VycmVudEZvcm0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoY3VycmVudEZvcm1bY29sSW5kZXhdWyd2YWx1ZSddLCBmaWVsZElkcy5zbGljZSgxKS5qb2luKCcuJyksIGNvbEluZGV4KTtcbiAgICB9IGVsc2UgaWYgKEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudEZvcm0pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoY3VycmVudEZvcm0sIGZpZWxkSWRzLnNsaWNlKDEpLmpvaW4oJy4nKSwgY29sSW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Rm9ybTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIHJlbW92ZSBhbnl0aGluZyB3aXRoIGEgYC0tLUxBQkVMYCBzdWZmaXguXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHJlY3Vyc2UgdGhyb3VnaCBhbmQgcmVtb3ZlIE11bHRpU2VsZWN0IGxhYmVscy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVtb3ZlTXVsdGlTZWxlY3RMYWJlbHMoZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAgICAgICAgIEZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlTXVsdGlTZWxlY3RMYWJlbHMoaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAvLyBIYXZlIHdlIGZvdW5kIG9uZSBhIE11bHRpU2VsZWN0IGxhYmVsP1xuICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihGaWVsZHNVdGlscy5MQUJFTF9TVUZGSVgpID4gMCkge1xuICAgICAgICAgICAgLy8gSWYgc28sIHJlbW92ZSBpdC5cbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlTXVsdGlTZWxlY3RMYWJlbHMoZGF0YVtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1JlYWRPbmx5KGZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmllbGQuZGlzcGxheV9jb250ZXh0ID8gZmllbGQuZGlzcGxheV9jb250ZXh0LnRvVXBwZXJDYXNlKCkgPT09ICdSRUFET05MWScgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzT3B0aW9uYWwoZmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWVsZC5kaXNwbGF5X2NvbnRleHQgPyBmaWVsZC5kaXNwbGF5X2NvbnRleHQudG9VcHBlckNhc2UoKSA9PT0gJ09QVElPTkFMJyA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNMYWJlbChmaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUpIHtcbiAgICAgIHJldHVybiBmaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdMYWJlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0VtcHR5RGF0YShkYXRhOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgbGV0IGFsbEVtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhkYXRhKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbcHJvcF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYWxsRW1wdHkgPSBhbGxFbXB0eSAmJiB0aGlzLmlzRW1wdHlEYXRhKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhbGxFbXB0eTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2hvdWxkIHdlIGNsZWFyIG91dCBvcHRpb25hbCwgZW1wdHksIGNvbXBsZXggb2JqZWN0cz9cbiAgICogQHBhcmFtIGNsZWFyRW1wdHkgRmFsc2UgcHJvcGVydHkgaWYgd2Ugc2ltcGx5IHdhbnQgdG8gc2tpcCBpdC5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gYXNzZXNzIGZvciBcImVtcHRpbmVzc1wiLlxuICAgKiBAcGFyYW0gZmllbGQgVGhlIENhc2VGaWVsZCB0aGF0IHdpbGwgdGVsbCB1cyBpZiB0aGlzIGlzIG9wdGlvbmFsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2xlYXJPcHRpb25hbEVtcHR5KGNsZWFyRW1wdHk6IGJvb2xlYW4sIGRhdGE6IG9iamVjdCwgZmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmIChjbGVhckVtcHR5KSB7XG4gICAgICByZXR1cm4gRm9ybVZhbHVlU2VydmljZS5pc09wdGlvbmFsKGZpZWxkKSAmJiBGb3JtVmFsdWVTZXJ2aWNlLmlzRW1wdHlEYXRhKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpZWxkVHlwZVNhbml0aXNlcjogRmllbGRUeXBlU2FuaXRpc2VyKSB7XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpc2UocmF3VmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpc2VPYmplY3QocmF3VmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHNhbml0aXNlQ2FzZVJlZmVyZW5jZShyZWZlcmVuY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gc3RyaXAgbm9uIGRpZ2l0c1xuICAgIGNvbnN0IHM6IHN0cmluZyA9IHJlZmVyZW5jZS5yZXBsYWNlKC9bXFxEXS9nLCAnJyk7XG4gICAgaWYgKHMubGVuZ3RoID4gMTYpIHtcbiAgICAgIHJldHVybiBzLnN1YnN0cihzLmxlbmd0aCAtIDE2LCAxNik7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckN1cnJlbnRQYWdlRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBlZGl0Rm9ybTogYW55KTogYW55IHtcbiAgICBjb25zdCBjbG9uZUZvcm0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVkaXRGb3JtKSk7XG4gICAgT2JqZWN0LmtleXMoY2xvbmVGb3JtWydkYXRhJ10pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGNhc2VGaWVsZHMuZmluZEluZGV4KChlbGVtZW50KSA9PiBlbGVtZW50LmlkID09PSBrZXkpIDwgMCkge1xuICAgICAgICBkZWxldGUgY2xvbmVGb3JtWydkYXRhJ11ba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVGb3JtO1xuICB9XG5cbiAgcHVibGljIHNhbml0aXNlRHluYW1pY0xpc3RzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBlZGl0Rm9ybTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFR5cGVTYW5pdGlzZXIuc2FuaXRpc2VMaXN0cyhjYXNlRmllbGRzLCBlZGl0Rm9ybS5kYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhck5vbkNhc2VGaWVsZHMoZGF0YTogb2JqZWN0LCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSkge1xuICAgIGZvciAoY29uc3QgZGF0YUtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIWNhc2VGaWVsZHMuZmluZChjZiA9PiBjZi5pZCA9PT0gZGF0YUtleSkpIHtcbiAgICAgICAgZGVsZXRlIGRhdGEgW2RhdGFLZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBUT0RPIHJlZmFjdG9yIHNvIHRoYXQgdGhpcyBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBoYXZlIGEgY29tbW9uIGl0ZXJhdG9yIHRoYXQgYXBwbGllcyBmdW5jdGlvbnMgdG8gZWFjaCBub2RlIHZpc2l0ZWRcbiAgcHVibGljIHJlbW92ZU51bGxMYWJlbHMoZGF0YTogb2JqZWN0LCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSkge1xuICAgIGlmIChkYXRhICYmIGNhc2VGaWVsZHMgJiYgY2FzZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZGF0YSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBmb3JtIHRoYXQncyBub3QgaW4gdGhlIGNhc2VGaWVsZHNcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdMYWJlbCc6XG4gICAgICAgICAgICAgIC8vIERlbGV0ZSBhbnkgbGFiZWxzIHRoYXQgYXJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKChkYXRhW2ZpZWxkLmlkXSA9PT0gbnVsbCkgfHwgKGRhdGFbZmllbGQuaWRdID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVtb3ZlIGFueXRoaW5nIHVubmVjZXNzYXJ5IGZyb20gd2l0aGluIGEgY29tcGxleCBmaWVsZC5cbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOdWxsTGFiZWxzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgLy8gR2V0IGhvbGQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbGxlY3Rpb24gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgY29tcGxleCBvYmplY3QsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIHRoZW0gb3V0LlxuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHJlbW92ZSBhbnkgdW5uZWNlc3NhcnkgZmllbGRzIHdpdGhpbi5cbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVsbExhYmVscyhpdGVtLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVsbExhYmVscyhpdGVtLnZhbHVlLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIFRPRE8gcmVmYWN0b3Igc28gdGhhdCB0aGlzIGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzIGhhdmUgYSBjb21tb24gaXRlcmF0b3IgdGhhdCBhcHBsaWVzIGZ1bmN0aW9ucyB0byBlYWNoIG5vZGUgdmlzaXRlZFxuICBwdWJsaWMgcmVtb3ZlRW1wdHlEb2N1bWVudHMoZGF0YTogb2JqZWN0LCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSkge1xuICAgIGlmIChkYXRhICYmIGNhc2VGaWVsZHMgJiYgY2FzZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZGF0YSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBmb3JtIHRoYXQncyBub3QgaW4gdGhlIGNhc2VGaWVsZHNcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVtb3ZlIGFueSBlbXB0eSBkb2N1bWVudHMgZnJvbSB3aXRoaW4gYSBjb21wbGV4IGZpZWxkLlxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVtcHR5RG9jdW1lbnRzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgLy8gR2V0IGhvbGQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbGxlY3Rpb24gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgY29tcGxleCBvYmplY3QsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIG91dCBlbXB0eSBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCByZW1vdmUgYW55IGVtcHR5IGRvY3VtZW50cyB3aXRoaW4uXG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVtcHR5RG9jdW1lbnRzKGl0ZW0sIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eURvY3VtZW50cyhpdGVtLnZhbHVlLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRG9jdW1lbnQnOlxuICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhpcyBpcyBleGVjdXRlZCBvbmx5IGlmIHRoZSBEb2N1bWVudCBmaWVsZCBpcyBOT1QgaGlkZGVuIGFuZCBpcyBlbXB0eSBvZiBkYXRhOyBoaWRkZW4gRG9jdW1lbnRcbiAgICAgICAgICAgICAgLy8gZmllbGRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBmaWx0ZXJSYXdGb3JtVmFsdWVzKCkgZnVuY3Rpb24gaW4gQ2FzZUVkaXRTdWJtaXQgY29tcG9uZW50XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRkZW4gIT09IHRydWUgJiYgRm9ybVZhbHVlU2VydmljZS5pc0VtcHR5RGF0YShkYXRhW2ZpZWxkLmlkXSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIG91dCB1bm5lY2Vzc2FyeSBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0LCBiYXNlZCBvbiBhbiBhcnJheSBvZiBDYXNlRmllbGRzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyByZWN1cnNpdmUgYW5kIHdpbGwgY2FsbCBpdHNlbGYgaWYgaXQgZW5jb3VudGVycyBwYXJ0aWN1bGFyIGZpZWxkIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgb2JqZWN0IHRvIGJlIHRpZGllZCB1cC5cbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIENhc2VGaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAuXG4gICAqIEBwYXJhbSBjbGVhckVtcHR5IFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjbGVhciBvdXQgZW1wdHksIG9wdGlvbmFsLCBjb21wbGV4IG9iamVjdHMuXG4gICAqIEBwYXJhbSBjbGVhck5vbkNhc2UgV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGNsZWFyIG91dCBub24tY2FzZSBmaWVsZHMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBjbGVhckVtcHR5ID0gZmFsc2UsIGNsZWFyTm9uQ2FzZSA9IGZhbHNlLFxuICAgIGZyb21QcmV2aW91c1BhZ2UgPSBmYWxzZSwgY3VycmVudFBhZ2VDYXNlRmllbGRzID0gW10pOiB2b2lkIHtcbiAgICBpZiAoZGF0YSAmJiBjYXNlRmllbGRzICYmIGNhc2VGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGRhdGEgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgZm9ybSB0aGF0J3Mgbm90IGluIHRoZSBjYXNlRmllbGRzXG4gICAgICBpZiAoY2xlYXJOb25DYXNlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJOb25DYXNlRmllbGRzKGRhdGEsIGNhc2VGaWVsZHMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBjYXNlRmllbGRzKSB7XG4gICAgICAgIGlmICghRm9ybVZhbHVlU2VydmljZS5pc0xhYmVsKGZpZWxkKSAmJiBGb3JtVmFsdWVTZXJ2aWNlLmlzUmVhZE9ubHkoZmllbGQpKSB7XG4gICAgICAgICAgLy8gUmV0YWluIGFueXRoaW5nIHRoYXQgaXMgcmVhZG9ubHkgYW5kIG5vdCBhIGxhYmVsLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5oaWRkZW4gPT09IHRydWUgJiYgZmllbGQuZGlzcGxheV9jb250ZXh0ICE9PSAnSElEREVOJykge1xuICAgICAgICAgIC8vIERlbGV0ZSBhbnl0aGluZyB0aGF0IGlzIGhpZGRlbiAodGhhdCBpcyBOT1QgcmVhZG9ubHkpLCBhbmQgdGhhdFxuICAgICAgICAgIC8vIGhhc24ndCBoYWQgaXRzIGRpc3BsYXlfY29udGV4dCBvdmVycmlkZGVuIHRvIG1ha2UgaXQgaGlkZGVuLlxuICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5maWVsZF90eXBlKSB7XG4gICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0xhYmVsJzpcbiAgICAgICAgICAgICAgLy8gRGVsZXRlIGFueSBsYWJlbHMuXG4gICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdEb2N1bWVudCc6XG4gICAgICAgICAgICAgIGlmIChGb3JtVmFsdWVTZXJ2aWNlLmlzRW1wdHlEYXRhKGRhdGFbZmllbGQuaWRdKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVVubmVjZXNzYXJ5RmllbGRzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBjbGVhckVtcHR5KTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgYW55IG9wdGlvbmFsIGNvbXBsZXggb2JqZWN0cyB0aGF0IGFyZSBjb21wbGV0ZWx5IGVtcHR5LlxuICAgICAgICAgICAgICAvLyBFVUktNDI0NDogUml0ZXNoJ3MgZml4LCBwYXNzaW5nIHRydWUgaW5zdGVhZCBvZiBjbGVhckVtcHR5LlxuICAgICAgICAgICAgICBpZiAoRm9ybVZhbHVlU2VydmljZS5jbGVhck9wdGlvbmFsRW1wdHkodHJ1ZSwgZGF0YVtmaWVsZC5pZF0sIGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGF0YVtmaWVsZC5pZF0gJiYgRm9ybVZhbHVlU2VydmljZS5pc0VtcHR5RGF0YShkYXRhW2ZpZWxkLmlkXSkgJiYgZnJvbVByZXZpb3VzUGFnZVxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRQYWdlQ2FzZUZpZWxkcy5maW5kSW5kZXgoY19maWVsZCA9PiBjX2ZpZWxkLmlkID09PSBmaWVsZC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbZmllbGQuaWRdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQ29sbGVjdGlvbic6XG4gICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBjb2xsZWN0aW9uIGRhdGFcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnZhbGlkQ29sbGVjdGlvbkRhdGEoZGF0YSwgZmllbGQpO1xuICAgICAgICAgICAgICAvLyBHZXQgaG9sZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IGRhdGFbZmllbGQuaWRdO1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhY3R1YWxseSBoYXZlIGEgY29sbGVjdGlvbiB0byB3b3JrIHdpdGguXG4gICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uICYmIEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29sbGVjdGlvbiBvZiBjb21wbGV4IG9iamVjdCwgd2UgbmVlZCB0byBpdGVyYXRlIHRocm91Z2hcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2xlYXIgdGhlbSBvdXQuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4Jykge1xuICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgcmVtb3ZlIGFueSB1bm5lY2Vzc2FyeSBmaWVsZHMgd2l0aGluLlxuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhpdGVtLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcywgY2xlYXJFbXB0eSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVW5uZWNlc3NhcnlGaWVsZHMoaXRlbS52YWx1ZSwgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBvdXQgYW55IE11bHRpU2VsZWN0IGxhYmVscy5cbiAgICBGb3JtVmFsdWVTZXJ2aWNlLnJlbW92ZU11bHRpU2VsZWN0TGFiZWxzKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbnkgZW1wdHkgb3IgaW52YWxpZCBhcnJ5IHdpdGggb25seSBpZFxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgb2JqZWN0IHRyZWUgb2YgZm9ybSB2YWx1ZXMgb24gd2hpY2ggdG8gcGVyZm9ybSB0aGUgcmVtb3ZhbFxuICAgKiBAcGFyYW0gZmllbGQgZG9tYWluIG1vZGVsIG9iamVjdCBmb3IgZWFjaCBmaWVsZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUludmFsaWRDb2xsZWN0aW9uRGF0YShkYXRhOiBvYmplY3QsIGZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoZGF0YVtmaWVsZC5pZF0gJiYgZGF0YVtmaWVsZC5pZF0ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBvYmpDb2xsZWN0aW9uIG9mIGRhdGFbZmllbGQuaWRdKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmpDb2xsZWN0aW9uKS5sZW5ndGggPT09IDEgJiYgT2JqZWN0LmtleXMob2JqQ29sbGVjdGlvbikuaW5kZXhPZignaWQnKSA+IC0xKSB7XG4gICAgICAgICAgZGF0YVtmaWVsZC5pZF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW55IGVtcHR5IGNvbGxlY3Rpb24gZmllbGRzIHdoZXJlIGEgdmFsdWUgb2YgZ3JlYXRlciB0aGFuIHplcm8gaXMgc3BlY2lmaWVkIGluIHRoZSBmaWVsZCdzIHtAbGluayBGaWVsZFR5cGV9XG4gICAqIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0cmVlIG9mIGZvcm0gdmFsdWVzIG9uIHdoaWNoIHRvIHBlcmZvcm0gdGhlIHJlbW92YWxcbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIGxpc3Qgb2YgdW5kZXJseWluZyB7QGxpbmsgQ2FzZUZpZWxkfSBkb21haW4gbW9kZWwgb2JqZWN0cyBmb3IgZWFjaCBmaWVsZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVtcHR5Q29sbGVjdGlvbnNXaXRoTWluVmFsaWRhdGlvbihkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogdm9pZCB7XG4gICAgaWYgKGRhdGEgJiYgY2FzZUZpZWxkcyAmJiBjYXNlRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29sbGVjdGlvbicgJiYgZmllbGQuZmllbGRfdHlwZS5taW4gPiAwICYmIGRhdGFbZmllbGQuaWRdICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGRhdGFbZmllbGQuaWRdKSAmJiBkYXRhW2ZpZWxkLmlkXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXNlT2JqZWN0KHJhd09iamVjdDogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBpZiAoIXJhd09iamVjdCkge1xuICAgICAgcmV0dXJuIHJhd09iamVjdDtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpc2VkT2JqZWN0ID0ge307XG4gICAgY29uc3QgZG9jdW1lbnRGaWVsZEtleXMgPSBbJ2RvY3VtZW50X3VybCcsICdkb2N1bWVudF9iaW5hcnlfdXJsJywgJ2RvY3VtZW50X2ZpbGVuYW1lJ107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3T2JqZWN0KSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGlzIG9uZSBvZiBkb2N1bWVudEZpZWxkS2V5cywgaXQgbWVhbnMgdGhlIGZpZWxkIGlzIG9mIERvY3VtZW50IHR5cGUuIElmIHRoZSB2YWx1ZSBvZiBhbnkgb2YgdGhlc2VcbiAgICAgIC8vIHByb3BlcnRpZXMgaXMgbnVsbCwgdGhlIGVudGlyZSBzYW5pdGlzZWQgb2JqZWN0IHRvIGJlIHJldHVybmVkIHNob3VsZCBiZSBudWxsXG4gICAgICBpZiAoZG9jdW1lbnRGaWVsZEtleXMuaW5kZXhPZihrZXkpID4gLTEgJiYgcmF3T2JqZWN0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICBzYW5pdGlzZWRPYmplY3QgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoJ0Nhc2VSZWZlcmVuY2UnID09PSBrZXkpIHtcbiAgICAgICAgc2FuaXRpc2VkT2JqZWN0W2tleV0gPSB0aGlzLnNhbml0aXNlVmFsdWUodGhpcy5zYW5pdGlzZUNhc2VSZWZlcmVuY2UoU3RyaW5nKHJhd09iamVjdFtrZXldKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2FuaXRpc2VkT2JqZWN0W2tleV0gPSB0aGlzLnNhbml0aXNlVmFsdWUocmF3T2JqZWN0W2tleV0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzYW5pdGlzZWRPYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgJ3Nhbml0aXNlZCcgYXJyYXkgaXMgZW1wdHksIHdoZXJlYXMgdGhlIG9yaWdpbmFsIGFycmF5IGhhZCAxIG9yIG1vcmUgaXRlbXNcbiAgICAgICAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHNhbmF0aXNlZCBvYmplY3RcbiAgICAgICAgICBpZiAoc2FuaXRpc2VkT2JqZWN0W2tleV0ubGVuZ3RoID09PSAwICYmIHJhd09iamVjdFtrZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzYW5pdGlzZWRPYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNhbml0aXNlZE9iamVjdDtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpc2VBcnJheShyYXdBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFyYXdBcnJheSkge1xuICAgICAgcmV0dXJuIHJhd0FycmF5O1xuICAgIH1cblxuICAgIHJhd0FycmF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICAgIGl0ZW0udmFsdWUgPSB0aGlzLnNhbml0aXNlVmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0ZXIgdGhlIGFycmF5IHRvIGVuc3VyZSBvbmx5IHRydXRoeSB2YWx1ZXMgYXJlIHJldHVybmVkOyBkb3VibGUtYmFuZyBvcGVyYXRvciByZXR1cm5zIHRoZSBib29sZWFuIHRydWUvZmFsc2VcbiAgICAvLyBhc3NvY2lhdGlvbiBvZiBhIHZhbHVlLiBJbiBhZGRpdGlvbiwgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGl0ZW1zIHdpdGggYSBcInZhbHVlXCIgb2JqZWN0IHByb3BlcnR5LCByZXR1cm4gb25seVxuICAgIC8vIHRob3NlIHdob3NlIHZhbHVlIG9iamVjdCBjb250YWlucyBub24tZW1wdHkgdmFsdWVzLCBpbmNsdWRpbmcgZm9yIGFueSBkZXNjZW5kYW50IG9iamVjdHNcbiAgICByZXR1cm4gcmF3QXJyYXlcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSA/IEZpZWxkc1V0aWxzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoaXRlbS52YWx1ZSkgOiB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpc2VWYWx1ZShyYXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXNlQXJyYXkocmF3VmFsdWUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZW9mIHJhd1ZhbHVlKSB7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGlzZU9iamVjdChyYXdWYWx1ZSk7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gcmF3VmFsdWUudHJpbSgpO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhyYXdWYWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG59XG4iXX0=
521
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12YWx1ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NkLWNhc2UtdWktdG9vbGtpdC9zcmMvbGliL3NoYXJlZC9zZXJ2aWNlcy9mb3JtL2Zvcm0tdmFsdWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQUc1RCxNQUFNLE9BQU8sZ0JBQWdCO0lBOEwzQixZQUE2QixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtJQUNuRSxDQUFDO0lBOUxEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtR0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTtRQUNsRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsSUFBSSxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkU7YUFBTSxJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM3RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEU7YUFBTSxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNsRzthQUFNLElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDL0U7YUFBTTtZQUNMLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFTO1FBQzdDLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUN2QixnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDaEQ7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLElBQUksR0FBYSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtvQkFDdEIseUNBQXlDO29CQUN6QyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDN0Msb0JBQW9CO3dCQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ3JEO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWdCO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM1RixDQUFDO0lBRU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFnQjtRQUN4QyxPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUYsQ0FBQztJQUVPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0I7UUFDckMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO1NBQzFDO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBWTtRQUNyQyxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekIsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO3dCQUMvQixRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hEO3lCQUFNO3dCQUNMLFFBQVEsR0FBRyxLQUFLLENBQUM7cUJBQ2xCO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFDLGtCQUFrQixDQUFDLFVBQW1CLEVBQUUsSUFBWSxFQUFFLEtBQWdCO1FBQ25GLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBS00sUUFBUSxDQUFDLFFBQWdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0scUJBQXFCLENBQUMsU0FBaUI7UUFDNUMsbUJBQW1CO1FBQ25CLE1BQU0sQ0FBQyxHQUFXLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDakIsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU0sdUJBQXVCLENBQUMsVUFBdUIsRUFBRSxRQUFhO1FBQ25FLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDL0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxVQUF1QixFQUFFLFFBQWE7UUFDaEUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxTQUFpQjtRQUN0QyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZGLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO1lBQzNCLCtHQUErRztZQUMvRyxnRkFBZ0Y7WUFDaEYsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbEUsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDdkIsTUFBTTthQUNQO2lCQUFNLElBQUksZUFBZSxLQUFLLEdBQUcsRUFBRTtnQkFDbEMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDL0Y7aUJBQU07Z0JBQ0wsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDdkMsb0ZBQW9GO29CQUNwRixnREFBZ0Q7b0JBQ2hELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2xFLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUM3QjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRU8sYUFBYSxDQUFDLFFBQWU7UUFDbkMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE9BQU8sUUFBUSxDQUFDO1NBQ2pCO1FBRUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxrSEFBa0g7UUFDbEgsK0dBQStHO1FBQy9HLDJGQUEyRjtRQUMzRixPQUFPLFFBQVE7YUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFTyxhQUFhLENBQUMsUUFBYTtRQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsUUFBUSxPQUFPLFFBQVEsRUFBRTtZQUN2QixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssUUFBUTtnQkFDWCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUI7Z0JBQ0UsT0FBTyxRQUFRLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBWSxFQUFFLFVBQXVCO1FBQzdELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEI7U0FDRjtJQUNILENBQUM7SUFFRCw4SEFBOEg7SUFDdkgsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLFVBQXVCO1FBQzNELElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQyx1RkFBdUY7WUFDdkYsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUU7Z0JBQzlCLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtvQkFDcEIsUUFBUSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTt3QkFDN0IsS0FBSyxPQUFPOzRCQUNWLGtDQUFrQzs0QkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFO2dDQUN4RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7NkJBQ3ZCOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxTQUFTOzRCQUNaLHVFQUF1RTs0QkFDdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQzs0QkFDdkUsTUFBTTt3QkFDUixLQUFLLFlBQVk7NEJBQ2YsOEJBQThCOzRCQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsQyx1REFBdUQ7NEJBQ3ZELElBQUksVUFBVSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0NBQzNDLHdFQUF3RTtnQ0FDeEUsc0JBQXNCO2dDQUN0QixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtvQ0FDN0QseUVBQXlFO29DQUN6RSxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRTt3Q0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dDQUNuRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO3FDQUMxRjtpQ0FDRjs2QkFDRjs0QkFDRCxNQUFNO3dCQUNSOzRCQUNFLE1BQU07cUJBQ1Q7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUNELDhIQUE4SDtJQUN2SCxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsVUFBdUI7UUFDL0QsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLHVGQUF1RjtZQUN2RixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRTtnQkFDOUIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO29CQUNwQixRQUFRLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO3dCQUM3QixLQUFLLFNBQVM7NEJBQ1osc0VBQXNFOzRCQUN0RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDOzRCQUMzRSxNQUFNO3dCQUNSLEtBQUssWUFBWTs0QkFDZiw4QkFBOEI7NEJBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQ2xDLHVEQUF1RDs0QkFDdkQsSUFBSSxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQ0FDM0Msd0VBQXdFO2dDQUN4RSxnQ0FBZ0M7Z0NBQ2hDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO29DQUM3RCxzRUFBc0U7b0NBQ3RFLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO3dDQUM3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7d0NBQ3ZGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7cUNBQzlGO2lDQUNGOzZCQUNGOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxVQUFVOzRCQUNiLHlHQUF5Rzs0QkFDekcsdUZBQXVGOzRCQUN2RixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0NBQ3pFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDdkI7NEJBQ0QsTUFBTTt3QkFDUjs0QkFDRSxNQUFNO3FCQUNUO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFDRDs7Ozs7Ozs7T0FRRztJQUNJLHVCQUF1QixDQUFDLElBQVksRUFBRSxVQUF1QixFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFDNUcsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLHFCQUFxQixHQUFHLEVBQUU7UUFDcEQsSUFBSSxJQUFJLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLHVGQUF1RjtZQUN2RixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMzQztZQUNELEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFO2dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDMUUsb0RBQW9EO29CQUNwRCxTQUFTO2lCQUNWO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsS0FBSyxRQUFRLEVBQUU7b0JBQy9ELGtFQUFrRTtvQkFDbEUsK0RBQStEO29CQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtvQkFDM0IsUUFBUSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTt3QkFDN0IsS0FBSyxPQUFPOzRCQUNWLHFCQUFxQjs0QkFDckIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUN0QixNQUFNO3dCQUNSLEtBQUssVUFBVTs0QkFDYixJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0NBQ2hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs2QkFDdkI7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLFNBQVM7NEJBQ1osSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7NEJBQzFGLHNFQUFzRTs0QkFDdEUsOERBQThEOzRCQUM5RCxJQUFJLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO2dDQUNwRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7NkJBQ3ZCOzRCQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLGdCQUFnQjttQ0FDakYscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQ0FDcEYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzZCQUN2Qjs0QkFDRCxNQUFNO3dCQUNSLEtBQUssWUFBWTs0QkFDZixrQ0FBa0M7NEJBQ2xDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQzlDLDhCQUE4Qjs0QkFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDbEMsdURBQXVEOzRCQUN2RCxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dDQUMzQyx3RUFBd0U7Z0NBQ3hFLHNCQUFzQjtnQ0FDdEIsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7b0NBQzdELHlFQUF5RTtvQ0FDekUsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7d0NBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7d0NBQ3RHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FDQUN4RztpQ0FDRjs2QkFDRjs0QkFDRCxNQUFNO3dCQUNSOzRCQUNFLE1BQU07cUJBQ1Q7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsb0NBQW9DO1FBQ3BDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNJLDJCQUEyQixDQUFDLElBQVksRUFBRSxLQUFnQjtRQUMvRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLEtBQUssTUFBTSxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzVGLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNyQjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUNBQXVDLENBQUMsSUFBWSxFQUFFLFVBQXVCO1FBQ2xGLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRTtnQkFDOUIsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxZQUFZLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN0RixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQzlELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDdkI7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksdUJBQXVCLENBQUMsSUFBWSxFQUFFLFVBQXVCO1FBQ2xFLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQyxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM3RyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLG1EQUFtRDtnQkFDbkQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDMUM7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGlDQUFpQyxDQUFDLElBQVksRUFBRSxVQUF1QjtRQUM1RSxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0MseUdBQXlHO1lBQ3pHLDhHQUE4RztZQUM5RyxvREFBb0Q7WUFDcEQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM1RSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDdEIsc0dBQXNHO29CQUN0Ryx5RkFBeUY7b0JBQ3pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDNUMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUNoRDtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDOztnRkExZ0JVLGdCQUFnQjt3REFBaEIsZ0JBQWdCLFdBQWhCLGdCQUFnQjt1RkFBaEIsZ0JBQWdCO2NBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENhc2VGaWVsZCB9IGZyb20gJy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGaWVsZHNVdGlscyB9IGZyb20gJy4uL2ZpZWxkcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGVTYW5pdGlzZXIgfSBmcm9tICcuL2ZpZWxkLXR5cGUtc2FuaXRpc2VyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1WYWx1ZVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB2YWx1ZSBvZiBhIGZpZWxkIGJhc2VkIG9uIGZpZWxkS2V5IHdoaWNoIGlzIGEgZG90IHNlcGFyYXRlZCByZWZlcmVuY2UgdG8gdmFsdWUgYW5kIGNvbGxlY3Rpb24gaW5kZXguXG4gICAqIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcbiAgICogMSkgSW4gY2FzZSBvZiBhIG11bHRpc2VsZWN0IGJlaW5nIGlkZW50aWZpZWQgYXMgYSBsZWFmIGEgJy0tLUxBQkVMJyBzdWZmaXggaXMgYXBwZW5kZWQgdG8gdGhlIGtleSBhbmQgdmFsdWVzIG9mIHRoYXQga2V5IGFyZSByZXR1cm5lZFxuICAgKiAgICAgIGZvcm09IHsgJ2xpc3QnOiBbJ2NvZGUxJywgJ2NvZGUyJ10sXG4gICAqICAgICAgICAgICAgICAnbGlzdC0tLUxBQkVMJzogWydsYWJlbDEnLCAnbGFiZWwyJ10gfSxcbiAgICogICAgICBmaWVsZEtleT1saXN0LFxuICAgKiAgICAgIGNvbEluZGV4PTAsXG4gICAqICAgICAgdmFsdWU9bGFiZWwxLCBsYWJlbDJcbiAgICogMikgSW4gY2FzZSBvZiBhIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIGZpZWxkcyBpcyBpZGVudGlmaWVkIGFzIGEgbGVhZiBhbGwgdmFsdWVzIGFyZSBqb2luZWQgc2VwZXJhdGVkIGJ5IGEgY29tbWFcbiAgICogICAgICBmb3JtPSB7ICdjb2xsZWN0aW9uJzogW3sgJ3ZhbHVlJzogJ3ZhbHVlMScgfSwgeyAndmFsdWUnOiAndmFsdWUyJyB9XSB9XG4gICAqICAgICAgZmllbGRLZXk9Y29sbGVjdGlvblxuICAgKiAgICAgIGNvbEluZGV4PTFcbiAgICogICAgICB2YWx1ZT12YWx1ZTEsIHZhbHVlMlxuICAgKlxuICAgKiBPdGhlciBleGFtcGxlczpcbiAgICogMSkgc2ltcGxlIGZpZWxkIHJlZmVyZW5jZTogZm9ybT17ICdQZXJzb25GaXJzdE5hbWUnOiAnSm9obicgfSwgZmllbGRLZXk9UGVyc29uRmlyc3ROYW1lLCB2YWx1ZT1Kb2huXG4gICAqIDIpIGNvbXBsZXggZmllbGQgcmVmZXJlbmNlOlxuICAgKiAgICAgIGZvcm09IHsgY29tcGxleDEnOiB7ICdzaW1wbGUxMSc6ICd2YWx1ZTExJywgJ3NpbXBsZTEyJzogJ3ZhbHVlMTInLCAnY29tcGxleDInOiB7ICdzaW1wbGUyMSc6ICd2YWx1ZTIxJyB9IH19LFxuICAgKiAgICAgIGZpZWxkS2V5PWNvbXBsZXgxLmNvbXBsZXgyLnNpbXBsZTIxXG4gICAqICAgICAgY29sSW5kZXg9MCxcbiAgICogICAgICB2YWx1ZT12YWx1ZTIxXG4gICAqIDMpIGNvbXBsZXggZmllbGQgd2l0aCBjb2xsZWN0aW9uIGZpZWxkIHdpdGggY29tcGxleCBmaWVsZCByZWZlcmVuY2U6XG4gICAqICAgICAgZm9ybT0geyAnY29tcGxleDEnOiB7XG4gICAqICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb24xJzogW1xuICAgKiAgICAgICAgICAgICAgIHsgJ3ZhbHVlJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAnY29tcGxleDInOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTEnOiAndmFsdWUxJyxcbiAgICogICAgICAgICAgICAgICAgICAgICAnY29tcGxleDMnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDQnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUyJzogJ3ZhbHVlMTInXG4gICAqICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgfSxcbiAgICogICAgICAgICAgICAgICB7ICd2YWx1ZSc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgyJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUxJzogJ3ZhbHVlMicsXG4gICAqICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgzJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXg0Jzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMic6ICd2YWx1ZTIxJ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgIH0sXG4gICAqICAgICAgICAgICAgICAgeyAndmFsdWUnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICdjb21wbGV4Mic6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMSc6ICd2YWx1ZTMnLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Myc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4NCc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTInOiAndmFsdWUzMSdcbiAgICogICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgIF19fVxuICAgKiAgICAgIGZpZWxkS2V5PWNvbXBsZXgxLmNvbGxlY3Rpb24xLmNvbXBsZXgyLmNvbXBsZXgzLmNvbXBsZXg0LnNpbXBsZTJcbiAgICogICAgICBjb2xJbmRleD0yLFxuICAgKiAgICAgIHZhbHVlPXZhbHVlMjFcbiAgICogNCkgY29sbGVjdGlvbiBvZiBjb21wbGV4IHR5cGVzXG4gICAqICAgICAgZm9ybT0geyAnY29sbGVjdGlvbjEnOiBbXG4gICAqICAgICAgICAgICAgICAgeyAndmFsdWUnOiB7J2NvbXBsZXgxJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTEnOiAndmFsdWUxMScsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDInOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Myc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMic6ICd2YWx1ZTEyJ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAqICAgICAgICAgICAgICAgfSxcbiAgICogICAgICAgICAgICAgICB7ICd2YWx1ZSc6IHsnY29tcGxleDEnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2ltcGxlMSc6ICd2YWx1ZTIxJyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV4Mic6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgzJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUyJzogJ3ZhbHVlMjInXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICogICAgICAgICAgICAgICB9LFxuICAgKiAgICAgICAgICAgICAgIHsgJ3ZhbHVlJzogeydjb21wbGV4MSc6IHtcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaW1wbGUxJzogJ3ZhbHVlMzEnLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXgyJzoge1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxleDMnOiB7XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpbXBsZTInOiAndmFsdWUzMidcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAqICAgICAgICAgICAgICAgfVxuICAgKiAgICAgICAgICAgICBdfVxuICAgKiAgICAgIGZpZWxkS2V5PWNvbGxlY3Rpb24xLmNvbXBsZXgxLmNvbXBsZXgyLmNvbXBsZXgzLnNpbXBsZTJcbiAgICogICAgICBjb2xJbmRleD0yXG4gICAqICAgICAgdmFsdWU9dmFsdWUzMlxuICAgKlxuICAgKiBJZiBrZXkgaXMgcG9pbnRpbmcgYXQgYSBjb21wbGV4IG9yIGNvbGxlY3Rpb24gbGVhZiAobm90IHNpbXBsZSwgY29sbGVjdGlvbiBvZiBzaW1wbGUgb3IgbXVsdGlzZWxlY3QgdHlwZXMpIHRoZW4gdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuICAgKiBBbHNvIG5vIGtleSByZWZlcnJpbmcgYSBsZWFmIHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiBjb2xsZWN0aW9uIHdpbGwgY29udGFpbiBpbmRleCBudW1iZXIuIFRoZSBpbmRleCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlXG4gICAqIG1ldGhvZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RmllbGRWYWx1ZShmb3JtLCBmaWVsZEtleSwgY29sSW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZElkcyA9IGZpZWxkS2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3QgY3VycmVudEZpZWxkSWQgPSBmaWVsZElkc1swXTtcbiAgICBjb25zdCBjdXJyZW50Rm9ybSA9IGZvcm1bY3VycmVudEZpZWxkSWRdO1xuICAgIGlmIChGaWVsZHNVdGlscy5pc011bHRpU2VsZWN0VmFsdWUoY3VycmVudEZvcm0pKSB7XG4gICAgICByZXR1cm4gZm9ybVtjdXJyZW50RmllbGRJZCArIEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWF0uam9pbignLCAnKTtcbiAgICB9IGVsc2UgaWYgKEZpZWxkc1V0aWxzLmlzQ29sbGVjdGlvbk9mU2ltcGxlVHlwZXMoY3VycmVudEZvcm0pKSB7XG4gICAgICByZXR1cm4gY3VycmVudEZvcm0ubWFwKGZpZWxkVmFsdWUgPT4gZmllbGRWYWx1ZVsndmFsdWUnXSkuam9pbignLCAnKTtcbiAgICB9IGVsc2UgaWYgKEZpZWxkc1V0aWxzLmlzQ29sbGVjdGlvbihjdXJyZW50Rm9ybSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZpZWxkVmFsdWUoY3VycmVudEZvcm1bY29sSW5kZXhdWyd2YWx1ZSddLCBmaWVsZElkcy5zbGljZSgxKS5qb2luKCcuJyksIGNvbEluZGV4KTtcbiAgICB9IGVsc2UgaWYgKEZpZWxkc1V0aWxzLmlzTm9uRW1wdHlPYmplY3QoY3VycmVudEZvcm0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFZhbHVlKGN1cnJlbnRGb3JtLCBmaWVsZElkcy5zbGljZSgxKS5qb2luKCcuJyksIGNvbEluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN1cnJlbnRGb3JtO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHJlY3Vyc2l2ZSBtZXRob2QgdG8gcmVtb3ZlIGFueXRoaW5nIHdpdGggYSBgLS0tTEFCRUxgIHN1ZmZpeC5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gcmVjdXJzZSB0aHJvdWdoIGFuZCByZW1vdmUgTXVsdGlTZWxlY3QgbGFiZWxzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZW1vdmVNdWx0aVNlbGVjdExhYmVscyhkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgICAgRm9ybVZhbHVlU2VydmljZS5yZW1vdmVNdWx0aVNlbGVjdExhYmVscyhpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgIC8vIEhhdmUgd2UgZm91bmQgb25lIGEgTXVsdGlTZWxlY3QgbGFiZWw/XG4gICAgICAgICAgaWYgKGtleS5pbmRleE9mKEZpZWxkc1V0aWxzLkxBQkVMX1NVRkZJWCkgPiAwKSB7XG4gICAgICAgICAgICAvLyBJZiBzbywgcmVtb3ZlIGl0LlxuICAgICAgICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9ybVZhbHVlU2VydmljZS5yZW1vdmVNdWx0aVNlbGVjdExhYmVscyhkYXRhW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzUmVhZE9ubHkoZmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWVsZC5kaXNwbGF5X2NvbnRleHQgPyBmaWVsZC5kaXNwbGF5X2NvbnRleHQudG9VcHBlckNhc2UoKSA9PT0gJ1JFQURPTkxZJyA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNPcHRpb25hbChmaWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpZWxkLmRpc3BsYXlfY29udGV4dCA/IGZpZWxkLmRpc3BsYXlfY29udGV4dC50b1VwcGVyQ2FzZSgpID09PSAnT1BUSU9OQUwnIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc0xhYmVsKGZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICBpZiAoZmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgcmV0dXJuIGZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0xhYmVsJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzRW1wdHlEYXRhKGRhdGE6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBsZXQgYWxsRW1wdHkgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtwcm9wXTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYWxsRW1wdHkgPSBhbGxFbXB0eSAmJiB0aGlzLmlzRW1wdHlEYXRhKHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhbGxFbXB0eTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2hvdWxkIHdlIGNsZWFyIG91dCBvcHRpb25hbCwgZW1wdHksIGNvbXBsZXggb2JqZWN0cz9cbiAgICogQHBhcmFtIGNsZWFyRW1wdHkgRmFsc2UgcHJvcGVydHkgaWYgd2Ugc2ltcGx5IHdhbnQgdG8gc2tpcCBpdC5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gYXNzZXNzIGZvciBcImVtcHRpbmVzc1wiLlxuICAgKiBAcGFyYW0gZmllbGQgVGhlIENhc2VGaWVsZCB0aGF0IHdpbGwgdGVsbCB1cyBpZiB0aGlzIGlzIG9wdGlvbmFsLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2xlYXJPcHRpb25hbEVtcHR5KGNsZWFyRW1wdHk6IGJvb2xlYW4sIGRhdGE6IG9iamVjdCwgZmllbGQ6IENhc2VGaWVsZCk6IGJvb2xlYW4ge1xuICAgIGlmIChjbGVhckVtcHR5KSB7XG4gICAgICByZXR1cm4gRm9ybVZhbHVlU2VydmljZS5pc09wdGlvbmFsKGZpZWxkKSAmJiBGb3JtVmFsdWVTZXJ2aWNlLmlzRW1wdHlEYXRhKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpZWxkVHlwZVNhbml0aXNlcjogRmllbGRUeXBlU2FuaXRpc2VyKSB7XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpc2UocmF3VmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpc2VPYmplY3QocmF3VmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHNhbml0aXNlQ2FzZVJlZmVyZW5jZShyZWZlcmVuY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gc3RyaXAgbm9uIGRpZ2l0c1xuICAgIGNvbnN0IHM6IHN0cmluZyA9IHJlZmVyZW5jZS5yZXBsYWNlKC9bXFxEXS9nLCAnJyk7XG4gICAgaWYgKHMubGVuZ3RoID4gMTYpIHtcbiAgICAgIHJldHVybiBzLnN1YnN0cihzLmxlbmd0aCAtIDE2LCAxNik7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgcHVibGljIGZpbHRlckN1cnJlbnRQYWdlRmllbGRzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBlZGl0Rm9ybTogYW55KTogYW55IHtcbiAgICBjb25zdCBjbG9uZUZvcm0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVkaXRGb3JtKSk7XG4gICAgT2JqZWN0LmtleXMoY2xvbmVGb3JtWydkYXRhJ10pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGNhc2VGaWVsZHMuZmluZEluZGV4KChlbGVtZW50KSA9PiBlbGVtZW50LmlkID09PSBrZXkpIDwgMCkge1xuICAgICAgICBkZWxldGUgY2xvbmVGb3JtWydkYXRhJ11ba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xvbmVGb3JtO1xuICB9XG5cbiAgcHVibGljIHNhbml0aXNlRHluYW1pY0xpc3RzKGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBlZGl0Rm9ybTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFR5cGVTYW5pdGlzZXIuc2FuaXRpc2VMaXN0cyhjYXNlRmllbGRzLCBlZGl0Rm9ybS5kYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpc2VPYmplY3QocmF3T2JqZWN0OiBvYmplY3QpOiBvYmplY3Qge1xuICAgIGlmICghcmF3T2JqZWN0KSB7XG4gICAgICByZXR1cm4gcmF3T2JqZWN0O1xuICAgIH1cblxuICAgIGxldCBzYW5pdGlzZWRPYmplY3QgPSB7fTtcbiAgICBjb25zdCBkb2N1bWVudEZpZWxkS2V5cyA9IFsnZG9jdW1lbnRfdXJsJywgJ2RvY3VtZW50X2JpbmFyeV91cmwnLCAnZG9jdW1lbnRfZmlsZW5hbWUnXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXdPYmplY3QpIHtcbiAgICAgIC8vIElmIHRoZSBrZXkgaXMgb25lIG9mIGRvY3VtZW50RmllbGRLZXlzLCBpdCBtZWFucyB0aGUgZmllbGQgaXMgb2YgRG9jdW1lbnQgdHlwZS4gSWYgdGhlIHZhbHVlIG9mIGFueSBvZiB0aGVzZVxuICAgICAgLy8gcHJvcGVydGllcyBpcyBudWxsLCB0aGUgZW50aXJlIHNhbml0aXNlZCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgc2hvdWxkIGJlIG51bGxcbiAgICAgIGlmIChkb2N1bWVudEZpZWxkS2V5cy5pbmRleE9mKGtleSkgPiAtMSAmJiByYXdPYmplY3Rba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICBzYW5pdGlzZWRPYmplY3QgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoJ0Nhc2VSZWZlcmVuY2UnID09PSBrZXkpIHtcbiAgICAgICAgc2FuaXRpc2VkT2JqZWN0W2tleV0gPSB0aGlzLnNhbml0aXNlVmFsdWUodGhpcy5zYW5pdGlzZUNhc2VSZWZlcmVuY2UoU3RyaW5nKHJhd09iamVjdFtrZXldKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2FuaXRpc2VkT2JqZWN0W2tleV0gPSB0aGlzLnNhbml0aXNlVmFsdWUocmF3T2JqZWN0W2tleV0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzYW5pdGlzZWRPYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgJ3Nhbml0aXNlZCcgYXJyYXkgaXMgZW1wdHksIHdoZXJlYXMgdGhlIG9yaWdpbmFsIGFycmF5IGhhZCAxIG9yIG1vcmUgaXRlbXNcbiAgICAgICAgICAvLyBkZWxldGUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHNhbmF0aXNlZCBvYmplY3RcbiAgICAgICAgICBpZiAoc2FuaXRpc2VkT2JqZWN0W2tleV0ubGVuZ3RoID09PSAwICYmIHJhd09iamVjdFtrZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzYW5pdGlzZWRPYmplY3Rba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNhbml0aXNlZE9iamVjdDtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpc2VBcnJheShyYXdBcnJheTogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFyYXdBcnJheSkge1xuICAgICAgcmV0dXJuIHJhd0FycmF5O1xuICAgIH1cblxuICAgIHJhd0FycmF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICAgIGl0ZW0udmFsdWUgPSB0aGlzLnNhbml0aXNlVmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBGaWx0ZXIgdGhlIGFycmF5IHRvIGVuc3VyZSBvbmx5IHRydXRoeSB2YWx1ZXMgYXJlIHJldHVybmVkOyBkb3VibGUtYmFuZyBvcGVyYXRvciByZXR1cm5zIHRoZSBib29sZWFuIHRydWUvZmFsc2VcbiAgICAvLyBhc3NvY2lhdGlvbiBvZiBhIHZhbHVlLiBJbiBhZGRpdGlvbiwgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGl0ZW1zIHdpdGggYSBcInZhbHVlXCIgb2JqZWN0IHByb3BlcnR5LCByZXR1cm4gb25seVxuICAgIC8vIHRob3NlIHdob3NlIHZhbHVlIG9iamVjdCBjb250YWlucyBub24tZW1wdHkgdmFsdWVzLCBpbmNsdWRpbmcgZm9yIGFueSBkZXNjZW5kYW50IG9iamVjdHNcbiAgICByZXR1cm4gcmF3QXJyYXlcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSA/IEZpZWxkc1V0aWxzLmNvbnRhaW5zTm9uRW1wdHlWYWx1ZXMoaXRlbS52YWx1ZSkgOiB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpc2VWYWx1ZShyYXdWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXNlQXJyYXkocmF3VmFsdWUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZW9mIHJhd1ZhbHVlKSB7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGlzZU9iamVjdChyYXdWYWx1ZSk7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gcmF3VmFsdWUudHJpbSgpO1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhyYXdWYWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyTm9uQ2FzZUZpZWxkcyhkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKSB7XG4gICAgZm9yIChjb25zdCBkYXRhS2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghY2FzZUZpZWxkcy5maW5kKGNmID0+IGNmLmlkID09PSBkYXRhS2V5KSkge1xuICAgICAgICBkZWxldGUgZGF0YVtkYXRhS2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUT0RPIHJlZmFjdG9yIHNvIHRoYXQgdGhpcyBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBoYXZlIGEgY29tbW9uIGl0ZXJhdG9yIHRoYXQgYXBwbGllcyBmdW5jdGlvbnMgdG8gZWFjaCBub2RlIHZpc2l0ZWRcbiAgcHVibGljIHJlbW92ZU51bGxMYWJlbHMoZGF0YTogb2JqZWN0LCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSkge1xuICAgIGlmIChkYXRhICYmIGNhc2VGaWVsZHMgJiYgY2FzZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZGF0YSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBmb3JtIHRoYXQncyBub3QgaW4gdGhlIGNhc2VGaWVsZHNcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdMYWJlbCc6XG4gICAgICAgICAgICAgIC8vIERlbGV0ZSBhbnkgbGFiZWxzIHRoYXQgYXJlIG51bGxcbiAgICAgICAgICAgICAgaWYgKChkYXRhW2ZpZWxkLmlkXSA9PT0gbnVsbCkgfHwgKGRhdGFbZmllbGQuaWRdID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVtb3ZlIGFueXRoaW5nIHVubmVjZXNzYXJ5IGZyb20gd2l0aGluIGEgY29tcGxleCBmaWVsZC5cbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOdWxsTGFiZWxzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgLy8gR2V0IGhvbGQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbGxlY3Rpb24gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgY29tcGxleCBvYmplY3QsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIHRoZW0gb3V0LlxuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHJlbW92ZSBhbnkgdW5uZWNlc3NhcnkgZmllbGRzIHdpdGhpbi5cbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVsbExhYmVscyhpdGVtLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVsbExhYmVscyhpdGVtLnZhbHVlLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIFRPRE8gcmVmYWN0b3Igc28gdGhhdCB0aGlzIGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmllbGRzIGhhdmUgYSBjb21tb24gaXRlcmF0b3IgdGhhdCBhcHBsaWVzIGZ1bmN0aW9ucyB0byBlYWNoIG5vZGUgdmlzaXRlZFxuICBwdWJsaWMgcmVtb3ZlRW1wdHlEb2N1bWVudHMoZGF0YTogb2JqZWN0LCBjYXNlRmllbGRzOiBDYXNlRmllbGRbXSkge1xuICAgIGlmIChkYXRhICYmIGNhc2VGaWVsZHMgJiYgY2FzZUZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgZGF0YSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBmb3JtIHRoYXQncyBub3QgaW4gdGhlIGNhc2VGaWVsZHNcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZSkge1xuICAgICAgICAgIHN3aXRjaCAoZmllbGQuZmllbGRfdHlwZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVtb3ZlIGFueSBlbXB0eSBkb2N1bWVudHMgZnJvbSB3aXRoaW4gYSBjb21wbGV4IGZpZWxkLlxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVtcHR5RG9jdW1lbnRzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgLy8gR2V0IGhvbGQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGNvbGxlY3Rpb24gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgY29tcGxleCBvYmplY3QsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gYW5kIGNsZWFyIG91dCBlbXB0eSBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCByZW1vdmUgYW55IGVtcHR5IGRvY3VtZW50cyB3aXRoaW4uXG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUVtcHR5RG9jdW1lbnRzKGl0ZW0sIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eURvY3VtZW50cyhpdGVtLnZhbHVlLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRG9jdW1lbnQnOlxuICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhpcyBpcyBleGVjdXRlZCBvbmx5IGlmIHRoZSBEb2N1bWVudCBmaWVsZCBpcyBOT1QgaGlkZGVuIGFuZCBpcyBlbXB0eSBvZiBkYXRhOyBoaWRkZW4gRG9jdW1lbnRcbiAgICAgICAgICAgICAgLy8gZmllbGRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBmaWx0ZXJSYXdGb3JtVmFsdWVzKCkgZnVuY3Rpb24gaW4gQ2FzZUVkaXRTdWJtaXQgY29tcG9uZW50XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5oaWRkZW4gIT09IHRydWUgJiYgRm9ybVZhbHVlU2VydmljZS5pc0VtcHR5RGF0YShkYXRhW2ZpZWxkLmlkXSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIG91dCB1bm5lY2Vzc2FyeSBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0LCBiYXNlZCBvbiBhbiBhcnJheSBvZiBDYXNlRmllbGRzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyByZWN1cnNpdmUgYW5kIHdpbGwgY2FsbCBpdHNlbGYgaWYgaXQgZW5jb3VudGVycyBwYXJ0aWN1bGFyIGZpZWxkIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgb2JqZWN0IHRvIGJlIHRpZGllZCB1cC5cbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIENhc2VGaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAuXG4gICAqIEBwYXJhbSBjbGVhckVtcHR5IFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjbGVhciBvdXQgZW1wdHksIG9wdGlvbmFsLCBjb21wbGV4IG9iamVjdHMuXG4gICAqIEBwYXJhbSBjbGVhck5vbkNhc2UgV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGNsZWFyIG91dCBub24tY2FzZSBmaWVsZHMgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdLCBjbGVhckVtcHR5ID0gZmFsc2UsIGNsZWFyTm9uQ2FzZSA9IGZhbHNlLFxuICAgIGZyb21QcmV2aW91c1BhZ2UgPSBmYWxzZSwgY3VycmVudFBhZ2VDYXNlRmllbGRzID0gW10pOiB2b2lkIHtcbiAgICBpZiAoZGF0YSAmJiBjYXNlRmllbGRzICYmIGNhc2VGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGRhdGEgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgZm9ybSB0aGF0J3Mgbm90IGluIHRoZSBjYXNlRmllbGRzXG4gICAgICBpZiAoY2xlYXJOb25DYXNlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJOb25DYXNlRmllbGRzKGRhdGEsIGNhc2VGaWVsZHMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBjYXNlRmllbGRzKSB7XG4gICAgICAgIGlmICghRm9ybVZhbHVlU2VydmljZS5pc0xhYmVsKGZpZWxkKSAmJiBGb3JtVmFsdWVTZXJ2aWNlLmlzUmVhZE9ubHkoZmllbGQpKSB7XG4gICAgICAgICAgLy8gUmV0YWluIGFueXRoaW5nIHRoYXQgaXMgcmVhZG9ubHkgYW5kIG5vdCBhIGxhYmVsLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5oaWRkZW4gPT09IHRydWUgJiYgZmllbGQuZGlzcGxheV9jb250ZXh0ICE9PSAnSElEREVOJykge1xuICAgICAgICAgIC8vIERlbGV0ZSBhbnl0aGluZyB0aGF0IGlzIGhpZGRlbiAodGhhdCBpcyBOT1QgcmVhZG9ubHkpLCBhbmQgdGhhdFxuICAgICAgICAgIC8vIGhhc24ndCBoYWQgaXRzIGRpc3BsYXlfY29udGV4dCBvdmVycmlkZGVuIHRvIG1ha2UgaXQgaGlkZGVuLlxuICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5maWVsZF90eXBlKSB7XG4gICAgICAgICAgc3dpdGNoIChmaWVsZC5maWVsZF90eXBlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0xhYmVsJzpcbiAgICAgICAgICAgICAgLy8gRGVsZXRlIGFueSBsYWJlbHMuXG4gICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdEb2N1bWVudCc6XG4gICAgICAgICAgICAgIGlmIChGb3JtVmFsdWVTZXJ2aWNlLmlzRW1wdHlEYXRhKGRhdGFbZmllbGQuaWRdKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0NvbXBsZXgnOlxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZVVubmVjZXNzYXJ5RmllbGRzKGRhdGFbZmllbGQuaWRdLCBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBjbGVhckVtcHR5KTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgYW55IG9wdGlvbmFsIGNvbXBsZXggb2JqZWN0cyB0aGF0IGFyZSBjb21wbGV0ZWx5IGVtcHR5LlxuICAgICAgICAgICAgICAvLyBFVUktNDI0NDogUml0ZXNoJ3MgZml4LCBwYXNzaW5nIHRydWUgaW5zdGVhZCBvZiBjbGVhckVtcHR5LlxuICAgICAgICAgICAgICBpZiAoRm9ybVZhbHVlU2VydmljZS5jbGVhck9wdGlvbmFsRW1wdHkodHJ1ZSwgZGF0YVtmaWVsZC5pZF0sIGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2ZpZWxkLmlkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGF0YVtmaWVsZC5pZF0gJiYgRm9ybVZhbHVlU2VydmljZS5pc0VtcHR5RGF0YShkYXRhW2ZpZWxkLmlkXSkgJiYgZnJvbVByZXZpb3VzUGFnZVxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRQYWdlQ2FzZUZpZWxkcy5maW5kSW5kZXgoKGNGaWVsZDogYW55KSA9PiBjRmllbGQuaWQgPT09IGZpZWxkLmlkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdDb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkIGNvbGxlY3Rpb24gZGF0YVxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUludmFsaWRDb2xsZWN0aW9uRGF0YShkYXRhLCBmaWVsZCk7XG4gICAgICAgICAgICAgIC8vIEdldCBob2xkIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gZGF0YVtmaWVsZC5pZF07XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFjdHVhbGx5IGhhdmUgYSBjb2xsZWN0aW9uIHRvIHdvcmsgd2l0aC5cbiAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGNvbXBsZXggb2JqZWN0LCB3ZSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaFxuICAgICAgICAgICAgICAgIC8vIGFuZCBjbGVhciB0aGVtIG91dC5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCByZW1vdmUgYW55IHVubmVjZXNzYXJ5IGZpZWxkcyB3aXRoaW4uXG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVVubmVjZXNzYXJ5RmllbGRzKGl0ZW0sIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLCBjbGVhckVtcHR5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVVbm5lY2Vzc2FyeUZpZWxkcyhpdGVtLnZhbHVlLCBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIG91dCBhbnkgTXVsdGlTZWxlY3QgbGFiZWxzLlxuICAgIEZvcm1WYWx1ZVNlcnZpY2UucmVtb3ZlTXVsdGlTZWxlY3RMYWJlbHMoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFueSBlbXB0eSBvciBpbnZhbGlkIGFycmF5IHdpdGggb25seSBpZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUludmFsaWRDb2xsZWN0aW9uRGF0YShkYXRhOiBvYmplY3QsIGZpZWxkOiBDYXNlRmllbGQpIHtcbiAgICBpZiAoZGF0YVtmaWVsZC5pZF0gJiYgZGF0YVtmaWVsZC5pZF0ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBvYmpDb2xsZWN0aW9uIG9mIGRhdGFbZmllbGQuaWRdKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmpDb2xsZWN0aW9uKS5sZW5ndGggPT09IDEgJiYgT2JqZWN0LmtleXMob2JqQ29sbGVjdGlvbikuaW5kZXhPZignaWQnKSA+IC0xKSB7XG4gICAgICAgICAgZGF0YVtmaWVsZC5pZF0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW55IGVtcHR5IGNvbGxlY3Rpb24gZmllbGRzIHdoZXJlIGEgdmFsdWUgb2YgZ3JlYXRlciB0aGFuIHplcm8gaXMgc3BlY2lmaWVkIGluIHRoZSBmaWVsZCdzIHtAbGluayBGaWVsZFR5cGV9XG4gICAqIGBtaW5gIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0cmVlIG9mIGZvcm0gdmFsdWVzIG9uIHdoaWNoIHRvIHBlcmZvcm0gdGhlIHJlbW92YWxcbiAgICogQHBhcmFtIGNhc2VGaWVsZHMgVGhlIGxpc3Qgb2YgdW5kZXJseWluZyB7QGxpbmsgQ2FzZUZpZWxkfSBkb21haW4gbW9kZWwgb2JqZWN0cyBmb3IgZWFjaCBmaWVsZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVtcHR5Q29sbGVjdGlvbnNXaXRoTWluVmFsaWRhdGlvbihkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogdm9pZCB7XG4gICAgaWYgKGRhdGEgJiYgY2FzZUZpZWxkcyAmJiBjYXNlRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgY2FzZUZpZWxkcykge1xuICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29sbGVjdGlvbicgJiYgZmllbGQuZmllbGRfdHlwZS5taW4gPiAwICYmIGRhdGFbZmllbGQuaWRdICYmXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhW2ZpZWxkLmlkXSkgJiYgZGF0YVtmaWVsZC5pZF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZmllbGQuaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgRmxhZ0xhdW5jaGVyIGNhc2UgZmllbGQsIHdoaWNoIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBwZXJzaXN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBvYmplY3QgdHJlZSBvZiBmb3JtIHZhbHVlcyBvbiB3aGljaCB0byBwZXJmb3JtIHRoZSByZW1vdmFsXG4gICAqIEBwYXJhbSBjYXNlRmllbGRzIFRoZSBsaXN0IG9mIHVuZGVybHlpbmcge0BsaW5rIENhc2VGaWVsZH0gZG9tYWluIG1vZGVsIG9iamVjdHMgZm9yIGVhY2ggZmllbGRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVGbGFnTGF1bmNoZXJGaWVsZChkYXRhOiBvYmplY3QsIGNhc2VGaWVsZHM6IENhc2VGaWVsZFtdKTogdm9pZCB7XG4gICAgaWYgKGRhdGEgJiYgY2FzZUZpZWxkcyAmJiBjYXNlRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZsYWdMYXVuY2hlckNhc2VGaWVsZCA9IGNhc2VGaWVsZHMuZmlsdGVyKGNhc2VGaWVsZCA9PiBGaWVsZHNVdGlscy5pc0ZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQpKTtcbiAgICAgIGlmIChmbGFnTGF1bmNoZXJDYXNlRmllbGQubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgRmxhZ0xhdW5jaGVyIGNhc2UgZmllbGRcbiAgICAgICAgZGVsZXRlIGRhdGFbZmxhZ0xhdW5jaGVyQ2FzZUZpZWxkWzBdLmlkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIGZsYWcgZGF0YSBmb3IgZWFjaCBGbGFncyBmaWVsZCwgZnJvbSB0aGUgZGF0YSBoZWxkIGluIGl0cyBjb3JyZXNwb25kaW5nIENhc2VGaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0cmVlIG9mIGZvcm0gdmFsdWVzIG9uIHdoaWNoIHRvIHBlcmZvcm0gdGhlIGRhdGEgcG9wdWxhdGlvblxuICAgKiBAcGFyYW0gY2FzZUZpZWxkcyBUaGUgbGlzdCBvZiB1bmRlcmx5aW5nIHtAbGluayBDYXNlRmllbGR9IGRvbWFpbiBtb2RlbCBvYmplY3RzIGZvciBlYWNoIGZpZWxkXG4gICAqL1xuICBwdWJsaWMgcG9wdWxhdGVGbGFnRGV0YWlsc0Zyb21DYXNlRmllbGRzKGRhdGE6IG9iamVjdCwgY2FzZUZpZWxkczogQ2FzZUZpZWxkW10pOiB2b2lkIHtcbiAgICBpZiAoZGF0YSAmJiBjYXNlRmllbGRzICYmIGNhc2VGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2Fubm90IGZpbHRlciBvdXQgYW55dGhpbmcgb3RoZXIgdGhhbiB0byByZW1vdmUgdGhlIEZsYWdMYXVuY2hlciBDYXNlRmllbGQgYmVjYXVzZSBGbGFncyBmaWVsZHMgbWF5IGJlXG4gICAgICAvLyBjb250YWluZWQgaW4gb3RoZXIgQ2FzZUZpZWxkIGluc3RhbmNlcywgZWl0aGVyIGFzIGEgc3ViLWZpZWxkIG9mIGEgQ29tcGxleCBmaWVsZCwgb3IgZmllbGRzIGluIGEgY29sbGVjdGlvblxuICAgICAgLy8gKG9yIHN1Yi1maWVsZHMgb2YgQ29tcGxleCBmaWVsZHMgaW4gYSBjb2xsZWN0aW9uKVxuICAgICAgY2FzZUZpZWxkcy5maWx0ZXIoY2FzZUZpZWxkID0+ICFGaWVsZHNVdGlscy5pc0ZsYWdMYXVuY2hlckNhc2VGaWVsZChjYXNlRmllbGQpKVxuICAgICAgICAuZm9yRWFjaChjYXNlRmllbGQgPT4ge1xuICAgICAgICAgIGlmIChkYXRhW2Nhc2VGaWVsZC5pZF0pIHtcbiAgICAgICAgICAgIC8vIENvcHkgYWxsIHZhbHVlcyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIENhc2VGaWVsZDsgdGhpcyBlbnN1cmVzIGFsbCBuZXN0ZWQgZmxhZyBkYXRhIChmb3IgZXhhbXBsZSwgYVxuICAgICAgICAgICAgLy8gRmxhZ3MgZmllbGQgd2l0aGluIGEgQ29tcGxleCBmaWVsZCBvciBhIGNvbGxlY3Rpb24gb2YgQ29tcGxleCBmaWVsZHMpIGlzIGNvcGllZCBhY3Jvc3NcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGFbY2FzZUZpZWxkLmlkXSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLnZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhW2Nhc2VGaWVsZC5pZF1ba2V5XSA9IGNhc2VGaWVsZC52YWx1ZVtrZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -3,6 +3,7 @@ export * from './addresses';
3
3
  export * from './alert';
4
4
  export * from './auth';
5
5
  export * from './case-fields';
6
+ export * from './case-flag';
6
7
  export * from './document-management';
7
8
  export * from './draft';
8
9
  export * from './error';
@@ -26,4 +27,4 @@ export * from './search-result/sorting/search-result-view-item-comparator-factor
26
27
  export * from './organisation';
27
28
  export * from './browser';
28
29
  export * from './loading';
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsb0VBQW9FLENBQUM7QUFDbkYsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWN0aXZpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9hZGRyZXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbGVydCc7XG5leHBvcnQgKiBmcm9tICcuL2F1dGgnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXNlLWZpZWxkcyc7XG5leHBvcnQgKiBmcm9tICcuL2RvY3VtZW50LW1hbmFnZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmFmdCc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnRTdGF0dXNTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZmllbGRzJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybSc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAnO1xuZXhwb3J0ICogZnJvbSAnLi9qdXJpc2RpY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9iYW5uZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbmF2aWdhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL29yZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZmlsZSc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2gnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXNzaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vd2luZG93JztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Jhc2tldCc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmluaXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoLXJlc3VsdC9zb3J0aW5nL3NlYXJjaC1yZXN1bHQtdmlldy1pdGVtLWNvbXBhcmF0b3ItZmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL29yZ2FuaXNhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9sb2FkaW5nJztcbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jY2QtY2FzZS11aS10b29sa2l0L3NyYy9saWIvc2hhcmVkL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsUUFBUSxDQUFDO0FBQ3ZCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsb0VBQW9FLENBQUM7QUFDbkYsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWN0aXZpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9hZGRyZXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbGVydCc7XG5leHBvcnQgKiBmcm9tICcuL2F1dGgnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXNlLWZpZWxkcyc7XG5leHBvcnQgKiBmcm9tICcuL2Nhc2UtZmxhZyc7XG5leHBvcnQgKiBmcm9tICcuL2RvY3VtZW50LW1hbmFnZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmFmdCc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXZlbnRTdGF0dXNTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vZmllbGRzJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybSc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAnO1xuZXhwb3J0ICogZnJvbSAnLi9qdXJpc2RpY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9iYW5uZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vbmF2aWdhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL29yZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZmlsZSc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWFyY2gnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXNzaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vd2luZG93JztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Jhc2tldCc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmluaXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoLXJlc3VsdC9zb3J0aW5nL3NlYXJjaC1yZXN1bHQtdmlldy1pdGVtLWNvbXBhcmF0b3ItZmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL29yZ2FuaXNhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9sb2FkaW5nJztcbiJdfQ==