@mediusinc/mng-commons 4.1.0 → 5.0.0-rc.0-c31d5206

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 (251) hide show
  1. package/assets/i18n/en.json +13 -66
  2. package/assets/i18n/sl.json +12 -67
  3. package/data-api/README.md +3 -0
  4. package/data-api/class-dto/README.md +3 -0
  5. package/data-api/class-dto/helpers/tableview-crud-create.d.ts +40 -0
  6. package/data-api/class-dto/index.d.ts +7 -0
  7. package/data-api/class-dto/models/query-result.model.d.ts +13 -0
  8. package/data-api/class-dto/obsolete/README.md +3 -0
  9. package/data-api/class-dto/obsolete/helpers/query-param-convert.d.ts +23 -0
  10. package/data-api/class-dto/obsolete/helpers/tableview-crud-create.d.ts +22 -0
  11. package/data-api/class-dto/obsolete/index.d.ts +14 -0
  12. package/data-api/class-dto/obsolete/models/builders/query-param.builder.d.ts +36 -0
  13. package/{lib/api → data-api/class-dto/obsolete}/models/filter-param.model.d.ts +1 -1
  14. package/{lib/api → data-api/class-dto/obsolete}/models/query-param.model.d.ts +1 -1
  15. package/{lib/api → data-api/class-dto/obsolete}/models/query-result.model.d.ts +1 -1
  16. package/data-api/class-dto/obsolete/provide.d.ts +9 -0
  17. package/data-api/class-dto/obsolete/services/api.abstract.service.d.ts +36 -0
  18. package/{lib/api → data-api/class-dto/obsolete}/services/crud-api.abstract.service.d.ts +20 -5
  19. package/data-api/class-dto/obsolete/services/get-all-api.abstract.service.d.ts +30 -0
  20. package/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.d.ts +28 -0
  21. package/data-api/class-dto/obsolete/utils/query-param-map.util.d.ts +22 -0
  22. package/{lib/api/utils/object-serializer.util.d.ts → data-api/class-dto/serder/object-serializer.d.ts} +1 -1
  23. package/{lib/api → data-api/class-dto}/services/api.abstract.service.d.ts +2 -4
  24. package/data-api/class-dto/services/crud-api.abstract.service.d.ts +25 -0
  25. package/data-api/class-dto/services/get-all-api.abstract.service.d.ts +14 -0
  26. package/data-api/class-dto/tableview/tableview-crud.data-provider.d.ts +17 -0
  27. package/data-api/helpers/get-all-params.d.ts +69 -0
  28. package/data-api/helpers/tableview-get-all-params-create.d.ts +14 -0
  29. package/data-api/index.d.ts +5 -0
  30. package/data-api/models/request-params.model.d.ts +61 -0
  31. package/data-api/rxjs/map-to-data-list.operator.d.ts +9 -0
  32. package/data-api/types/extract-get-all-params.type.d.ts +14 -0
  33. package/esm2022/data-api/class-dto/helpers/tableview-crud-create.mjs +40 -0
  34. package/esm2022/data-api/class-dto/index.mjs +13 -0
  35. package/esm2022/data-api/class-dto/mediusinc-mng-commons-data-api-class-dto.mjs +5 -0
  36. package/esm2022/data-api/class-dto/models/query-result.model.mjs +24 -0
  37. package/esm2022/data-api/class-dto/obsolete/helpers/query-param-convert.mjs +103 -0
  38. package/esm2022/data-api/class-dto/obsolete/helpers/tableview-crud-create.mjs +21 -0
  39. package/esm2022/data-api/class-dto/obsolete/index.mjs +21 -0
  40. package/esm2022/data-api/class-dto/obsolete/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +5 -0
  41. package/esm2022/data-api/class-dto/obsolete/models/builders/query-param.builder.mjs +83 -0
  42. package/esm2022/data-api/class-dto/obsolete/models/filter-match-type.model.mjs +27 -0
  43. package/esm2022/data-api/class-dto/obsolete/models/filter-param.model.mjs +33 -0
  44. package/esm2022/data-api/class-dto/obsolete/models/query-mode.model.mjs +18 -0
  45. package/esm2022/data-api/class-dto/obsolete/models/query-param.model.mjs +68 -0
  46. package/esm2022/data-api/class-dto/obsolete/models/query-result.model.mjs +24 -0
  47. package/esm2022/data-api/class-dto/obsolete/provide.mjs +40 -0
  48. package/esm2022/data-api/class-dto/obsolete/services/api.abstract.service.mjs +70 -0
  49. package/esm2022/data-api/class-dto/obsolete/services/crud-api.abstract.service.mjs +83 -0
  50. package/esm2022/data-api/class-dto/obsolete/services/get-all-api.abstract.service.mjs +38 -0
  51. package/esm2022/data-api/class-dto/obsolete/tableview/tableview-crud.data-provider.mjs +51 -0
  52. package/esm2022/data-api/class-dto/obsolete/utils/query-param-map.util.mjs +57 -0
  53. package/esm2022/data-api/class-dto/serder/object-serializer.mjs +184 -0
  54. package/esm2022/data-api/class-dto/services/api.abstract.service.mjs +55 -0
  55. package/esm2022/data-api/class-dto/services/crud-api.abstract.service.mjs +82 -0
  56. package/esm2022/data-api/class-dto/services/get-all-api.abstract.service.mjs +49 -0
  57. package/esm2022/data-api/class-dto/tableview/tableview-crud.data-provider.mjs +49 -0
  58. package/esm2022/data-api/helpers/get-all-params.mjs +180 -0
  59. package/esm2022/data-api/helpers/tableview-get-all-params-create.mjs +18 -0
  60. package/esm2022/data-api/index.mjs +10 -0
  61. package/esm2022/data-api/mediusinc-mng-commons-data-api.mjs +5 -0
  62. package/esm2022/data-api/models/request-params.model.mjs +2 -0
  63. package/esm2022/data-api/rxjs/map-to-data-list.operator.mjs +19 -0
  64. package/esm2022/data-api/types/extract-get-all-params.type.mjs +2 -0
  65. package/esm2022/index.mjs +3 -6
  66. package/esm2022/lib/components/action/action.component.mjs +4 -5
  67. package/esm2022/lib/components/action/editor/injector-context/action-editor-injector-context.component.mjs +2 -2
  68. package/esm2022/lib/components/action/models/action-execution.model.mjs +5 -4
  69. package/esm2022/lib/components/action/route/action-route.component.mjs +1 -2
  70. package/esm2022/lib/components/action/table/action-table.component.mjs +4 -6
  71. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +29 -17
  72. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +3 -7
  73. package/esm2022/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +20 -18
  74. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +2 -2
  75. package/esm2022/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +23 -12
  76. package/esm2022/lib/components/table/column-filter-full/column-filter-full.component.mjs +162 -33
  77. package/esm2022/lib/components/table/column-value/column-value.component.mjs +3 -3
  78. package/esm2022/lib/components/table/models/table.event.mjs +1 -1
  79. package/esm2022/lib/components/table/models/table.interface.mjs +1 -1
  80. package/esm2022/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.mjs +4 -4
  81. package/esm2022/lib/components/table/table.component.mjs +117 -191
  82. package/esm2022/lib/components/tableview/actions/tableview-default-actions.mjs +215 -0
  83. package/esm2022/lib/components/tableview/builders/tableview-builder.mjs +162 -0
  84. package/esm2022/lib/components/tableview/helpers/tableview-create.mjs +24 -0
  85. package/esm2022/lib/components/tableview/index.mjs +5 -2
  86. package/esm2022/lib/components/tableview/models/tableview.model.mjs +2 -0
  87. package/esm2022/lib/components/tableview/route/tableview-route.component.mjs +7 -39
  88. package/esm2022/lib/components/tableview/tableview.component.mjs +4 -4
  89. package/esm2022/lib/data-providers/editor.data-provider.mjs +13 -13
  90. package/esm2022/lib/data-providers/index.mjs +1 -2
  91. package/esm2022/lib/data-providers/lookup.data-provider.mjs +1 -1
  92. package/esm2022/lib/data-providers/table.data-provider.mjs +4 -5
  93. package/esm2022/lib/data-providers/tableview.data-provider.mjs +1 -1
  94. package/esm2022/lib/descriptors/action/action-confirmation.descriptor.mjs +1 -1
  95. package/esm2022/lib/descriptors/action/action-editor.descriptor.mjs +10 -6
  96. package/esm2022/lib/descriptors/action/action.descriptor.mjs +2 -3
  97. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +13 -17
  98. package/esm2022/lib/descriptors/editor/field-lookup.descriptor.mjs +12 -17
  99. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +5 -8
  100. package/esm2022/lib/descriptors/editor/internal/editor-fields.model.mjs +1 -1
  101. package/esm2022/lib/descriptors/filter/filter-lookup.descriptor.mjs +28 -52
  102. package/esm2022/lib/descriptors/filter/filter.descriptor.mjs +40 -23
  103. package/esm2022/lib/descriptors/model/enum.descriptor.mjs +31 -0
  104. package/esm2022/lib/descriptors/model/index.mjs +3 -1
  105. package/esm2022/lib/descriptors/model/model.descriptor.mjs +10 -1
  106. package/esm2022/lib/descriptors/model/type.descriptor.mjs +11 -0
  107. package/esm2022/lib/descriptors/table/column.descriptor.mjs +12 -107
  108. package/esm2022/lib/descriptors/table/index.mjs +2 -1
  109. package/esm2022/lib/descriptors/table/internal/table-columns.model.mjs +1 -1
  110. package/esm2022/lib/descriptors/table/internal/table.model.mjs +1 -1
  111. package/esm2022/lib/descriptors/table/sort.descriptor.mjs +45 -0
  112. package/esm2022/lib/descriptors/table/table.descriptor.mjs +208 -57
  113. package/esm2022/lib/descriptors/tableview/internal/tableview.model.mjs +1 -1
  114. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +114 -17
  115. package/esm2022/lib/descriptors/types/filter.type.mjs +1 -19
  116. package/esm2022/lib/descriptors/types/table.type.mjs +1 -5
  117. package/esm2022/lib/error/error.handler.mjs +1 -1
  118. package/esm2022/lib/helpers/data-provider-executors.mjs +80 -0
  119. package/esm2022/lib/models/data-list.model.mjs +2 -0
  120. package/esm2022/lib/models/filter-match.model.mjs +105 -0
  121. package/esm2022/lib/models/index.mjs +3 -1
  122. package/esm2022/lib/models/view-container.model.mjs +1 -1
  123. package/esm2022/lib/pipes/enum.pipe.mjs +6 -6
  124. package/esm2022/lib/provide.mjs +101 -0
  125. package/esm2022/lib/registry/type.registry.mjs +3 -10
  126. package/esm2022/lib/router/models/router.model.mjs +1 -1
  127. package/esm2022/lib/router/tableview-route-builder.mjs +1 -1
  128. package/esm2022/lib/services/action/action-executor.service.mjs +54 -32
  129. package/esm2022/lib/services/commons.service.mjs +1 -37
  130. package/esm2022/lib/services/data-provider-executor.service.mjs +52 -0
  131. package/esm2022/lib/services/index.mjs +2 -1
  132. package/esm2022/lib/services/view/view-container.service.mjs +1 -1
  133. package/esm2022/lib/types/action-descriptor.types.mjs +1 -1
  134. package/esm2022/lib/types/type.model.mjs +1 -1
  135. package/esm2022/lib/utils/data-list-params.util.mjs +416 -0
  136. package/esm2022/lib/utils/date.util.mjs +8 -2
  137. package/esm2022/lib/utils/enum.util.mjs +2 -1
  138. package/esm2022/lib/utils/error.util.mjs +3 -3
  139. package/esm2022/lib/utils/export.util.mjs +1 -1
  140. package/esm2022/lib/utils/index.mjs +2 -2
  141. package/esm2022/lib/utils/route.util.mjs +1 -2
  142. package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs +698 -0
  143. package/fesm2022/mediusinc-mng-commons-data-api-class-dto-obsolete.mjs.map +1 -0
  144. package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs +480 -0
  145. package/fesm2022/mediusinc-mng-commons-data-api-class-dto.mjs.map +1 -0
  146. package/fesm2022/mediusinc-mng-commons-data-api.mjs +224 -0
  147. package/fesm2022/mediusinc-mng-commons-data-api.mjs.map +1 -0
  148. package/fesm2022/mediusinc-mng-commons.mjs +2634 -2549
  149. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  150. package/index.d.ts +2 -4
  151. package/lib/components/action/action.component.d.ts +13 -13
  152. package/lib/components/action/models/action-execution.model.d.ts +47 -46
  153. package/lib/components/action/table/action-table.component.d.ts +15 -16
  154. package/lib/components/form/autocomplete/autocomplete.component.d.ts +1 -1
  155. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +3 -5
  156. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +10 -10
  157. package/lib/components/table/column-filter-full/column-filter-full.component.d.ts +25 -9
  158. package/lib/components/table/models/table.event.d.ts +2 -2
  159. package/lib/components/table/models/table.interface.d.ts +4 -1
  160. package/lib/components/table/table-column-filter-class/table-column-filter-class.pipe.d.ts +2 -2
  161. package/lib/components/table/table.component.d.ts +19 -18
  162. package/lib/components/tableview/actions/tableview-default-actions.d.ts +36 -0
  163. package/lib/components/tableview/builders/tableview-builder.d.ts +115 -0
  164. package/lib/components/tableview/helpers/tableview-create.d.ts +16 -0
  165. package/lib/components/tableview/index.d.ts +4 -1
  166. package/lib/components/tableview/models/tableview.model.d.ts +8 -0
  167. package/lib/components/tableview/route/tableview-route.component.d.ts +5 -14
  168. package/lib/components/tableview/tableview.component.d.ts +12 -12
  169. package/lib/data-providers/editor.data-provider.d.ts +12 -12
  170. package/lib/data-providers/index.d.ts +0 -1
  171. package/lib/data-providers/lookup.data-provider.d.ts +2 -2
  172. package/lib/data-providers/table.data-provider.d.ts +25 -25
  173. package/lib/data-providers/tableview.data-provider.d.ts +18 -18
  174. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +1 -1
  175. package/lib/descriptors/action/action-editor.descriptor.d.ts +20 -17
  176. package/lib/descriptors/editor/editor.descriptor.d.ts +8 -12
  177. package/lib/descriptors/editor/field-base.descriptor.d.ts +3 -3
  178. package/lib/descriptors/editor/field-lookup.descriptor.d.ts +11 -11
  179. package/lib/descriptors/editor/field-many.descriptor.d.ts +4 -4
  180. package/lib/descriptors/editor/field.descriptor.d.ts +2 -2
  181. package/lib/descriptors/editor/internal/editor-fields.model.d.ts +6 -5
  182. package/lib/descriptors/filter/filter-lookup.descriptor.d.ts +15 -14
  183. package/lib/descriptors/filter/filter.descriptor.d.ts +17 -18
  184. package/lib/descriptors/model/enum.descriptor.d.ts +14 -0
  185. package/lib/descriptors/model/index.d.ts +2 -0
  186. package/lib/descriptors/model/model.descriptor.d.ts +9 -0
  187. package/lib/descriptors/model/type.descriptor.d.ts +5 -0
  188. package/lib/descriptors/table/column.descriptor.d.ts +10 -24
  189. package/lib/descriptors/table/index.d.ts +1 -0
  190. package/lib/descriptors/table/internal/table-columns.model.d.ts +36 -5
  191. package/lib/descriptors/table/internal/table.model.d.ts +5 -2
  192. package/lib/descriptors/table/sort.descriptor.d.ts +17 -0
  193. package/lib/descriptors/table/table.descriptor.d.ts +57 -33
  194. package/lib/descriptors/tableview/internal/tableview.model.d.ts +3 -3
  195. package/lib/descriptors/tableview/tableview.descriptor.d.ts +49 -19
  196. package/lib/descriptors/types/filter.type.d.ts +0 -17
  197. package/lib/descriptors/types/table.type.d.ts +0 -3
  198. package/lib/error/error.handler.d.ts +1 -1
  199. package/lib/helpers/data-provider-executors.d.ts +19 -0
  200. package/lib/models/data-list.model.d.ts +27 -0
  201. package/lib/models/filter-match.model.d.ts +36 -0
  202. package/lib/models/index.d.ts +2 -0
  203. package/lib/models/view-container.model.d.ts +2 -2
  204. package/lib/pipes/enum.pipe.d.ts +2 -2
  205. package/lib/provide.d.ts +10 -0
  206. package/lib/router/models/router.model.d.ts +1 -1
  207. package/lib/router/tableview-route-builder.d.ts +1 -2
  208. package/lib/services/action/action-executor.service.d.ts +18 -16
  209. package/lib/services/data-provider-executor.service.d.ts +60 -0
  210. package/lib/services/index.d.ts +1 -0
  211. package/lib/services/view/view-container.service.d.ts +11 -11
  212. package/lib/types/action-descriptor.types.d.ts +2 -2
  213. package/lib/types/type.model.d.ts +1 -3
  214. package/lib/utils/data-list-params.util.d.ts +84 -0
  215. package/lib/utils/date.util.d.ts +3 -1
  216. package/lib/utils/enum.util.d.ts +4 -3
  217. package/lib/utils/export.util.d.ts +1 -1
  218. package/lib/utils/index.d.ts +1 -1
  219. package/openapi/angular/modelEnum.mustache +0 -3
  220. package/package.json +20 -2
  221. package/esm2022/lib/api/models/builders/query-param.builder.mjs +0 -59
  222. package/esm2022/lib/api/models/filter-match-type.model.mjs +0 -27
  223. package/esm2022/lib/api/models/filter-param.model.mjs +0 -33
  224. package/esm2022/lib/api/models/index.mjs +0 -7
  225. package/esm2022/lib/api/models/query-mode.model.mjs +0 -18
  226. package/esm2022/lib/api/models/query-param.model.mjs +0 -68
  227. package/esm2022/lib/api/models/query-result.model.mjs +0 -35
  228. package/esm2022/lib/api/services/api.abstract.service.mjs +0 -58
  229. package/esm2022/lib/api/services/crud-api.abstract.service.mjs +0 -75
  230. package/esm2022/lib/api/services/get-all-api.abstract.service.mjs +0 -30
  231. package/esm2022/lib/api/services/index.mjs +0 -4
  232. package/esm2022/lib/api/utils/index.mjs +0 -3
  233. package/esm2022/lib/api/utils/medius-rest.util.mjs +0 -293
  234. package/esm2022/lib/api/utils/object-serializer.util.mjs +0 -185
  235. package/esm2022/lib/components/tableview/route/tableview-route.abstract.component.mjs +0 -158
  236. package/esm2022/lib/data-providers/tableview-crud.data-provider.mjs +0 -32
  237. package/esm2022/lib/provide-commons.mjs +0 -88
  238. package/esm2022/lib/utils/action-data-provider.util.mjs +0 -171
  239. package/lib/api/models/builders/query-param.builder.d.ts +0 -13
  240. package/lib/api/models/index.d.ts +0 -6
  241. package/lib/api/services/get-all-api.abstract.service.d.ts +0 -14
  242. package/lib/api/services/index.d.ts +0 -3
  243. package/lib/api/utils/index.d.ts +0 -2
  244. package/lib/api/utils/medius-rest.util.d.ts +0 -32
  245. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +0 -35
  246. package/lib/data-providers/tableview-crud.data-provider.d.ts +0 -12
  247. package/lib/provide-commons.d.ts +0 -3
  248. package/lib/utils/action-data-provider.util.d.ts +0 -35
  249. package/templates/tableview-route.component.html +0 -5
  250. /package/{lib/api → data-api/class-dto/obsolete}/models/filter-match-type.model.d.ts +0 -0
  251. /package/{lib/api → data-api/class-dto/obsolete}/models/query-mode.model.d.ts +0 -0
@@ -0,0 +1,416 @@
1
+ import { FilterMatchMode, MngInternalError } from '../models';
2
+ import { DateUtil } from './date.util';
3
+ export class DataListParamsUtil {
4
+ /**
5
+ * Converts a TableLazyLoadEvent to DataListParams.
6
+ *
7
+ * @param {TableLazyLoadEvent} event - The event containing the data to convert.
8
+ * @return {DataListParams} - The converted DataListParams object.
9
+ */
10
+ static fromPrimeTableLoad(event) {
11
+ const params = {};
12
+ if (event.first != null) {
13
+ params.offset = event.first;
14
+ }
15
+ if (event.rows != null) {
16
+ params.limit = event.rows;
17
+ }
18
+ if (typeof event.globalFilter === 'string') {
19
+ params.search = event.globalFilter;
20
+ }
21
+ else if (Array.isArray(event.globalFilter) && event.globalFilter.length > 0) {
22
+ params.search = event.globalFilter.join(',');
23
+ }
24
+ if (Array.isArray(event.multiSortMeta) && event.multiSortMeta.length > 0) {
25
+ params.sort = event.multiSortMeta.map(m => ({ property: m.field, ascending: m.order >= 0 }));
26
+ }
27
+ if (event.filters) {
28
+ params.filters = Object.keys(event.filters).reduce((acc, key) => {
29
+ const filter = {};
30
+ const eventFilter = event.filters?.[key];
31
+ if (Array.isArray(eventFilter)) {
32
+ filter.value = eventFilter[0].value;
33
+ filter.matchMode = eventFilter[0].matchMode;
34
+ }
35
+ else if (eventFilter !== undefined) {
36
+ filter.value = eventFilter.value;
37
+ filter.matchMode = eventFilter.matchMode;
38
+ }
39
+ return { ...acc, [key]: filter };
40
+ }, {});
41
+ }
42
+ return params;
43
+ }
44
+ /**
45
+ * Converts the given parameters to URL query parameters.
46
+ * Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
47
+ * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
48
+ *
49
+ * @param {DataListParams} params - The parameters to convert.
50
+ * @param {DataListParams|null} defaults - The default parameters used if no matching property in params is available. Defaults to { limit: 25, offset: 0 } if not provided.
51
+ * @returns {Params} - The URL query parameters object.
52
+ */
53
+ static toUrlQueryParams(params, defaults = {
54
+ limit: 25,
55
+ offset: 0
56
+ }) {
57
+ const urlParams = {};
58
+ if (params.limit && params.limit !== defaults?.limit) {
59
+ urlParams['limit'] = params.limit;
60
+ }
61
+ if (params.offset && params.offset !== defaults?.offset) {
62
+ urlParams['offset'] = params.offset;
63
+ }
64
+ if (params.search && params.search !== defaults?.search) {
65
+ urlParams['q'] = params.search;
66
+ }
67
+ if (params.sort && Array.isArray(params.sort) && params.sort.length > 0) {
68
+ if (defaults?.sort == null ||
69
+ !Array.isArray(defaults.sort) ||
70
+ defaults.sort.length === 0 ||
71
+ params.sort.length !== defaults.sort.length ||
72
+ defaults.sort.some((ds, idx) => ds.property !== params.sort[idx].property || (ds.ascending ?? true) !== (params.sort[idx].ascending ?? true))) {
73
+ urlParams['sort'] = DataListParamsUtil.sortToUrlQuery(params);
74
+ }
75
+ }
76
+ if (params.filters) {
77
+ Object.keys(params.filters).forEach(k => {
78
+ const paramFilter = params.filters[k];
79
+ const defaultFilter = defaults?.filters?.[k];
80
+ if (defaultFilter &&
81
+ ((Array.isArray(defaultFilter.value) &&
82
+ Array.isArray(paramFilter.value) &&
83
+ defaultFilter.value.length === paramFilter.value.length &&
84
+ defaultFilter.value.every((v, idx) => {
85
+ const value = paramFilter.value[idx];
86
+ if (value instanceof Date && v instanceof Date)
87
+ return value.getTime() === v.getTime();
88
+ else
89
+ return value === v;
90
+ })) || // handle arrays
91
+ defaultFilter.value === paramFilter.value) &&
92
+ defaultFilter.matchMode === paramFilter.matchMode &&
93
+ (defaultFilter.caseSensitive ?? false) === (paramFilter.caseSensitive ?? false)) {
94
+ return;
95
+ }
96
+ if (paramFilter.value == null && defaultFilter?.value == null) {
97
+ return;
98
+ }
99
+ urlParams[k] = DataListParamsUtil.paramsFilterToUrlQuery(params, k, true);
100
+ });
101
+ }
102
+ if (defaults?.filters) {
103
+ // add other defaults
104
+ const paramFilterKeys = params.filters ? Object.keys(params.filters) : [];
105
+ Object.keys(defaults.filters)
106
+ .filter(k => paramFilterKeys.indexOf(k) < 0)
107
+ .forEach(k => {
108
+ urlParams[k] = DataListParamsUtil.paramsFilterToUrlQuery(defaults, k);
109
+ });
110
+ }
111
+ return urlParams;
112
+ }
113
+ /**
114
+ * Merges the provided parameters with default values and returns the merged object.
115
+ *
116
+ * @param {DataListParams} params - The parameters to merge with defaults.
117
+ * @param {DataListParams} defaults - The default values to merge with params (optional, default is { limit: 25, offset: 0 }).
118
+ * @returns {DataListParams} - The merged parameters object.
119
+ */
120
+ static mergeWithDefaults(params, defaults = {
121
+ limit: 25,
122
+ offset: 0
123
+ }) {
124
+ const merged = {
125
+ limit: params.limit ?? defaults.limit,
126
+ offset: params.offset ?? defaults.offset,
127
+ search: params.search ?? defaults.search,
128
+ sort: (params.sort ?? defaults.sort)?.map(s => ({ ...s }))
129
+ };
130
+ if (params.filters) {
131
+ merged.filters = {};
132
+ Object.entries(params.filters).forEach(([key, value]) => (merged.filters[key] = { ...value }));
133
+ }
134
+ if (defaults.filters) {
135
+ if (!merged.filters)
136
+ merged.filters = {};
137
+ Object.entries(defaults.filters).forEach(([key, value]) => {
138
+ if (merged.filters[key] === undefined) {
139
+ merged.filters[key] = { ...value };
140
+ }
141
+ });
142
+ }
143
+ return merged;
144
+ }
145
+ /**
146
+ * Converts an object of parameters to a URL query string for sorting.
147
+ * Sorts are formatted in Medius data API sort query language: `asc:prop1,desc:prop2`, ...
148
+ *
149
+ * @param {DataListParams} params - An optional object containing sort parameters.
150
+ * @returns A string representing the URL query or undefined if no sort parameters are provided.
151
+ */
152
+ static sortToUrlQuery(params) {
153
+ return params && Array.isArray(params.sort)
154
+ ? params.sort.map(s => `${s.ascending === true || s.ascending === undefined ? 'asc' : 'desc'}:${String(s.property)}`).join(',')
155
+ : undefined;
156
+ }
157
+ /**
158
+ * Converts a specific filter parameter (by key) from DataListParams object to a URL query string.
159
+ * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
160
+ *
161
+ * @param {DataListParams<any, Filters> | undefined} params - The DataListParams object containing the filters.
162
+ * @param {Filters} key - The key of the filter to convert.
163
+ * @param {boolean} [allowNull=false] - Indicates whether to allow null values in the query string.
164
+ * @return {string | undefined} - The URL query string representing the specified filter, or undefined if the filter is not found.
165
+ */
166
+ static paramsFilterToUrlQuery(params, key, allowNull = false) {
167
+ const paramFilter = params?.filters?.[key];
168
+ return DataListParamsUtil.filterToUrlQuery(paramFilter, allowNull);
169
+ }
170
+ /**
171
+ * Converts a filter to a URL query string.
172
+ * Filter keys are "flattened" in the new object, values are formatted in Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
173
+ *
174
+ * @param {DataListFilter} paramFilter - The filter object to be converted.
175
+ * @param {boolean} [allowNull=false] - Indicates whether to allow null values in the filter.
176
+ * @returns {string|undefined} - The filter converted to a URL query string, or undefined if no filter is provided or the filter has empty or invalid values.
177
+ * @throws {MngInternalError} - If the filter has invalid values.
178
+ */
179
+ static filterToUrlQuery(paramFilter, allowNull = false) {
180
+ const filterValueAsArray = Array.isArray(paramFilter?.value) ? paramFilter.value.filter(v => v !== undefined && (allowNull || v !== null)) : undefined;
181
+ if (paramFilter === undefined ||
182
+ (!allowNull && paramFilter.value == null) ||
183
+ (typeof paramFilter.value === 'string' && paramFilter.value.length === 0) ||
184
+ (Array.isArray(filterValueAsArray) && filterValueAsArray.length === 0)) {
185
+ // no need to include filters for empty values
186
+ return undefined;
187
+ }
188
+ const matchMode = paramFilter.matchMode ?? FilterMatchMode.Equals;
189
+ if (matchMode === FilterMatchMode.Between && !(Array.isArray(filterValueAsArray) && filterValueAsArray.length === 2)) {
190
+ throw new MngInternalError(`Filter match mode between requires exactly 2 values: ${paramFilter.value}`);
191
+ }
192
+ if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) && (!Array.isArray(filterValueAsArray) || filterValueAsArray.length === 0)) {
193
+ throw new MngInternalError(`Filter match mode ${matchMode} requires non-empty array: ${paramFilter.value}`);
194
+ }
195
+ if ([FilterMatchMode.In, FilterMatchMode.NotIn, FilterMatchMode.Between].indexOf(matchMode) === -1 && Array.isArray(filterValueAsArray)) {
196
+ throw new MngInternalError(`Filter match mode ${matchMode} must not be array: ${paramFilter.value}`);
197
+ }
198
+ const noVal = paramFilter.matchMode === FilterMatchMode.Exists || paramFilter.matchMode === FilterMatchMode.DoesNotExist;
199
+ const urlValuePart = noVal ? '' : `:${DataListParamsUtil.filterValueToUrlParam(filterValueAsArray ?? paramFilter.value, allowNull)}`;
200
+ return `${paramFilter.caseSensitive ? 'cs:' : paramFilter.caseSensitive === false ? 'ci:' : ''}${FilterMatchMode.getAbbreviation(matchMode) ?? matchMode}${urlValuePart}`;
201
+ }
202
+ /**
203
+ * Converts URL query parameters to a DataListParams object.
204
+ * Sorts are formatted from Medius data API sort query language: `asc:prop1,desc:prop2`, ...
205
+ * Filter keys are all keys in Params object that are not matched elsewhere, values are formatted from Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
206
+ *
207
+ * @param {Params} urlParams - The URL query parameters.
208
+ * @return {DataListParams} - The converted DataListParams object.
209
+ */
210
+ static fromUrlQueryParams(urlParams) {
211
+ const params = {};
212
+ Object.entries(urlParams).forEach(([urlParamKey, urlParamValue]) => {
213
+ if (urlParamKey === 'limit') {
214
+ params.limit = +urlParamValue;
215
+ if (isNaN(params.limit) || params.limit < 0) {
216
+ delete params.limit;
217
+ }
218
+ }
219
+ else if (urlParamKey === 'offset') {
220
+ params.offset = +urlParamValue;
221
+ if (isNaN(params.offset) || params.offset < 0) {
222
+ delete params.offset;
223
+ }
224
+ }
225
+ else if (urlParamKey === 'q') {
226
+ params.search = urlParamValue;
227
+ }
228
+ else if (urlParamKey === 'sort') {
229
+ if (typeof urlParamValue === 'string') {
230
+ params.sort = urlParamValue.split(',').map(s => {
231
+ const [direction, property] = s.split(':');
232
+ return { property: (property ?? direction), ascending: direction !== 'desc' };
233
+ });
234
+ }
235
+ else {
236
+ throw new MngInternalError(`String is expected as value for '${urlParamKey}' when converting from urlParams`);
237
+ }
238
+ }
239
+ else if (typeof urlParamValue === 'string') {
240
+ if (urlParamValue.length === 0) {
241
+ // empty string should be ignored
242
+ return;
243
+ }
244
+ const filterParts = urlParamValue.split(':');
245
+ let partIdx = 0;
246
+ // case sensitive
247
+ let caseSensitive = undefined;
248
+ if (filterParts[partIdx] === 'cs' || filterParts[partIdx] === 'ci') {
249
+ caseSensitive = filterParts[partIdx++] === 'cs';
250
+ }
251
+ // match mode
252
+ const matchMode = filterParts[partIdx] ? FilterMatchMode.fromAbbreviation(filterParts[partIdx]) ?? filterParts[partIdx] : FilterMatchMode.Equals;
253
+ partIdx++;
254
+ const noVal = matchMode === FilterMatchMode.Exists || matchMode === FilterMatchMode.DoesNotExist;
255
+ // value
256
+ let value = undefined;
257
+ if (!noVal) {
258
+ if (filterParts.length < 2) {
259
+ return;
260
+ }
261
+ if (partIdx === filterParts.length - 1) {
262
+ value = filterParts[partIdx];
263
+ }
264
+ else if (partIdx < filterParts.length) {
265
+ // array that should not be array, so join back together
266
+ value = filterParts.slice(partIdx, filterParts.length).join(':');
267
+ }
268
+ if (value === undefined && matchMode !== FilterMatchMode.Exists && matchMode !== FilterMatchMode.DoesNotExist) {
269
+ // if value undefined and match mode expects value, then skip
270
+ return;
271
+ }
272
+ if (value === 'null') {
273
+ value = null;
274
+ }
275
+ if ((matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn || matchMode === FilterMatchMode.Between) && typeof value === 'string') {
276
+ let arrayVal = [];
277
+ // these match modes expect array
278
+ if (value.indexOf('"') >= 0) {
279
+ const tokens = [];
280
+ let currentToken = '';
281
+ let explicitQuotes = false; //token is quoted, e.g. in:1,2,"22""",",123"""
282
+ let quotesOpened = false; //token has started processing
283
+ let quotesExplicitlyClosed = false; //token processing has finished, after single " in quoted mode, or before , in not quoted
284
+ for (let i = 0; i < value.length; i++) {
285
+ const c = value[i];
286
+ // reset the tokenizer when seeing the token separator
287
+ // only if either:
288
+ // the quotes have not been opened yet (when there are no characters between separators),
289
+ // the token has been explicitly closed (when we actually have explicit opening i.e., quotes as the first character)
290
+ // or we have implicit quotes (i.e., quotes are not the first character)
291
+ if (c === ',' && (!quotesOpened || quotesExplicitlyClosed || !explicitQuotes)) {
292
+ tokens.push(currentToken);
293
+ currentToken = '';
294
+ quotesOpened = false;
295
+ quotesExplicitlyClosed = false;
296
+ explicitQuotes = false;
297
+ }
298
+ else if (c == '"') {
299
+ // escaped double-quotes
300
+ if (explicitQuotes && i + 1 < value.length && value[i + 1] === '"') {
301
+ currentToken += c; // Append one double-quote to the current token
302
+ i++; // Skip the next double-quote
303
+ }
304
+ // we encounter quotes again after they were the first character => we close the token
305
+ else if (explicitQuotes) {
306
+ quotesExplicitlyClosed = true;
307
+ }
308
+ // implicit quotes
309
+ else if (quotesOpened) {
310
+ currentToken += c;
311
+ }
312
+ // quotes are the first character => explicitly open the token
313
+ else {
314
+ currentToken = '';
315
+ quotesOpened = true;
316
+ explicitQuotes = true;
317
+ }
318
+ }
319
+ else {
320
+ if (quotesExplicitlyClosed) {
321
+ return;
322
+ }
323
+ quotesOpened = true;
324
+ currentToken += c;
325
+ }
326
+ }
327
+ if (quotesOpened && !quotesExplicitlyClosed && explicitQuotes) {
328
+ return;
329
+ }
330
+ // Append the last token after the loop ends
331
+ tokens.push(currentToken.toString());
332
+ arrayVal = tokens;
333
+ }
334
+ else {
335
+ arrayVal = value.split(',');
336
+ }
337
+ if (matchMode === FilterMatchMode.Between && arrayVal.length !== 2) {
338
+ return;
339
+ }
340
+ value = arrayVal;
341
+ }
342
+ if ((typeof value === 'string' && value.length === 0) || (Array.isArray(value) && value.length === 0)) {
343
+ // filter with empty value is to be ignored
344
+ return;
345
+ }
346
+ }
347
+ else {
348
+ caseSensitive = undefined;
349
+ }
350
+ if (!params.filters) {
351
+ params.filters = {};
352
+ }
353
+ params.filters[urlParamKey] = { value: value, matchMode: matchMode, caseSensitive: caseSensitive };
354
+ }
355
+ });
356
+ return params;
357
+ }
358
+ /**
359
+ * Makes a copy of the given DataListParams object.
360
+ *
361
+ * @param {DataListParams<Sorts, Filters>} params - The DataListParams object to be copied.
362
+ * @returns {DataListParams<Sorts, Filters>} - Returns a new copy of the DataListParams object.
363
+ */
364
+ static copy(params) {
365
+ const copy = {
366
+ offset: params.offset,
367
+ limit: params.limit,
368
+ search: params.search
369
+ };
370
+ if (params.sort) {
371
+ copy.sort = params.sort?.map(s => ({ ...s }));
372
+ }
373
+ if (params.filters) {
374
+ copy.filters = Object.entries(params.filters).reduce((acc, [key, value]) => {
375
+ const filterValue = value;
376
+ return {
377
+ ...acc,
378
+ [key]: {
379
+ ...filterValue,
380
+ value: Array.isArray(filterValue.value) ? [...filterValue.value] : filterValue.value
381
+ }
382
+ };
383
+ }, {});
384
+ }
385
+ return copy;
386
+ }
387
+ /**
388
+ * Converts a value to a URL query param string representation.
389
+ *
390
+ * @param {unknown} value - The value to be converted.
391
+ * @param {boolean} [allowNull=false] - Indicates whether null values are allowed.
392
+ * @returns {string} The URL parameter representation of the value.
393
+ * @throws {MngInternalError} If an undefined value is passed without allowNull set to true.
394
+ * @throws {MngInternalError} If the value is an object (excluding Date).
395
+ */
396
+ static filterValueToUrlParam(value, allowNull = false) {
397
+ if (value === null && allowNull)
398
+ return 'null';
399
+ if (value == null)
400
+ throw new MngInternalError('Undefined value cannot be converted to url param.'); // this should not happen, should be filtered out earlier
401
+ if (Array.isArray(value))
402
+ return value
403
+ .map(v => DataListParamsUtil.filterValueToUrlParam(v, allowNull))
404
+ .map(v => (v.indexOf(',') >= 0 || v.indexOf('"') >= 0 ? `"${v.replaceAll('"', '""')}"` : v))
405
+ .join(',');
406
+ if (typeof value === 'object') {
407
+ if (value instanceof Date)
408
+ return DateUtil.toIsoString(value, 'dateTime', { utc: true });
409
+ else {
410
+ throw new MngInternalError('Filter value cannot be object');
411
+ }
412
+ }
413
+ return String(value);
414
+ }
415
+ }
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXBhcmFtcy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRhLWxpc3QtcGFyYW1zLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUErRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUksT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLE9BQU8sa0JBQWtCO0lBQzNCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQXlCO1FBQ3RELE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7UUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUNyQixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7U0FDL0I7UUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUVELElBQUksT0FBTyxLQUFLLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRTtZQUN4QyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDdEM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzRSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEUsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUY7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDZixNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDNUQsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQW1CLENBQUMsQ0FBQztnQkFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUM1QixNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztpQkFDL0M7cUJBQU0sSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO29CQUNsQyxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7b0JBQ2pDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxFQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUM7WUFDbkMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzFCLE1BQWdDLEVBQ2hDLFdBQTRDO1FBQ3hDLEtBQUssRUFBRSxFQUFFO1FBQ1QsTUFBTSxFQUFFLENBQUM7S0FDWjtRQUVELE1BQU0sU0FBUyxHQUFXLEVBQUUsQ0FBQztRQUU3QixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ2xELFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUNyRCxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUN2QztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxNQUFNLEVBQUU7WUFDckQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDbEM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JFLElBQ0ksUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJO2dCQUN0QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUMzQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLElBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsRUFDako7Z0JBQ0UsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqRTtTQUNKO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQVEsQ0FBQyxDQUFpQixDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sYUFBYSxHQUFHLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFpQixDQUFDLENBQUM7Z0JBQzdELElBQ0ksYUFBYTtvQkFDYixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO3dCQUNoQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7d0JBQ2hDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTTt3QkFDdkQsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7NEJBQ2pDLE1BQU0sS0FBSyxHQUFJLFdBQVcsQ0FBQyxLQUF3QyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN6RSxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUk7Z0NBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDOztnQ0FDbEYsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDO3dCQUM1QixDQUFDLENBQUMsQ0FBQyxJQUFJLGdCQUFnQjt3QkFDdkIsYUFBYSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDO29CQUM5QyxhQUFhLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTO29CQUNqRCxDQUFDLGFBQWEsQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxFQUNqRjtvQkFDRSxPQUFPO2lCQUNWO2dCQUVELElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUU7b0JBQzNELE9BQU87aUJBQ1Y7Z0JBRUQsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksUUFBUSxFQUFFLE9BQU8sRUFBRTtZQUNuQixxQkFBcUI7WUFDckIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7aUJBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ1QsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDM0IsTUFBc0MsRUFDdEMsV0FBMkM7UUFDdkMsS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsQ0FBQztLQUNaO1FBRUQsTUFBTSxNQUFNLEdBQW1DO1lBQzNDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLO1lBQ3JDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNO1lBQ3hDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNO1lBQ3hDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsRUFBQyxDQUFDLENBQUM7U0FDM0QsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLEVBQWtDLENBQUM7WUFDcEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFjLENBQUMsR0FBRyxFQUFDLEdBQUksS0FBd0IsRUFBQyxDQUFDLENBQUMsQ0FBQztTQUNoSTtRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFrQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RELElBQUksTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFjLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQy9DLE1BQU0sQ0FBQyxPQUFRLENBQUMsR0FBYyxDQUFDLEdBQUcsRUFBQyxHQUFJLEtBQXdCLEVBQUMsQ0FBQztpQkFDcEU7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBaUM7UUFDMUQsT0FBTyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDL0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQ2hDLE1BQWdELEVBQ2hELEdBQVksRUFDWixTQUFTLEdBQUcsS0FBSztRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsT0FBTyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQTRCLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDMUUsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEosSUFDSSxXQUFXLEtBQUssU0FBUztZQUN6QixDQUFDLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO1lBQ3pDLENBQUMsT0FBTyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDekUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUN4RTtZQUNFLDhDQUE4QztZQUM5QyxPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUVsRSxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2xILE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyx3REFBd0QsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDM0c7UUFFRCxJQUFJLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxFQUFFLElBQUksU0FBUyxLQUFLLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN0SixNQUFNLElBQUksZ0JBQWdCLENBQUMscUJBQXFCLFNBQVMsOEJBQThCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQy9HO1FBRUQsSUFBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFjLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUNuSixNQUFNLElBQUksZ0JBQWdCLENBQUMscUJBQXFCLFNBQVMsdUJBQXVCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3hHO1FBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEtBQUssZUFBZSxDQUFDLFlBQVksQ0FBQztRQUN6SCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFckksT0FBTyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQzlLLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQWlCO1FBQzlDLE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7UUFFbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFO1lBQy9ELElBQUksV0FBVyxLQUFLLE9BQU8sRUFBRTtnQkFDekIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUN6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ3ZCO2FBQ0o7aUJBQU0sSUFBSSxXQUFXLEtBQUssUUFBUSxFQUFFO2dCQUNqQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsYUFBYSxDQUFDO2dCQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzNDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDeEI7YUFDSjtpQkFBTSxJQUFJLFdBQVcsS0FBSyxHQUFHLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO2FBQ2pDO2lCQUFNLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRTtnQkFDL0IsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7b0JBQ25DLE1BQU0sQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQzNDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQWlCLEVBQUUsU0FBUyxFQUFFLFNBQVMsS0FBSyxNQUFNLEVBQUMsQ0FBQztvQkFDaEcsQ0FBQyxDQUFDLENBQUM7aUJBQ047cUJBQU07b0JBQ0gsTUFBTSxJQUFJLGdCQUFnQixDQUFDLG9DQUFvQyxXQUFXLGtDQUFrQyxDQUFDLENBQUM7aUJBQ2pIO2FBQ0o7aUJBQU0sSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7Z0JBQzFDLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQzVCLGlDQUFpQztvQkFDakMsT0FBTztpQkFDVjtnQkFFRCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBRWhCLGlCQUFpQjtnQkFDakIsSUFBSSxhQUFhLEdBQXdCLFNBQVMsQ0FBQztnQkFDbkQsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2hFLGFBQWEsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUM7aUJBQ25EO2dCQUVELGFBQWE7Z0JBQ2IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUNqSixPQUFPLEVBQUUsQ0FBQztnQkFFVixNQUFNLEtBQUssR0FBRyxTQUFTLEtBQUssZUFBZSxDQUFDLE1BQU0sSUFBSSxTQUFTLEtBQUssZUFBZSxDQUFDLFlBQVksQ0FBQztnQkFFakcsUUFBUTtnQkFDUixJQUFJLEtBQUssR0FBeUMsU0FBUyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNSLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3hCLE9BQU87cUJBQ1Y7b0JBRUQsSUFBSSxPQUFPLEtBQUssV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3BDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ2hDO3lCQUFNLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUU7d0JBQ3JDLHdEQUF3RDt3QkFDeEQsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3BFO29CQUVELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssZUFBZSxDQUFDLE1BQU0sSUFBSSxTQUFTLEtBQUssZUFBZSxDQUFDLFlBQVksRUFBRTt3QkFDM0csNkRBQTZEO3dCQUM3RCxPQUFPO3FCQUNWO29CQUVELElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTt3QkFDbEIsS0FBSyxHQUFHLElBQUksQ0FBQztxQkFDaEI7b0JBRUQsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUMsRUFBRSxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsS0FBSyxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO3dCQUNqSixJQUFJLFFBQVEsR0FBYSxFQUFFLENBQUM7d0JBQzVCLGlDQUFpQzt3QkFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDekIsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDOzRCQUM1QixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7NEJBQ3RCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLDhDQUE4Qzs0QkFDMUUsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsOEJBQThCOzRCQUN4RCxJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxDQUFDLHlGQUF5Rjs0QkFFN0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FFbkIsc0RBQXNEO2dDQUN0RCxrQkFBa0I7Z0NBQ2xCLHlGQUF5RjtnQ0FDekYsb0hBQW9IO2dDQUNwSCx3RUFBd0U7Z0NBQ3hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLHNCQUFzQixJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7b0NBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0NBQzFCLFlBQVksR0FBRyxFQUFFLENBQUM7b0NBQ2xCLFlBQVksR0FBRyxLQUFLLENBQUM7b0NBQ3JCLHNCQUFzQixHQUFHLEtBQUssQ0FBQztvQ0FDL0IsY0FBYyxHQUFHLEtBQUssQ0FBQztpQ0FDMUI7cUNBQU0sSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO29DQUNqQix3QkFBd0I7b0NBQ3hCLElBQUksY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTt3Q0FDaEUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLCtDQUErQzt3Q0FDbEUsQ0FBQyxFQUFFLENBQUMsQ0FBQyw2QkFBNkI7cUNBQ3JDO29DQUNELHNGQUFzRjt5Q0FDakYsSUFBSSxjQUFjLEVBQUU7d0NBQ3JCLHNCQUFzQixHQUFHLElBQUksQ0FBQztxQ0FDakM7b0NBQ0Qsa0JBQWtCO3lDQUNiLElBQUksWUFBWSxFQUFFO3dDQUNuQixZQUFZLElBQUksQ0FBQyxDQUFDO3FDQUNyQjtvQ0FDRCw4REFBOEQ7eUNBQ3pEO3dDQUNELFlBQVksR0FBRyxFQUFFLENBQUM7d0NBQ2xCLFlBQVksR0FBRyxJQUFJLENBQUM7d0NBQ3BCLGNBQWMsR0FBRyxJQUFJLENBQUM7cUNBQ3pCO2lDQUNKO3FDQUFNO29DQUNILElBQUksc0JBQXNCLEVBQUU7d0NBQ3hCLE9BQU87cUNBQ1Y7b0NBRUQsWUFBWSxHQUFHLElBQUksQ0FBQztvQ0FDcEIsWUFBWSxJQUFJLENBQUMsQ0FBQztpQ0FDckI7NkJBQ0o7NEJBRUQsSUFBSSxZQUFZLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxjQUFjLEVBQUU7Z0NBQzNELE9BQU87NkJBQ1Y7NEJBRUQsNENBQTRDOzRCQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUVyQyxRQUFRLEdBQUcsTUFBTSxDQUFDO3lCQUNyQjs2QkFBTTs0QkFDSCxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDL0I7d0JBRUQsSUFBSSxTQUFTLEtBQUssZUFBZSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDaEUsT0FBTzt5QkFDVjt3QkFFRCxLQUFLLEdBQUcsUUFBUSxDQUFDO3FCQUNwQjtvQkFFRCxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3BHLDJDQUEyQzt3QkFDM0MsT0FBTztxQkFDVjtpQkFDSjtxQkFBTTtvQkFDSCxhQUFhLEdBQUcsU0FBUyxDQUFDO2lCQUM3QjtnQkFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFDakIsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7aUJBQ3ZCO2dCQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBMkIsQ0FBQyxHQUFHLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUMsQ0FBQzthQUNwSDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBcUQsTUFBc0M7UUFDekcsTUFBTSxJQUFJLEdBQW1DO1lBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1NBQ3hCLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZFLE1BQU0sV0FBVyxHQUFHLEtBQXVCLENBQUM7Z0JBQzVDLE9BQU87b0JBQ0gsR0FBRyxHQUFHO29CQUNOLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ0gsR0FBRyxXQUFXO3dCQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUs7cUJBQ3JFO2lCQUN0QixDQUFDO1lBQ04sQ0FBQyxFQUFFLEVBQWtDLENBQUMsQ0FBQztTQUMxQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDakUsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLFNBQVM7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1lBQUUsTUFBTSxJQUFJLGdCQUFnQixDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQyx5REFBeUQ7UUFDN0osSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNwQixPQUFPLEtBQUs7aUJBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxLQUFLLFlBQVksSUFBSTtnQkFBRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2lCQUNsRjtnQkFDRCxNQUFNLElBQUksZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUMvRDtTQUNKO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VGFibGVMYXp5TG9hZEV2ZW50fSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuaW1wb3J0IHtEYXRhTGlzdEZpbHRlciwgRGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGUsIERhdGFMaXN0RmlsdGVyc1R5cGUsIERhdGFMaXN0UGFyYW1zLCBGaWx0ZXJNYXRjaE1vZGUsIE1uZ0ludGVybmFsRXJyb3J9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge0RhdGVVdGlsfSBmcm9tICcuL2RhdGUudXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhTGlzdFBhcmFtc1V0aWwge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgVGFibGVMYXp5TG9hZEV2ZW50IHRvIERhdGFMaXN0UGFyYW1zLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUYWJsZUxhenlMb2FkRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJuIHtEYXRhTGlzdFBhcmFtc30gLSBUaGUgY29udmVydGVkIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21QcmltZVRhYmxlTG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogRGF0YUxpc3RQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKGV2ZW50LmZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmFtcy5vZmZzZXQgPSBldmVudC5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucm93cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPSBldmVudC5yb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudC5nbG9iYWxGaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJhbXMuc2VhcmNoID0gZXZlbnQuZ2xvYmFsRmlsdGVyO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZ2xvYmFsRmlsdGVyKSAmJiBldmVudC5nbG9iYWxGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IGV2ZW50Lmdsb2JhbEZpbHRlci5qb2luKCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudC5tdWx0aVNvcnRNZXRhKSAmJiBldmVudC5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gZXZlbnQubXVsdGlTb3J0TWV0YS5tYXAobSA9PiAoe3Byb3BlcnR5OiBtLmZpZWxkLCBhc2NlbmRpbmc6IG0ub3JkZXIgPj0gMH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBwYXJhbXMuZmlsdGVycyA9IE9iamVjdC5rZXlzKGV2ZW50LmZpbHRlcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXI6IERhdGFMaXN0RmlsdGVyID0ge307XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRGaWx0ZXIgPSBldmVudC5maWx0ZXJzPy5ba2V5IGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGV2ZW50RmlsdGVyWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlID0gZXZlbnRGaWx0ZXJbMF0ubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBldmVudEZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1hdGNoTW9kZSA9IGV2ZW50RmlsdGVyLm1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5hY2MsIFtrZXldOiBmaWx0ZXJ9O1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB0byBVUkwgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKiBGaWx0ZXIga2V5cyBhcmUgXCJmbGF0dGVuZWRcIiBpbiB0aGUgbmV3IG9iamVjdCwgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN8bnVsbH0gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHVzZWQgaWYgbm8gbWF0Y2hpbmcgcHJvcGVydHkgaW4gcGFyYW1zIGlzIGF2YWlsYWJsZS4gRGVmYXVsdHMgdG8geyBsaW1pdDogMjUsIG9mZnNldDogMCB9IGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAcmV0dXJucyB7UGFyYW1zfSAtIFRoZSBVUkwgcXVlcnkgcGFyYW1ldGVycyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB0b1VybFF1ZXJ5UGFyYW1zKFxuICAgICAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PixcbiAgICAgICAgZGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PiB8IG51bGwgPSB7XG4gICAgICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfVxuICAgICk6IFBhcmFtcyB7XG4gICAgICAgIGNvbnN0IHVybFBhcmFtczogUGFyYW1zID0ge307XG5cbiAgICAgICAgaWYgKHBhcmFtcy5saW1pdCAmJiBwYXJhbXMubGltaXQgIT09IGRlZmF1bHRzPy5saW1pdCkge1xuICAgICAgICAgICAgdXJsUGFyYW1zWydsaW1pdCddID0gcGFyYW1zLmxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMub2Zmc2V0ICYmIHBhcmFtcy5vZmZzZXQgIT09IGRlZmF1bHRzPy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHVybFBhcmFtc1snb2Zmc2V0J10gPSBwYXJhbXMub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5zZWFyY2ggIT09IGRlZmF1bHRzPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHVybFBhcmFtc1sncSddID0gcGFyYW1zLnNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLnNvcnQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydCkgJiYgcGFyYW1zLnNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzPy5zb3J0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShkZWZhdWx0cy5zb3J0KSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcGFyYW1zLnNvcnQubGVuZ3RoICE9PSBkZWZhdWx0cy5zb3J0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQuc29tZSgoZHMsIGlkeCkgPT4gZHMucHJvcGVydHkgIT09IHBhcmFtcy5zb3J0IVtpZHhdLnByb3BlcnR5IHx8IChkcy5hc2NlbmRpbmcgPz8gdHJ1ZSkgIT09IChwYXJhbXMuc29ydCFbaWR4XS5hc2NlbmRpbmcgPz8gdHJ1ZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB1cmxQYXJhbXNbJ3NvcnQnXSA9IERhdGFMaXN0UGFyYW1zVXRpbC5zb3J0VG9VcmxRdWVyeShwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zLmZpbHRlcnMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1GaWx0ZXIgPSBwYXJhbXMuZmlsdGVycyFbayBhcyBrZXlvZiBvYmplY3RdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBkZWZhdWx0cz8uZmlsdGVycz8uW2sgYXMga2V5b2Ygb2JqZWN0XTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgKChBcnJheS5pc0FycmF5KGRlZmF1bHRGaWx0ZXIudmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZS5sZW5ndGggPT09IHBhcmFtRmlsdGVyLnZhbHVlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZS5ldmVyeSgodiwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAocGFyYW1GaWx0ZXIudmFsdWUgYXMgQXJyYXk8RGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGU+KVtpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgdiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS5nZXRUaW1lKCkgPT09IHYuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHZhbHVlID09PSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IC8vIGhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIudmFsdWUgPT09IHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyLm1hdGNoTW9kZSA9PT0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICYmXG4gICAgICAgICAgICAgICAgICAgIChkZWZhdWx0RmlsdGVyLmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpID09PSAocGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJhbUZpbHRlci52YWx1ZSA9PSBudWxsICYmIGRlZmF1bHRGaWx0ZXI/LnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVybFBhcmFtc1trXSA9IERhdGFMaXN0UGFyYW1zVXRpbC5wYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtcywgaywgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgICAgIC8vIGFkZCBvdGhlciBkZWZhdWx0c1xuICAgICAgICAgICAgY29uc3QgcGFyYW1GaWx0ZXJLZXlzID0gcGFyYW1zLmZpbHRlcnMgPyBPYmplY3Qua2V5cyhwYXJhbXMuZmlsdGVycykgOiBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmZpbHRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihrID0+IHBhcmFtRmlsdGVyS2V5cy5pbmRleE9mKGspIDwgMClcbiAgICAgICAgICAgICAgICAuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zW2tdID0gRGF0YUxpc3RQYXJhbXNVdGlsLnBhcmFtc0ZpbHRlclRvVXJsUXVlcnkoZGVmYXVsdHMsIGspO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVybFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMuXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCB2YWx1ZXMgdG8gbWVyZ2Ugd2l0aCBwYXJhbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIHsgbGltaXQ6IDI1LCBvZmZzZXQ6IDAgfSkuXG4gICAgICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBtZXJnZWQgcGFyYW1ldGVycyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVdpdGhEZWZhdWx0czxTb3J0cyA9IGFueSwgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IGFueT4oXG4gICAgICAgIHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+LFxuICAgICAgICBkZWZhdWx0czogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+ID0ge1xuICAgICAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH1cbiAgICApOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgICAgICBjb25zdCBtZXJnZWQ6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgICAgIGxpbWl0OiBwYXJhbXMubGltaXQgPz8gZGVmYXVsdHMubGltaXQsXG4gICAgICAgICAgICBvZmZzZXQ6IHBhcmFtcy5vZmZzZXQgPz8gZGVmYXVsdHMub2Zmc2V0LFxuICAgICAgICAgICAgc2VhcmNoOiBwYXJhbXMuc2VhcmNoID8/IGRlZmF1bHRzLnNlYXJjaCxcbiAgICAgICAgICAgIHNvcnQ6IChwYXJhbXMuc29ydCA/PyBkZWZhdWx0cy5zb3J0KT8ubWFwKHMgPT4gKHsuLi5zfSkpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBtZXJnZWQuZmlsdGVycyA9IHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz47XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAobWVyZ2VkLmZpbHRlcnMhW2tleSBhcyBGaWx0ZXJzXSA9IHsuLi4odmFsdWUgYXMgRGF0YUxpc3RGaWx0ZXIpfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0cy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIW1lcmdlZC5maWx0ZXJzKSBtZXJnZWQuZmlsdGVycyA9IHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz47XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cy5maWx0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmZpbHRlcnMhW2tleSBhcyBGaWx0ZXJzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPSB7Li4uKHZhbHVlIGFzIERhdGFMaXN0RmlsdGVyKX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiBwYXJhbWV0ZXJzIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZyBmb3Igc29ydGluZy5cbiAgICAgKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIHNvcnQgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBxdWVyeSBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNvcnRUb1VybFF1ZXJ5KHBhcmFtcz86IERhdGFMaXN0UGFyYW1zPGFueSwgYW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBwYXJhbXMgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydClcbiAgICAgICAgICAgID8gcGFyYW1zLnNvcnQubWFwKHMgPT4gYCR7cy5hc2NlbmRpbmcgPT09IHRydWUgfHwgcy5hc2NlbmRpbmcgPT09IHVuZGVmaW5lZCA/ICdhc2MnIDogJ2Rlc2MnfToke1N0cmluZyhzLnByb3BlcnR5KX1gKS5qb2luKCcsJylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgc3BlY2lmaWMgZmlsdGVyIHBhcmFtZXRlciAoYnkga2V5KSBmcm9tIERhdGFMaXN0UGFyYW1zIG9iamVjdCB0byBhIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxhbnksIEZpbHRlcnM+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBUaGUgRGF0YUxpc3RQYXJhbXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbHRlcnMuXG4gICAgICogQHBhcmFtIHtGaWx0ZXJzfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBmaWx0ZXIgdG8gY29udmVydC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd051bGw9ZmFsc2VdIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gYWxsb3cgbnVsbCB2YWx1ZXMgaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIFVSTCBxdWVyeSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyLCBvciB1bmRlZmluZWQgaWYgdGhlIGZpbHRlciBpcyBub3QgZm91bmQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBwYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5PEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+KFxuICAgICAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgRmlsdGVycz4gfCB1bmRlZmluZWQsXG4gICAgICAgIGtleTogRmlsdGVycyxcbiAgICAgICAgYWxsb3dOdWxsID0gZmFsc2VcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBwYXJhbUZpbHRlciA9IHBhcmFtcz8uZmlsdGVycz8uW2tleV07XG4gICAgICAgIHJldHVybiBEYXRhTGlzdFBhcmFtc1V0aWwuZmlsdGVyVG9VcmxRdWVyeShwYXJhbUZpbHRlciwgYWxsb3dOdWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGZpbHRlciB0byBhIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRhTGlzdEZpbHRlcn0gcGFyYW1GaWx0ZXIgLSBUaGUgZmlsdGVyIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dOdWxsPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIGFsbG93IG51bGwgdmFsdWVzIGluIHRoZSBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IC0gVGhlIGZpbHRlciBjb252ZXJ0ZWQgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkIG9yIHRoZSBmaWx0ZXIgaGFzIGVtcHR5IG9yIGludmFsaWQgdmFsdWVzLlxuICAgICAqIEB0aHJvd3Mge01uZ0ludGVybmFsRXJyb3J9IC0gSWYgdGhlIGZpbHRlciBoYXMgaW52YWxpZCB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtRmlsdGVyPzogRGF0YUxpc3RGaWx0ZXIsIGFsbG93TnVsbCA9IGZhbHNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVBc0FycmF5ID0gQXJyYXkuaXNBcnJheShwYXJhbUZpbHRlcj8udmFsdWUpID8gcGFyYW1GaWx0ZXIhLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHVuZGVmaW5lZCAmJiAoYWxsb3dOdWxsIHx8IHYgIT09IG51bGwpKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyYW1GaWx0ZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKCFhbGxvd051bGwgJiYgcGFyYW1GaWx0ZXIudmFsdWUgPT0gbnVsbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2YgcGFyYW1GaWx0ZXIudmFsdWUgPT09ICdzdHJpbmcnICYmIHBhcmFtRmlsdGVyLnZhbHVlLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkgJiYgZmlsdGVyVmFsdWVBc0FycmF5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIGluY2x1ZGUgZmlsdGVycyBmb3IgZW1wdHkgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID8/IEZpbHRlck1hdGNoTW9kZS5FcXVhbHM7XG5cbiAgICAgICAgaWYgKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4gJiYgIShBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkgJiYgZmlsdGVyVmFsdWVBc0FycmF5Lmxlbmd0aCA9PT0gMikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKGBGaWx0ZXIgbWF0Y2ggbW9kZSBiZXR3ZWVuIHJlcXVpcmVzIGV4YWN0bHkgMiB2YWx1ZXM6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluKSAmJiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSB8fCBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSByZXF1aXJlcyBub24tZW1wdHkgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKFtGaWx0ZXJNYXRjaE1vZGUuSW4sIEZpbHRlck1hdGNoTW9kZS5Ob3RJbiwgRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW5dIGFzIHN0cmluZ1tdKS5pbmRleE9mKG1hdGNoTW9kZSkgPT09IC0xICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSBtdXN0IG5vdCBiZSBhcnJheTogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVmFsID0gcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzIHx8IHBhcmFtRmlsdGVyLm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdDtcbiAgICAgICAgY29uc3QgdXJsVmFsdWVQYXJ0ID0gbm9WYWwgPyAnJyA6IGA6JHtEYXRhTGlzdFBhcmFtc1V0aWwuZmlsdGVyVmFsdWVUb1VybFBhcmFtKGZpbHRlclZhbHVlQXNBcnJheSA/PyBwYXJhbUZpbHRlci52YWx1ZSwgYWxsb3dOdWxsKX1gO1xuXG4gICAgICAgIHJldHVybiBgJHtwYXJhbUZpbHRlci5jYXNlU2Vuc2l0aXZlID8gJ2NzOicgOiBwYXJhbUZpbHRlci5jYXNlU2Vuc2l0aXZlID09PSBmYWxzZSA/ICdjaTonIDogJyd9JHtGaWx0ZXJNYXRjaE1vZGUuZ2V0QWJicmV2aWF0aW9uKG1hdGNoTW9kZSkgPz8gbWF0Y2hNb2RlfSR7dXJsVmFsdWVQYXJ0fWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYSBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gICAgICogU29ydHMgYXJlIGZvcm1hdHRlZCBmcm9tIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAgICAgKiBGaWx0ZXIga2V5cyBhcmUgYWxsIGtleXMgaW4gUGFyYW1zIG9iamVjdCB0aGF0IGFyZSBub3QgbWF0Y2hlZCBlbHNld2hlcmUsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGZyb20gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BhcmFtc30gdXJsUGFyYW1zIC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVybFF1ZXJ5UGFyYW1zKHVybFBhcmFtczogUGFyYW1zKTogRGF0YUxpc3RQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXModXJsUGFyYW1zKS5mb3JFYWNoKChbdXJsUGFyYW1LZXksIHVybFBhcmFtVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAodXJsUGFyYW1LZXkgPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubGltaXQgPSArdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocGFyYW1zLmxpbWl0KSB8fCBwYXJhbXMubGltaXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMubGltaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ29mZnNldCcpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMub2Zmc2V0ID0gK3VybFBhcmFtVmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHBhcmFtcy5vZmZzZXQpIHx8IHBhcmFtcy5vZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdxJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSB1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ3NvcnQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc29ydCA9IHVybFBhcmFtVmFsdWUuc3BsaXQoJywnKS5tYXAocyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbZGlyZWN0aW9uLCBwcm9wZXJ0eV0gPSBzLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Byb3BlcnR5OiAocHJvcGVydHkgPz8gZGlyZWN0aW9uKSBhcyBrZXlvZiBvYmplY3QsIGFzY2VuZGluZzogZGlyZWN0aW9uICE9PSAnZGVzYyd9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcihgU3RyaW5nIGlzIGV4cGVjdGVkIGFzIHZhbHVlIGZvciAnJHt1cmxQYXJhbUtleX0nIHdoZW4gY29udmVydGluZyBmcm9tIHVybFBhcmFtc2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybFBhcmFtVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVybFBhcmFtVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZyBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyUGFydHMgPSB1cmxQYXJhbVZhbHVlLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnRJZHggPSAwO1xuXG4gICAgICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgICAgICBsZXQgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyUGFydHNbcGFydElkeF0gPT09ICdjcycgfHwgZmlsdGVyUGFydHNbcGFydElkeF0gPT09ICdjaScpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHgrK10gPT09ICdjcyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbWF0Y2ggbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdID8gRmlsdGVyTWF0Y2hNb2RlLmZyb21BYmJyZXZpYXRpb24oZmlsdGVyUGFydHNbcGFydElkeF0pID8/IGZpbHRlclBhcnRzW3BhcnRJZHhdIDogRmlsdGVyTWF0Y2hNb2RlLkVxdWFscztcbiAgICAgICAgICAgICAgICBwYXJ0SWR4Kys7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub1ZhbCA9IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3Q7XG5cbiAgICAgICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBudWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICghbm9WYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0SWR4ID09PSBmaWx0ZXJQYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnRJZHggPCBmaWx0ZXJQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHRoYXQgc2hvdWxkIG5vdCBiZSBhcnJheSwgc28gam9pbiBiYWNrIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbHRlclBhcnRzLnNsaWNlKHBhcnRJZHgsIGZpbHRlclBhcnRzLmxlbmd0aCkuam9pbignOicpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmIG1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdmFsdWUgdW5kZWZpbmVkIGFuZCBtYXRjaCBtb2RlIGV4cGVjdHMgdmFsdWUsIHRoZW4gc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuSW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuTm90SW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbikgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFycmF5VmFsOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgbWF0Y2ggbW9kZXMgZXhwZWN0IGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXCInKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhwbGljaXRRdW90ZXMgPSBmYWxzZTsgLy90b2tlbiBpcyBxdW90ZWQsIGUuZy4gaW46MSwyLFwiMjJcIlwiXCIsXCIsMTIzXCJcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1b3Rlc09wZW5lZCA9IGZhbHNlOyAvL3Rva2VuIGhhcyBzdGFydGVkIHByb2Nlc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IGZhbHNlOyAvL3Rva2VuIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLCBhZnRlciBzaW5nbGUgXCIgaW4gcXVvdGVkIG1vZGUsIG9yIGJlZm9yZSAsIGluIG5vdCBxdW90ZWRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IHZhbHVlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0b2tlbml6ZXIgd2hlbiBzZWVpbmcgdGhlIHRva2VuIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIGVpdGhlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1b3RlcyBoYXZlIG5vdCBiZWVuIG9wZW5lZCB5ZXQgKHdoZW4gdGhlcmUgYXJlIG5vIGNoYXJhY3RlcnMgYmV0d2VlbiBzZXBhcmF0b3JzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRva2VuIGhhcyBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkICh3aGVuIHdlIGFjdHVhbGx5IGhhdmUgZXhwbGljaXQgb3BlbmluZyBpLmUuLCBxdW90ZXMgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2UgaGF2ZSBpbXBsaWNpdCBxdW90ZXMgKGkuZS4sIHF1b3RlcyBhcmUgbm90IHRoZSBmaXJzdCBjaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnLCcgJiYgKCFxdW90ZXNPcGVuZWQgfHwgcXVvdGVzRXhwbGljaXRseUNsb3NlZCB8fCAhZXhwbGljaXRRdW90ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0UXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIGRvdWJsZS1xdW90ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBsaWNpdFF1b3RlcyAmJiBpICsgMSA8IHZhbHVlLmxlbmd0aCAmJiB2YWx1ZVtpICsgMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gKz0gYzsgLy8gQXBwZW5kIG9uZSBkb3VibGUtcXVvdGUgdG8gdGhlIGN1cnJlbnQgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7IC8vIFNraXAgdGhlIG5leHQgZG91YmxlLXF1b3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBlbmNvdW50ZXIgcXVvdGVzIGFnYWluIGFmdGVyIHRoZXkgd2VyZSB0aGUgZmlyc3QgY2hhcmFjdGVyID0+IHdlIGNsb3NlIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwbGljaXRRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNFeHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IHF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocXVvdGVzT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdW90ZXMgYXJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgPT4gZXhwbGljaXRseSBvcGVuIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFF1b3RlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVvdGVzRXhwbGljaXRseUNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc09wZW5lZCAmJiAhcXVvdGVzRXhwbGljaXRseUNsb3NlZCAmJiBleHBsaWNpdFF1b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBsYXN0IHRva2VuIGFmdGVyIHRoZSBsb29wIGVuZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4udG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbCA9IHRva2VucztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWwgPSB2YWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiBhcnJheVZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlWYWw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUhLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciB3aXRoIGVtcHR5IHZhbHVlIGlzIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzW3VybFBhcmFtS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSwgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gcGFyYW1zIC0gVGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdCB0byBiZSBjb3BpZWQuXG4gICAgICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gLSBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvcHk8U29ydHMgPSBzdHJpbmcsIEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+KHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+KTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+IHtcbiAgICAgICAgY29uc3QgY29weTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+ID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQ6IHBhcmFtcy5saW1pdCxcbiAgICAgICAgICAgIHNlYXJjaDogcGFyYW1zLnNlYXJjaFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgICAgICAgY29weS5zb3J0ID0gcGFyYW1zLnNvcnQ/Lm1hcChzID0+ICh7Li4uc30pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIGNvcHkuZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKHBhcmFtcy5maWx0ZXJzKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5maWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlLnZhbHVlKSA/IFsuLi5maWx0ZXJWYWx1ZS52YWx1ZV0gOiBmaWx0ZXJWYWx1ZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9IGFzIERhdGFMaXN0RmlsdGVyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIFVSTCBxdWVyeSBwYXJhbSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd051bGw9ZmFsc2VdIC0gSW5kaWNhdGVzIHdoZXRoZXIgbnVsbCB2YWx1ZXMgYXJlIGFsbG93ZWQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIFVSTCBwYXJhbWV0ZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgICAqIEB0aHJvd3Mge01uZ0ludGVybmFsRXJyb3J9IElmIGFuIHVuZGVmaW5lZCB2YWx1ZSBpcyBwYXNzZWQgd2l0aG91dCBhbGxvd051bGwgc2V0IHRvIHRydWUuXG4gICAgICogQHRocm93cyB7TW5nSW50ZXJuYWxFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCAoZXhjbHVkaW5nIERhdGUpLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyVmFsdWVUb1VybFBhcmFtKHZhbHVlOiB1bmtub3duLCBhbGxvd051bGwgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTW5nSW50ZXJuYWxFcnJvcignVW5kZWZpbmVkIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdXJsIHBhcmFtLicpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGVhcmxpZXJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+IERhdGFMaXN0UGFyYW1zVXRpbC5maWx0ZXJWYWx1ZVRvVXJsUGFyYW0odiwgYWxsb3dOdWxsKSlcbiAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHYuaW5kZXhPZignLCcpID49IDAgfHwgdi5pbmRleE9mKCdcIicpID49IDAgPyBgXCIke3YucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiYCA6IHYpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gRGF0ZVV0aWwudG9Jc29TdHJpbmcodmFsdWUsICdkYXRlVGltZScsIHt1dGM6IHRydWV9KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNbmdJbnRlcm5hbEVycm9yKCdGaWx0ZXIgdmFsdWUgY2Fubm90IGJlIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbn1cbiJdfQ==
@@ -107,7 +107,7 @@ export class DateUtil {
107
107
  return base;
108
108
  }
109
109
  }
110
- static fromPrimeToAngularDateFormat(ngDateFormat) {
110
+ static fromAngularToPrimeDateFormat(ngDateFormat) {
111
111
  let primeDateFormat = ngDateFormat;
112
112
  for (const regex of DateUtil.NG_PRIME_FORMAT_OTHER) {
113
113
  primeDateFormat = primeDateFormat.replace(regex, ' ');
@@ -126,5 +126,11 @@ export class DateUtil {
126
126
  primeDateFormat = primeDateFormat.replace(/\s\s+/g, ' ');
127
127
  return primeDateFormat.trim();
128
128
  }
129
+ static fromAngularDateFormatHasTime(ngDateFormat) {
130
+ return /[hHmsS]/.test(ngDateFormat);
131
+ }
132
+ static fromAngularDateFormatHasSeconds(ngDateFormat) {
133
+ return /[sS]/.test(ngDateFormat);
134
+ }
129
135
  }
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLFFBQVE7YUFDTyw4QkFBeUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzFHLDBCQUFxQixHQUFHO1FBQzVDLFNBQVM7UUFDVCxTQUFTO1FBQ1QsSUFBSTtRQUNKLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO0tBQ1osQ0FBQzthQUNzQix3QkFBbUIsR0FBRztRQUMxQyxPQUFPO1FBQ1AsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLEdBQUc7UUFDUCxHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLFNBQVM7UUFDVCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxJQUFJO1FBQ1IsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsSUFB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RyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUF3QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RixlQUFlLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN4STthQUNKO1NBQ0o7UUFDRCxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlID0gJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnO1xuZXhwb3J0IHR5cGUgdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlID0ge3V0Yz86IGJvb2xlYW47IG5vVGltZXpvbmU/OiBib29sZWFuOyBub01pbGxpcz86IGJvb2xlYW59O1xuXG5leHBvcnQgY2xhc3MgRGF0ZVV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5HX1BSSU1FX0ZPUk1BVF9TVVBQT1JURUQgPSBbL2R7MSwyfS9nLCAvRXsxLDV9L2csIC9jezEsNX0vZywgL017MSw1fS9nLCAvTHsxLDV9L2csIC95ezEsNH0vZywgL1l7MSw0fS9nXTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOR19QUklNRV9GT1JNQVRfT1RIRVIgPSBbXG4gICAgICAgIC9HezEsNX0vZyxcbiAgICAgICAgL3d7MSwyfS9nLFxuICAgICAgICAvVy9nLFxuICAgICAgICAvYXsxLDV9L2csXG4gICAgICAgIC9CezEsNX0vZyxcbiAgICAgICAgL2J7MSw1fS9nLFxuICAgICAgICAvaHsxLDJ9L2csXG4gICAgICAgIC9IezEsMn0vZyxcbiAgICAgICAgL217MSwyfS9nLFxuICAgICAgICAvc3sxLDJ9L2csXG4gICAgICAgIC9TezEsM30vZyxcbiAgICAgICAgL3p7MSw0fS9nLFxuICAgICAgICAvWnsxLDV9L2csXG4gICAgICAgIC9PezEsNH0vZ1xuICAgIF07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkdfUFJJTUVfRk9STUFUX01BUCA9IHtcbiAgICAgICAgLy8gZGF5c1xuICAgICAgICBkOiAnZCcsXG4gICAgICAgIGRkOiAnZGQnLFxuICAgICAgICBFOiAnRCcsXG4gICAgICAgIEVFOiAnRCcsXG4gICAgICAgIEVFRTogJ0QnLFxuICAgICAgICBFRUVFOiAnREQnLFxuICAgICAgICBFRUVFRTogJ0QnLFxuICAgICAgICBFRUVFRUU6ICdEJyxcbiAgICAgICAgYzogJ2QnLFxuICAgICAgICBjYzogJ2RkJyxcbiAgICAgICAgY2NjOiAnRCcsXG4gICAgICAgIGNjY2M6ICdERCcsXG4gICAgICAgIGNjY2NjOiAnRCcsXG4gICAgICAgIGNjY2NjYzogJ0QnLFxuICAgICAgICAvLyBtb250aHNcbiAgICAgICAgTTogJ20nLFxuICAgICAgICBNTTogJ21tJyxcbiAgICAgICAgTU1NOiAnTScsXG4gICAgICAgIE1NTU06ICdNTScsXG4gICAgICAgIE1NTU1NOiAnTScsXG4gICAgICAgIEw6ICdtJyxcbiAgICAgICAgTEw6ICdtbScsXG4gICAgICAgIExMTDogJ00nLFxuICAgICAgICBMTExMOiAnTU0nLFxuICAgICAgICBMTExMTDogJ00nLFxuICAgICAgICAvLyB5ZWFyXG4gICAgICAgIHk6ICd5JyxcbiAgICAgICAgeXk6ICd5JyxcbiAgICAgICAgeXl5OiAneXknLFxuICAgICAgICB5eXl5OiAneXknLFxuICAgICAgICBZOiAneScsXG4gICAgICAgIFlZOiAneScsXG4gICAgICAgIFlZWTogJ3l5JyxcbiAgICAgICAgWVlZWTogJ3l5J1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYWROdW1iZXIobnVtOiBudW1iZXIsIHNpemUgPSAyKSB7XG4gICAgICAgIGxldCBzdHIgPSBTdHJpbmcobnVtKTtcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICBzdHIgPSAnMCcgKyBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCB0eXBlPzogJ2RhdGUnKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIHR5cGU6ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJywgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVuZGVmaW5lZCB8IG51bGwgfCB1bmtub3duLCB0eXBlPzogJ2RhdGUnKTogbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmRlZmluZWQgfCBudWxsIHwgdW5rbm93biwgdHlwZTogJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU/OiB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU6IHRvSXNvU3RyaW5nVHlwZU9wdFR5cGUgPSAnZGF0ZS10aW1lJywgZGF0ZVRpbWVPcHRzOiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUgPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIGRhdGUgb25seSwgbm8gdGltZSBwYXJ0IChhbmQgdGltZXpvbmUsIG1pbGxpcywgdXRjIGRvZXMgbm90IG1hdHRlciAuLi4pXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0RnVsbFllYXIoKSArICctJyArIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLnV0Yykge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLm5vTWlsbGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90SWR4ID0gc3RyLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBkb3RJZHgpICsgc3RyLnN1YnN0cmluZyhkb3RJZHggKyA0LCBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlVGltZU9wdHMubm9UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiYXNlID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGdWxsWWVhcigpICtcbiAgICAgICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldERhdGUoKSkgK1xuICAgICAgICAgICAgICAgICdUJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGVUaW1lT3B0cy5ub01pbGxpcykge1xuICAgICAgICAgICAgICAgIGJhc2UgKz0gJy4nICsgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0ZVRpbWVPcHRzLm5vVGltZXpvbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0em8gPSAtdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlmID0gdHpvID49IDAgPyAnKycgOiAnLSc7XG5cbiAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIChkaWYgKyBEYXRlVXRpbC5wYWROdW1iZXIoTWF0aC5mbG9vcihNYXRoLmFicyh0em8pIC8gNjApKSArICc6JyArIERhdGVVdGlsLnBhZE51bWJlcihNYXRoLmFicyh0em8pICUgNjApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21QcmltZVRvQW5ndWxhckRhdGVGb3JtYXQobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJpbWVEYXRlRm9ybWF0ID0gbmdEYXRlRm9ybWF0O1xuICAgICAgICBmb3IgKGNvbnN0IHJlZ2V4IG9mIERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9PVEhFUikge1xuICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UocmVnZXgsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZWdleCBvZiBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfU1VQUE9SVEVEKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnByaW1lRGF0ZUZvcm1hdC5tYXRjaEFsbChyZWdleCldLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9NQVBbbWF0Y2hTdHIgYXMga2V5b2Ygb2JqZWN0XSA/PyBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyByZXBsYWNlbWVudCArIHByaW1lRGF0ZUZvcm1hdC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmltZURhdGVGb3JtYXQgPSBwcmltZURhdGVGb3JtYXQucmVwbGFjZSgvXFxzK1xcV1xccysvZywgJyAnKTtcbiAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcblxuICAgICAgICByZXR1cm4gcHJpbWVEYXRlRm9ybWF0LnRyaW0oKTtcbiAgICB9XG59XG4iXX0=
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscy9kYXRlLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLFFBQVE7YUFDTyw4QkFBeUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzFHLDBCQUFxQixHQUFHO1FBQzVDLFNBQVM7UUFDVCxTQUFTO1FBQ1QsSUFBSTtRQUNKLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO0tBQ1osQ0FBQzthQUNzQix3QkFBbUIsR0FBRztRQUMxQyxPQUFPO1FBQ1AsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLEdBQUc7UUFDUCxHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLENBQUMsRUFBRSxHQUFHO1FBQ04sRUFBRSxFQUFFLElBQUk7UUFDUixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxJQUFJO1FBQ1YsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUNYLFNBQVM7UUFDVCxDQUFDLEVBQUUsR0FBRztRQUNOLEVBQUUsRUFBRSxJQUFJO1FBQ1IsR0FBRyxFQUFFLEdBQUc7UUFDUixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxHQUFHO1FBQ1YsQ0FBQyxFQUFFLEdBQUc7UUFDTixFQUFFLEVBQUUsSUFBSTtRQUNSLEdBQUcsRUFBRSxHQUFHO1FBQ1IsSUFB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RyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUF3QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RixlQUFlLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN4STthQUNKO1NBQ0o7UUFDRCxlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxNQUFNLENBQUMsNEJBQTRCLENBQUMsWUFBb0I7UUFDM0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsK0JBQStCLENBQUMsWUFBb0I7UUFDOUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlID0gJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnO1xuZXhwb3J0IHR5cGUgdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlID0ge3V0Yz86IGJvb2xlYW47IG5vVGltZXpvbmU/OiBib29sZWFuOyBub01pbGxpcz86IGJvb2xlYW59O1xuXG5leHBvcnQgY2xhc3MgRGF0ZVV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5HX1BSSU1FX0ZPUk1BVF9TVVBQT1JURUQgPSBbL2R7MSwyfS9nLCAvRXsxLDV9L2csIC9jezEsNX0vZywgL017MSw1fS9nLCAvTHsxLDV9L2csIC95ezEsNH0vZywgL1l7MSw0fS9nXTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOR19QUklNRV9GT1JNQVRfT1RIRVIgPSBbXG4gICAgICAgIC9HezEsNX0vZyxcbiAgICAgICAgL3d7MSwyfS9nLFxuICAgICAgICAvVy9nLFxuICAgICAgICAvYXsxLDV9L2csXG4gICAgICAgIC9CezEsNX0vZyxcbiAgICAgICAgL2J7MSw1fS9nLFxuICAgICAgICAvaHsxLDJ9L2csXG4gICAgICAgIC9IezEsMn0vZyxcbiAgICAgICAgL217MSwyfS9nLFxuICAgICAgICAvc3sxLDJ9L2csXG4gICAgICAgIC9TezEsM30vZyxcbiAgICAgICAgL3p7MSw0fS9nLFxuICAgICAgICAvWnsxLDV9L2csXG4gICAgICAgIC9PezEsNH0vZ1xuICAgIF07XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTkdfUFJJTUVfRk9STUFUX01BUCA9IHtcbiAgICAgICAgLy8gZGF5c1xuICAgICAgICBkOiAnZCcsXG4gICAgICAgIGRkOiAnZGQnLFxuICAgICAgICBFOiAnRCcsXG4gICAgICAgIEVFOiAnRCcsXG4gICAgICAgIEVFRTogJ0QnLFxuICAgICAgICBFRUVFOiAnREQnLFxuICAgICAgICBFRUVFRTogJ0QnLFxuICAgICAgICBFRUVFRUU6ICdEJyxcbiAgICAgICAgYzogJ2QnLFxuICAgICAgICBjYzogJ2RkJyxcbiAgICAgICAgY2NjOiAnRCcsXG4gICAgICAgIGNjY2M6ICdERCcsXG4gICAgICAgIGNjY2NjOiAnRCcsXG4gICAgICAgIGNjY2NjYzogJ0QnLFxuICAgICAgICAvLyBtb250aHNcbiAgICAgICAgTTogJ20nLFxuICAgICAgICBNTTogJ21tJyxcbiAgICAgICAgTU1NOiAnTScsXG4gICAgICAgIE1NTU06ICdNTScsXG4gICAgICAgIE1NTU1NOiAnTScsXG4gICAgICAgIEw6ICdtJyxcbiAgICAgICAgTEw6ICdtbScsXG4gICAgICAgIExMTDogJ00nLFxuICAgICAgICBMTExMOiAnTU0nLFxuICAgICAgICBMTExMTDogJ00nLFxuICAgICAgICAvLyB5ZWFyXG4gICAgICAgIHk6ICd5JyxcbiAgICAgICAgeXk6ICd5JyxcbiAgICAgICAgeXl5OiAneXknLFxuICAgICAgICB5eXl5OiAneXknLFxuICAgICAgICBZOiAneScsXG4gICAgICAgIFlZOiAneScsXG4gICAgICAgIFlZWTogJ3l5JyxcbiAgICAgICAgWVlZWTogJ3l5J1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBwYWROdW1iZXIobnVtOiBudW1iZXIsIHNpemUgPSAyKSB7XG4gICAgICAgIGxldCBzdHIgPSBTdHJpbmcobnVtKTtcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICBzdHIgPSAnMCcgKyBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCB0eXBlPzogJ2RhdGUnKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIHR5cGU6ICdkYXRlLXRpbWUnIHwgJ2RhdGVUaW1lJywgZGF0ZVRpbWVPcHRzPzogdG9Jc29TdHJpbmdEYXRlVGltZU9wdHNUeXBlKTogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVuZGVmaW5lZCB8IG51bGwgfCB1bmtub3duLCB0eXBlPzogJ2RhdGUnKTogbnVsbDtcbiAgICBwdWJsaWMgc3RhdGljIHRvSXNvU3RyaW5nKHZhbHVlOiB1bmRlZmluZWQgfCBudWxsIHwgdW5rbm93biwgdHlwZTogJ2RhdGUtdGltZScgfCAnZGF0ZVRpbWUnLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU/OiB0b0lzb1N0cmluZ1R5cGVPcHRUeXBlLCBkYXRlVGltZU9wdHM/OiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUpOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBzdGF0aWMgdG9Jc29TdHJpbmcodmFsdWU6IHVua25vd24sIHR5cGU6IHRvSXNvU3RyaW5nVHlwZU9wdFR5cGUgPSAnZGF0ZS10aW1lJywgZGF0ZVRpbWVPcHRzOiB0b0lzb1N0cmluZ0RhdGVUaW1lT3B0c1R5cGUgPSB7fSk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIC8vIGRhdGUgb25seSwgbm8gdGltZSBwYXJ0IChhbmQgdGltZXpvbmUsIG1pbGxpcywgdXRjIGRvZXMgbm90IG1hdHRlciAuLi4pXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0RnVsbFllYXIoKSArICctJyArIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBEYXRlVXRpbC5wYWROdW1iZXIodmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLnV0Yykge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVPcHRzLm5vTWlsbGlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG90SWR4ID0gc3RyLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZygwLCBkb3RJZHgpICsgc3RyLnN1YnN0cmluZyhkb3RJZHggKyA0LCBzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlVGltZU9wdHMubm9UaW1lem9uZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiYXNlID1cbiAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGdWxsWWVhcigpICtcbiAgICAgICAgICAgICAgICAnLScgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgICAgICAgICAgICctJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldERhdGUoKSkgK1xuICAgICAgICAgICAgICAgICdUJyArXG4gICAgICAgICAgICAgICAgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldEhvdXJzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIERhdGVVdGlsLnBhZE51bWJlcih2YWx1ZS5nZXRTZWNvbmRzKCkpO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGVUaW1lT3B0cy5ub01pbGxpcykge1xuICAgICAgICAgICAgICAgIGJhc2UgKz0gJy4nICsgRGF0ZVV0aWwucGFkTnVtYmVyKHZhbHVlLmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGF0ZVRpbWVPcHRzLm5vVGltZXpvbmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0em8gPSAtdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgZGlmID0gdHpvID49IDAgPyAnKycgOiAnLSc7XG5cbiAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIChkaWYgKyBEYXRlVXRpbC5wYWROdW1iZXIoTWF0aC5mbG9vcihNYXRoLmFicyh0em8pIC8gNjApKSArICc6JyArIERhdGVVdGlsLnBhZE51bWJlcihNYXRoLmFicyh0em8pICUgNjApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Bbmd1bGFyVG9QcmltZURhdGVGb3JtYXQobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcHJpbWVEYXRlRm9ybWF0ID0gbmdEYXRlRm9ybWF0O1xuICAgICAgICBmb3IgKGNvbnN0IHJlZ2V4IG9mIERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9PVEhFUikge1xuICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UocmVnZXgsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByZWdleCBvZiBEYXRlVXRpbC5OR19QUklNRV9GT1JNQVRfU1VQUE9SVEVEKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gWy4uLnByaW1lRGF0ZUZvcm1hdC5tYXRjaEFsbChyZWdleCldLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaFN0ciA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IERhdGVVdGlsLk5HX1BSSU1FX0ZPUk1BVF9NQVBbbWF0Y2hTdHIgYXMga2V5b2Ygb2JqZWN0XSA/PyBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCkgKyByZXBsYWNlbWVudCArIHByaW1lRGF0ZUZvcm1hdC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmltZURhdGVGb3JtYXQgPSBwcmltZURhdGVGb3JtYXQucmVwbGFjZSgvXFxzK1xcV1xccysvZywgJyAnKTtcbiAgICAgICAgcHJpbWVEYXRlRm9ybWF0ID0gcHJpbWVEYXRlRm9ybWF0LnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcblxuICAgICAgICByZXR1cm4gcHJpbWVEYXRlRm9ybWF0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Bbmd1bGFyRGF0ZUZvcm1hdEhhc1RpbWUobmdEYXRlRm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9baEhtc1NdLy50ZXN0KG5nRGF0ZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQW5ndWxhckRhdGVGb3JtYXRIYXNTZWNvbmRzKG5nRGF0ZUZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAvW3NTXS8udGVzdChuZ0RhdGVGb3JtYXQpO1xuICAgIH1cbn1cbiJdfQ==