@mediusinc/mng-commons 6.0.0-rc.4 → 6.0.0-rc.6

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 (386) hide show
  1. package/core/components/notification/notification-wrapper.component.d.ts +4 -4
  2. package/core/error/error.model.d.ts +4 -4
  3. package/core/helpers/notification.d.ts +2 -2
  4. package/core/provide.d.ts +3 -3
  5. package/core/styles/style-constants.d.ts +9 -8
  6. package/core/styles/style.model.d.ts +2 -1
  7. package/fesm2022/mediusinc-mng-commons-core.mjs +91 -104
  8. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  9. package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
  10. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  11. package/fesm2022/mediusinc-mng-commons-form.mjs +149 -49
  12. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  13. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs +31 -0
  14. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs.map +1 -0
  15. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs +2118 -0
  16. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map +1 -0
  17. package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
  18. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  19. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
  20. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  21. package/fesm2022/mediusinc-mng-commons-tableview.mjs +340 -309
  22. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  23. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  24. package/form/api/index.d.ts +1 -0
  25. package/form/api/models/empty-value.model.d.ts +7 -0
  26. package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
  27. package/form/components/date-range/date-range.component.d.ts +4 -3
  28. package/form/components/dropdown/dropdown.component.d.ts +3 -2
  29. package/form/components/number-range/number-range.component.d.ts +3 -2
  30. package/form/directives/input-empty-value.directive.d.ts +40 -0
  31. package/form/directives/input-trim.directive.d.ts +3 -5
  32. package/form/index.d.ts +1 -0
  33. package/i18n/en.json +57 -8
  34. package/i18n/sl.json +1 -3
  35. package/package.json +16 -42
  36. package/provide.d.ts +2 -2
  37. package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
  38. package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
  39. package/table/components/table/table.component.d.ts +0 -1
  40. package/table/helpers/filters.d.ts +3 -2
  41. package/table/helpers/notification.d.ts +2 -2
  42. package/table/services/table-metadata.service.d.ts +3 -3
  43. package/tableview/action/components/action/action.component.d.ts +1 -0
  44. package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
  45. package/tableview/action/components/table/action-table.component.d.ts +2 -1
  46. package/tableview/action/helpers/notification.d.ts +3 -3
  47. package/tableview/action/models/execution/action-context.model.d.ts +2 -2
  48. package/tableview/action/services/action-executor.service.d.ts +1 -1
  49. package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
  50. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
  51. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
  52. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
  53. package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
  54. package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
  55. package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
  56. package/tableview/api/editor/models/field.model.d.ts +1 -2
  57. package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
  58. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  59. package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
  60. package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
  61. package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
  62. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
  63. package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
  64. package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
  65. package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
  66. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
  67. package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
  68. package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
  69. package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
  70. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
  71. package/tableview/editor/helpers/formly-config.d.ts +1 -1
  72. package/tableview/editor/helpers/notification.d.ts +3 -3
  73. package/tableview/editor/models/formly-config.model.d.ts +10 -1
  74. package/tableview/editor/models/formly.model.d.ts +23 -0
  75. package/tableview/editor/services/form-editor.service.d.ts +2 -2
  76. package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
  77. package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
  78. package/version-info.json +3 -3
  79. package/esm2022/core/action/action-data.model.mjs +0 -2
  80. package/esm2022/core/action/action-parameters.model.mjs +0 -2
  81. package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
  82. package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
  83. package/esm2022/core/data-list/data-list.model.mjs +0 -2
  84. package/esm2022/core/data-list/filter-match.model.mjs +0 -105
  85. package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
  86. package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
  87. package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
  88. package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
  89. package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
  90. package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
  91. package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
  92. package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
  93. package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
  94. package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
  95. package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
  96. package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
  97. package/esm2022/core/directives/component.directive.mjs +0 -75
  98. package/esm2022/core/directives/rerender.directive.mjs +0 -25
  99. package/esm2022/core/directives/template.directive.mjs +0 -29
  100. package/esm2022/core/enum/enum-helpers.mjs +0 -90
  101. package/esm2022/core/enum/enum.model.mjs +0 -2
  102. package/esm2022/core/error/error-handler.mjs +0 -20
  103. package/esm2022/core/error/error-helpers.mjs +0 -273
  104. package/esm2022/core/error/error.model.mjs +0 -33
  105. package/esm2022/core/helpers/coercion.mjs +0 -55
  106. package/esm2022/core/helpers/date.mjs +0 -119
  107. package/esm2022/core/helpers/notification.mjs +0 -21
  108. package/esm2022/core/helpers/number.mjs +0 -19
  109. package/esm2022/core/helpers/object.mjs +0 -152
  110. package/esm2022/core/helpers/route.mjs +0 -58
  111. package/esm2022/core/helpers/string.mjs +0 -57
  112. package/esm2022/core/helpers/templates.mjs +0 -4
  113. package/esm2022/core/helpers/type-helpers.mjs +0 -2
  114. package/esm2022/core/i18n/i18n-common.mjs +0 -24
  115. package/esm2022/core/i18n/i18n-error.mjs +0 -29
  116. package/esm2022/core/i18n/i18n-type.mjs +0 -46
  117. package/esm2022/core/index.mjs +0 -107
  118. package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
  119. package/esm2022/core/log/log.model.mjs +0 -10
  120. package/esm2022/core/log/logger.service.mjs +0 -131
  121. package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
  122. package/esm2022/core/models/class-attribute.model.mjs +0 -2
  123. package/esm2022/core/models/class-service.model.mjs +0 -2
  124. package/esm2022/core/models/getter.model.mjs +0 -2
  125. package/esm2022/core/models/i18n.model.mjs +0 -2
  126. package/esm2022/core/models/menu.model.mjs +0 -2
  127. package/esm2022/core/models/user.model.mjs +0 -2
  128. package/esm2022/core/models/version.model.mjs +0 -2
  129. package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
  130. package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
  131. package/esm2022/core/pipes/enum.pipe.mjs +0 -38
  132. package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
  133. package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
  134. package/esm2022/core/pipes/getter.pipe.mjs +0 -21
  135. package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
  136. package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
  137. package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
  138. package/esm2022/core/pipes/template.pipe.mjs +0 -25
  139. package/esm2022/core/provide.mjs +0 -79
  140. package/esm2022/core/reactivity/effect.mjs +0 -22
  141. package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
  142. package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
  143. package/esm2022/core/registry/registry.model.mjs +0 -2
  144. package/esm2022/core/registry/type-registry.mjs +0 -106
  145. package/esm2022/core/router/route-builder.mjs +0 -431
  146. package/esm2022/core/router/router.model.mjs +0 -2
  147. package/esm2022/core/router/routes-builder.mjs +0 -52
  148. package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
  149. package/esm2022/core/security/permission-helpers.mjs +0 -14
  150. package/esm2022/core/security/permission.guard.mjs +0 -15
  151. package/esm2022/core/security/permission.service.mjs +0 -101
  152. package/esm2022/core/security/permissions.model.mjs +0 -93
  153. package/esm2022/core/services/commons-configuration.service.mjs +0 -189
  154. package/esm2022/core/services/commons-init.service.mjs +0 -111
  155. package/esm2022/core/services/commons-router.service.mjs +0 -181
  156. package/esm2022/core/services/commons-storage.service.mjs +0 -31
  157. package/esm2022/core/services/commons.service.mjs +0 -324
  158. package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
  159. package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
  160. package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
  161. package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
  162. package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
  163. package/esm2022/core/styles/style-constants.mjs +0 -11
  164. package/esm2022/core/styles/style.model.mjs +0 -20
  165. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
  166. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
  167. package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
  168. package/esm2022/filter/index.mjs +0 -8
  169. package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
  170. package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
  171. package/esm2022/filter/models/filter.model.mjs +0 -20
  172. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
  173. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
  174. package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
  175. package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
  176. package/esm2022/form/api/index.mjs +0 -10
  177. package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
  178. package/esm2022/form/api/models/button.model.mjs +0 -2
  179. package/esm2022/form/api/models/trim.model.mjs +0 -2
  180. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
  181. package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
  182. package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
  183. package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
  184. package/esm2022/form/directives/input-trim.directive.mjs +0 -50
  185. package/esm2022/form/index.mjs +0 -8
  186. package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
  187. package/esm2022/index.mjs +0 -2
  188. package/esm2022/mediusinc-mng-commons.mjs +0 -5
  189. package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
  190. package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
  191. package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
  192. package/esm2022/model/class/helpers/model.mjs +0 -53
  193. package/esm2022/model/class/index.mjs +0 -8
  194. package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
  195. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
  196. package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
  197. package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
  198. package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
  199. package/esm2022/model/helpers/i18n.mjs +0 -47
  200. package/esm2022/model/index.mjs +0 -9
  201. package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
  202. package/esm2022/provide.mjs +0 -6
  203. package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
  204. package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
  205. package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
  206. package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
  207. package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
  208. package/esm2022/table/api/class/index.mjs +0 -6
  209. package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
  210. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
  211. package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
  212. package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
  213. package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
  214. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
  215. package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
  216. package/esm2022/table/api/helpers/column-converter.mjs +0 -25
  217. package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
  218. package/esm2022/table/api/index.mjs +0 -19
  219. package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
  220. package/esm2022/table/api/models/column-value.model.mjs +0 -2
  221. package/esm2022/table/api/models/column.model.mjs +0 -21
  222. package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
  223. package/esm2022/table/api/models/table-columns.model.mjs +0 -2
  224. package/esm2022/table/api/models/table-event.model.mjs +0 -2
  225. package/esm2022/table/api/models/table.model.mjs +0 -21
  226. package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
  227. package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
  228. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
  229. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
  230. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
  231. package/esm2022/table/components/table/table.component.mjs +0 -319
  232. package/esm2022/table/helpers/filters.mjs +0 -312
  233. package/esm2022/table/helpers/notification.mjs +0 -21
  234. package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
  235. package/esm2022/table/helpers/table.mjs +0 -24
  236. package/esm2022/table/index.mjs +0 -24
  237. package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
  238. package/esm2022/table/models/column-preferences.model.mjs +0 -2
  239. package/esm2022/table/models/filter.model.mjs +0 -2
  240. package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
  241. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
  242. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
  243. package/esm2022/table/provide.mjs +0 -19
  244. package/esm2022/table/services/table-data.service.mjs +0 -194
  245. package/esm2022/table/services/table-feature-config.token.mjs +0 -3
  246. package/esm2022/table/services/table-metadata.service.mjs +0 -136
  247. package/esm2022/table/services/table-preferences.service.mjs +0 -142
  248. package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
  249. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
  250. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
  251. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
  252. package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
  253. package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
  254. package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
  255. package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
  256. package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
  257. package/esm2022/tableview/action/helpers/notification.mjs +0 -78
  258. package/esm2022/tableview/action/helpers/styles.mjs +0 -32
  259. package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
  260. package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
  261. package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
  262. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
  263. package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
  264. package/esm2022/tableview/action/services/action-executor.service.mjs +0 -777
  265. package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
  266. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
  267. package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
  268. package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
  269. package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
  270. package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
  271. package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
  272. package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
  273. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
  274. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
  275. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
  276. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
  277. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
  278. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
  279. package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
  280. package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
  281. package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
  282. package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
  283. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
  284. package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
  285. package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
  286. package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
  287. package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
  288. package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
  289. package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
  290. package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
  291. package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
  292. package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
  293. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
  294. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
  295. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
  296. package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
  297. package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
  298. package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
  299. package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
  300. package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
  301. package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
  302. package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
  303. package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
  304. package/esm2022/tableview/api/class/index.mjs +0 -13
  305. package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
  306. package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
  307. package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
  308. package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
  309. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
  310. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
  311. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
  312. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
  313. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
  314. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
  315. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
  316. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
  317. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
  318. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
  319. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
  320. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
  321. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
  322. package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
  323. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
  324. package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
  325. package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
  326. package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
  327. package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
  328. package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
  329. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
  330. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
  331. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
  332. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
  333. package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
  334. package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
  335. package/esm2022/tableview/api/index.mjs +0 -76
  336. package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
  337. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
  338. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
  339. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
  340. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
  341. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
  342. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
  343. package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
  344. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
  345. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
  346. package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
  347. package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
  348. package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
  349. package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
  350. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
  351. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
  352. package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
  353. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
  354. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
  355. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
  356. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
  357. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
  358. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
  359. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
  360. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
  361. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
  362. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
  363. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
  364. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
  365. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
  366. package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
  367. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
  368. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
  369. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
  370. package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
  371. package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
  372. package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
  373. package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
  374. package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
  375. package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
  376. package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
  377. package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
  378. package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
  379. package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
  380. package/esm2022/tableview/index.mjs +0 -67
  381. package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
  382. package/esm2022/tableview/provide.mjs +0 -105
  383. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
  384. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
  385. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
  386. package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
@@ -1,319 +0,0 @@
1
- import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, afterNextRender, booleanAttribute, computed, contentChildren, inject, input, output, signal, viewChild, viewChildren } from '@angular/core';
3
- import { outputFromObservable, takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
- import { FormsModule } from '@angular/forms';
5
- import { ActivatedRoute, NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
6
- import { TranslateModule, TranslateService } from '@ngx-translate/core';
7
- import { MessageService } from 'primeng/api';
8
- import { ButtonModule } from 'primeng/button';
9
- import { MultiSelectModule } from 'primeng/multiselect';
10
- import { Table, TableModule } from 'primeng/table';
11
- import { TooltipModule } from 'primeng/tooltip';
12
- import { NEVER, Subject, filter, of, switchMap } from 'rxjs';
13
- import { ClassMapPipe, ComponentDirective, I18nPropertyPipe, LoggerService, TemplateDirective, booleanOrUndefinedAttribute, dataListParamsToUrlQuery, effectWithDeps, findTemplateByName, fromSubscribeError, fromTableLoadToDataListParams, fromUrlQueryToDataListParams, getErrorLogLevel, mergeDataListParamsWithDefaults } from '@mediusinc/mng-commons/core';
14
- import { FilterDisplayTypeEnum } from '@mediusinc/mng-commons/filter';
15
- import { TablePaginationModeEnum, TableSizeEnum } from '@mediusinc/mng-commons/table/api';
16
- import { tableNotificationError } from '../../helpers/notification';
17
- import { LocaleDefaultRowClassPipe } from '../../pipes/locale-default-row-class.pipe';
18
- import { TableColumnFilterClassPipe } from '../../pipes/table-column-filter-class.pipe';
19
- import { TableDataService } from '../../services/table-data.service';
20
- import { TableMetadataService } from '../../services/table-metadata.service';
21
- import { TablePreferencesService } from '../../services/table-preferences.service';
22
- import { TableColumnFilterComponent } from '../column-filter/column-filter.component';
23
- import { TableColumnValueComponent } from '../column-value/column-value.component';
24
- import { TableFilterOverlayWithTagComponent } from '../filter/filter-overlay-with-tag/filter-overlay-with-tag.component';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "primeng/table";
27
- import * as i2 from "primeng/api";
28
- import * as i3 from "primeng/multiselect";
29
- import * as i4 from "primeng/button";
30
- import * as i5 from "primeng/tooltip";
31
- import * as i6 from "@ngx-translate/core";
32
- import * as i7 from "@angular/forms";
33
- export class TableComponent {
34
- // subscriptions and refs
35
- #previousDataProvider;
36
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
37
- #dataProviderEagerFirstLoad;
38
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
- #dataProviderReloadSubscription;
40
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
41
- #routeQueryParamsSubscription;
42
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
43
- #routerEventsSubscription;
44
- #afterNextRenderRef;
45
- constructor() {
46
- this.filterKeyPrepend = 'f_';
47
- this.logger = inject(LoggerService).create(TableMetadataService.cmpTypeName);
48
- this.router = inject(Router);
49
- this.route = inject(ActivatedRoute);
50
- this.translate = inject(TranslateService);
51
- this.messageService = inject(MessageService);
52
- this.metadata = inject(TableMetadataService);
53
- this.prefs = inject(TablePreferencesService);
54
- this.data = inject((TableDataService));
55
- // descriptor
56
- this.descriptorInput = input.required({ alias: 'descriptor' });
57
- // data source inputs
58
- this.items = input();
59
- this.result = input();
60
- this.loadingInput = input(undefined, { alias: 'loading', transform: booleanOrUndefinedAttribute });
61
- this.dataProvider = input();
62
- // extra features input
63
- this.useQueryParams = input(false, { transform: booleanAttribute });
64
- this.cellClickEnabled = input(true, { transform: booleanAttribute });
65
- this.selectionMode = input('multiple');
66
- this.selectionEnabled = input(false, { transform: booleanAttribute });
67
- this.rowReorderEnabledInput = input(true, { alias: 'rowReorderEnabled', transform: booleanAttribute });
68
- this.rowReorderEnabled = computed(() => this.rowReorderEnabledInput() && this.metadata.descriptor().rowReorderable);
69
- this.expandedRowKeys = computed(() => {
70
- const descriptor = this.metadata.descriptor();
71
- if (typeof descriptor.isRowExpanded === 'string') {
72
- return this.data.data()?.reduce((acc, item) => {
73
- acc[item[descriptor.trackProperty]] = !!item[descriptor.isRowExpanded];
74
- return acc;
75
- }, {});
76
- }
77
- else if (typeof descriptor.isRowExpanded === 'function') {
78
- return this.data.data()?.reduce((acc, item) => {
79
- acc[item[descriptor.trackProperty]] = descriptor.isRowExpanded(item);
80
- return acc;
81
- }, {});
82
- }
83
- return {};
84
- });
85
- // styling
86
- this.columnLastMinWidth = input();
87
- this.columnsColspan = computed(() => this.visibleColumns().length + (this.hasLastColumn() ? 1 : 0) + (this.selectionEnabled() ? 1 : 0) + (this.rowReorderEnabled() ? 1 : 0));
88
- this.hasTitleDisplay = computed(() => this.captionTemplate() || this.captionComponent() || this.metadata.descriptor().title);
89
- this.isCaptionVisible = computed(() => this.hasTitleDisplay() || this.overlayWithTagFilters().length > 0 || this.metadata.descriptor().search);
90
- // component inputs
91
- this.captionComponent = input();
92
- this.columnCustomLastComponent = input();
93
- this.globalFilterFieldsInput = input(undefined, { alias: 'globalFilterFields' });
94
- // cell click
95
- this.cellClickSubject = new Subject();
96
- this.isCellClickObserved = signal(this.cellClickSubject.observed);
97
- this.isCellClickEnabled = computed(() => this.cellClickEnabled() && this.isCellClickObserved());
98
- // event outputs
99
- this.tableLoad = output();
100
- this.cellClick = outputFromObservable(this.cellClickSubject);
101
- this.selectionChange = output();
102
- this.captionComponentInstance = output();
103
- this.columnCustomLastComponentInstance = output();
104
- this.rowReorder = output();
105
- // content and view queries
106
- this.templates = contentChildren(TemplateDirective);
107
- this.components = viewChildren((ComponentDirective));
108
- this.primeTable = viewChild(Table);
109
- // templates
110
- this.captionTemplate = computed(() => findTemplateByName([...this.templates()], 'caption'));
111
- this.columnCustomLastTemplate = computed(() => findTemplateByName([...this.templates()], 'columnCustomLast'));
112
- this.footerTemplate = computed(() => findTemplateByName([...this.templates()], 'footer'));
113
- this.rowExpandTemplate = computed(() => findTemplateByName([...this.templates()], 'rowExpandContent'));
114
- // data provider and items
115
- this.isLazy = computed(() => this.dataProvider()?.isLazy === true);
116
- this.isPagination = computed(() => this.data.paginationMode() === TablePaginationModeEnum.Pagination);
117
- this.useQueryParamsInitialized = signal(false);
118
- // visual
119
- this.className = computed(() => {
120
- let className = this.metadata.descriptor().className ?? '';
121
- switch (this.metadata.descriptor().size) {
122
- case TableSizeEnum.Small:
123
- className += ' p-datatable-sm';
124
- break;
125
- case TableSizeEnum.Large:
126
- className += ' p-datatable-lg';
127
- break;
128
- }
129
- if (this.metadata.descriptor().hasGridlines) {
130
- className += ' p-datatable-gridlines';
131
- }
132
- if (!this.isCaptionVisible()) {
133
- className += ' datatable-no-header';
134
- }
135
- return className;
136
- });
137
- // columns
138
- this.visibleColumns = computed(() => this.prefs.columnsWithPrefs().filter(col => col.isVisible));
139
- this.areColumnsReorderable = computed(() => this.prefs.columnsWithPrefs().some(col => col.descriptor.isReorderable));
140
- this.areColumnsToggleable = computed(() => this.prefs.columnsWithPrefs().some(col => col.descriptor.isToggleable));
141
- // filter, sort
142
- this.hasColumnFilters = computed(() => (this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.OverlayWithTag &&
143
- this.metadata.filterDescriptors().some(d => d.displayType === FilterDisplayTypeEnum.Column)) ||
144
- (this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.Column && this.metadata.filterDescriptors().some(d => d.displayType == null)));
145
- this.overlayWithTagFilters = computed(() => {
146
- // statically defined filters AND generic filters
147
- const filters = this.metadata
148
- .filters()
149
- .filter(d => (d.descriptor.displayType == null && this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.OverlayWithTag) ||
150
- d.descriptor.displayType === FilterDisplayTypeEnum.OverlayWithTag);
151
- return filters.concat(this.metadata.genericFilters());
152
- });
153
- this.anyColumnVisible = computed(() => this.visibleColumns().length > 0);
154
- this.hasCustomLastColumn = computed(() => this.columnCustomLastComponent() || this.columnCustomLastTemplate());
155
- this.hasLastColumn = computed(() => this.hasCustomLastColumn() || this.areColumnsToggleable() || this.areColumnsReorderable());
156
- // other
157
- this.navigationOutOfTableInProgress = false;
158
- this.navigationInTableInProgress = false;
159
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
160
- this.#dataProviderEagerFirstLoad = effectWithDeps([this.dataProvider], ([dataProvider]) => {
161
- if (dataProvider?.isLazy === false) {
162
- this.loadTableWithDataProvider(this.metadata.defaultParams());
163
- }
164
- else if (this.#previousDataProvider && dataProvider) {
165
- this.reload();
166
- }
167
- this.#previousDataProvider = dataProvider;
168
- });
169
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
170
- this.#dataProviderReloadSubscription = toObservable(this.dataProvider)
171
- .pipe(switchMap(dp => dp?.tableReload$ ?? of({})), takeUntilDestroyed())
172
- .subscribe({
173
- next: e => {
174
- this.reload(e);
175
- }
176
- });
177
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
178
- this.#routeQueryParamsSubscription = toObservable(this.useQueryParams)
179
- .pipe(switchMap(useQp => (useQp ? this.route.queryParams : NEVER)), takeUntilDestroyed())
180
- .subscribe(qp => {
181
- this.loadTableFromRouteUpdate(qp);
182
- });
183
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
184
- this.#routerEventsSubscription = toObservable(this.useQueryParams)
185
- .pipe(switchMap(useQp => (useQp ? this.router.events : NEVER)), filter(e => (e instanceof NavigationStart && e.url.split('?')[0].split('#')[0] !== this.router.url.split('?')[0].split('#')[0]) ||
186
- e instanceof NavigationEnd ||
187
- e instanceof NavigationCancel ||
188
- e instanceof NavigationError), takeUntilDestroyed())
189
- .subscribe(e => {
190
- this.navigationOutOfTableInProgress = e instanceof NavigationStart;
191
- });
192
- this.#afterNextRenderRef = afterNextRender(() => {
193
- this.isCellClickObserved.set(this.cellClickSubject.observed);
194
- });
195
- this.metadata.setSignalSources(this.descriptorInput, this.globalFilterFieldsInput);
196
- this.data.setDataSources(this.items, this.result, this.dataProvider, this.loadingInput);
197
- }
198
- reload(emitEvent) {
199
- const params = emitEvent?.params ? emitEvent?.params : emitEvent?.resetParams ? undefined : this.lastParamsWithDefaults;
200
- const reloadParams = mergeDataListParamsWithDefaults(params ?? {}, this.metadata.defaultParams());
201
- this.loadTableWithDataProvider(reloadParams, emitEvent?.emitEvent ?? false);
202
- }
203
- onTableLazyLoad(event) {
204
- this.lastLazyLoadEvent = event;
205
- const params = fromTableLoadToDataListParams(event);
206
- if (this.useQueryParams()) {
207
- if (!this.navigationOutOfTableInProgress && !this.navigationInTableInProgress) {
208
- // this check is necessary: from some reason, primeNG commits one last lazy load event whenever any angular router navigation occurs
209
- this.navigationInTableInProgress = true;
210
- const newParams = dataListParamsToUrlQuery(params, this.metadata.defaultParams(), { prependFilterName: this.filterKeyPrepend });
211
- const newParamsWithParamsToRemove = { ...newParams };
212
- const currentQp = this.route.snapshot.queryParams;
213
- if (currentQp) {
214
- Object.keys(currentQp)
215
- .filter(k => (k.startsWith(this.filterKeyPrepend) || ['offset', 'limit', 'sort', 'q'].indexOf(k) >= 0) && newParams[k] === undefined)
216
- .forEach(k => (newParamsWithParamsToRemove[k] = null));
217
- }
218
- this.router
219
- .navigate([], {
220
- relativeTo: this.route,
221
- replaceUrl: true,
222
- queryParams: newParamsWithParamsToRemove,
223
- queryParamsHandling: 'merge'
224
- })
225
- .then(() => {
226
- this.navigationInTableInProgress = false;
227
- });
228
- }
229
- }
230
- else {
231
- const paramsWithDefaults = mergeDataListParamsWithDefaults(params, this.metadata.defaultParams());
232
- this.data.setParams(paramsWithDefaults);
233
- this.loadTableWithDataProvider(paramsWithDefaults);
234
- }
235
- }
236
- onTableFilter(event) {
237
- if (this.useQueryParams()) {
238
- return;
239
- }
240
- const params = fromTableLoadToDataListParams({ filters: event.filters });
241
- const paramsWithDefaults = mergeDataListParamsWithDefaults(params, this.metadata.defaultParams());
242
- // if table doesn't use lazy loading, filter params need to be set here
243
- // because the onTableLazyLoad event is not emitted
244
- if (!this.isLazy()) {
245
- this.data.setParams(paramsWithDefaults);
246
- }
247
- }
248
- onCellClick(event, col, item, idx) {
249
- if (!this.isCellClickEnabled()) {
250
- return;
251
- }
252
- const tableEvent = {
253
- column: col,
254
- rowItem: item,
255
- rowIndex: idx,
256
- event: event
257
- };
258
- this.cellClickSubject.next(tableEvent);
259
- }
260
- onSelectionChange(event) {
261
- this.selectionChange.emit(event);
262
- }
263
- onRowReorder(event) {
264
- this.rowReorder.emit(event);
265
- }
266
- loadTableWithDataProvider(paramsWithDefaults, emitEvent = true) {
267
- const isFetched = this.data.fetchWithDataProvider(paramsWithDefaults, error => {
268
- tableNotificationError(this.translate, this.messageService, this.metadata.descriptor(), error);
269
- const commonsError = fromSubscribeError(error, 'TableComponentError', {
270
- params: paramsWithDefaults
271
- });
272
- this.logger.log(commonsError, getErrorLogLevel(commonsError));
273
- });
274
- if (isFetched) {
275
- this.lastParamsWithDefaults = paramsWithDefaults;
276
- if (emitEvent) {
277
- const tableEvent = {
278
- originalEvent: this.lastLazyLoadEvent,
279
- params: paramsWithDefaults
280
- };
281
- this.tableLoad.emit(tableEvent);
282
- }
283
- }
284
- }
285
- loadTableFromRouteUpdate(urlParams) {
286
- const paramsWithDefaults = mergeDataListParamsWithDefaults(fromUrlQueryToDataListParams(urlParams, {
287
- prependFilterName: this.filterKeyPrepend,
288
- searchAsGlobal: true
289
- }), this.metadata.defaultParams());
290
- this.data.setParams(paramsWithDefaults, true);
291
- this.loadTableWithDataProvider(paramsWithDefaults);
292
- }
293
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
294
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: TableComponent, isStandalone: true, selector: "mng-table", inputs: { descriptorInput: { classPropertyName: "descriptorInput", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, useQueryParams: { classPropertyName: "useQueryParams", publicName: "useQueryParams", isSignal: true, isRequired: false, transformFunction: null }, cellClickEnabled: { classPropertyName: "cellClickEnabled", publicName: "cellClickEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionEnabled: { classPropertyName: "selectionEnabled", publicName: "selectionEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowReorderEnabledInput: { classPropertyName: "rowReorderEnabledInput", publicName: "rowReorderEnabled", isSignal: true, isRequired: false, transformFunction: null }, columnLastMinWidth: { classPropertyName: "columnLastMinWidth", publicName: "columnLastMinWidth", isSignal: true, isRequired: false, transformFunction: null }, captionComponent: { classPropertyName: "captionComponent", publicName: "captionComponent", isSignal: true, isRequired: false, transformFunction: null }, columnCustomLastComponent: { classPropertyName: "columnCustomLastComponent", publicName: "columnCustomLastComponent", isSignal: true, isRequired: false, transformFunction: null }, globalFilterFieldsInput: { classPropertyName: "globalFilterFieldsInput", publicName: "globalFilterFields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tableLoad: "tableLoad", cellClick: "cellClick", selectionChange: "selectionChange", captionComponentInstance: "captionComponentInstance", columnCustomLastComponentInstance: "columnCustomLastComponentInstance", rowReorder: "rowReorder" }, providers: [TableMetadataService, TableDataService, TablePreferencesService], queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "components", predicate: (ComponentDirective), descendants: true, isSignal: true }, { propertyName: "primeTable", first: true, predicate: Table, descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (data.isAllPaginationMetaInitialized()) {\n <p-table\n [value]=\"data.data()\"\n [dataKey]=\"metadata.descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"data.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"data.rows()\"\n [first]=\"data.offset()\"\n [totalRecords]=\"data.count()\"\n [rowsPerPageOptions]=\"metadata.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"data.sortMeta()\"\n [filters]=\"data.filterMeta()\"\n [globalFilterFields]=\"metadata.searchFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"metadata.descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"metadata.descriptor().hasResizableColumns\"\n [columnResizeMode]=\"metadata.descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n [expandedRowKeys]=\"expandedRowKeys()\"\n (onColResize)=\"prefs.onColumnResize($event)\"\n (onColReorder)=\"prefs.onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onFilter)=\"onTableFilter($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || metadata.descriptor().search) {\n <mng-table-filter-overlay-with-tag\n [title]=\"metadata.descriptor().title\"\n [metadata]=\"overlayWithTagFilters()\"\n [genericFilterDescriptor]=\"metadata.genericFilterDescriptor()\"\n [model]=\"metadata.descriptor().model\"\n [enableSearch]=\"metadata.descriptor().search\"\n [search]=\"data.searchMeta()\"\n [searchLimitWordMax]=\"metadata.descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-table-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (metadata.descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ metadata.descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!metadata.descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"metadata.descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n <p-sortIcon [field]=\"col.sort?.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (areColumnsToggleable()) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"prefs.columnsWithPrefs()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"prefs.onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"prefs.onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"prefs.clearLayoutPreferences()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{\n (item.descriptor.title && !item.descriptor.titleUseModelBase\n ? item.descriptor.title\n : (item.descriptor.title ?? item.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.descriptor?.columnClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : (col.filter?.descriptor?.columnWidth ?? col.descriptor.width ?? null)\"\n [style.min-width.px]=\"col.width ? null : (col.filter?.descriptor?.columnMinWidth ?? col.descriptor.minWidth)\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [metadata]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"\n metadata.descriptor().rowClassName | mngClassMap: metadata.descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: metadata.descriptor() : item\n \">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <td>\n @if (!metadata.descriptor().rowExpandableProperty || item[metadata.descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (metadata.descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"metadata.descriptor().rowExpandableColSpan\">\n @if (metadata.descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"metadata.descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (metadata.descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + metadata.descriptor().loadingIcon\"></i>\n }\n @if (metadata.descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': metadata.descriptor().loadingIcon}\">\n {{ metadata.descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: data.data(), totalCount: data.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", dependencies: [{ kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "pipe", type: I18nPropertyPipe, name: "mngI18nProperty" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "pipe", type: ClassMapPipe, name: "mngClassMap" }, { kind: "pipe", type: LocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: TableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["metadata"] }, { kind: "pipe", type: TableColumnFilterClassPipe, name: "mngTableColumnFilterClass" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i1.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i1.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i1.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i1.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i1.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i1.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i1.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i1.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i1.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i3.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "component", type: TableFilterOverlayWithTagComponent, selector: "mng-table-filter-overlay-with-tag", inputs: ["metadata", "genericFilterDescriptor", "model", "enableSearch", "search", "searchLimitWordMax", "enableCaseSensitive"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TemplateDirective, selector: "[mngTemplate]", inputs: ["type", "mngTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
295
- }
296
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableComponent, decorators: [{
297
- type: Component,
298
- args: [{ standalone: true, selector: 'mng-table', imports: [
299
- ComponentDirective,
300
- I18nPropertyPipe,
301
- NgClass,
302
- NgStyle,
303
- NgTemplateOutlet,
304
- TableColumnValueComponent,
305
- ClassMapPipe,
306
- LocaleDefaultRowClassPipe,
307
- TableColumnFilterComponent,
308
- TableColumnFilterClassPipe,
309
- TableModule,
310
- MultiSelectModule,
311
- ButtonModule,
312
- TooltipModule,
313
- TranslateModule,
314
- TableFilterOverlayWithTagComponent,
315
- FormsModule,
316
- TemplateDirective
317
- ], providers: [TableMetadataService, TableDataService, TablePreferencesService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (data.isAllPaginationMetaInitialized()) {\n <p-table\n [value]=\"data.data()\"\n [dataKey]=\"metadata.descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"data.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"data.rows()\"\n [first]=\"data.offset()\"\n [totalRecords]=\"data.count()\"\n [rowsPerPageOptions]=\"metadata.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"data.sortMeta()\"\n [filters]=\"data.filterMeta()\"\n [globalFilterFields]=\"metadata.searchFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"metadata.descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"metadata.descriptor().hasResizableColumns\"\n [columnResizeMode]=\"metadata.descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n [expandedRowKeys]=\"expandedRowKeys()\"\n (onColResize)=\"prefs.onColumnResize($event)\"\n (onColReorder)=\"prefs.onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onFilter)=\"onTableFilter($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template pTemplate=\"caption\">\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || metadata.descriptor().search) {\n <mng-table-filter-overlay-with-tag\n [title]=\"metadata.descriptor().title\"\n [metadata]=\"overlayWithTagFilters()\"\n [genericFilterDescriptor]=\"metadata.genericFilterDescriptor()\"\n [model]=\"metadata.descriptor().model\"\n [enableSearch]=\"metadata.descriptor().search\"\n [search]=\"data.searchMeta()\"\n [searchLimitWordMax]=\"metadata.descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-table-filter-overlay-with-tag>\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (metadata.descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ metadata.descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"header\">\n @if (!metadata.descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"metadata.descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n <p-sortIcon [field]=\"col.sort?.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"column-custom-last text-right\">\n @if (areColumnsToggleable()) {\n <p-multiSelect\n #columnToggleMultiselect\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n dataKey=\"id\"\n tooltipPosition=\"left\"\n placeholder=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [filter]=\"false\"\n [options]=\"prefs.columnsWithPrefs()\"\n [ngModel]=\"visibleColumns()\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"prefs.onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allSelected\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.onToggleAll($event)\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allSelected\"\n [ngClass]=\"{\n 'p-highlight': anyColumnVisible()\n }\"\n (click)=\"prefs.onColumnToggleAll()\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': anyColumnVisible()}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"prefs.clearLayoutPreferences()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{\n (item.descriptor.title && !item.descriptor.titleUseModelBase\n ? item.descriptor.title\n : (item.descriptor.title ?? item.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n </p-multiSelect>\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"col.filter?.descriptor?.columnClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : (col.filter?.descriptor?.columnWidth ?? col.descriptor.width ?? null)\"\n [style.min-width.px]=\"col.width ? null : (col.filter?.descriptor?.columnMinWidth ?? col.descriptor.minWidth)\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n <mng-table-column-filter [metadata]=\"col.filter\"></mng-table-column-filter>\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th class=\"column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"\n metadata.descriptor().rowClassName | mngClassMap: metadata.descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: metadata.descriptor() : item\n \">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <td>\n @if (!metadata.descriptor().rowExpandableProperty || item[metadata.descriptor().rowExpandableProperty!]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n class=\"p-button-text p-button-rounded p-button-plain mng-table-row-expand-button\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"column-custom-last justify-content-end text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"rowexpansion\" let-item>\n @if (metadata.descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"metadata.descriptor().rowExpandableColSpan\">\n @if (metadata.descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"metadata.descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n @if (metadata.descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + metadata.descriptor().loadingIcon\"></i>\n }\n @if (metadata.descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': metadata.descriptor().loadingIcon}\">\n {{ metadata.descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"loadingbody\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template pTemplate=\"summary\">\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: data.data(), totalCount: data.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n" }]
318
- }], ctorParameters: () => [] });
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFJVCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixlQUFlLEVBQ2YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFVLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWxJLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsS0FBSyxFQUF3QyxXQUFXLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBQyxh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QUFFLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLG1CQUMzRCx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgU2lnbmFsLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFR5cGUsXG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgY29udGVudENoaWxkcmVuLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICB2aWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge291dHB1dEZyb21PYnNlcnZhYmxlLCB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkNhbmNlbCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFBhcmFtcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge01lc3NhZ2VTZXJ2aWNlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge1RhYmxlLCBUYWJsZUZpbHRlckV2ZW50LCBUYWJsZUxhenlMb2FkRXZlbnQsIFRhYmxlTW9kdWxlLCBUYWJsZVJvd1Jlb3JkZXJFdmVudH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQge1Rvb2x0aXBNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5pbXBvcnQge05FVkVSLCBTdWJqZWN0LCBmaWx0ZXIsIG9mLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIENsYXNzTWFwUGlwZSxcbiAgICBDb21wb25lbnREaXJlY3RpdmUsXG4gICAgRGF0YUxpc3RQYXJhbXMsXG4gICAgRGF0YUxpc3RSZXN1bHQsXG4gICAgSTE4blByb3BlcnR5UGlwZSxcbiAgICBMb2dnZXJTZXJ2aWNlLFxuICAgIFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIGJvb2xlYW5PclVuZGVmaW5lZEF0dHJpYnV0ZSxcbiAgICBkYXRhTGlzdFBhcmFtc1RvVXJsUXVlcnksXG4gICAgZWZmZWN0V2l0aERlcHMsXG4gICAgZmluZFRlbXBsYXRlQnlOYW1lLFxuICAgIGZyb21TdWJzY3JpYmVFcnJvcixcbiAgICBmcm9tVGFibGVMb2FkVG9EYXRhTGlzdFBhcmFtcyxcbiAgICBmcm9tVXJsUXVlcnlUb0RhdGFMaXN0UGFyYW1zLFxuICAgIGdldEVycm9yTG9nTGV2ZWwsXG4gICAgbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0c1xufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEaXNwbGF5VHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7XG4gICAgQ29sdW1uRGVzY3JpcHRvcixcbiAgICBJVGFibGVEYXRhUHJvdmlkZXIsXG4gICAgVGFibGVDZWxsQ2xpY2tFdmVudCxcbiAgICBUYWJsZURlc2NyaXB0b3JJbnN0LFxuICAgIFRhYmxlTG9hZEV2ZW50LFxuICAgIFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLFxuICAgIFRhYmxlUmVsb2FkRXZlbnQsXG4gICAgVGFibGVTaXplRW51bVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxlL2FwaSc7XG5cbmltcG9ydCB7dGFibGVOb3RpZmljYXRpb25FcnJvcn0gZnJvbSAnLi4vLi4vaGVscGVycy9ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtMb2NhbGVEZWZhdWx0Um93Q2xhc3NQaXBlfSBmcm9tICcuLi8uLi9waXBlcy9sb2NhbGUtZGVmYXVsdC1yb3ctY2xhc3MucGlwZSc7XG5pbXBvcnQge1RhYmxlQ29sdW1uRmlsdGVyQ2xhc3NQaXBlfSBmcm9tICcuLi8uLi9waXBlcy90YWJsZS1jb2x1bW4tZmlsdGVyLWNsYXNzLnBpcGUnO1xuaW1wb3J0IHtUYWJsZURhdGFTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHtUYWJsZU1ldGFkYXRhU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUtbWV0YWRhdGEuc2VydmljZSc7XG5pbXBvcnQge1RhYmxlUHJlZmVyZW5jZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7VGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnR9IGZyb20gJy4uL2NvbHVtbi1maWx0ZXIvY29sdW1uLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50fSBmcm9tICcuLi9jb2x1bW4tdmFsdWUvY29sdW1uLXZhbHVlLmNvbXBvbmVudCc7XG5pbXBvcnQge1RhYmxlRmlsdGVyT3ZlcmxheVdpdGhUYWdDb21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLXRhYmxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgICAgICBJMThuUHJvcGVydHlQaXBlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBOZ1N0eWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50LFxuICAgICAgICBDbGFzc01hcFBpcGUsXG4gICAgICAgIExvY2FsZURlZmF1bHRSb3dDbGFzc1BpcGUsXG4gICAgICAgIFRhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50LFxuICAgICAgICBUYWJsZUNvbHVtbkZpbHRlckNsYXNzUGlwZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIE11bHRpU2VsZWN0TW9kdWxlLFxuICAgICAgICBCdXR0b25Nb2R1bGUsXG4gICAgICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgVGFibGVGaWx0ZXJPdmVybGF5V2l0aFRhZ0NvbXBvbmVudCxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFRlbXBsYXRlRGlyZWN0aXZlXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtUYWJsZU1ldGFkYXRhU2VydmljZSwgVGFibGVEYXRhU2VydmljZSwgVGFibGVQcmVmZXJlbmNlc1NlcnZpY2VdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PEl0ZW0gPSBhbnksIFNlcnZpY2UgPSB1bmRlZmluZWQsIFNvcnRzID0gYW55LCBGaWx0ZXJzIGV4dGVuZHMga2V5b2YgYW55ID0gYW55PiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJLZXlQcmVwZW5kID0gJ2ZfJztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpLmNyZWF0ZShUYWJsZU1ldGFkYXRhU2VydmljZS5jbXBUeXBlTmFtZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGEgPSBpbmplY3QoVGFibGVNZXRhZGF0YVNlcnZpY2UpO1xuICAgIHB1YmxpYyByZWFkb25seSBwcmVmcyA9IGluamVjdChUYWJsZVByZWZlcmVuY2VzU2VydmljZSk7XG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGEgPSBpbmplY3QoVGFibGVEYXRhU2VydmljZTxJdGVtPik7XG5cbiAgICAvLyBkZXNjcmlwdG9yXG4gICAgcHVibGljIGRlc2NyaXB0b3JJbnB1dCA9IGlucHV0LnJlcXVpcmVkPFRhYmxlRGVzY3JpcHRvckluc3Q8SXRlbSwgU29ydHMsIEZpbHRlcnM+Pih7YWxpYXM6ICdkZXNjcmlwdG9yJ30pO1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgcHVibGljIGl0ZW1zID0gaW5wdXQ8SXRlbVtdPigpO1xuICAgIHB1YmxpYyByZXN1bHQgPSBpbnB1dDxEYXRhTGlzdFJlc3VsdDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgbG9hZGluZ0lucHV0ID0gaW5wdXQodW5kZWZpbmVkLCB7YWxpYXM6ICdsb2FkaW5nJywgdHJhbnNmb3JtOiBib29sZWFuT3JVbmRlZmluZWRBdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgZGF0YVByb3ZpZGVyID0gaW5wdXQ8SVRhYmxlRGF0YVByb3ZpZGVyPEl0ZW0sIFNlcnZpY2UsIFNvcnRzLCBGaWx0ZXJzPj4oKTtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgcHVibGljIHVzZVF1ZXJ5UGFyYW1zID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgY2VsbENsaWNrRW5hYmxlZCA9IGlucHV0KHRydWUsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgc2VsZWN0aW9uTW9kZSA9IGlucHV0PCdzaW5nbGUnIHwgJ211bHRpcGxlJz4oJ211bHRpcGxlJyk7XG4gICAgcHVibGljIHNlbGVjdGlvbkVuYWJsZWQgPSBpbnB1dChmYWxzZSwge3RyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyByb3dSZW9yZGVyRW5hYmxlZElucHV0ID0gaW5wdXQodHJ1ZSwge2FsaWFzOiAncm93UmVvcmRlckVuYWJsZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcbiAgICBwdWJsaWMgcm93UmVvcmRlckVuYWJsZWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLnJvd1Jlb3JkZXJFbmFibGVkSW5wdXQoKSAmJiB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5yb3dSZW9yZGVyYWJsZSk7XG4gICAgcHVibGljIGV4cGFuZGVkUm93S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMubWV0YWRhdGEuZGVzY3JpcHRvcigpO1xuICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0b3IuaXNSb3dFeHBhbmRlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuZGF0YSgpPy5yZWR1Y2UoKGFjYzoge1trZXk6IHN0cmluZ106IGJvb2xlYW59LCBpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbVtkZXNjcmlwdG9yLnRyYWNrUHJvcGVydHkhXV0gPSAhIWl0ZW1bZGVzY3JpcHRvci5pc1Jvd0V4cGFuZGVkIGFzIHN0cmluZ107XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzY3JpcHRvci5pc1Jvd0V4cGFuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRhdGEoKT8ucmVkdWNlKChhY2M6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSwgaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1bZGVzY3JpcHRvci50cmFja1Byb3BlcnR5IV1dID0gKGRlc2NyaXB0b3IuaXNSb3dFeHBhbmRlZCBhcyAoaXRlbTogSXRlbSkgPT4gYm9vbGVhbikoaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgfSk7XG5cbiAgICAvLyBzdHlsaW5nXG4gICAgcHVibGljIGNvbHVtbkxhc3RNaW5XaWR0aCA9IGlucHV0PG51bWJlcj4oKTtcbiAgICBwdWJsaWMgY29sdW1uc0NvbHNwYW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpc2libGVDb2x1bW5zKCkubGVuZ3RoICsgKHRoaXMuaGFzTGFzdENvbHVtbigpID8gMSA6IDApICsgKHRoaXMuc2VsZWN0aW9uRW5hYmxlZCgpID8gMSA6IDApICsgKHRoaXMucm93UmVvcmRlckVuYWJsZWQoKSA/IDEgOiAwKSk7XG4gICAgcHVibGljIGhhc1RpdGxlRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY2FwdGlvblRlbXBsYXRlKCkgfHwgdGhpcy5jYXB0aW9uQ29tcG9uZW50KCkgfHwgdGhpcy5tZXRhZGF0YS5kZXNjcmlwdG9yKCkudGl0bGUpO1xuICAgIHB1YmxpYyBpc0NhcHRpb25WaXNpYmxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oYXNUaXRsZURpc3BsYXkoKSB8fCB0aGlzLm92ZXJsYXlXaXRoVGFnRmlsdGVycygpLmxlbmd0aCA+IDAgfHwgdGhpcy5tZXRhZGF0YS5kZXNjcmlwdG9yKCkuc2VhcmNoKTtcblxuICAgIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgICBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudCA9IGlucHV0PFR5cGU8YW55Pj4oKTtcbiAgICBwdWJsaWMgY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCA9IGlucHV0PFR5cGU8YW55Pj4oKTtcbiAgICBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzSW5wdXQgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7YWxpYXM6ICdnbG9iYWxGaWx0ZXJGaWVsZHMnfSk7XG5cbiAgICAvLyBjZWxsIGNsaWNrXG4gICAgcHJpdmF0ZSBjZWxsQ2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VGFibGVDZWxsQ2xpY2tFdmVudDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgaXNDZWxsQ2xpY2tPYnNlcnZlZCA9IHNpZ25hbCh0aGlzLmNlbGxDbGlja1N1YmplY3Qub2JzZXJ2ZWQpO1xuICAgIHB1YmxpYyBpc0NlbGxDbGlja0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNlbGxDbGlja0VuYWJsZWQoKSAmJiB0aGlzLmlzQ2VsbENsaWNrT2JzZXJ2ZWQoKSk7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgcHVibGljIHRhYmxlTG9hZCA9IG91dHB1dDxUYWJsZUxvYWRFdmVudD4oKTtcbiAgICBwdWJsaWMgY2VsbENsaWNrID0gb3V0cHV0RnJvbU9ic2VydmFibGUodGhpcy5jZWxsQ2xpY2tTdWJqZWN0KTtcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PEFycmF5PEl0ZW0+PigpO1xuICAgIHB1YmxpYyBjYXB0aW9uQ29tcG9uZW50SW5zdGFuY2UgPSBvdXRwdXQ8YW55PigpO1xuICAgIHB1YmxpYyBjb2x1bW5DdXN0b21MYXN0Q29tcG9uZW50SW5zdGFuY2UgPSBvdXRwdXQ8YW55PigpO1xuICAgIHB1YmxpYyByb3dSZW9yZGVyID0gb3V0cHV0PFRhYmxlUm93UmVvcmRlckV2ZW50PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgcHVibGljIHRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZURpcmVjdGl2ZSk7XG4gICAgcHVibGljIGNvbXBvbmVudHMgPSB2aWV3Q2hpbGRyZW4oQ29tcG9uZW50RGlyZWN0aXZlPGFueT4pO1xuICAgIHB1YmxpYyBwcmltZVRhYmxlID0gdmlld0NoaWxkKFRhYmxlKTtcblxuICAgIC8vIHRlbXBsYXRlc1xuICAgIHB1YmxpYyBjYXB0aW9uVGVtcGxhdGU6IFNpZ25hbDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiBmaW5kVGVtcGxhdGVCeU5hbWUoWy4uLnRoaXMudGVtcGxhdGVzKCldLCAnY2FwdGlvbicpKTtcbiAgICBwdWJsaWMgY29sdW1uQ3VzdG9tTGFzdFRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ2NvbHVtbkN1c3RvbUxhc3QnKSk7XG4gICAgcHVibGljIGZvb3RlclRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ2Zvb3RlcicpKTtcbiAgICBwdWJsaWMgcm93RXhwYW5kVGVtcGxhdGU6IFNpZ25hbDxUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiBmaW5kVGVtcGxhdGVCeU5hbWUoWy4uLnRoaXMudGVtcGxhdGVzKCldLCAncm93RXhwYW5kQ29udGVudCcpKTtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXIgYW5kIGl0ZW1zXG4gICAgcHVibGljIGlzTGF6eSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YVByb3ZpZGVyKCk/LmlzTGF6eSA9PT0gdHJ1ZSk7XG4gICAgcHVibGljIGlzUGFnaW5hdGlvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YS5wYWdpbmF0aW9uTW9kZSgpID09PSBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bS5QYWdpbmF0aW9uKTtcbiAgICBwdWJsaWMgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvLyB2aXN1YWxcbiAgICBwdWJsaWMgY2xhc3NOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGhpcy5tZXRhZGF0YS5kZXNjcmlwdG9yKCkuY2xhc3NOYW1lID8/ICcnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEuZGVzY3JpcHRvcigpLnNpemUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5TbWFsbDpcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1zbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRhYmxlU2l6ZUVudW0uTGFyZ2U6XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9ICcgcC1kYXRhdGFibGUtbGcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5oYXNHcmlkbGluZXMpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLWdyaWRsaW5lcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzQ2FwdGlvblZpc2libGUoKSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lICs9ICcgZGF0YXRhYmxlLW5vLWhlYWRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgICB9KTtcblxuICAgIC8vIGNvbHVtbnNcbiAgICBwdWJsaWMgdmlzaWJsZUNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnByZWZzLmNvbHVtbnNXaXRoUHJlZnMoKS5maWx0ZXIoY29sID0+IGNvbC5pc1Zpc2libGUpKTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcmVmcy5jb2x1bW5zV2l0aFByZWZzKCkuc29tZShjb2wgPT4gY29sLmRlc2NyaXB0b3IuaXNSZW9yZGVyYWJsZSkpO1xuICAgIHB1YmxpYyBhcmVDb2x1bW5zVG9nZ2xlYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucHJlZnMuY29sdW1uc1dpdGhQcmVmcygpLnNvbWUoY29sID0+IGNvbC5kZXNjcmlwdG9yLmlzVG9nZ2xlYWJsZSkpO1xuXG4gICAgLy8gZmlsdGVyLCBzb3J0XG4gICAgcHVibGljIGhhc0NvbHVtbkZpbHRlcnMgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICh0aGlzLm1ldGFkYXRhLmRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLk92ZXJsYXlXaXRoVGFnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YS5maWx0ZXJEZXNjcmlwdG9ycygpLnNvbWUoZCA9PiBkLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKSkgfHxcbiAgICAgICAgICAgICh0aGlzLm1ldGFkYXRhLmRlZmF1bHRGaWx0ZXJEaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLkNvbHVtbiAmJiB0aGlzLm1ldGFkYXRhLmZpbHRlckRlc2NyaXB0b3JzKCkuc29tZShkID0+IGQuZGlzcGxheVR5cGUgPT0gbnVsbCkpXG4gICAgKTtcbiAgICBwdWJsaWMgb3ZlcmxheVdpdGhUYWdGaWx0ZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAvLyBzdGF0aWNhbGx5IGRlZmluZWQgZmlsdGVycyBBTkQgZ2VuZXJpYyBmaWx0ZXJzXG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLm1ldGFkYXRhXG4gICAgICAgICAgICAuZmlsdGVycygpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGQgPT5cbiAgICAgICAgICAgICAgICAgICAgKGQuZGVzY3JpcHRvci5kaXNwbGF5VHlwZSA9PSBudWxsICYmIHRoaXMubWV0YWRhdGEuZGVmYXVsdEZpbHRlckRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uT3ZlcmxheVdpdGhUYWcpIHx8XG4gICAgICAgICAgICAgICAgICAgIGQuZGVzY3JpcHRvci5kaXNwbGF5VHlwZSA9PT0gRmlsdGVyRGlzcGxheVR5cGVFbnVtLk92ZXJsYXlXaXRoVGFnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXJzLmNvbmNhdCh0aGlzLm1ldGFkYXRhLmdlbmVyaWNGaWx0ZXJzKCkpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIGFueUNvbHVtblZpc2libGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpc2libGVDb2x1bW5zKCkubGVuZ3RoID4gMCk7XG4gICAgcHVibGljIGhhc0N1c3RvbUxhc3RDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnQoKSB8fCB0aGlzLmNvbHVtbkN1c3RvbUxhc3RUZW1wbGF0ZSgpKTtcbiAgICBwdWJsaWMgaGFzTGFzdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGFzQ3VzdG9tTGFzdENvbHVtbigpIHx8IHRoaXMuYXJlQ29sdW1uc1RvZ2dsZWFibGUoKSB8fCB0aGlzLmFyZUNvbHVtbnNSZW9yZGVyYWJsZSgpKTtcblxuICAgIC8vIHRhYmxlIGxvYWQgcGFyYW1zXG4gICAgcHJpdmF0ZSBsYXN0TGF6eUxvYWRFdmVudD86IFRhYmxlTGF6eUxvYWRFdmVudDtcbiAgICBwcml2YXRlIGxhc3RQYXJhbXNXaXRoRGVmYXVsdHM/OiBEYXRhTGlzdFBhcmFtcztcblxuICAgIC8vIG90aGVyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uT3V0T2ZUYWJsZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICBwcml2YXRlIG5hdmlnYXRpb25JblRhYmxlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgLy8gc3Vic2NyaXB0aW9ucyBhbmQgcmVmc1xuICAgICNwcmV2aW91c0RhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxJdGVtLCBTZXJ2aWNlLCBTb3J0cywgRmlsdGVycz47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICNkYXRhUHJvdmlkZXJFYWdlckZpcnN0TG9hZCA9IGVmZmVjdFdpdGhEZXBzKFt0aGlzLmRhdGFQcm92aWRlcl0sIChbZGF0YVByb3ZpZGVyXSkgPT4ge1xuICAgICAgICBpZiAoZGF0YVByb3ZpZGVyPy5pc0xhenkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVdpdGhEYXRhUHJvdmlkZXIodGhpcy5tZXRhZGF0YS5kZWZhdWx0UGFyYW1zKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI3ByZXZpb3VzRGF0YVByb3ZpZGVyICYmIGRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3ByZXZpb3VzRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAjZGF0YVByb3ZpZGVyUmVsb2FkU3Vic2NyaXB0aW9uID0gdG9PYnNlcnZhYmxlKHRoaXMuZGF0YVByb3ZpZGVyKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcChkcCA9PiBkcD8udGFibGVSZWxvYWQkID8/IG9mKHt9KSksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAjcm91dGVRdWVyeVBhcmFtc1N1YnNjcmlwdGlvbiA9IHRvT2JzZXJ2YWJsZSh0aGlzLnVzZVF1ZXJ5UGFyYW1zKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCh1c2VRcCA9PiAodXNlUXAgPyB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zIDogTkVWRVIpKSxcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShxcCA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRUYWJsZUZyb21Sb3V0ZVVwZGF0ZShxcCk7XG4gICAgICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAjcm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uID0gdG9PYnNlcnZhYmxlKHRoaXMudXNlUXVlcnlQYXJhbXMpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKHVzZVFwID0+ICh1c2VRcCA/IHRoaXMucm91dGVyLmV2ZW50cyA6IE5FVkVSKSksXG4gICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgZSA9PlxuICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCAmJiBlLnVybC5zcGxpdCgnPycpWzBdLnNwbGl0KCcjJylbMF0gIT09IHRoaXMucm91dGVyLnVybC5zcGxpdCgnPycpWzBdLnNwbGl0KCcjJylbMF0pIHx8XG4gICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8XG4gICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsIHx8XG4gICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3JcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25PdXRPZlRhYmxlSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICAgIH0pO1xuICAgICNhZnRlck5leHRSZW5kZXJSZWYgPSBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzQ2VsbENsaWNrT2JzZXJ2ZWQuc2V0KHRoaXMuY2VsbENsaWNrU3ViamVjdC5vYnNlcnZlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YS5zZXRTaWduYWxTb3VyY2VzKHRoaXMuZGVzY3JpcHRvcklucHV0LCB0aGlzLmdsb2JhbEZpbHRlckZpZWxkc0lucHV0KTtcbiAgICAgICAgdGhpcy5kYXRhLnNldERhdGFTb3VyY2VzKHRoaXMuaXRlbXMsIHRoaXMucmVzdWx0LCB0aGlzLmRhdGFQcm92aWRlciwgdGhpcy5sb2FkaW5nSW5wdXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxvYWQoZW1pdEV2ZW50PzogVGFibGVSZWxvYWRFdmVudDxTb3J0cywgRmlsdGVycz4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gZW1pdEV2ZW50Py5wYXJhbXMgPyAoZW1pdEV2ZW50Py5wYXJhbXMgYXMgRGF0YUxpc3RQYXJhbXMpIDogZW1pdEV2ZW50Py5yZXNldFBhcmFtcyA/IHVuZGVmaW5lZCA6IHRoaXMubGFzdFBhcmFtc1dpdGhEZWZhdWx0cztcbiAgICAgICAgY29uc3QgcmVsb2FkUGFyYW1zID0gbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0cyhwYXJhbXMgPz8ge30sIHRoaXMubWV0YWRhdGEuZGVmYXVsdFBhcmFtcygpKTtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKHJlbG9hZFBhcmFtcywgZW1pdEV2ZW50Py5lbWl0RXZlbnQgPz8gZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlTGF6eUxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xuICAgICAgICB0aGlzLmxhc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gZnJvbVRhYmxlTG9hZFRvRGF0YUxpc3RQYXJhbXMoZXZlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLnVzZVF1ZXJ5UGFyYW1zKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uT3V0T2ZUYWJsZUluUHJvZ3Jlc3MgJiYgIXRoaXMubmF2aWdhdGlvbkluVGFibGVJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaGVjayBpcyBuZWNlc3Nhcnk6IGZyb20gc29tZSByZWFzb24sIHByaW1lTkcgY29tbWl0cyBvbmUgbGFzdCBsYXp5IGxvYWQgZXZlbnQgd2hlbmV2ZXIgYW55IGFuZ3VsYXIgcm91dGVyIG5hdmlnYXRpb24gb2NjdXJzXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSW5UYWJsZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IGRhdGFMaXN0UGFyYW1zVG9VcmxRdWVyeShwYXJhbXMsIHRoaXMubWV0YWRhdGEuZGVmYXVsdFBhcmFtcygpLCB7cHJlcGVuZEZpbHRlck5hbWU6IHRoaXMuZmlsdGVyS2V5UHJlcGVuZH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcmFtc1dpdGhQYXJhbXNUb1JlbW92ZSA9IHsuLi5uZXdQYXJhbXN9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRRcCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRRcCkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50UXApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGsgPT4gKGsuc3RhcnRzV2l0aCh0aGlzLmZpbHRlcktleVByZXBlbmQpIHx8IFsnb2Zmc2V0JywgJ2xpbWl0JywgJ3NvcnQnLCAncSddLmluZGV4T2YoaykgPj0gMCkgJiYgbmV3UGFyYW1zW2tdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChrID0+IChuZXdQYXJhbXNXaXRoUGFyYW1zVG9SZW1vdmVba10gPSBudWxsKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJcbiAgICAgICAgICAgICAgICAgICAgLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBuZXdQYXJhbXNXaXRoUGFyYW1zVG9SZW1vdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbkluVGFibGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zV2l0aERlZmF1bHRzID0gbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0cyhwYXJhbXMsIHRoaXMubWV0YWRhdGEuZGVmYXVsdFBhcmFtcygpKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRQYXJhbXMocGFyYW1zV2l0aERlZmF1bHRzKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVGaWx0ZXIoZXZlbnQ6IFRhYmxlRmlsdGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudXNlUXVlcnlQYXJhbXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGZyb21UYWJsZUxvYWRUb0RhdGFMaXN0UGFyYW1zKHtmaWx0ZXJzOiBldmVudC5maWx0ZXJzfSk7XG4gICAgICAgIGNvbnN0IHBhcmFtc1dpdGhEZWZhdWx0cyA9IG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHMocGFyYW1zLCB0aGlzLm1ldGFkYXRhLmRlZmF1bHRQYXJhbXMoKSk7XG5cbiAgICAgICAgLy8gaWYgdGFibGUgZG9lc24ndCB1c2UgbGF6eSBsb2FkaW5nLCBmaWx0ZXIgcGFyYW1zIG5lZWQgdG8gYmUgc2V0IGhlcmVcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgb25UYWJsZUxhenlMb2FkIGV2ZW50IGlzIG5vdCBlbWl0dGVkXG4gICAgICAgIGlmICghdGhpcy5pc0xhenkoKSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldFBhcmFtcyhwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2VsbENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgSXRlbT4sIGl0ZW06IEl0ZW0sIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NlbGxDbGlja0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlRXZlbnQ6IFRhYmxlQ2VsbENsaWNrRXZlbnQ8SXRlbT4gPSB7XG4gICAgICAgICAgICBjb2x1bW46IGNvbCxcbiAgICAgICAgICAgIHJvd0l0ZW06IGl0ZW0sXG4gICAgICAgICAgICByb3dJbmRleDogaWR4LFxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2VsbENsaWNrU3ViamVjdC5uZXh0KHRhYmxlRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXJyYXk8SXRlbT4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93UmVvcmRlcihldmVudDogVGFibGVSb3dSZW9yZGVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy5yb3dSZW9yZGVyLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihwYXJhbXNXaXRoRGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzRmV0Y2hlZCA9IHRoaXMuZGF0YS5mZXRjaFdpdGhEYXRhUHJvdmlkZXIocGFyYW1zV2l0aERlZmF1bHRzLCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0YWJsZU5vdGlmaWNhdGlvbkVycm9yKHRoaXMudHJhbnNsYXRlLCB0aGlzLm1lc3NhZ2VTZXJ2aWNlLCB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0b3IoKSwgZXJyb3IpO1xuICAgICAgICAgICAgY29uc3QgY29tbW9uc0Vycm9yID0gZnJvbVN1YnNjcmliZUVycm9yKGVycm9yLCAnVGFibGVDb21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1dpdGhEZWZhdWx0c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coY29tbW9uc0Vycm9yLCBnZXRFcnJvckxvZ0xldmVsKGNvbW1vbnNFcnJvcikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGZXRjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQYXJhbXNXaXRoRGVmYXVsdHMgPSBwYXJhbXNXaXRoRGVmYXVsdHM7XG4gICAgICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVFdmVudDogVGFibGVMb2FkRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRoaXMubGFzdExhenlMb2FkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zV2l0aERlZmF1bHRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlTG9hZC5lbWl0KHRhYmxlRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVGFibGVGcm9tUm91dGVVcGRhdGUodXJsUGFyYW1zOiBQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zV2l0aERlZmF1bHRzID0gbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0cyhcbiAgICAgICAgICAgIGZyb21VcmxRdWVyeVRvRGF0YUxpc3RQYXJhbXModXJsUGFyYW1zLCB7XG4gICAgICAgICAgICAgICAgcHJlcGVuZEZpbHRlck5hbWU6IHRoaXMuZmlsdGVyS2V5UHJlcGVuZCxcbiAgICAgICAgICAgICAgICBzZWFyY2hBc0dsb2JhbDogdHJ1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLm1ldGFkYXRhLmRlZmF1bHRQYXJhbXMoKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEuc2V0UGFyYW1zKHBhcmFtc1dpdGhEZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihwYXJhbXNXaXRoRGVmYXVsdHMpO1xuICAgIH1cbn1cbiIsIjxkaXY+XG4gICAgPCEtLSBNVVNUIE5PVCB1c2Ugb2JzZXJ2YWJsZSBmb3IgdmFsdWUgd2hlbiB1c2luZyB2aXJ0dWFsIHNjcm9sbCAtIGRvZXMgbm90IHdvcmsgZm9yIHNvbWUgcmVhc29uIC0tPlxuICAgIEBpZiAoZGF0YS5pc0FsbFBhZ2luYXRpb25NZXRhSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgICA8cC10YWJsZVxuICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGEuZGF0YSgpXCJcbiAgICAgICAgICAgIFtkYXRhS2V5XT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS50cmFja1Byb3BlcnR5XCJcbiAgICAgICAgICAgIFtsYXp5XT1cImlzTGF6eSgpXCJcbiAgICAgICAgICAgIFtsb2FkaW5nXT1cImRhdGEubG9hZGluZygpXCJcbiAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwiaXNQYWdpbmF0aW9uKClcIlxuICAgICAgICAgICAgW3Jvd3NdPVwiZGF0YS5yb3dzKClcIlxuICAgICAgICAgICAgW2ZpcnN0XT1cImRhdGEub2Zmc2V0KClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJkYXRhLmNvdW50KClcIlxuICAgICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJtZXRhZGF0YS5yb3dzUGVyUGFnZU9wdGlvbnMoKVwiXG4gICAgICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxuICAgICAgICAgICAgW2N1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGVdPVwiJ21uZ1RhYmxlLnBhZ2luYXRpb25Nc2cnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFttdWx0aVNvcnRNZXRhXT1cImRhdGEuc29ydE1ldGEoKVwiXG4gICAgICAgICAgICBbZmlsdGVyc109XCJkYXRhLmZpbHRlck1ldGEoKVwiXG4gICAgICAgICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cIm1ldGFkYXRhLnNlYXJjaEZpZWxkcygpXCJcbiAgICAgICAgICAgIHNvcnRNb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJbXVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwic2VsZWN0aW9uRW5hYmxlZCgpID8gc2VsZWN0aW9uTW9kZSgpIDogbnVsbFwiXG4gICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICAgICAgW3Jvd0hvdmVyXT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5oYXNIb3ZlclwiXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCJjbGFzc05hbWUoKVwiXG4gICAgICAgICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJtZXRhZGF0YS5kZXNjcmlwdG9yKCkuaGFzUmVzaXphYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICBbY29sdW1uUmVzaXplTW9kZV09XCJtZXRhZGF0YS5kZXNjcmlwdG9yKCkuY29sdW1uUmVzaXplTW9kZSA/PyAnZXhwYW5kJ1wiXG4gICAgICAgICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cImFyZUNvbHVtbnNSZW9yZGVyYWJsZSgpXCJcbiAgICAgICAgICAgIHBhZ2luYXRvckRyb3Bkb3duQXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5zKClcIlxuICAgICAgICAgICAgW2V4cGFuZGVkUm93S2V5c109XCJleHBhbmRlZFJvd0tleXMoKVwiXG4gICAgICAgICAgICAob25Db2xSZXNpemUpPVwicHJlZnMub25Db2x1bW5SZXNpemUoJGV2ZW50KVwiXG4gICAgICAgICAgICAob25Db2xSZW9yZGVyKT1cInByZWZzLm9uQ29sdW1uUmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkxhenlMb2FkKT1cIm9uVGFibGVMYXp5TG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkZpbHRlcik9XCJvblRhYmxlRmlsdGVyKCRldmVudClcIlxuICAgICAgICAgICAgKG9uUm93UmVvcmRlcik9XCJvblJvd1Jlb3JkZXIoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICBAaWYgKGlzQ2FwdGlvblZpc2libGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG92ZXJsYXlXaXRoVGFnRmlsdGVycygpLmxlbmd0aCA+IDAgfHwgbWV0YWRhdGEuZGVzY3JpcHRvcigpLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtZmlsdGVyLW92ZXJsYXktd2l0aC10YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZXRhZGF0YV09XCJvdmVybGF5V2l0aFRhZ0ZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZW5lcmljRmlsdGVyRGVzY3JpcHRvcl09XCJtZXRhZGF0YS5nZW5lcmljRmlsdGVyRGVzY3JpcHRvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5tb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLnNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwiZGF0YS5zZWFyY2hNZXRhKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoTGltaXRXb3JkTWF4XT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5zZWFyY2hMaW1pdE1heFdvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUNhc2VTZW5zaXRpdmVdPVwiaXNMYXp5KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNUaXRsZURpc3BsYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1uZ1RlbXBsYXRlPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FwdGlvblRlbXBsYXRlT3JDb21wb25lbnRPclRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctdGFibGUtZmlsdGVyLW92ZXJsYXktd2l0aC10YWc+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FwdGlvblRlbXBsYXRlT3JDb21wb25lbnRPclRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcHRpb25UZW1wbGF0ZU9yQ29tcG9uZW50T3JUaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcHRpb25UZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXB0aW9uVGVtcGxhdGUoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNhcHRpb25Db21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFttbmdDb21wb25lbnRdPVwiY2FwdGlvbkNvbXBvbmVudCgpXCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJjYXB0aW9uQ29tcG9uZW50SW5zdGFuY2UuZW1pdCgkZXZlbnQpXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAobWV0YWRhdGEuZGVzY3JpcHRvcigpLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInAtMCBtLTBcIj57eyBtZXRhZGF0YS5kZXNjcmlwdG9yKCkudGl0bGUhIHwgdHJhbnNsYXRlIH19PC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIEBpZiAoIW1ldGFkYXRhLmRlc2NyaXB0b3IoKS5oaWRlSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm1uZy10YWJsZS1oZWFkZXJcIiBbY2xhc3NdPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLmhlYWRlckNsYXNzTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUoKSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLnNlbGVjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIG5lZWQgdGhlIGxpbmUgYmVsb3csIGJlY2F1c2Ugb3RoZXJ3aXNlIHAtdGFibGVSYWRpb0J1dHRvbiBzaGlmdHMgdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMgaW4gdGFibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJtZXRhZGF0YS5kZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwidHJ1ZVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvd1Jlb3JkZXJFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHZpc2libGVDb2x1bW5zKCk7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc29ydGFibGVDb2x1bW5USFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbC5kZXNjcmlwdG9yLnRpdGxlICYmICFjb2wuZGVzY3JpcHRvci50aXRsZVVzZU1vZGVsQmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbC5kZXNjcmlwdG9yLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBtZXRhZGF0YS5kZXNjcmlwdG9yKCkubW9kZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuc29ydD8ucHJvcGVydHlcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmRlc2NyaXB0b3IudGl0bGUgJiYgIWNvbC5kZXNjcmlwdG9yLnRpdGxlVXNlTW9kZWxCYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2wuZGVzY3JpcHRvci50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBtZXRhZGF0YS5kZXNjcmlwdG9yKCkubW9kZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzaXphYmxlQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5zb3J0Py5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiIWNvbC5zb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPyBjb2wud2lkdGggKyAncHgnIDogY29sLmRlc2NyaXB0b3Iud2lkdGggKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wud2lkdGggPyBudWxsIDogY29sLmRlc2NyaXB0b3IubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5kZXNjcmlwdG9yLmhlYWRlckNsYXNzTmFtZSB8IG1uZ1RhYmxlQ29sdW1uRmlsdGVyQ2xhc3M6IGNvbC5maWx0ZXI/LmRlc2NyaXB0b3IgOiBoYXNDb2x1bW5GaWx0ZXJzKCkgJiYgIWNvbC53aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbC5zb3J0ID8gc29ydGFibGVDb2x1bW5USFRlbXBsYXRlIDogbm9uU29ydGFibGVDb2x1bW5USFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlc2l6YWJsZUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvbC5kZXNjcmlwdG9yLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnNvcnQ/LnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLnNvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lIHwgbW5nVGFibGVDb2x1bW5GaWx0ZXJDbGFzczogY29sLmZpbHRlcj8uZGVzY3JpcHRvciA6IGhhc0NvbHVtbkZpbHRlcnMoKSAmJiAhY29sLndpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLnNvcnQgPyBzb3J0YWJsZUNvbHVtblRIVGVtcGxhdGUgOiBub25Tb3J0YWJsZUNvbHVtblRIVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc0xhc3RDb2x1bW4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkxhc3RNaW5XaWR0aCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5hY3Rpb25Db2x1bW5Gcm96ZW4gPz8gYXJlQ29sdW1uc1RvZ2dsZWFibGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduRnJvemVuPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1jdXN0b20tbGFzdCB0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoYXJlQ29sdW1uc1RvZ2dsZWFibGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBtbmctdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5PVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkljb249XCJwaSBwaS1zbGlkZXJzLWhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInByZWZzLmNvbHVtbnNXaXRoUHJlZnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmlzaWJsZUNvbHVtbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidtbmdUYWJsZS5hZGp1c3RUYWJsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cInByZWZzLm9uQ29sdW1uVG9nZ2xlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNoZWNrYm94IHAtY29tcG9uZW50IG1sLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWhpZGRlbi1hY2Nlc3NpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vbkhlYWRlckNoZWNrYm94Rm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uSGVhZGVyQ2hlY2tib3hCbHVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vblRvZ2dsZUFsbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1jaGVja2JveC1ib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwLWhpZ2hsaWdodCc6IGFueUNvbHVtblZpc2libGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmVmcy5vbkNvbHVtblRvZ2dsZUFsbCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNoZWNrYm94LWljb25cIiBbbmdDbGFzc109XCJ7J3BpIHBpLWNoZWNrJzogYW55Q29sdW1uVmlzaWJsZSgpfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktcmVwbGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidtbmdUYWJsZS5yZXNldExheW91dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJlZnMuY2xlYXJMYXlvdXRQcmVmZXJlbmNlcygpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5kZXNjcmlwdG9yLnRpdGxlICYmICFpdGVtLmRlc2NyaXB0b3IudGl0bGVVc2VNb2RlbEJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0uZGVzY3JpcHRvci50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGl0ZW0uZGVzY3JpcHRvci50aXRsZSA/PyBpdGVtLmRlc2NyaXB0b3IucHJvcGVydHkgfCBtbmdJMThuUHJvcGVydHk6IG1ldGFkYXRhLmRlc2NyaXB0b3IoKS5tb2RlbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChoYXNDb2x1bW5GaWx0ZXJzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibW5nLWNvbHVtbi1maWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIG5lZWQgdGhlIGxpbmUgYmVsb3csIGJlY2F1c2Ugb3RoZXJ3aXNlIHAtdGFibGVSYWRpb0J1dHRvbiBzaGlmdHMgdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMgaW4gdGFibGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJtZXRhZGF0YS5kZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3dSZW9yZGVyRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHZpc2libGVDb2x1bW5zKCk7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLmZpbHRlcj8uZGVzY3JpcHRvcj8uY29sdW1uQ2xhc3NOYW1lIHwgbW5nVGFibGVDb2x1bW5GaWx0ZXJDbGFzczogY29sLmZpbHRlcj8uZGVzY3JpcHRvciA6IGhhc0NvbHVtbkZpbHRlcnMoKSAmJiAhY29sLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNvbC53aWR0aCA/IG51bGwgOiAoY29sLmZpbHRlcj8uZGVzY3JpcHRvcj8uY29sdW1uV2lkdGggPz8gY29sLmRlc2NyaXB0b3Iud2lkdGggPz8gbnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiAoY29sLmZpbHRlcj8uZGVzY3JpcHRvcj8uY29sdW1uTWluV2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWluV2lkdGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLXRhYmxlLWNvbHVtbi1maWx0ZXIgW21ldGFkYXRhXT1cImNvbC5maWx0ZXJcIj48L21uZy10YWJsZS1jb2x1bW4tZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaGFzTGFzdENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY29sdW1uLWN1c3RvbS1sYXN0XCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5MYXN0TWluV2lkdGgoKVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgW3BSZW9yZGVyYWJsZVJvd109XCJpZHhcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlc2NyaXB0b3IoKS5yb3dDbGFzc05hbWUgfCBtbmdDbGFzc01hcDogbWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0NsYXNzTmFtZU1hcEZuIDogaXRlbSB8IG1uZ0xvY2FsZURlZmF1bHRSb3dDbGFzczogbWV0YWRhdGEuZGVzY3JpcHRvcigpIDogaXRlbVxuICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3Rpb25FbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAzNnB4XCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cIm1ldGFkYXRhLmRlc2NyaXB0b3IoKS5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJtZXRhZGF0YS5kZXNjcmlwdG9yKCkuc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVSYWRpb0J1dHRvbiBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZVJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YS5kZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIW1ldGFkYXRhLmRlc2NyaXB0b3IoKS5yb3dFeHBhbmRhYmxlUHJvcGVydHkgfHwgaXRlbVttZXRhZGF0YS5kZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZVByb3BlcnR5IV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFJvd1RvZ2dsZXJdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1wbGFpbiBtbmctdGFibGUtcm93LWV4cGFuZC1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiZXhwYW5kZWQgPyAncGkgcGktY2hldnJvbi1kb3duJyA6ICdwaSBwaS1jaGV2cm9uLXJpZ2h0J1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChyb3dSZW9yZGVyRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwaSBwaS1iYXJzXCIgcFJlb3JkZXJhYmxlUm93SGFuZGxlPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHZpc2libGVDb2x1bW5zKCk7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudCwgY29sLmRlc2NyaXB0b3IsIGl0ZW0sIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuY2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1uZ0NsYXNzTWFwOiBjb2wuZGVzY3JpcHRvci5jbGFzc05hbWVNYXBGbiA6IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW5nVGFibGVDb2x1bW5GaWx0ZXJDbGFzczogY29sLmZpbHRlcj8uZGVzY3JpcHRvciA6IGhhc0NvbHVtbkZpbHRlcnMoKSAmJiAhY29sLndpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzQ2VsbENsaWNrRW5hYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbC53aWR0aCA/IG51bGwgOiBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmRlc2NyaXB0b3IudGl0bGUgJiYgIWNvbC5kZXNjcmlwdG9yLnRpdGxlVXNlTW9kZWxCYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2wuZGVzY3JpcHRvci50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgbW5nSTE4blByb3BlcnR5OiBtZXRhZGF0YS5kZXNjcmlwdG9yKCkubW9kZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbC5kZXNjcmlwdG9yXCIgW2l0ZW1dPVwiaXRlbVwiPjwvbW5nLXRhYmxlLWNvbHVtbi12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNMYXN0Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sdW1uLWN1c3RvbS1sYXN0IGp1c3RpZnktY29udGVudC1lbmQgdGV4dC1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5MYXN0TWluV2lkdGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2x1bW5DdXN0b21MYXN0VGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQ3VzdG9tTGFzdFRlbXBsYXRlKCk7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtLCByb3dJbmRleDogaWR4fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbkN1c3RvbUxhc3RDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFttbmdDb21wb25lbnRdPVwiY29sdW1uQ3VzdG9tTGFzdENvbXBvbmVudCgpXCIgKGluc3RhbmNlQ3JlYXRlZCk9XCJjb2x1bW5DdXN0b21MYXN0Q29tcG9uZW50SW5zdGFuY2UuZW1pdCgkZXZlbnQpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInJvd2V4cGFuc2lvblwiIGxldC1pdGVtPlxuICAgICAgICAgICAgICAgIEBpZiAobWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2NvbFNwYW5dPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGVDb2xTcGFuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YS5kZXNjcmlwdG9yKCkucm93RXhwYW5kYWJsZUNvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFttbmdDb21wb25lbnRdPVwibWV0YWRhdGEuZGVzY3JpcHRvcigpLnJvd0V4cGFuZGFibGVDb21wb25lbnRUeXBlXCIgW2lucHV0c109XCJ7aXRlbX1cIj4gPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dFeHBhbmRUZW1wbGF0ZSgpOyBjb250ZXh0OiB7cm93SXRlbTogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2ljb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YS5kZXNjcmlwdG9yKCkubG9hZGluZ0ljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIndGV4dC13aGl0ZSB0ZXh0LTR4bCBwaS1zcGluICcgKyBtZXRhZGF0YS5kZXNjcmlwdG9yKCkubG9hZGluZ0ljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZXRhZGF0YS5kZXNjcmlwdG9yKCkubG9hZGluZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHRleHQtd2hpdGUgdGV4dC1sZyBmb250LXNlbWlib2xkXCIgW25nQ2xhc3NdPVwieydtdC0zJzogbWV0YWRhdGEuZGVzY3JpcHRvcigpLmxvYWRpbmdJY29ufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1ldGFkYXRhLmRlc2NyaXB0b3IoKS5sb2FkaW5nVGV4dCA/PyAnJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2JvZHlcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNDb2xzcGFuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInt3aWR0aDogJzEwMCUnfVwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnNDb2xzcGFuKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdtbmdUYWJsZS5ub0l0ZW1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgQGlmIChmb290ZXJUZW1wbGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclRlbXBsYXRlKCk7IGNvbnRleHQ6IHtkYXRhOiBkYXRhLmRhdGEoKSwgdG90YWxDb3VudDogZGF0YS5jb3VudCgpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvcC10YWJsZT5cbiAgICB9XG48L2Rpdj5cbiJdfQ==