@mediusinc/mng-commons 5.0.0-rc.0 → 5.0.0-rc.2

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 (273) hide show
  1. package/core/data-list/data-list-params-helpers.d.ts +82 -0
  2. package/core/descriptors/action.descriptor.d.ts +3 -3
  3. package/core/descriptors/column.descriptor.d.ts +1 -1
  4. package/core/descriptors/editor.descriptor.d.ts +6 -6
  5. package/core/descriptors/enum.descriptor.d.ts +6 -0
  6. package/core/descriptors/filter.descriptor.d.ts +1 -1
  7. package/core/descriptors/model.descriptor.d.ts +1 -1
  8. package/core/descriptors/table.descriptor.d.ts +6 -6
  9. package/core/descriptors/tableview.descriptor.d.ts +10 -10
  10. package/core/enum/enum-helpers.d.ts +49 -0
  11. package/core/error/error-helpers.d.ts +114 -0
  12. package/core/helpers/date.d.ts +14 -0
  13. package/core/helpers/object.d.ts +27 -0
  14. package/core/helpers/route.d.ts +35 -0
  15. package/core/helpers/string.d.ts +7 -0
  16. package/core/helpers/templates.d.ts +3 -0
  17. package/core/i18n/i18n-common.d.ts +6 -0
  18. package/core/i18n/i18n-error.d.ts +4 -0
  19. package/core/i18n/i18n-type.d.ts +20 -0
  20. package/core/index.d.ts +15 -9
  21. package/{model → core}/pipes/enum.pipe.d.ts +2 -2
  22. package/core/pipes/enumerate.pipe.d.ts +3 -3
  23. package/{model → core}/pipes/i18n-property.pipe.d.ts +2 -2
  24. package/core/pipes/template.pipe.d.ts +0 -2
  25. package/core/router/route-builder.d.ts +151 -30
  26. package/core/router/routes-builder.d.ts +29 -15
  27. package/core/security/permission-helpers.d.ts +3 -0
  28. package/core/security/permissions.model.d.ts +2 -2
  29. package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
  30. package/esm2022/core/components/pages/error/error.page.component.mjs +3 -3
  31. package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +3 -3
  32. package/esm2022/core/data-list/data-list-params-helpers.mjs +415 -0
  33. package/esm2022/core/data-list/filter-match.model.mjs +1 -1
  34. package/esm2022/core/data-providers/base.data-provider.mjs +1 -1
  35. package/esm2022/core/descriptors/action.descriptor.mjs +1 -1
  36. package/esm2022/core/descriptors/column.descriptor.mjs +1 -1
  37. package/esm2022/core/descriptors/editor.descriptor.mjs +1 -1
  38. package/esm2022/core/descriptors/enum.descriptor.mjs +2 -0
  39. package/esm2022/core/descriptors/filter.descriptor.mjs +1 -1
  40. package/esm2022/core/descriptors/model.descriptor.mjs +1 -1
  41. package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
  42. package/esm2022/core/descriptors/tableview.descriptor.mjs +1 -1
  43. package/esm2022/core/directives/component.directive.mjs +4 -4
  44. package/esm2022/core/directives/dialog-keydown-handler.directive.mjs +4 -4
  45. package/esm2022/core/directives/template.directive.mjs +3 -3
  46. package/esm2022/core/enum/enum-helpers.mjs +81 -0
  47. package/esm2022/core/error/error-handler.mjs +3 -3
  48. package/esm2022/core/error/error-helpers.mjs +247 -0
  49. package/esm2022/core/helpers/coercion.mjs +1 -1
  50. package/esm2022/core/helpers/date.mjs +119 -0
  51. package/esm2022/core/helpers/object.mjs +145 -0
  52. package/esm2022/core/helpers/route.mjs +58 -0
  53. package/esm2022/core/helpers/string.mjs +57 -0
  54. package/esm2022/core/helpers/templates.mjs +4 -0
  55. package/esm2022/core/i18n/i18n-common.mjs +24 -0
  56. package/esm2022/core/i18n/i18n-error.mjs +27 -0
  57. package/esm2022/core/i18n/i18n-type.mjs +79 -0
  58. package/esm2022/core/index.mjs +17 -11
  59. package/esm2022/core/log/log-publisher-console.service.mjs +3 -3
  60. package/esm2022/core/log/logger.service.mjs +3 -3
  61. package/esm2022/core/pipes/boolean.pipe.mjs +4 -4
  62. package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
  63. package/esm2022/core/pipes/enum.pipe.mjs +27 -0
  64. package/esm2022/core/pipes/enumerate-async.pipe.mjs +8 -8
  65. package/esm2022/core/pipes/enumerate.pipe.mjs +10 -10
  66. package/esm2022/core/pipes/getter.pipe.mjs +4 -4
  67. package/esm2022/core/pipes/i18n-property.pipe.mjs +19 -0
  68. package/esm2022/core/pipes/json-path.pipe.mjs +6 -6
  69. package/esm2022/core/pipes/parametrize.pipe.mjs +6 -6
  70. package/esm2022/core/pipes/template.pipe.mjs +7 -8
  71. package/esm2022/core/provide.mjs +1 -21
  72. package/esm2022/core/reflect/type-enum-metadata.mjs +1 -1
  73. package/esm2022/core/registry/type-registry.mjs +1 -1
  74. package/esm2022/core/router/route-builder.mjs +218 -107
  75. package/esm2022/core/router/routes-builder.mjs +42 -43
  76. package/esm2022/core/security/permission-helpers.mjs +14 -0
  77. package/esm2022/core/security/permission.guard.mjs +1 -1
  78. package/esm2022/core/security/permission.service.mjs +6 -6
  79. package/esm2022/core/security/permissions.model.mjs +1 -1
  80. package/esm2022/core/services/commons-configuration.service.mjs +6 -6
  81. package/esm2022/core/services/commons-init.service.mjs +4 -4
  82. package/esm2022/core/services/commons-router.service.mjs +4 -4
  83. package/esm2022/core/services/commons.service.mjs +4 -4
  84. package/esm2022/core/services/local-storage-config.service.mjs +4 -4
  85. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +9 -10
  86. package/esm2022/filter/descriptors/filter.descriptor.mjs +1 -1
  87. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +1 -1
  88. package/esm2022/form/api/descriptors/button-style.builder.mjs +1 -1
  89. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +39 -45
  90. package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
  91. package/esm2022/form/components/dropdown/dropdown.component.mjs +7 -7
  92. package/esm2022/form/directives/input-trim.directive.mjs +4 -4
  93. package/esm2022/model/descriptors/enum.descriptor.mjs +1 -1
  94. package/esm2022/model/descriptors/model.descriptor.mjs +4 -4
  95. package/esm2022/model/helpers/i18n.mjs +45 -0
  96. package/esm2022/model/helpers/model.mjs +71 -0
  97. package/esm2022/model/index.mjs +4 -7
  98. package/esm2022/table/api/data-providers/table.data-provider.mjs +1 -1
  99. package/esm2022/table/api/descriptors/column.descriptor.mjs +1 -1
  100. package/esm2022/table/api/descriptors/table.descriptor.mjs +36 -8
  101. package/esm2022/table/api/helpers/class-attribute-converter.mjs +1 -1
  102. package/esm2022/table/components/column-filter-full/column-filter-full.component.mjs +9 -9
  103. package/esm2022/table/components/column-value/column-value.component.mjs +12 -14
  104. package/esm2022/table/components/table/table.component.mjs +20 -37
  105. package/esm2022/table/helpers/notification.mjs +4 -4
  106. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
  107. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
  108. package/esm2022/table/services/data-list.service.mjs +3 -3
  109. package/esm2022/tableview/action/components/action/action.component.mjs +9 -9
  110. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
  111. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +22 -21
  112. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +3 -3
  113. package/esm2022/tableview/action/components/route/action-route.component.mjs +6 -5
  114. package/esm2022/tableview/action/components/table/action-table.component.mjs +12 -24
  115. package/esm2022/tableview/action/helpers/i18n.mjs +82 -0
  116. package/esm2022/tableview/action/helpers/notification.mjs +8 -8
  117. package/esm2022/tableview/action/helpers/styles.mjs +1 -1
  118. package/esm2022/tableview/action/models/execution/action-context.model.mjs +1 -1
  119. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +1 -1
  120. package/esm2022/tableview/action/services/action-error-mapper.service.mjs +1 -1
  121. package/esm2022/tableview/action/services/action-executor.service.mjs +10 -9
  122. package/esm2022/tableview/action/services/component-action-executor.service.mjs +3 -3
  123. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +3 -3
  124. package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
  125. package/esm2022/tableview/action/services/providers/provide-view-container.mjs +1 -1
  126. package/esm2022/tableview/action/services/root-action-executor.service.mjs +3 -3
  127. package/esm2022/tableview/action/services/view-container.service.mjs +3 -3
  128. package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +1 -1
  129. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +9 -1
  130. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +1 -1
  131. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +1 -1
  132. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +1 -1
  133. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +1 -1
  134. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +21 -32
  135. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +1 -1
  136. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +3 -3
  137. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +3 -3
  138. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +8 -8
  139. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +1 -1
  140. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +1 -1
  141. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +39 -10
  142. package/esm2022/tableview/api/editor/helpers/class-attribute-converter.mjs +1 -1
  143. package/esm2022/tableview/api/editor/helpers/field-validators.mjs +15 -25
  144. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +1 -1
  145. package/esm2022/tableview/api/editor/models/field.model.mjs +1 -1
  146. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
  147. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +1 -1
  148. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +3 -3
  149. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +1 -1
  150. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +1 -1
  151. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +15 -22
  152. package/esm2022/tableview/api/tableview/helpers/class-attribute-converter.mjs +1 -1
  153. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +1 -1
  154. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +4 -4
  155. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +1 -1
  156. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +158 -138
  157. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
  158. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -7
  159. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +3 -3
  160. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +103 -0
  161. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +5 -7
  162. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +3 -3
  163. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +33 -50
  164. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +3 -3
  165. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +8 -10
  166. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +6 -8
  167. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +19 -18
  168. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +3 -3
  169. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
  170. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
  171. package/esm2022/tableview/editor/helpers/editor-formly.mjs +343 -0
  172. package/esm2022/tableview/editor/helpers/formly-config.mjs +5 -3
  173. package/esm2022/tableview/editor/models/formly-config.model.mjs +1 -1
  174. package/esm2022/tableview/editor/services/formly-config.provider.mjs +1 -1
  175. package/esm2022/tableview/index.mjs +3 -5
  176. package/esm2022/tableview/provide.mjs +2 -1
  177. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +10 -10
  178. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +30 -56
  179. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +17 -43
  180. package/fesm2022/mediusinc-mng-commons-core.mjs +1599 -1496
  181. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  182. package/fesm2022/mediusinc-mng-commons-filter.mjs +8 -9
  183. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  184. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  185. package/fesm2022/mediusinc-mng-commons-form.mjs +51 -56
  186. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  187. package/fesm2022/mediusinc-mng-commons-model.mjs +99 -148
  188. package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
  189. package/fesm2022/mediusinc-mng-commons-table-api.mjs +35 -7
  190. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  191. package/fesm2022/mediusinc-mng-commons-table.mjs +48 -65
  192. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  193. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +105 -96
  194. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  195. package/fesm2022/mediusinc-mng-commons-tableview.mjs +865 -868
  196. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  197. package/filter/descriptors/filter.descriptor.d.ts +2 -2
  198. package/form/components/autocomplete/autocomplete.component.d.ts +8 -7
  199. package/model/descriptors/model.descriptor.d.ts +2 -2
  200. package/model/helpers/i18n.d.ts +10 -0
  201. package/model/helpers/model.d.ts +5 -0
  202. package/model/index.d.ts +2 -4
  203. package/package.json +7 -7
  204. package/table/api/descriptors/table.descriptor.d.ts +10 -0
  205. package/table/components/column-value/column-value.component.d.ts +3 -4
  206. package/table/components/table/table.component.d.ts +13 -13
  207. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +1 -3
  208. package/tableview/action/components/route/action-route.component.d.ts +1 -1
  209. package/tableview/action/components/table/action-table.component.d.ts +6 -6
  210. package/tableview/action/helpers/i18n.d.ts +22 -0
  211. package/tableview/action/models/execution/action-instance-state.model.d.ts +21 -21
  212. package/tableview/action/models/execution/action-instance.model.d.ts +2 -1
  213. package/tableview/action/services/action-executor.service.d.ts +1 -1
  214. package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +9 -1
  215. package/tableview/api/action/descriptors/action.descriptor.d.ts +3 -3
  216. package/tableview/api/action/models/action.type.d.ts +2 -2
  217. package/tableview/api/action/models/execution/action-instance-state.model.d.ts +21 -21
  218. package/tableview/api/action/models/execution/action-instance.model.d.ts +2 -1
  219. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +16 -21
  220. package/tableview/api/editor/descriptors/field-action.descriptor.d.ts +2 -2
  221. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +29 -29
  222. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +9 -9
  223. package/tableview/api/editor/descriptors/field-lookup.descriptor.d.ts +4 -4
  224. package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +4 -4
  225. package/tableview/api/editor/descriptors/field-validation.descriptor.d.ts +10 -13
  226. package/tableview/api/editor/descriptors/field.descriptor.d.ts +17 -2
  227. package/tableview/api/editor/helpers/field-validators.d.ts +6 -2
  228. package/tableview/api/editor/models/editor-fields.model.d.ts +9 -7
  229. package/tableview/api/editor/models/field.model.d.ts +16 -7
  230. package/tableview/api/editor/models/form-editor.event.d.ts +6 -4
  231. package/tableview/api/editor/models/form-editor.interface.d.ts +37 -8
  232. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  233. package/tableview/api/editor/models/formly-field.model.d.ts +9 -7
  234. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +8 -9
  235. package/tableview/editor/components/editor/form-editor.component.d.ts +51 -35
  236. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +22 -0
  237. package/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.d.ts +5 -7
  238. package/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +0 -1
  239. package/tableview/editor/helpers/editor-formly.d.ts +11 -0
  240. package/tableview/editor/models/formly-config.model.d.ts +1 -1
  241. package/tableview/index.d.ts +2 -2
  242. package/tableview/tableview/components/route/tableview-route.component.d.ts +2 -2
  243. package/tableview/tableview/components/tableview/tableview.component.d.ts +16 -15
  244. package/tableview/tableview/router/tableview-route-builder.d.ts +7 -13
  245. package/version-info.json +11 -0
  246. package/core/data-list/data-list-params.util.d.ts +0 -84
  247. package/core/enum/enum.util.d.ts +0 -51
  248. package/core/error/error.util.d.ts +0 -116
  249. package/core/security/permission.util.d.ts +0 -5
  250. package/core/utils/date.util.d.ts +0 -20
  251. package/core/utils/i18n.util.d.ts +0 -36
  252. package/core/utils/object.util.d.ts +0 -31
  253. package/core/utils/route.util.d.ts +0 -37
  254. package/core/utils/string.util.d.ts +0 -9
  255. package/esm2022/core/data-list/data-list-params.util.mjs +0 -417
  256. package/esm2022/core/enum/enum.util.mjs +0 -83
  257. package/esm2022/core/error/error.util.mjs +0 -249
  258. package/esm2022/core/security/permission.util.mjs +0 -16
  259. package/esm2022/core/utils/date.util.mjs +0 -136
  260. package/esm2022/core/utils/i18n.util.mjs +0 -137
  261. package/esm2022/core/utils/object.util.mjs +0 -147
  262. package/esm2022/core/utils/route.util.mjs +0 -60
  263. package/esm2022/core/utils/string.util.mjs +0 -59
  264. package/esm2022/model/pipes/enum.pipe.mjs +0 -26
  265. package/esm2022/model/pipes/i18n-property.pipe.mjs +0 -19
  266. package/esm2022/model/utils/i18n.util.mjs +0 -51
  267. package/esm2022/model/utils/model.util.mjs +0 -73
  268. package/esm2022/tableview/action/utils/i18n.util.mjs +0 -126
  269. package/esm2022/tableview/editor/utils/editor-formly.util.mjs +0 -337
  270. package/model/utils/i18n.util.d.ts +0 -15
  271. package/model/utils/model.util.d.ts +0 -8
  272. package/tableview/action/utils/i18n.util.d.ts +0 -48
  273. package/tableview/editor/utils/editor-formly.util.d.ts +0 -12
@@ -1,6 +1,5 @@
1
- import { CommonsInternalError } from '../error/error.model';
1
+ import { removeRouteEmptyPathSegments } from '../helpers/route';
2
2
  import { permissionGuard } from '../security/permission.guard';
3
- import { RouteUtil } from '../utils/route.util';
4
3
  export class RouteBuilder {
5
4
  constructor(route) {
6
5
  this.routePath = [];
@@ -13,89 +12,95 @@ export class RouteBuilder {
13
12
  this.routePath = [this.route.path];
14
13
  }
15
14
  }
16
- static create(path, component) {
17
- return new RouteBuilder({
18
- path: path,
19
- component: component
20
- });
21
- }
22
- static createRedirect(path, redirectTo, pathMatch = 'prefix') {
23
- return new RouteBuilder({
24
- path: path,
25
- redirectTo: redirectTo,
26
- pathMatch: pathMatch
27
- });
28
- }
29
- static createLazyRouteModule(path, loadChildren, canMatch) {
30
- const route = { path: path, loadChildren: loadChildren };
31
- if (canMatch?.length) {
32
- route.canMatch = canMatch;
33
- }
34
- return new RouteBuilder(route);
35
- }
36
- static createLazyRouteComponent(path, loadComponent, canMatch) {
37
- const route = { path: path, loadComponent: loadComponent };
38
- if (canMatch?.length) {
39
- route.canMatch = canMatch;
40
- }
41
- return new RouteBuilder(route);
42
- }
43
- static createFromRoute(route) {
44
- return new RouteBuilder(route);
45
- }
15
+ /**
16
+ * Sets the link to root Routes builder.
17
+ *
18
+ * @param {RoutesBuilder} routesBuilder - The routes builder to set as the root.
19
+ */
46
20
  withRoot(routesBuilder) {
47
21
  this.root = routesBuilder;
48
22
  return this;
49
23
  }
24
+ /**
25
+ * Sets the link to parent Route builder.
26
+ *
27
+ * @param {RouteBuilder} parent - The parent route builder.
28
+ */
50
29
  withParent(parent) {
51
30
  this.parent = parent;
52
- this.routePath = RouteUtil.removeEmptyPathSegments([...this.parent.routePath, this.route.path ?? '']);
31
+ this.routePath = removeRouteEmptyPathSegments([...this.parent.routePath, this.route.path ?? '']);
53
32
  return this;
54
33
  }
34
+ /**
35
+ * Sets the breadcrumb.
36
+ *
37
+ * @param {BreadcrumbType} breadcrumb - Breadcrumb configuration.
38
+ */
55
39
  withBreadcrumb(breadcrumb) {
56
- this.breadcrumb = breadcrumb;
57
40
  this.routeData.breadcrumb = breadcrumb;
58
41
  return this;
59
42
  }
43
+ /**
44
+ * Sets the page title for the current route.
45
+ *
46
+ * @param {string} pageTitle - The title of the page.
47
+ */
60
48
  withPageTitle(pageTitle) {
61
- this.pageTitle = pageTitle;
62
49
  this.routeData.pageTitle = pageTitle;
63
50
  return this;
64
51
  }
65
- withRedirectTo(redirectTo) {
66
- this.route.redirectTo = redirectTo;
67
- return this;
68
- }
69
- withPathMatch(pathMatch) {
70
- this.route.pathMatch = pathMatch;
71
- return this;
72
- }
52
+ /**
53
+ * Sets the page title and the breadcrumb.
54
+ *
55
+ * @param {string} title - The title of the page and breadcrumb.
56
+ */
73
57
  withTitle(title) {
74
58
  this.withPageTitle(title);
75
59
  this.withBreadcrumb(title);
76
60
  return this;
77
61
  }
78
- withCanActivate(diToken) {
62
+ /**
63
+ * Adds a can activate guard to route.
64
+ *
65
+ * @param {CanActivateFn} fn - The CanActivate function to be added.
66
+ */
67
+ withCanActivate(fn) {
79
68
  if (!this.route.canActivate) {
80
69
  this.route.canActivate = [];
81
70
  }
82
- this.route.canActivate.push(diToken);
71
+ this.route.canActivate.push(fn);
83
72
  return this;
84
73
  }
85
- withCanDeactivate(diToken) {
74
+ /**
75
+ * Adds a can deactivate guard to route.
76
+ *
77
+ * @param {CanDeactivateFn} fn - The CanActivate function to be added.
78
+ */
79
+ withCanDeactivate(fn) {
86
80
  if (!this.route.canDeactivate) {
87
81
  this.route.canDeactivate = [];
88
82
  }
89
- this.route.canDeactivate.push(diToken);
83
+ this.route.canDeactivate.push(fn);
90
84
  return this;
91
85
  }
92
- withResolver(diToken, name) {
86
+ /**
87
+ * Adds a resolver to route.
88
+ *
89
+ * @param {string} name - Name of the resolver.
90
+ * @param {CanDeactivateFn} fn - The CanActivate function to be added.
91
+ */
92
+ withResolver(name, fn) {
93
93
  if (!this.route.resolve) {
94
94
  this.route.resolve = {};
95
95
  }
96
- this.route.resolve[name] = diToken;
96
+ this.route.resolve[name] = fn;
97
97
  return this;
98
98
  }
99
+ /**
100
+ * Adds a provider to the route.
101
+ *
102
+ * @param {Provider | EnvironmentProviders} provider - The provider to add.
103
+ */
99
104
  withProvider(provider) {
100
105
  if (!this.route.providers) {
101
106
  this.route.providers = [];
@@ -103,19 +108,49 @@ export class RouteBuilder {
103
108
  this.route.providers.push(provider);
104
109
  return this;
105
110
  }
106
- withData(data) {
107
- if (!data.breadcrumb) {
108
- data.breadcrumb = null;
109
- }
110
- this.routeData = data;
111
+ /**
112
+ * Sets the data for the route.
113
+ *
114
+ * @param {CommonsRouteData} data - The data to set for the route.
115
+ * @param {boolean} [merge=true] - If the data should be merged with current data setup (true by default) - page title and breadcrumb config are carried over.
116
+ */
117
+ withData(data, merge = true) {
118
+ this.routeData = merge
119
+ ? {
120
+ ...this.routeData,
121
+ ...data
122
+ }
123
+ : {
124
+ breadcrumb: null,
125
+ ...data
126
+ };
111
127
  return this;
112
128
  }
113
- withCommonsMenuItem(menuItem) {
114
- this.menuItem = menuItem;
129
+ /**
130
+ * Updates the menu item of route. Merging with current configuration (set with {withMenuItem}) takes place.
131
+ *
132
+ * @param {CommonsMenuItem} opts - The opts properties to be merged on existing menu item for route.
133
+ */
134
+ withMenuItemOpts(opts) {
135
+ if (!this.menuItem) {
136
+ this.menuItem = {};
137
+ }
138
+ this.menuItem = {
139
+ ...this.menuItem,
140
+ ...opts
141
+ };
115
142
  return this;
116
143
  }
144
+ /**
145
+ * Sets the menu item (basic). For more options, see the {withMenuItemFromOpts}.
146
+ *
147
+ * @param {string} [icon] - The icon for the menu item.
148
+ * @param {string} [label] - The label for the menu item.
149
+ * @param {Array<string>} [routerLink] - The router link for the menu item.
150
+ * @param {boolean} [breadcrumb=false] - Indicates whether to display breadcrumb for the menu item.
151
+ */
117
152
  withMenuItem(icon, label, routerLink, breadcrumb = false) {
118
- this.menuItem = this.createMenuItem(icon, label, routerLink);
153
+ this.menuItem = createMenuItem(icon, label, routerLink);
119
154
  if (breadcrumb && label) {
120
155
  this.withBreadcrumb({
121
156
  label: label
@@ -124,35 +159,40 @@ export class RouteBuilder {
124
159
  return this;
125
160
  }
126
161
  /**
127
- * Adds menu item child to this instance of menu item.
128
- * @param label Label.
129
- * @param icon Icon.
130
- * @param routerLink Router link.
131
- * @param afterRouteChildren If false, menu item child will be appended before route children menu items, at the end otherwise.
162
+ * Adds menu item child to route's menu item. If no menu item is present, children will be appended directly to parent/root menu item.
163
+ *
164
+ * @param {string} [icon] - The icon for the menu item.
165
+ * @param {string} [label] - The label for the menu item.
166
+ * @param {Array<string>} [routerLink] - The router link for the menu item.
167
+ * @param {boolean} [afterRouteChildren=false] If false, menu item child will be appended before route's children menu items, at the end otherwise.
132
168
  */
133
- withMenuItemChild(label, icon, routerLink, afterRouteChildren = false) {
169
+ withMenuItemChild(icon, label, routerLink, afterRouteChildren = false) {
134
170
  if (afterRouteChildren) {
135
- this.menuItemChildrenAfter.push(this.createMenuItem(icon, label, routerLink));
171
+ this.menuItemChildrenAfter.push(createMenuItem(icon, label, routerLink));
136
172
  }
137
173
  else {
138
- this.menuItemChildren.push(this.createMenuItem(icon, label, routerLink));
174
+ this.menuItemChildren.push(createMenuItem(icon, label, routerLink));
139
175
  }
140
176
  return this;
141
177
  }
142
178
  /**
143
- * Adds menu item child to this instance of menu item.
144
- * @param menuItem Configuration object for menu item.
145
- * @param afterRouteChildren If false, menu item child will be appended before route children menu items, at the end otherwise.
179
+ * Adds menu item child from opts to route's menu item. If no menu item is present, children will be appended directly to parent/root menu item.
180
+ *
181
+ * @param {CommonsMenuItem} opts - The opts properties to be merged on existing menu item for route.
182
+ * @param {boolean} [afterRouteChildren=false] If false, menu item child will be appended before route's children menu items, at the end otherwise.
146
183
  */
147
- withCommonsMenuItemChild(menuItem, afterRouteChildren = false) {
184
+ withMenuItemChildFromOpts(opts, afterRouteChildren = false) {
148
185
  if (afterRouteChildren) {
149
- this.menuItemChildrenAfter.push(menuItem);
186
+ this.menuItemChildrenAfter.push(opts);
150
187
  }
151
188
  else {
152
- this.menuItemChildren.push(menuItem);
189
+ this.menuItemChildren.push(opts);
153
190
  }
154
191
  return this;
155
192
  }
193
+ /**
194
+ * Sets the menu item's children to be generated lazily from route's lazy loaded routes after the chunk is loaded to runtime.
195
+ */
156
196
  withMenuItemLazyChildren() {
157
197
  if (!this.menuItem) {
158
198
  this.menuItem = {};
@@ -160,16 +200,34 @@ export class RouteBuilder {
160
200
  this.menuItem.lazyChildren = true;
161
201
  return this;
162
202
  }
203
+ /**
204
+ * Sets the permissions on the route.
205
+ *
206
+ * @param {APermissions} permissions - The permissions to be set on the route.
207
+ */
163
208
  withPermissions(permissions) {
164
209
  this.permissions = permissions;
165
210
  this.withCanActivate(permissionGuard);
166
211
  return this;
167
212
  }
168
- addChild(path, component) {
169
- const childRouteBuilder = RouteBuilder.create(path, component);
170
- this.addChildBuilder(childRouteBuilder);
171
- return childRouteBuilder;
213
+ /**
214
+ * Adds a child route to the current route.
215
+ *
216
+ * @param {string} path - The path of the child route.
217
+ * @param {Type<any>} component - The component associated with the child route.
218
+ * @param {RouteBuilderAdjustFnType} [adjustFn] - An optional function to adjust the child route builder.
219
+ */
220
+ addChild(path, component, adjustFn) {
221
+ const childRouteBuilder = createRoute(path, component);
222
+ adjustFn?.(childRouteBuilder);
223
+ return this.addChildBuilder(childRouteBuilder);
172
224
  }
225
+ /**
226
+ * Adds a child builder to the current route.
227
+ *
228
+ * @param {RouteBuilder} builder - The child builder to be added.
229
+ * @return {this} - The current builder with the added child builder.
230
+ */
173
231
  addChildBuilder(builder) {
174
232
  builder.withParent(this);
175
233
  if (this.root) {
@@ -178,21 +236,11 @@ export class RouteBuilder {
178
236
  this.children.push(builder);
179
237
  return this;
180
238
  }
181
- toParent() {
182
- if (!this.parent) {
183
- throw new CommonsInternalError('Parent was not provided.', { name: 'RouteBuilder error' });
184
- }
185
- return this.parent;
186
- }
187
- toRoot() {
188
- if (!this.root) {
189
- throw new CommonsInternalError('Root was not provided.', { name: 'RouteBuilderError' });
190
- }
191
- return this.root;
192
- }
193
- finish() {
194
- return this.toRoot();
195
- }
239
+ /**
240
+ * Builds an Angular route based on configurations.
241
+ *
242
+ * @returns {Route} The built Angular route.
243
+ */
196
244
  build() {
197
245
  const angularRoute = {
198
246
  ...this.route
@@ -243,6 +291,11 @@ export class RouteBuilder {
243
291
  }
244
292
  return angularRoute;
245
293
  }
294
+ /**
295
+ * Builds the menu items.
296
+ *
297
+ * @returns {Array<CommonsMenuItem>} - The built menu items.
298
+ */
246
299
  buildMenu() {
247
300
  const menuItemBuild = this.menuItem ? { ...this.menuItem } : null;
248
301
  const routeChildrenMenuItems = this.children.flatMap(child => child.buildMenu());
@@ -260,7 +313,7 @@ export class RouteBuilder {
260
313
  finalChild.routerLink = [finalChild.routerLink];
261
314
  }
262
315
  if (finalChild.routerLink) {
263
- finalChild.routerLink = RouteUtil.removeEmptyPathSegments(finalChild.routerLink);
316
+ finalChild.routerLink = removeRouteEmptyPathSegments(finalChild.routerLink);
264
317
  }
265
318
  return finalChild;
266
319
  };
@@ -270,11 +323,11 @@ export class RouteBuilder {
270
323
  if (!menuItemBuild) {
271
324
  return menuItemChildrenBuild;
272
325
  }
273
- menuItemBuild.label = menuItemBuild.label ?? this.pageTitle;
326
+ menuItemBuild.label = menuItemBuild.label ?? this.routeData.pageTitle;
274
327
  if (typeof menuItemBuild.routerLink === 'string') {
275
328
  menuItemBuild.routerLink = [menuItemBuild.routerLink];
276
329
  }
277
- menuItemBuild.routerLink = RouteUtil.removeEmptyPathSegments(menuItemBuild.routerLink ?? this.routePath);
330
+ menuItemBuild.routerLink = removeRouteEmptyPathSegments(menuItemBuild.routerLink ?? this.routePath);
278
331
  if (menuItemChildrenBuild.length > 0) {
279
332
  menuItemBuild.items = menuItemChildrenBuild;
280
333
  }
@@ -289,19 +342,6 @@ export class RouteBuilder {
289
342
  }
290
343
  return [menuItemBuild];
291
344
  }
292
- createMenuItem(icon, label, routerLink) {
293
- const menuItem = {};
294
- if (icon) {
295
- menuItem.icon = icon;
296
- }
297
- if (label) {
298
- menuItem.label = label;
299
- }
300
- if (routerLink) {
301
- menuItem.routerLink = routerLink;
302
- }
303
- return menuItem;
304
- }
305
345
  findMenuItemGuards() {
306
346
  const guards = [];
307
347
  if (this.route.canActivate?.length) {
@@ -333,4 +373,75 @@ export class RouteBuilder {
333
373
  return undefined;
334
374
  }
335
375
  }
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc3JjL3JvdXRlci9yb3V0ZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFJOUMsTUFBTSxPQUFPLFlBQVk7SUFpQnJCLFlBQXNCLEtBQVk7UUFmMUIsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDNUIsY0FBUyxHQUFxQixFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUduRCxhQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUduQyxxQkFBZ0IsR0FBMkIsRUFBRSxDQUFDO1FBQzlDLDBCQUFxQixHQUEyQixFQUFFLENBQUMsQ0FBQyw4QkFBOEI7UUFRdEYsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBWSxFQUFFLFNBQW9CO1FBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUM7WUFDcEIsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFZLEVBQUUsVUFBa0IsRUFBRSxZQUErQixRQUFRO1FBQ2xHLE9BQU8sSUFBSSxZQUFZLENB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QUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQzVCLHdCQUF3QjtZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUMzQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RW52aXJvbm1lbnRQcm92aWRlcnMsIFByb3ZpZGVyLCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q2FuQWN0aXZhdGVGbiwgQ2FuRGVhY3RpdmF0ZUZuLCBEZWZhdWx0RXhwb3J0LCBMb2FkQ2hpbGRyZW4sIFJlc29sdmVGbiwgUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7Q29tbW9uc0ludGVybmFsRXJyb3J9IGZyb20gJy4uL2Vycm9yL2Vycm9yLm1vZGVsJztcbmltcG9ydCB7Q29tbW9uc01lbnVJdGVtfSBmcm9tICcuLi9tb2RlbHMvbWVudS5tb2RlbCc7XG5pbXBvcnQge3Blcm1pc3Npb25HdWFyZH0gZnJvbSAnLi4vc2VjdXJpdHkvcGVybWlzc2lvbi5ndWFyZCc7XG5pbXBvcnQge0FQZXJtaXNzaW9uc30gZnJvbSAnLi4vc2VjdXJpdHkvcGVybWlzc2lvbnMubW9kZWwnO1xuaW1wb3J0IHtSb3V0ZVV0aWx9IGZyb20gJy4uL3V0aWxzL3JvdXRlLnV0aWwnO1xuaW1wb3J0IHtCcmVhZGNydW1iVHlwZSwgQ29tbW9uc1JvdXRlRGF0YX0gZnJvbSAnLi9yb3V0ZXIubW9kZWwnO1xuaW1wb3J0IHtSb3V0ZXNCdWlsZGVyfSBmcm9tICcuL3JvdXRlcy1idWlsZGVyJztcblxuZXhwb3J0IGNsYXNzIFJvdXRlQnVpbGRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvdXRlOiBSb3V0ZTtcbiAgICBwcml2YXRlIHJvdXRlUGF0aDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByb3RlY3RlZCByb3V0ZURhdGE6IENvbW1vbnNSb3V0ZURhdGEgPSB7YnJlYWRjcnVtYjogbnVsbH07XG4gICAgcHJpdmF0ZSByb290PzogUm91dGVzQnVpbGRlcjtcbiAgICBwcml2YXRlIHBhcmVudD86IFJvdXRlQnVpbGRlcjtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiBBcnJheTxSb3V0ZUJ1aWxkZXI+ID0gW107XG5cbiAgICBwcml2YXRlIG1lbnVJdGVtPzogQ29tbW9uc01lbnVJdGVtO1xuICAgIHByaXZhdGUgbWVudUl0ZW1DaGlsZHJlbjogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiA9IFtdO1xuICAgIHByaXZhdGUgbWVudUl0ZW1DaGlsZHJlbkFmdGVyOiBBcnJheTxDb21tb25zTWVudUl0ZW0+ID0gW107IC8vIGFwcGVuZCBhZnRlciByb3V0ZSBjaGlsZHJlblxuXG4gICAgcHJpdmF0ZSBicmVhZGNydW1iPzogQnJlYWRjcnVtYlR5cGU7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGU/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogQVBlcm1pc3Npb25zO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJvdXRlOiBSb3V0ZSkge1xuICAgICAgICB0aGlzLnJvdXRlID0gcm91dGU7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnBhdGggJiYgdGhpcy5yb3V0ZS5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQYXRoID0gW3RoaXMucm91dGUucGF0aF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShwYXRoOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+KTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmVkaXJlY3QocGF0aDogc3RyaW5nLCByZWRpcmVjdFRvOiBzdHJpbmcsIHBhdGhNYXRjaDogJ2Z1bGwnIHwgJ3ByZWZpeCcgPSAncHJlZml4Jyk6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICByZWRpcmVjdFRvOiByZWRpcmVjdFRvLFxuICAgICAgICAgICAgcGF0aE1hdGNoOiBwYXRoTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVMYXp5Um91dGVNb2R1bGUocGF0aDogc3RyaW5nLCBsb2FkQ2hpbGRyZW46IExvYWRDaGlsZHJlbiwgY2FuTWF0Y2g/OiBBcnJheTxhbnk+KTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgY29uc3Qgcm91dGU6IFJvdXRlID0ge3BhdGg6IHBhdGgsIGxvYWRDaGlsZHJlbjogbG9hZENoaWxkcmVufTtcbiAgICAgICAgaWYgKGNhbk1hdGNoPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJvdXRlLmNhbk1hdGNoID0gY2FuTWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIocm91dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlTGF6eVJvdXRlQ29tcG9uZW50KFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIGxvYWRDb21wb25lbnQ6ICgpID0+IFR5cGU8dW5rbm93bj4gfCBPYnNlcnZhYmxlPFR5cGU8dW5rbm93bj4gfCBEZWZhdWx0RXhwb3J0PFR5cGU8dW5rbm93bj4+PiB8IFByb21pc2U8VHlwZTx1bmtub3duPiB8IERlZmF1bHRFeHBvcnQ8VHlwZTx1bmtub3duPj4+LFxuICAgICAgICBjYW5NYXRjaD86IEFycmF5PGFueT5cbiAgICApOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCByb3V0ZTogUm91dGUgPSB7cGF0aDogcGF0aCwgbG9hZENvbXBvbmVudDogbG9hZENvbXBvbmVudH07XG4gICAgICAgIGlmIChjYW5NYXRjaD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByb3V0ZS5jYW5NYXRjaCA9IGNhbk1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHJvdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21Sb3V0ZShyb3V0ZTogUm91dGUpOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcihyb3V0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb290KHJvdXRlc0J1aWxkZXI6IFJvdXRlc0J1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm91dGVzQnVpbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQYXJlbnQocGFyZW50OiBSb3V0ZUJ1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMucm91dGVQYXRoID0gUm91dGVVdGlsLnJlbW92ZUVtcHR5UGF0aFNlZ21lbnRzKFsuLi50aGlzLnBhcmVudC5yb3V0ZVBhdGgsIHRoaXMucm91dGUucGF0aCA/PyAnJ10pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEJyZWFkY3J1bWIoYnJlYWRjcnVtYjogQnJlYWRjcnVtYlR5cGUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5icmVhZGNydW1iID0gYnJlYWRjcnVtYjtcbiAgICAgICAgdGhpcy5yb3V0ZURhdGEuYnJlYWRjcnVtYiA9IGJyZWFkY3J1bWI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUGFnZVRpdGxlKHBhZ2VUaXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlID0gcGFnZVRpdGxlO1xuICAgICAgICB0aGlzLnJvdXRlRGF0YS5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVkaXJlY3RUbyhyZWRpcmVjdFRvOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb3V0ZS5yZWRpcmVjdFRvID0gcmVkaXJlY3RUbztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQYXRoTWF0Y2gocGF0aE1hdGNoOiAnZnVsbCcgfCAncHJlZml4Jyk6IHRoaXMge1xuICAgICAgICB0aGlzLnJvdXRlLnBhdGhNYXRjaCA9IHBhdGhNYXRjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMud2l0aFBhZ2VUaXRsZSh0aXRsZSk7XG4gICAgICAgIHRoaXMud2l0aEJyZWFkY3J1bWIodGl0bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENhbkFjdGl2YXRlKGRpVG9rZW46IENhbkFjdGl2YXRlRm4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLmNhbkFjdGl2YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlLmNhbkFjdGl2YXRlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZS5wdXNoKGRpVG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENhbkRlYWN0aXZhdGUoZGlUb2tlbjogQ2FuRGVhY3RpdmF0ZUZuPGFueT4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLmNhbkRlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZS5wdXNoKGRpVG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJlc29sdmVyKGRpVG9rZW46IFJlc29sdmVGbjxhbnk+LCBuYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLnJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUucmVzb2x2ZSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUucmVzb2x2ZVtuYW1lXSA9IGRpVG9rZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUHJvdmlkZXIocHJvdmlkZXI6IFByb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnMpOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLnByb3ZpZGVycykge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5wcm92aWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvdXRlLnByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEYXRhKGRhdGE6IENvbW1vbnNSb3V0ZURhdGEpOiB0aGlzIHtcbiAgICAgICAgaWYgKCFkYXRhLmJyZWFkY3J1bWIpIHtcbiAgICAgICAgICAgIGRhdGEuYnJlYWRjcnVtYiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZURhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENvbW1vbnNNZW51SXRlbShtZW51SXRlbTogQ29tbW9uc01lbnVJdGVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMubWVudUl0ZW0gPSBtZW51SXRlbTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNZW51SXRlbShpY29uPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgcm91dGVyTGluaz86IEFycmF5PHN0cmluZz4sIGJyZWFkY3J1bWIgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICB0aGlzLm1lbnVJdGVtID0gdGhpcy5jcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluayk7XG4gICAgICAgIGlmIChicmVhZGNydW1iICYmIGxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLndpdGhCcmVhZGNydW1iKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbWVudSBpdGVtIGNoaWxkIHRvIHRoaXMgaW5zdGFuY2Ugb2YgbWVudSBpdGVtLlxuICAgICAqIEBwYXJhbSBsYWJlbCBMYWJlbC5cbiAgICAgKiBAcGFyYW0gaWNvbiBJY29uLlxuICAgICAqIEBwYXJhbSByb3V0ZXJMaW5rIFJvdXRlciBsaW5rLlxuICAgICAqIEBwYXJhbSBhZnRlclJvdXRlQ2hpbGRyZW4gSWYgZmFsc2UsIG1lbnUgaXRlbSBjaGlsZCB3aWxsIGJlIGFwcGVuZGVkIGJlZm9yZSByb3V0ZSBjaGlsZHJlbiBtZW51IGl0ZW1zLCBhdCB0aGUgZW5kIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtQ2hpbGQobGFiZWw6IHN0cmluZywgaWNvbj86IHN0cmluZywgcm91dGVyTGluaz86IEFycmF5PHN0cmluZz4sIGFmdGVyUm91dGVDaGlsZHJlbiA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIGlmIChhZnRlclJvdXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1DaGlsZHJlbkFmdGVyLnB1c2godGhpcy5jcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuLnB1c2godGhpcy5jcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbWVudSBpdGVtIGNoaWxkIHRvIHRoaXMgaW5zdGFuY2Ugb2YgbWVudSBpdGVtLlxuICAgICAqIEBwYXJhbSBtZW51SXRlbSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgbWVudSBpdGVtLlxuICAgICAqIEBwYXJhbSBhZnRlclJvdXRlQ2hpbGRyZW4gSWYgZmFsc2UsIG1lbnUgaXRlbSBjaGlsZCB3aWxsIGJlIGFwcGVuZGVkIGJlZm9yZSByb3V0ZSBjaGlsZHJlbiBtZW51IGl0ZW1zLCBhdCB0aGUgZW5kIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbW1vbnNNZW51SXRlbUNoaWxkKG1lbnVJdGVtOiBDb21tb25zTWVudUl0ZW0sIGFmdGVyUm91dGVDaGlsZHJlbiA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIGlmIChhZnRlclJvdXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1DaGlsZHJlbkFmdGVyLnB1c2gobWVudUl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuLnB1c2gobWVudUl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1MYXp5Q2hpbGRyZW4oKTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5tZW51SXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVudUl0ZW0ubGF6eUNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogQVBlcm1pc3Npb25zKTogdGhpcyB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy53aXRoQ2FuQWN0aXZhdGUocGVybWlzc2lvbkd1YXJkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENoaWxkKHBhdGg6IHN0cmluZywgY29tcG9uZW50OiBUeXBlPGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCBjaGlsZFJvdXRlQnVpbGRlciA9IFJvdXRlQnVpbGRlci5jcmVhdGUocGF0aCwgY29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5hZGRDaGlsZEJ1aWxkZXIoY2hpbGRSb3V0ZUJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gY2hpbGRSb3V0ZUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENoaWxkQnVpbGRlcihidWlsZGVyOiBSb3V0ZUJ1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgYnVpbGRlci53aXRoUGFyZW50KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICBidWlsZGVyLndpdGhSb290KHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9QYXJlbnQoKTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKCdQYXJlbnQgd2FzIG5vdCBwcm92aWRlZC4nLCB7bmFtZTogJ1JvdXRlQnVpbGRlciBlcnJvcid9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRvUm9vdCgpOiBSb3V0ZXNCdWlsZGVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignUm9vdCB3YXMgbm90IHByb3ZpZGVkLicsIHtuYW1lOiAnUm91dGVCdWlsZGVyRXJyb3InfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluaXNoKCk6IFJvdXRlc0J1aWxkZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50b1Jvb3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYnVpbGQoKTogUm91dGUge1xuICAgICAgICBjb25zdCBhbmd1bGFyUm91dGU6IFJvdXRlID0ge1xuICAgICAgICAgICAgLi4udGhpcy5yb3V0ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhbmd1bGFyUm91dGUuZGF0YSkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgLi4uYW5ndWxhclJvdXRlLmRhdGEsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5yb3V0ZURhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuZGF0YSA9IHsuLi50aGlzLnJvdXRlRGF0YX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBlbmQgcGVybWlzc2lvbnMgaWYgbm90IGFscmVhZHkgaW4gcm91dGUgZGF0YVxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9ucyAmJiAhKGFuZ3VsYXJSb3V0ZS5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEpLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAoYW5ndWxhclJvdXRlLmRhdGEgYXMgQ29tbW9uc1JvdXRlRGF0YSkucGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVudSA9IHRoaXMuYnVpbGRNZW51KCk7XG4gICAgICAgIGlmIChtZW51Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIChhbmd1bGFyUm91dGUuZGF0YSBhcyBDb21tb25zUm91dGVEYXRhKS5tZW51SXRlbXMgPSBtZW51O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGggPz8gMCkgPiAwIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gcm91dGUgaGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4ucHVzaCguLi50aGlzLnJvdXRlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGRSb3V0ZSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jaGlsZHJlbi5wdXNoKGNoaWxkUm91dGUuYnVpbGQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuQWN0aXZhdGUpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jYW5BY3RpdmF0ZSA9IFsuLi50aGlzLnJvdXRlLmNhbkFjdGl2YXRlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2FuQWN0aXZhdGVDaGlsZCA9IFsuLi50aGlzLnJvdXRlLmNhbkFjdGl2YXRlQ2hpbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkxvYWQpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jYW5Mb2FkID0gWy4uLnRoaXMucm91dGUuY2FuTG9hZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZSkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkRlYWN0aXZhdGUgPSBbLi4udGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5yZXNvbHZlKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUucmVzb2x2ZSA9IHsuLi50aGlzLnJvdXRlLnJlc29sdmV9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuZ3VsYXJSb3V0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkTWVudSgpOiBBcnJheTxDb21tb25zTWVudUl0ZW0+IHtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1CdWlsZDogQ29tbW9uc01lbnVJdGVtIHwgbnVsbCA9IHRoaXMubWVudUl0ZW0gPyB7Li4udGhpcy5tZW51SXRlbX0gOiBudWxsO1xuICAgICAgICBjb25zdCByb3V0ZUNoaWxkcmVuTWVudUl0ZW1zOiBBcnJheTxDb21tb25zTWVudUl0ZW0+ID0gdGhpcy5jaGlsZHJlbi5mbGF0TWFwKGNoaWxkID0+IGNoaWxkLmJ1aWxkTWVudSgpKTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1DaGlsZHJlbjogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiA9IFtdO1xuICAgICAgICBjb25zdCBtZW51SXRlbUNoaWxkcmVuQnVpbGQ6IEFycmF5PENvbW1vbnNNZW51SXRlbT4gPSBbXTtcblxuICAgICAgICBpZiAobWVudUl0ZW1CdWlsZD8uaXRlbXMpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZC5wdXNoKC4uLm1lbnVJdGVtQnVpbGQuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc01lbnVJdGVtQ2hpbGQgPSAoY2hpbGQ6IENvbW1vbnNNZW51SXRlbSk6IENvbW1vbnNNZW51SXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbENoaWxkOiBDb21tb25zTWVudUl0ZW0gPSB7Li4uY2hpbGR9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbENoaWxkLnJvdXRlckxpbmsgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZmluYWxDaGlsZC5yb3V0ZXJMaW5rID0gdGhpcy5yb3V0ZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpbmFsQ2hpbGQucm91dGVyTGluayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmaW5hbENoaWxkLnJvdXRlckxpbmsgPSBbZmluYWxDaGlsZC5yb3V0ZXJMaW5rXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaW5hbENoaWxkLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgICAgICBmaW5hbENoaWxkLnJvdXRlckxpbmsgPSBSb3V0ZVV0aWwucmVtb3ZlRW1wdHlQYXRoU2VnbWVudHMoZmluYWxDaGlsZC5yb3V0ZXJMaW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaW5hbENoaWxkO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubWVudUl0ZW1DaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IG1lbnVJdGVtQ2hpbGRyZW4ucHVzaChwcm9jZXNzTWVudUl0ZW1DaGlsZChjaGlsZCkpKTtcblxuICAgICAgICBjb25zdCBtZW51SXRlbUNoaWxkcmVuQWZ0ZXJCdWlsZDogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiA9IHRoaXMubWVudUl0ZW1DaGlsZHJlbkFmdGVyLm1hcChjaGlsZCA9PiBwcm9jZXNzTWVudUl0ZW1DaGlsZChjaGlsZCkpO1xuXG4gICAgICAgIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZC5wdXNoKC4uLm1lbnVJdGVtQ2hpbGRyZW4sIC4uLnJvdXRlQ2hpbGRyZW5NZW51SXRlbXMsIC4uLm1lbnVJdGVtQ2hpbGRyZW5BZnRlckJ1aWxkKTtcblxuICAgICAgICBpZiAoIW1lbnVJdGVtQnVpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBtZW51SXRlbUNoaWxkcmVuQnVpbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBtZW51SXRlbUJ1aWxkLmxhYmVsID0gbWVudUl0ZW1CdWlsZC5sYWJlbCA/PyB0aGlzLnBhZ2VUaXRsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPSBbbWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rXTtcbiAgICAgICAgfVxuICAgICAgICBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPSBSb3V0ZVV0aWwucmVtb3ZlRW1wdHlQYXRoU2VnbWVudHMobWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rID8/IHRoaXMucm91dGVQYXRoKTtcbiAgICAgICAgaWYgKG1lbnVJdGVtQ2hpbGRyZW5CdWlsZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtZW51SXRlbUJ1aWxkLml0ZW1zID0gbWVudUl0ZW1DaGlsZHJlbkJ1aWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtZW51SXRlbUJ1aWxkLmd1YXJkcykge1xuICAgICAgICAgICAgY29uc3QgZ3VhcmRzID0gdGhpcy5maW5kTWVudUl0ZW1HdWFyZHMoKTtcbiAgICAgICAgICAgIGlmIChndWFyZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1lbnVJdGVtQnVpbGQuZ3VhcmRzID0gZ3VhcmRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtZW51SXRlbUJ1aWxkLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICBtZW51SXRlbUJ1aWxkLnBlcm1pc3Npb25zID0gdGhpcy5maW5kTWVudUl0ZW1QZXJtaXNzaW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFttZW51SXRlbUJ1aWxkXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lbnVJdGVtKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCBtZW51SXRlbTogQ29tbW9uc01lbnVJdGVtID0ge307XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICBtZW51SXRlbS5pY29uID0gaWNvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlckxpbmspIHtcbiAgICAgICAgICAgIG1lbnVJdGVtLnJvdXRlckxpbmsgPSByb3V0ZXJMaW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW51SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRNZW51SXRlbUd1YXJkcygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgZ3VhcmRzOiBBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkFjdGl2YXRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGd1YXJkcy5wdXNoKC4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBhcmVudCBndWFyZHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGVjaXNpb24gdG8gaGlkZSBtZW51IGl0ZW0hXG4gICAgICAgICAgICAvLyBTb21lIHBhcmVudCByb3V0ZXMgbWlnaHQgaGF2ZSBndWFyZHMsIGJ1dCBubyBtZW51IGl0ZW1zLCBzbyB0aGlzIGd1YXJkcyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudCBoZXJlLFxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBwYXJlbnQgbWVudSBpdGVtIHRvIGhpZGUuXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5maW5kTWVudUl0ZW1HdWFyZHMoKS5mb3JFYWNoKGcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChndWFyZHMuaW5kZXhPZihnKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3VhcmRzLnB1c2goZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGd1YXJkcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmluZE1lbnVJdGVtUGVybWlzc2lvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lbnVJdGVtPy5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVudUl0ZW0ucGVybWlzc2lvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGVEYXRhLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFscmVhZHkgYnVpbHRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlRGF0YS5wZXJtaXNzaW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4iXX0=
376
+ function createMenuItem(icon, label, routerLink) {
377
+ const menuItem = {};
378
+ if (icon) {
379
+ menuItem.icon = icon;
380
+ }
381
+ if (label) {
382
+ menuItem.label = label;
383
+ }
384
+ if (routerLink) {
385
+ menuItem.routerLink = routerLink;
386
+ }
387
+ return menuItem;
388
+ }
389
+ /**
390
+ * Creates a new instance of RouteBuilder with the given path and component.
391
+ *
392
+ * @param {string} path - The path for the route.
393
+ * @param {Type<any>} component - The component for the route.
394
+ * @return {RouteBuilder} - A new instance of RouteBuilder.
395
+ */
396
+ export function createRoute(path, component) {
397
+ return new RouteBuilder({
398
+ path: path,
399
+ component: component
400
+ });
401
+ }
402
+ /**
403
+ * Creates a redirect route for the given path.
404
+ *
405
+ * @param {string} path - The path to match against.
406
+ * @param {string} redirectTo - The URL path to redirect to.
407
+ * @param {'full' | 'prefix'} [pathMatch='prefix'] - The path matching strategy ('full' or 'prefix').
408
+ * @return {RouteBuilder} - A new instance of the RouteBuilder class with the redirect route configuration.
409
+ */
410
+ export function createRouteRedirect(path, redirectTo, pathMatch = 'prefix') {
411
+ return new RouteBuilder({
412
+ path: path,
413
+ redirectTo: redirectTo,
414
+ pathMatch: pathMatch
415
+ });
416
+ }
417
+ /**
418
+ * Creates a lazy route module (or routes).
419
+ *
420
+ * @param {string} path - The path for the route.
421
+ * @param {LoadChildren} loadChildren - The function that loads the lazy module (or routes).
422
+ * @param {Array<any>} [canMatch] - An optional array of objects that can match the route.
423
+ * @returns {RouteBuilder} - A new instance of RouteBuilder class.
424
+ */
425
+ export function createLazyChildrenRoute(path, loadChildren, canMatch) {
426
+ const route = { path: path, loadChildren: loadChildren };
427
+ if (canMatch?.length) {
428
+ route.canMatch = canMatch;
429
+ }
430
+ return new RouteBuilder(route);
431
+ }
432
+ /**
433
+ * Creates a lazy route component.
434
+ *
435
+ * @param {string} path - The path for the route.
436
+ * @param {() => Type<unknown> | Observable<Type<unknown> | DefaultExport<Type<unknown>>> | Promise<Type<unknown> | DefaultExport<Type<unknown>>>} loadComponent - The function that loads the component for the route.
437
+ * @param {Array<any>} [canMatch] - The array of values that determine if the route can match.
438
+ * @returns {RouteBuilder} - An instance of RouteBuilder with the created route.
439
+ */
440
+ export function createLazyRoute(path, loadComponent, canMatch) {
441
+ const route = { path: path, loadComponent: loadComponent };
442
+ if (canMatch?.length) {
443
+ route.canMatch = canMatch;
444
+ }
445
+ return new RouteBuilder(route);
446
+ }
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc3JjL3JvdXRlci9yb3V0ZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRTlELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQU83RCxNQUFNLE9BQU8sWUFBWTtJQWNyQixZQUFtQixLQUFZO1FBWnZCLGNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBQzVCLGNBQVMsR0FBcUIsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFHbkQsYUFBUSxHQUF3QixFQUFFLENBQUM7UUFHbkMscUJBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQUM5QywwQkFBcUIsR0FBMkIsRUFBRSxDQUFDLENBQUMsOEJBQThCO1FBS3RGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxhQUE0QjtRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxNQUFvQjtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLDRCQUE0QixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLFVBQTBCO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGFBQWEsQ0FBQyxTQUFpQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxlQUFlLENBQUMsRUFBaUI7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxpQkFBaUIsQ0FBQyxFQUF3QjtRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxZQUFZLENBQUMsSUFBWSxFQUFFLEVBQWtCO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLFFBQXlDO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FBQyxJQUFzQixFQUFFLEtBQUssR0FBRyxJQUFJO1FBQ2hELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSztZQUNsQixDQUFDLENBQUM7Z0JBQ0ksR0FBRyxJQUFJLENBQUMsU0FBUztnQkFDakIsR0FBRyxJQUFJO2FBQ1Y7WUFDSCxDQUFDLENBQUM7Z0JBQ0ksVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLEdBQUcsSUFBSTthQUNWLENBQUM7UUFDUixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLElBQXFCO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDWixHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ2hCLEdBQUcsSUFBSTtTQUNWLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFlBQVksQ0FBQyxJQUFhLEVBQUUsS0FBYyxFQUFFLFVBQTBCLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDN0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLFVBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUNoQixLQUFLLEVBQUUsS0FBSzthQUNmLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGlCQUFpQixDQUFDLElBQWEsRUFBRSxLQUFjLEVBQUUsVUFBMEIsRUFBRSxrQkFBa0IsR0FBRyxLQUFLO1FBQzFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHlCQUF5QixDQUFDLElBQXFCLEVBQUUsa0JBQWtCLEdBQUcsS0FBSztRQUM5RSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNJLHdCQUF3QjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxlQUFlLENBQUMsV0FBeUI7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksUUFBUSxDQUFDLElBQVksRUFBRSxTQUFvQixFQUFFLFFBQW1DO1FBQ25GLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RCxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxPQUFxQjtRQUN4QyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSztRQUNSLE1BQU0sWUFBWSxHQUFVO1lBQ3hCLEdBQUcsSUFBSSxDQUFDLEtBQUs7U0FDaEIsQ0FBQztRQUVGLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLFlBQVksQ0FBQyxJQUFJLEdBQUc7Z0JBQ2hCLEdBQUcsWUFBWSxDQUFDLElBQUk7Z0JBQ3BCLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDcEIsQ0FBQztRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ0osWUFBWSxDQUFDLElBQUksR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUUsWUFBWSxDQUFDLElBQXlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUUsWUFBWSxDQUFDLElBQXlCLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDM0UsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLElBQXlCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUM3RCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckUscUJBQXFCO1lBQ3JCLFlBQVksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzlCLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ25ELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QixZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM5QixZQUFZLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLFlBQVksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixZQUFZLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsWUFBWSxDQUFDLE9BQU8sR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxTQUFTO1FBQ2IsTUFBTSxhQUFhLEdBQTJCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RixNQUFNLHNCQUFzQixHQUEyQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sZ0JBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLHFCQUFxQixHQUEyQixFQUFFLENBQUM7UUFFekQsSUFBSSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDdkIscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBc0IsRUFBbUIsRUFBRTtZQUNyRSxNQUFNLFVBQVUsR0FBb0IsRUFBQyxHQUFHLEtBQUssRUFBQyxDQUFDO1lBQy9DLElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMvQyxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksT0FBTyxVQUFVLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsVUFBVSxDQUFDLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNGLE1BQU0sMEJBQTBCLEdBQTJCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWhJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLGdCQUFnQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsR0FBRywwQkFBMEIsQ0FBQyxDQUFDO1FBRTFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqQixPQUFPLHFCQUFxQixDQUFDO1FBQ2pDLENBQUM7UUFFRCxhQUFhLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDdEUsSUFBSSxPQUFPLGFBQWEsQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0MsYUFBYSxDQUFDLFVBQVUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsYUFBYSxDQUFDLFVBQVUsR0FBRyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxhQUFhLENBQUMsS0FBSyxHQUFHLHFCQUFxQixDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsYUFBYSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLGlGQUFpRjtZQUNqRiwyR0FBMkc7WUFDM0csZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFUyx1QkFBdUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3Qix3QkFBd0I7WUFDeEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0NBQ0o7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFhLEVBQUUsS0FBYyxFQUFFLFVBQTBCO0lBQzdFLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNQLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1IsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksVUFBVSxFQUFFLENBQUM7UUFDYixRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWSxFQUFFLFNBQW9CO0lBQzFELE9BQU8sSUFBSSxZQUFZLENBQUM7UUFDcEIsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsVUFBa0IsRUFBRSxZQUErQixRQUFRO0lBQ3pHLE9BQU8sSUFBSSxZQUFZLENBQUM7UUFDcEIsSUFBSSxFQUFFLElBQUk7UUFDVixVQUFVLEVBQUUsVUFBVTtRQUN0QixTQUFTLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxJQUFZLEVBQUUsWUFBMEIsRUFBRSxRQUFxQjtJQUNuRyxNQUFNLEtBQUssR0FBVSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxDQUFDO0lBQzlELElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ25CLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsSUFBWSxFQUNaLGFBQXFKLEVBQ3JKLFFBQXFCO0lBRXJCLE1BQU0sS0FBSyxHQUFVLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDLENBQUM7SUFDaEUsSUFBSSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RW52aXJvbm1lbnRQcm92aWRlcnMsIFByb3ZpZGVyLCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q2FuQWN0aXZhdGVGbiwgQ2FuRGVhY3RpdmF0ZUZuLCBEZWZhdWx0RXhwb3J0LCBMb2FkQ2hpbGRyZW4sIFJlc29sdmVGbiwgUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7cmVtb3ZlUm91dGVFbXB0eVBhdGhTZWdtZW50c30gZnJvbSAnLi4vaGVscGVycy9yb3V0ZSc7XG5pbXBvcnQge0NvbW1vbnNNZW51SXRlbX0gZnJvbSAnLi4vbW9kZWxzL21lbnUubW9kZWwnO1xuaW1wb3J0IHtwZXJtaXNzaW9uR3VhcmR9IGZyb20gJy4uL3NlY3VyaXR5L3Blcm1pc3Npb24uZ3VhcmQnO1xuaW1wb3J0IHtBUGVybWlzc2lvbnN9IGZyb20gJy4uL3NlY3VyaXR5L3Blcm1pc3Npb25zLm1vZGVsJztcbmltcG9ydCB7QnJlYWRjcnVtYlR5cGUsIENvbW1vbnNSb3V0ZURhdGF9IGZyb20gJy4vcm91dGVyLm1vZGVsJztcbmltcG9ydCB7Um91dGVzQnVpbGRlcn0gZnJvbSAnLi9yb3V0ZXMtYnVpbGRlcic7XG5cbmV4cG9ydCB0eXBlIFJvdXRlQnVpbGRlckFkanVzdEZuVHlwZSA9IChidWlsZGVyOiBSb3V0ZUJ1aWxkZXIpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBSb3V0ZUJ1aWxkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSByb3V0ZTogUm91dGU7XG4gICAgcHJpdmF0ZSByb3V0ZVBhdGg6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBwcm90ZWN0ZWQgcm91dGVEYXRhOiBDb21tb25zUm91dGVEYXRhID0ge2JyZWFkY3J1bWI6IG51bGx9O1xuICAgIHByaXZhdGUgcm9vdD86IFJvdXRlc0J1aWxkZXI7XG4gICAgcHJpdmF0ZSBwYXJlbnQ/OiBSb3V0ZUJ1aWxkZXI7XG4gICAgcHJpdmF0ZSBjaGlsZHJlbjogQXJyYXk8Um91dGVCdWlsZGVyPiA9IFtdO1xuXG4gICAgcHJpdmF0ZSBtZW51SXRlbT86IENvbW1vbnNNZW51SXRlbTtcbiAgICBwcml2YXRlIG1lbnVJdGVtQ2hpbGRyZW46IEFycmF5PENvbW1vbnNNZW51SXRlbT4gPSBbXTtcbiAgICBwcml2YXRlIG1lbnVJdGVtQ2hpbGRyZW5BZnRlcjogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiA9IFtdOyAvLyBhcHBlbmQgYWZ0ZXIgcm91dGUgY2hpbGRyZW5cblxuICAgIHByaXZhdGUgcGVybWlzc2lvbnM/OiBBUGVybWlzc2lvbnM7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iocm91dGU6IFJvdXRlKSB7XG4gICAgICAgIHRoaXMucm91dGUgPSByb3V0ZTtcbiAgICAgICAgaWYgKHRoaXMucm91dGUucGF0aCAmJiB0aGlzLnJvdXRlLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZVBhdGggPSBbdGhpcy5yb3V0ZS5wYXRoXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpbmsgdG8gcm9vdCBSb3V0ZXMgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Um91dGVzQnVpbGRlcn0gcm91dGVzQnVpbGRlciAtIFRoZSByb3V0ZXMgYnVpbGRlciB0byBzZXQgYXMgdGhlIHJvb3QuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSb290KHJvdXRlc0J1aWxkZXI6IFJvdXRlc0J1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm91dGVzQnVpbGRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGluayB0byBwYXJlbnQgUm91dGUgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Um91dGVCdWlsZGVyfSBwYXJlbnQgLSBUaGUgcGFyZW50IHJvdXRlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhQYXJlbnQocGFyZW50OiBSb3V0ZUJ1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMucm91dGVQYXRoID0gcmVtb3ZlUm91dGVFbXB0eVBhdGhTZWdtZW50cyhbLi4udGhpcy5wYXJlbnQucm91dGVQYXRoLCB0aGlzLnJvdXRlLnBhdGggPz8gJyddKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYnJlYWRjcnVtYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QnJlYWRjcnVtYlR5cGV9IGJyZWFkY3J1bWIgLSBCcmVhZGNydW1iIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHdpdGhCcmVhZGNydW1iKGJyZWFkY3J1bWI6IEJyZWFkY3J1bWJUeXBlKTogdGhpcyB7XG4gICAgICAgIHRoaXMucm91dGVEYXRhLmJyZWFkY3J1bWIgPSBicmVhZGNydW1iO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwYWdlIHRpdGxlIGZvciB0aGUgY3VycmVudCByb3V0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYWdlVGl0bGUgLSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhQYWdlVGl0bGUocGFnZVRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb3V0ZURhdGEucGFnZVRpdGxlID0gcGFnZVRpdGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwYWdlIHRpdGxlIGFuZCB0aGUgYnJlYWRjcnVtYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgcGFnZSBhbmQgYnJlYWRjcnVtYi5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy53aXRoUGFnZVRpdGxlKHRpdGxlKTtcbiAgICAgICAgdGhpcy53aXRoQnJlYWRjcnVtYih0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjYW4gYWN0aXZhdGUgZ3VhcmQgdG8gcm91dGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0NhbkFjdGl2YXRlRm59IGZuIC0gVGhlIENhbkFjdGl2YXRlIGZ1bmN0aW9uIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ2FuQWN0aXZhdGUoZm46IENhbkFjdGl2YXRlRm4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLmNhbkFjdGl2YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlLmNhbkFjdGl2YXRlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZS5wdXNoKGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNhbiBkZWFjdGl2YXRlIGd1YXJkIHRvIHJvdXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDYW5EZWFjdGl2YXRlRm59IGZuIC0gVGhlIENhbkFjdGl2YXRlIGZ1bmN0aW9uIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ2FuRGVhY3RpdmF0ZShmbjogQ2FuRGVhY3RpdmF0ZUZuPGFueT4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLmNhbkRlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZS5wdXNoKGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHJlc29sdmVyIHRvIHJvdXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBOYW1lIG9mIHRoZSByZXNvbHZlci5cbiAgICAgKiBAcGFyYW0ge0NhbkRlYWN0aXZhdGVGbn0gZm4gLSBUaGUgQ2FuQWN0aXZhdGUgZnVuY3Rpb24gdG8gYmUgYWRkZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSZXNvbHZlcihuYW1lOiBzdHJpbmcsIGZuOiBSZXNvbHZlRm48YW55Pik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMucm91dGUucmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5yZXNvbHZlID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5yZXNvbHZlW25hbWVdID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwcm92aWRlciB0byB0aGUgcm91dGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3ZpZGVyIHwgRW52aXJvbm1lbnRQcm92aWRlcnN9IHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGFkZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFByb3ZpZGVyKHByb3ZpZGVyOiBQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZS5wcm92aWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUucHJvdmlkZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRhdGEgZm9yIHRoZSByb3V0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29tbW9uc1JvdXRlRGF0YX0gZGF0YSAtIFRoZSBkYXRhIHRvIHNldCBmb3IgdGhlIHJvdXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21lcmdlPXRydWVdIC0gSWYgdGhlIGRhdGEgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgZGF0YSBzZXR1cCAodHJ1ZSBieSBkZWZhdWx0KSAtIHBhZ2UgdGl0bGUgYW5kIGJyZWFkY3J1bWIgY29uZmlnIGFyZSBjYXJyaWVkIG92ZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhEYXRhKGRhdGE6IENvbW1vbnNSb3V0ZURhdGEsIG1lcmdlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLnJvdXRlRGF0YSA9IG1lcmdlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMucm91dGVEYXRhLFxuICAgICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAuLi5kYXRhXG4gICAgICAgICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIG1lbnUgaXRlbSBvZiByb3V0ZS4gTWVyZ2luZyB3aXRoIGN1cnJlbnQgY29uZmlndXJhdGlvbiAoc2V0IHdpdGgge3dpdGhNZW51SXRlbX0pIHRha2VzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb21tb25zTWVudUl0ZW19IG9wdHMgLSBUaGUgb3B0cyBwcm9wZXJ0aWVzIHRvIGJlIG1lcmdlZCBvbiBleGlzdGluZyBtZW51IGl0ZW0gZm9yIHJvdXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1PcHRzKG9wdHM6IENvbW1vbnNNZW51SXRlbSk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMubWVudUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lbnVJdGVtID0ge1xuICAgICAgICAgICAgLi4udGhpcy5tZW51SXRlbSxcbiAgICAgICAgICAgIC4uLm9wdHNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWVudSBpdGVtIChiYXNpYykuIEZvciBtb3JlIG9wdGlvbnMsIHNlZSB0aGUge3dpdGhNZW51SXRlbUZyb21PcHRzfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbaWNvbl0gLSBUaGUgaWNvbiBmb3IgdGhlIG1lbnUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXSAtIFRoZSBsYWJlbCBmb3IgdGhlIG1lbnUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtyb3V0ZXJMaW5rXSAtIFRoZSByb3V0ZXIgbGluayBmb3IgdGhlIG1lbnUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFticmVhZGNydW1iPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc3BsYXkgYnJlYWRjcnVtYiBmb3IgdGhlIG1lbnUgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPiwgYnJlYWRjcnVtYiA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMubWVudUl0ZW0gPSBjcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluayk7XG4gICAgICAgIGlmIChicmVhZGNydW1iICYmIGxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLndpdGhCcmVhZGNydW1iKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbWVudSBpdGVtIGNoaWxkIHRvIHJvdXRlJ3MgbWVudSBpdGVtLiBJZiBubyBtZW51IGl0ZW0gaXMgcHJlc2VudCwgY2hpbGRyZW4gd2lsbCBiZSBhcHBlbmRlZCBkaXJlY3RseSB0byBwYXJlbnQvcm9vdCBtZW51IGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ljb25dIC0gVGhlIGljb24gZm9yIHRoZSBtZW51IGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF0gLSBUaGUgbGFiZWwgZm9yIHRoZSBtZW51IGl0ZW0uXG4gICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbcm91dGVyTGlua10gLSBUaGUgcm91dGVyIGxpbmsgZm9yIHRoZSBtZW51IGl0ZW0uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWZ0ZXJSb3V0ZUNoaWxkcmVuPWZhbHNlXSBJZiBmYWxzZSwgbWVudSBpdGVtIGNoaWxkIHdpbGwgYmUgYXBwZW5kZWQgYmVmb3JlIHJvdXRlJ3MgY2hpbGRyZW4gbWVudSBpdGVtcywgYXQgdGhlIGVuZCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhNZW51SXRlbUNoaWxkKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPiwgYWZ0ZXJSb3V0ZUNoaWxkcmVuID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgaWYgKGFmdGVyUm91dGVDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuQWZ0ZXIucHVzaChjcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuLnB1c2goY3JlYXRlTWVudUl0ZW0oaWNvbiwgbGFiZWwsIHJvdXRlckxpbmspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG1lbnUgaXRlbSBjaGlsZCBmcm9tIG9wdHMgdG8gcm91dGUncyBtZW51IGl0ZW0uIElmIG5vIG1lbnUgaXRlbSBpcyBwcmVzZW50LCBjaGlsZHJlbiB3aWxsIGJlIGFwcGVuZGVkIGRpcmVjdGx5IHRvIHBhcmVudC9yb290IG1lbnUgaXRlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29tbW9uc01lbnVJdGVtfSBvcHRzIC0gVGhlIG9wdHMgcHJvcGVydGllcyB0byBiZSBtZXJnZWQgb24gZXhpc3RpbmcgbWVudSBpdGVtIGZvciByb3V0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZnRlclJvdXRlQ2hpbGRyZW49ZmFsc2VdIElmIGZhbHNlLCBtZW51IGl0ZW0gY2hpbGQgd2lsbCBiZSBhcHBlbmRlZCBiZWZvcmUgcm91dGUncyBjaGlsZHJlbiBtZW51IGl0ZW1zLCBhdCB0aGUgZW5kIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtQ2hpbGRGcm9tT3B0cyhvcHRzOiBDb21tb25zTWVudUl0ZW0sIGFmdGVyUm91dGVDaGlsZHJlbiA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIGlmIChhZnRlclJvdXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1DaGlsZHJlbkFmdGVyLnB1c2gob3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtQ2hpbGRyZW4ucHVzaChvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtZW51IGl0ZW0ncyBjaGlsZHJlbiB0byBiZSBnZW5lcmF0ZWQgbGF6aWx5IGZyb20gcm91dGUncyBsYXp5IGxvYWRlZCByb3V0ZXMgYWZ0ZXIgdGhlIGNodW5rIGlzIGxvYWRlZCB0byBydW50aW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1MYXp5Q2hpbGRyZW4oKTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5tZW51SXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVudUl0ZW0ubGF6eUNoaWxkcmVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcGVybWlzc2lvbnMgb24gdGhlIHJvdXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBUGVybWlzc2lvbnN9IHBlcm1pc3Npb25zIC0gVGhlIHBlcm1pc3Npb25zIHRvIGJlIHNldCBvbiB0aGUgcm91dGUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogQVBlcm1pc3Npb25zKTogdGhpcyB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy53aXRoQ2FuQWN0aXZhdGUocGVybWlzc2lvbkd1YXJkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNoaWxkIHJvdXRlIHRvIHRoZSBjdXJyZW50IHJvdXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgY2hpbGQgcm91dGUuXG4gICAgICogQHBhcmFtIHtUeXBlPGFueT59IGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGlsZCByb3V0ZS5cbiAgICAgKiBAcGFyYW0ge1JvdXRlQnVpbGRlckFkanVzdEZuVHlwZX0gW2FkanVzdEZuXSAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgY2hpbGQgcm91dGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ2hpbGQocGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGU8YW55PiwgYWRqdXN0Rm4/OiBSb3V0ZUJ1aWxkZXJBZGp1c3RGblR5cGUpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgY2hpbGRSb3V0ZUJ1aWxkZXIgPSBjcmVhdGVSb3V0ZShwYXRoLCBjb21wb25lbnQpO1xuICAgICAgICBhZGp1c3RGbj8uKGNoaWxkUm91dGVCdWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2hpbGRCdWlsZGVyKGNoaWxkUm91dGVCdWlsZGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2hpbGQgYnVpbGRlciB0byB0aGUgY3VycmVudCByb3V0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Um91dGVCdWlsZGVyfSBidWlsZGVyIC0gVGhlIGNoaWxkIGJ1aWxkZXIgdG8gYmUgYWRkZWQuXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBidWlsZGVyIHdpdGggdGhlIGFkZGVkIGNoaWxkIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIGFkZENoaWxkQnVpbGRlcihidWlsZGVyOiBSb3V0ZUJ1aWxkZXIpOiB0aGlzIHtcbiAgICAgICAgYnVpbGRlci53aXRoUGFyZW50KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICBidWlsZGVyLndpdGhSb290KHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW4gQW5ndWxhciByb3V0ZSBiYXNlZCBvbiBjb25maWd1cmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtSb3V0ZX0gVGhlIGJ1aWx0IEFuZ3VsYXIgcm91dGUuXG4gICAgICovXG4gICAgcHVibGljIGJ1aWxkKCk6IFJvdXRlIHtcbiAgICAgICAgY29uc3QgYW5ndWxhclJvdXRlOiBSb3V0ZSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMucm91dGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYW5ndWxhclJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5kYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLmFuZ3VsYXJSb3V0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMucm91dGVEYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmRhdGEgPSB7Li4udGhpcy5yb3V0ZURhdGF9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXBwZW5kIHBlcm1pc3Npb25zIGlmIG5vdCBhbHJlYWR5IGluIHJvdXRlIGRhdGFcbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnMgJiYgIShhbmd1bGFyUm91dGUuZGF0YSBhcyBDb21tb25zUm91dGVEYXRhKS5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgKGFuZ3VsYXJSb3V0ZS5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEpLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLmJ1aWxkTWVudSgpO1xuICAgICAgICBpZiAobWVudS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAoYW5ndWxhclJvdXRlLmRhdGEgYXMgQ29tbW9uc1JvdXRlRGF0YSkubWVudUl0ZW1zID0gbWVudTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodGhpcy5yb3V0ZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMCB8fCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHJvdXRlIGhhcyBjaGlsZHJlblxuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5yb3V0ZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNoaWxkcmVuLnB1c2goLi4udGhpcy5yb3V0ZS5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4ucHVzaChjaGlsZFJvdXRlLmJ1aWxkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkFjdGl2YXRlKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2FuQWN0aXZhdGUgPSBbLi4udGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuQWN0aXZhdGVDaGlsZCkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkFjdGl2YXRlQ2hpbGQgPSBbLi4udGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5Mb2FkKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2FuTG9hZCA9IFsuLi50aGlzLnJvdXRlLmNhbkxvYWRdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkRlYWN0aXZhdGUpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jYW5EZWFjdGl2YXRlID0gWy4uLnRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGUucmVzb2x2ZSkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLnJlc29sdmUgPSB7Li4udGhpcy5yb3V0ZS5yZXNvbHZlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmd1bGFyUm91dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBtZW51IGl0ZW1zLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PENvbW1vbnNNZW51SXRlbT59IC0gVGhlIGJ1aWx0IG1lbnUgaXRlbXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZE1lbnUoKTogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiB7XG4gICAgICAgIGNvbnN0IG1lbnVJdGVtQnVpbGQ6IENvbW1vbnNNZW51SXRlbSB8IG51bGwgPSB0aGlzLm1lbnVJdGVtID8gey4uLnRoaXMubWVudUl0ZW19IDogbnVsbDtcbiAgICAgICAgY29uc3Qgcm91dGVDaGlsZHJlbk1lbnVJdGVtczogQXJyYXk8Q29tbW9uc01lbnVJdGVtPiA9IHRoaXMuY2hpbGRyZW4uZmxhdE1hcChjaGlsZCA9PiBjaGlsZC5idWlsZE1lbnUoKSk7XG4gICAgICAgIGNvbnN0IG1lbnVJdGVtQ2hpbGRyZW46IEFycmF5PENvbW1vbnNNZW51SXRlbT4gPSBbXTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1DaGlsZHJlbkJ1aWxkOiBBcnJheTxDb21tb25zTWVudUl0ZW0+ID0gW107XG5cbiAgICAgICAgaWYgKG1lbnVJdGVtQnVpbGQ/Lml0ZW1zKSB7XG4gICAgICAgICAgICBtZW51SXRlbUNoaWxkcmVuQnVpbGQucHVzaCguLi5tZW51SXRlbUJ1aWxkLml0ZW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NNZW51SXRlbUNoaWxkID0gKGNoaWxkOiBDb21tb25zTWVudUl0ZW0pOiBDb21tb25zTWVudUl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgZmluYWxDaGlsZDogQ29tbW9uc01lbnVJdGVtID0gey4uLmNoaWxkfTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmluYWxDaGlsZC5yb3V0ZXJMaW5rID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGZpbmFsQ2hpbGQucm91dGVyTGluayA9IHRoaXMucm91dGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbENoaWxkLnJvdXRlckxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZmluYWxDaGlsZC5yb3V0ZXJMaW5rID0gW2ZpbmFsQ2hpbGQucm91dGVyTGlua107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmluYWxDaGlsZC5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICAgICAgZmluYWxDaGlsZC5yb3V0ZXJMaW5rID0gcmVtb3ZlUm91dGVFbXB0eVBhdGhTZWdtZW50cyhmaW5hbENoaWxkLnJvdXRlckxpbmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQ2hpbGQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gbWVudUl0ZW1DaGlsZHJlbi5wdXNoKHByb2Nlc3NNZW51SXRlbUNoaWxkKGNoaWxkKSkpO1xuXG4gICAgICAgIGNvbnN0IG1lbnVJdGVtQ2hpbGRyZW5BZnRlckJ1aWxkOiBBcnJheTxDb21tb25zTWVudUl0ZW0+ID0gdGhpcy5tZW51SXRlbUNoaWxkcmVuQWZ0ZXIubWFwKGNoaWxkID0+IHByb2Nlc3NNZW51SXRlbUNoaWxkKGNoaWxkKSk7XG5cbiAgICAgICAgbWVudUl0ZW1DaGlsZHJlbkJ1aWxkLnB1c2goLi4ubWVudUl0ZW1DaGlsZHJlbiwgLi4ucm91dGVDaGlsZHJlbk1lbnVJdGVtcywgLi4ubWVudUl0ZW1DaGlsZHJlbkFmdGVyQnVpbGQpO1xuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbnVJdGVtQnVpbGQubGFiZWwgPSBtZW51SXRlbUJ1aWxkLmxhYmVsID8/IHRoaXMucm91dGVEYXRhLnBhZ2VUaXRsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPSBbbWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rXTtcbiAgICAgICAgfVxuICAgICAgICBtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPSByZW1vdmVSb3V0ZUVtcHR5UGF0aFNlZ21lbnRzKG1lbnVJdGVtQnVpbGQucm91dGVyTGluayA/PyB0aGlzLnJvdXRlUGF0aCk7XG4gICAgICAgIGlmIChtZW51SXRlbUNoaWxkcmVuQnVpbGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5pdGVtcyA9IG1lbnVJdGVtQ2hpbGRyZW5CdWlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZC5ndWFyZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IHRoaXMuZmluZE1lbnVJdGVtR3VhcmRzKCk7XG4gICAgICAgICAgICBpZiAoZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtZW51SXRlbUJ1aWxkLmd1YXJkcyA9IGd1YXJkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZC5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5wZXJtaXNzaW9ucyA9IHRoaXMuZmluZE1lbnVJdGVtUGVybWlzc2lvbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbWVudUl0ZW1CdWlsZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTWVudUl0ZW1HdWFyZHMoKTogQXJyYXk8YW55PiB7XG4gICAgICAgIGNvbnN0IGd1YXJkczogQXJyYXk8YW55PiA9IFtdO1xuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBndWFyZHMucHVzaCguLi50aGlzLnJvdXRlLmNhbkFjdGl2YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBwYXJlbnQgZ3VhcmRzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGRlY2lzaW9uIHRvIGhpZGUgbWVudSBpdGVtIVxuICAgICAgICAgICAgLy8gU29tZSBwYXJlbnQgcm91dGVzIG1pZ2h0IGhhdmUgZ3VhcmRzLCBidXQgbm8gbWVudSBpdGVtcywgc28gdGhpcyBndWFyZHMgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaGVyZSxcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gcGFyZW50IG1lbnUgaXRlbSB0byBoaWRlLlxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZmluZE1lbnVJdGVtR3VhcmRzKCkuZm9yRWFjaChnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZ3VhcmRzLmluZGV4T2YoZykgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGd1YXJkcy5wdXNoKGcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBndWFyZHM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRNZW51SXRlbVBlcm1pc3Npb25zKCkge1xuICAgICAgICBpZiAodGhpcy5tZW51SXRlbT8ucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lbnVJdGVtLnBlcm1pc3Npb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlRGF0YS5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBhbHJlYWR5IGJ1aWx0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZURhdGEucGVybWlzc2lvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb25zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNZW51SXRlbShpY29uPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgcm91dGVyTGluaz86IEFycmF5PHN0cmluZz4pIHtcbiAgICBjb25zdCBtZW51SXRlbTogQ29tbW9uc01lbnVJdGVtID0ge307XG4gICAgaWYgKGljb24pIHtcbiAgICAgICAgbWVudUl0ZW0uaWNvbiA9IGljb247XG4gICAgfVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgICBtZW51SXRlbS5sYWJlbCA9IGxhYmVsO1xuICAgIH1cbiAgICBpZiAocm91dGVyTGluaykge1xuICAgICAgICBtZW51SXRlbS5yb3V0ZXJMaW5rID0gcm91dGVyTGluaztcbiAgICB9XG4gICAgcmV0dXJuIG1lbnVJdGVtO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUm91dGVCdWlsZGVyIHdpdGggdGhlIGdpdmVuIHBhdGggYW5kIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIGZvciB0aGUgcm91dGUuXG4gKiBAcGFyYW0ge1R5cGU8YW55Pn0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBmb3IgdGhlIHJvdXRlLlxuICogQHJldHVybiB7Um91dGVCdWlsZGVyfSAtIEEgbmV3IGluc3RhbmNlIG9mIFJvdXRlQnVpbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlKHBhdGg6IHN0cmluZywgY29tcG9uZW50OiBUeXBlPGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHtcbiAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVkaXJlY3Qgcm91dGUgZm9yIHRoZSBnaXZlbiBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWRpcmVjdFRvIC0gVGhlIFVSTCBwYXRoIHRvIHJlZGlyZWN0IHRvLlxuICogQHBhcmFtIHsnZnVsbCcgfCAncHJlZml4J30gW3BhdGhNYXRjaD0ncHJlZml4J10gLSBUaGUgcGF0aCBtYXRjaGluZyBzdHJhdGVneSAoJ2Z1bGwnIG9yICdwcmVmaXgnKS5cbiAqIEByZXR1cm4ge1JvdXRlQnVpbGRlcn0gLSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgUm91dGVCdWlsZGVyIGNsYXNzIHdpdGggdGhlIHJlZGlyZWN0IHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb3V0ZVJlZGlyZWN0KHBhdGg6IHN0cmluZywgcmVkaXJlY3RUbzogc3RyaW5nLCBwYXRoTWF0Y2g6ICdmdWxsJyB8ICdwcmVmaXgnID0gJ3ByZWZpeCcpOiBSb3V0ZUJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHtcbiAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgcmVkaXJlY3RUbzogcmVkaXJlY3RUbyxcbiAgICAgICAgcGF0aE1hdGNoOiBwYXRoTWF0Y2hcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSByb3V0ZSBtb2R1bGUgKG9yIHJvdXRlcykuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCBmb3IgdGhlIHJvdXRlLlxuICogQHBhcmFtIHtMb2FkQ2hpbGRyZW59IGxvYWRDaGlsZHJlbiAtIFRoZSBmdW5jdGlvbiB0aGF0IGxvYWRzIHRoZSBsYXp5IG1vZHVsZSAob3Igcm91dGVzKS5cbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gW2Nhbk1hdGNoXSAtIEFuIG9wdGlvbmFsIGFycmF5IG9mIG9iamVjdHMgdGhhdCBjYW4gbWF0Y2ggdGhlIHJvdXRlLlxuICogQHJldHVybnMge1JvdXRlQnVpbGRlcn0gLSBBIG5ldyBpbnN0YW5jZSBvZiBSb3V0ZUJ1aWxkZXIgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5Q2hpbGRyZW5Sb3V0ZShwYXRoOiBzdHJpbmcsIGxvYWRDaGlsZHJlbjogTG9hZENoaWxkcmVuLCBjYW5NYXRjaD86IEFycmF5PGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgIGNvbnN0IHJvdXRlOiBSb3V0ZSA9IHtwYXRoOiBwYXRoLCBsb2FkQ2hpbGRyZW46IGxvYWRDaGlsZHJlbn07XG4gICAgaWYgKGNhbk1hdGNoPy5sZW5ndGgpIHtcbiAgICAgICAgcm91dGUuY2FuTWF0Y2ggPSBjYW5NYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIocm91dGUpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXp5IHJvdXRlIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIGZvciB0aGUgcm91dGUuXG4gKiBAcGFyYW0geygpID0+IFR5cGU8dW5rbm93bj4gfCBPYnNlcnZhYmxlPFR5cGU8dW5rbm93bj4gfCBEZWZhdWx0RXhwb3J0PFR5cGU8dW5rbm93bj4+PiB8IFByb21pc2U8VHlwZTx1bmtub3duPiB8IERlZmF1bHRFeHBvcnQ8VHlwZTx1bmtub3duPj4+fSBsb2FkQ29tcG9uZW50IC0gVGhlIGZ1bmN0aW9uIHRoYXQgbG9hZHMgdGhlIGNvbXBvbmVudCBmb3IgdGhlIHJvdXRlLlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBbY2FuTWF0Y2hdIC0gVGhlIGFycmF5IG9mIHZhbHVlcyB0aGF0IGRldGVybWluZSBpZiB0aGUgcm91dGUgY2FuIG1hdGNoLlxuICogQHJldHVybnMge1JvdXRlQnVpbGRlcn0gLSBBbiBpbnN0YW5jZSBvZiBSb3V0ZUJ1aWxkZXIgd2l0aCB0aGUgY3JlYXRlZCByb3V0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhenlSb3V0ZShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbG9hZENvbXBvbmVudDogKCkgPT4gVHlwZTx1bmtub3duPiB8IE9ic2VydmFibGU8VHlwZTx1bmtub3duPiB8IERlZmF1bHRFeHBvcnQ8VHlwZTx1bmtub3duPj4+IHwgUHJvbWlzZTxUeXBlPHVua25vd24+IHwgRGVmYXVsdEV4cG9ydDxUeXBlPHVua25vd24+Pj4sXG4gICAgY2FuTWF0Y2g/OiBBcnJheTxhbnk+XG4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgIGNvbnN0IHJvdXRlOiBSb3V0ZSA9IHtwYXRoOiBwYXRoLCBsb2FkQ29tcG9uZW50OiBsb2FkQ29tcG9uZW50fTtcbiAgICBpZiAoY2FuTWF0Y2g/Lmxlbmd0aCkge1xuICAgICAgICByb3V0ZS5jYW5NYXRjaCA9IGNhbk1hdGNoO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcihyb3V0ZSk7XG59XG4iXX0=