@mediusinc/mng-commons 0.18.0-rc.1 → 0.18.1

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 (373) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  3. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  4. package/esm2020/lib/api/models/index.mjs +8 -8
  5. package/esm2020/lib/api/models/mappers.mjs +12 -12
  6. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  7. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  8. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  9. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  10. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  11. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +67 -67
  12. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  13. package/esm2020/lib/api/services/index.mjs +3 -3
  14. package/esm2020/lib/api/utils/index.mjs +2 -2
  15. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  16. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  17. package/esm2020/lib/components/action/action.component.mjs +213 -213
  18. package/esm2020/lib/components/action/editor/action-editor.component.mjs +271 -271
  19. package/esm2020/lib/components/action/index.mjs +3 -3
  20. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  21. package/esm2020/lib/components/action/models/action-execution.model.mjs +240 -240
  22. package/esm2020/lib/components/action/models/index.mjs +3 -3
  23. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  26. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  27. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  28. package/esm2020/lib/components/form/editor/form-editor.component.mjs +218 -218
  29. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
  30. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
  31. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
  32. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  33. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +102 -102
  34. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
  35. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +180 -180
  36. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +167 -167
  37. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +149 -149
  38. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  39. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  40. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
  41. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  42. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  43. package/esm2020/lib/components/form/index.mjs +4 -4
  44. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  45. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  46. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  47. package/esm2020/lib/components/form/models/index.mjs +2 -2
  48. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  49. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  50. package/esm2020/lib/components/layout/index.mjs +7 -7
  51. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  52. package/esm2020/lib/components/layout/menu-item.component.mjs +272 -267
  53. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  54. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  55. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  56. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  57. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  58. package/esm2020/lib/components/tableview/index.mjs +6 -6
  59. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  60. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  61. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +81 -81
  62. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  63. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  64. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +73 -73
  65. package/esm2020/lib/components/tableview/table/table.component.mjs +584 -560
  66. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  67. package/esm2020/lib/config/formly.config.mjs +186 -186
  68. package/esm2020/lib/config/index.mjs +1 -1
  69. package/esm2020/lib/config/models/config.model.mjs +2 -2
  70. package/esm2020/lib/config/models/formly-config.model.mjs +1 -1
  71. package/esm2020/lib/config/models/index.mjs +2 -2
  72. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  73. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  74. package/esm2020/lib/data-providers/index.mjs +6 -6
  75. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  76. package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
  77. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
  78. package/esm2020/lib/data-providers/tableview.data-provider.mjs +58 -58
  79. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  80. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  81. package/esm2020/lib/descriptors/action.descriptor.mjs +547 -547
  82. package/esm2020/lib/descriptors/column.descriptor.mjs +380 -380
  83. package/esm2020/lib/descriptors/editor.descriptor.mjs +250 -250
  84. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  85. package/esm2020/lib/descriptors/field.descriptor.mjs +901 -901
  86. package/esm2020/lib/descriptors/filter.descriptor.mjs +320 -320
  87. package/esm2020/lib/descriptors/index.mjs +11 -11
  88. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  89. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  90. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  91. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  92. package/esm2020/lib/descriptors/table.descriptor.mjs +463 -464
  93. package/esm2020/lib/descriptors/tableview.descriptor.mjs +323 -323
  94. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  95. package/esm2020/lib/descriptors/types/column.type.mjs +11 -11
  96. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  97. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  98. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  99. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  100. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  101. package/esm2020/lib/directives/component.directive.mjs +43 -43
  102. package/esm2020/lib/directives/index.mjs +2 -2
  103. package/esm2020/lib/directives/template.directive.mjs +27 -27
  104. package/esm2020/lib/mng-commons.module.mjs +465 -465
  105. package/esm2020/lib/models/column-value.model.mjs +1 -1
  106. package/esm2020/lib/models/enum.model.mjs +1 -1
  107. package/esm2020/lib/models/error.model.mjs +1 -1
  108. package/esm2020/lib/models/formly-field.model.mjs +1 -1
  109. package/esm2020/lib/models/index.mjs +9 -9
  110. package/esm2020/lib/models/menu.model.mjs +1 -1
  111. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  112. package/esm2020/lib/models/user.model.mjs +1 -1
  113. package/esm2020/lib/models/version.model.mjs +1 -1
  114. package/esm2020/lib/models/view-container.model.mjs +1 -1
  115. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  116. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  117. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  118. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  119. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  120. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  121. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  122. package/esm2020/lib/pipes/index.mjs +10 -10
  123. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  124. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  125. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  126. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  127. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  128. package/esm2020/lib/router/index.mjs +2 -2
  129. package/esm2020/lib/router/models/index.mjs +1 -1
  130. package/esm2020/lib/router/models/router.model.mjs +1 -1
  131. package/esm2020/lib/router/route-builder.mjs +425 -425
  132. package/esm2020/lib/router/tableview-route-builder.mjs +183 -183
  133. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  134. package/esm2020/lib/security/authorization.service.mjs +46 -46
  135. package/esm2020/lib/security/authorization.util.mjs +15 -15
  136. package/esm2020/lib/security/index.mjs +3 -3
  137. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  138. package/esm2020/lib/security/model/index.mjs +3 -3
  139. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  140. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  141. package/esm2020/lib/services/action-executor.service.mjs +547 -547
  142. package/esm2020/lib/services/commons.service.mjs +354 -354
  143. package/esm2020/lib/services/configuration.service.mjs +119 -119
  144. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  145. package/esm2020/lib/services/index.mjs +6 -6
  146. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  147. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  148. package/esm2020/lib/services/internal/index.mjs +2 -2
  149. package/esm2020/lib/services/navigation.service.mjs +47 -47
  150. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  151. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  152. package/esm2020/lib/services/providers/index.mjs +2 -2
  153. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  154. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  155. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  156. package/esm2020/lib/services/tokens/index.mjs +4 -4
  157. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  158. package/esm2020/lib/services/version.service.mjs +38 -38
  159. package/esm2020/lib/services/view-container.component.service.mjs +47 -47
  160. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  161. package/esm2020/lib/styles/index.mjs +2 -2
  162. package/esm2020/lib/styles/models/index.mjs +2 -2
  163. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  164. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  165. package/esm2020/lib/styles/styles.util.mjs +41 -41
  166. package/esm2020/lib/types/index.mjs +2 -2
  167. package/esm2020/lib/types/type.decorator.mjs +21 -21
  168. package/esm2020/lib/types/type.model.mjs +1 -1
  169. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  170. package/esm2020/lib/utils/date.util.mjs +117 -117
  171. package/esm2020/lib/utils/editor-formly.util.mjs +262 -262
  172. package/esm2020/lib/utils/enum.util.mjs +81 -81
  173. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  174. package/esm2020/lib/utils/index.mjs +9 -9
  175. package/esm2020/lib/utils/model.util.mjs +68 -68
  176. package/esm2020/lib/utils/notification.util.mjs +45 -45
  177. package/esm2020/lib/utils/route.util.mjs +23 -23
  178. package/esm2020/lib/utils/string.util.mjs +26 -26
  179. package/esm2020/lib/utils/tableview.util.mjs +143 -143
  180. package/esm2020/lib/utils/type.util.mjs +92 -92
  181. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  182. package/esm2020/public-api.mjs +54 -54
  183. package/fesm2015/mediusinc-mng-commons.mjs +12828 -12801
  184. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  185. package/fesm2020/mediusinc-mng-commons.mjs +12672 -12645
  186. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  187. package/index.d.ts +5 -5
  188. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  189. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  190. package/lib/api/models/filter-param.model.d.ts +23 -23
  191. package/lib/api/models/index.d.ts +8 -8
  192. package/lib/api/models/mappers.d.ts +6 -6
  193. package/lib/api/models/query-mode.model.d.ts +16 -16
  194. package/lib/api/models/query-param.model.d.ts +31 -31
  195. package/lib/api/models/query-result.model.d.ts +24 -24
  196. package/lib/api/models/serialization.model.d.ts +8 -8
  197. package/lib/api/services/api.abstract.service.d.ts +24 -24
  198. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  199. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  200. package/lib/api/services/index.d.ts +3 -3
  201. package/lib/api/utils/index.d.ts +2 -2
  202. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  203. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  204. package/lib/components/action/action.component.d.ts +69 -69
  205. package/lib/components/action/editor/action-editor.component.d.ts +63 -63
  206. package/lib/components/action/index.d.ts +3 -3
  207. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  208. package/lib/components/action/models/action-execution.model.d.ts +131 -131
  209. package/lib/components/action/models/index.d.ts +3 -3
  210. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  211. package/lib/components/action/route/action-route.component.d.ts +31 -31
  212. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  213. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  214. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  215. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  216. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  217. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  218. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  219. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  220. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +24 -24
  221. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  222. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  223. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +21 -21
  224. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  225. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  226. package/lib/components/form/formly/fields/index.d.ts +10 -10
  227. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  228. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  229. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  230. package/lib/components/form/index.d.ts +4 -4
  231. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  232. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  233. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  234. package/lib/components/form/models/index.d.ts +2 -2
  235. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  236. package/lib/components/layout/footer.component.d.ts +9 -9
  237. package/lib/components/layout/index.d.ts +7 -7
  238. package/lib/components/layout/main-layout.component.d.ts +20 -20
  239. package/lib/components/layout/menu-item.component.d.ts +52 -52
  240. package/lib/components/layout/menu.component.d.ts +10 -10
  241. package/lib/components/layout/services/index.d.ts +1 -1
  242. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  243. package/lib/components/layout/topbar.component.d.ts +28 -28
  244. package/lib/components/layout/version.component.d.ts +19 -19
  245. package/lib/components/tableview/index.d.ts +6 -6
  246. package/lib/components/tableview/models/index.d.ts +1 -1
  247. package/lib/components/tableview/models/table.event.d.ts +17 -17
  248. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +26 -26
  249. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  250. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  251. package/lib/components/tableview/table/column-value/column-value.component.d.ts +30 -30
  252. package/lib/components/tableview/table/table.component.d.ts +114 -113
  253. package/lib/components/tableview/tableview.component.d.ts +48 -48
  254. package/lib/config/formly.config.d.ts +13 -16
  255. package/lib/config/index.d.ts +1 -1
  256. package/lib/config/models/config.model.d.ts +38 -36
  257. package/lib/config/models/formly-config.model.d.ts +11 -11
  258. package/lib/config/models/index.d.ts +2 -2
  259. package/lib/data-providers/base.data-provider.d.ts +14 -14
  260. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  261. package/lib/data-providers/index.d.ts +6 -6
  262. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  263. package/lib/data-providers/table.data-provider.d.ts +27 -27
  264. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  265. package/lib/data-providers/tableview.data-provider.d.ts +37 -37
  266. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  267. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  268. package/lib/descriptors/action.descriptor.d.ts +212 -212
  269. package/lib/descriptors/column.descriptor.d.ts +123 -123
  270. package/lib/descriptors/editor.descriptor.d.ts +95 -95
  271. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  272. package/lib/descriptors/field.descriptor.d.ts +324 -324
  273. package/lib/descriptors/filter.descriptor.d.ts +112 -112
  274. package/lib/descriptors/index.d.ts +11 -11
  275. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  276. package/lib/descriptors/interfaces/index.d.ts +2 -2
  277. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  278. package/lib/descriptors/model.descriptor.d.ts +18 -18
  279. package/lib/descriptors/table.descriptor.d.ts +182 -182
  280. package/lib/descriptors/tableview.descriptor.d.ts +122 -122
  281. package/lib/descriptors/types/action.type.d.ts +21 -21
  282. package/lib/descriptors/types/column.type.d.ts +10 -10
  283. package/lib/descriptors/types/editor.type.d.ts +6 -6
  284. package/lib/descriptors/types/field.type.d.ts +44 -44
  285. package/lib/descriptors/types/filter.type.d.ts +27 -27
  286. package/lib/descriptors/types/index.d.ts +6 -6
  287. package/lib/descriptors/types/table.type.d.ts +22 -22
  288. package/lib/directives/component.directive.d.ts +16 -16
  289. package/lib/directives/index.d.ts +2 -2
  290. package/lib/directives/template.directive.d.ts +13 -13
  291. package/lib/mng-commons.module.d.ts +94 -94
  292. package/lib/models/column-value.model.d.ts +4 -4
  293. package/lib/models/enum.model.d.ts +6 -6
  294. package/lib/models/error.model.d.ts +14 -14
  295. package/lib/models/formly-field.model.d.ts +16 -16
  296. package/lib/models/index.d.ts +9 -9
  297. package/lib/models/menu.model.d.ts +27 -27
  298. package/lib/models/tableview-attr.model.d.ts +9 -9
  299. package/lib/models/user.model.d.ts +8 -8
  300. package/lib/models/version.model.d.ts +18 -18
  301. package/lib/models/view-container.model.d.ts +37 -37
  302. package/lib/pipes/boolean.pipe.d.ts +7 -7
  303. package/lib/pipes/class-map.pipe.d.ts +7 -7
  304. package/lib/pipes/enum.pipe.d.ts +8 -8
  305. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  306. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  307. package/lib/pipes/getter.pipe.d.ts +7 -7
  308. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  309. package/lib/pipes/index.d.ts +10 -10
  310. package/lib/pipes/json-path.pipe.d.ts +13 -13
  311. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  312. package/lib/pipes/models/internal/index.d.ts +1 -1
  313. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  314. package/lib/pipes/template.pipe.d.ts +10 -10
  315. package/lib/router/index.d.ts +2 -2
  316. package/lib/router/models/index.d.ts +1 -1
  317. package/lib/router/models/router.model.d.ts +33 -33
  318. package/lib/router/route-builder.d.ts +98 -98
  319. package/lib/router/tableview-route-builder.d.ts +37 -37
  320. package/lib/security/authorization.guard.d.ts +11 -11
  321. package/lib/security/authorization.service.d.ts +19 -19
  322. package/lib/security/authorization.util.d.ts +5 -5
  323. package/lib/security/index.d.ts +3 -3
  324. package/lib/security/model/authorization.type.d.ts +6 -6
  325. package/lib/security/model/index.d.ts +3 -3
  326. package/lib/security/model/permission-service.interface.d.ts +6 -6
  327. package/lib/security/model/permissions.model.d.ts +37 -37
  328. package/lib/services/action-executor.service.d.ts +149 -149
  329. package/lib/services/commons.service.d.ts +81 -81
  330. package/lib/services/configuration.service.d.ts +45 -45
  331. package/lib/services/error-mapper.service.d.ts +7 -7
  332. package/lib/services/index.d.ts +6 -6
  333. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  334. package/lib/services/internal/commons-init.service.d.ts +16 -16
  335. package/lib/services/internal/index.d.ts +2 -2
  336. package/lib/services/navigation.service.d.ts +14 -14
  337. package/lib/services/providers/config-service.provider.d.ts +6 -6
  338. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  339. package/lib/services/providers/index.d.ts +2 -2
  340. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  341. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  342. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  343. package/lib/services/tokens/index.d.ts +4 -4
  344. package/lib/services/tokens/module-config.token.d.ts +3 -3
  345. package/lib/services/version.service.d.ts +13 -13
  346. package/lib/services/view-container.component.service.d.ts +28 -28
  347. package/lib/styles/button-style.builder.d.ts +67 -67
  348. package/lib/styles/index.d.ts +2 -2
  349. package/lib/styles/models/index.d.ts +2 -2
  350. package/lib/styles/models/style-level.enum.d.ts +10 -10
  351. package/lib/styles/models/style-size.enum.d.ts +7 -7
  352. package/lib/styles/styles.util.d.ts +14 -14
  353. package/lib/types/index.d.ts +2 -2
  354. package/lib/types/type.decorator.d.ts +4 -4
  355. package/lib/types/type.model.d.ts +23 -23
  356. package/lib/utils/action-data-provider.util.d.ts +20 -20
  357. package/lib/utils/date.util.d.ts +7 -7
  358. package/lib/utils/editor-formly.util.d.ts +12 -12
  359. package/lib/utils/enum.util.d.ts +50 -50
  360. package/lib/utils/i18n.util.d.ts +56 -56
  361. package/lib/utils/index.d.ts +9 -9
  362. package/lib/utils/model.util.d.ts +8 -8
  363. package/lib/utils/notification.util.d.ts +11 -11
  364. package/lib/utils/route.util.d.ts +4 -4
  365. package/lib/utils/string.util.d.ts +4 -4
  366. package/lib/utils/tableview.util.d.ts +39 -39
  367. package/lib/utils/type.util.d.ts +57 -57
  368. package/package.json +1 -1
  369. package/public-api.d.ts +34 -34
  370. package/scss/mng-overrides/_theme_datatable.scss +31 -3
  371. package/scss/mng-overrides/_theme_dialog.scss +2 -1
  372. package/version-info.json +6 -6
  373. package/mediusinc-mng-commons-0.18.0-rc.1.tgz +0 -0
@@ -1,902 +1,902 @@
1
- import { Validators } from '@angular/forms';
2
- import { Subject, of } from 'rxjs';
3
- import { MngFormFieldEvent } from '../components/form/models';
4
- import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
- import { ButtonStyleBuilder } from '../styles';
6
- import { StyleLevelEnum } from '../styles/models';
7
- import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
8
- import { ActionButtonDescriptor, EditorDescriptor, FieldValidationDescriptor } from './';
9
- import { FieldGroupTypeEnum, FieldInputTypeEnum, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorTypeEnum, FieldSizeEnum } from './types';
10
- export class AGenericFieldDescriptor {
11
- constructor(editor) {
12
- this._config = {};
13
- this._editor = editor;
14
- }
15
- get editor() {
16
- return this._editor;
17
- }
18
- get config() {
19
- return this._config;
20
- }
21
- withConfig(config) {
22
- this._config = config;
23
- return this;
24
- }
25
- }
26
- export class AFieldDescriptor extends AGenericFieldDescriptor {
27
- constructor(editor, property) {
28
- super(editor);
29
- this._required = false;
30
- this._requiredHideLabelMarker = false;
31
- this._disabled = false;
32
- this._validations = [];
33
- this._asyncValidations = [];
34
- this._className = '';
35
- this._labelClassName = '';
36
- this._inputClassName = '';
37
- this._size = FieldSizeEnum.Normal;
38
- this._eventsSubject = new Subject();
39
- this._property = property;
40
- this._label = I18nUtils.Type.getPropertyKey(this._editor.model.i18nBaseKey, property);
41
- }
42
- get property() {
43
- return this._property;
44
- }
45
- get label() {
46
- return this._label;
47
- }
48
- get placeholder() {
49
- return this._placeholder;
50
- }
51
- get helpText() {
52
- return this._helpText;
53
- }
54
- get required() {
55
- return this._required;
56
- }
57
- get requiredHideLabelMarker() {
58
- return this._requiredHideLabelMarker;
59
- }
60
- get disabled() {
61
- return this._disabled;
62
- }
63
- get defaultValue() {
64
- return this._defaultValue;
65
- }
66
- get getter() {
67
- return this._getter;
68
- }
69
- get setter() {
70
- return this._setter;
71
- }
72
- get validations() {
73
- return this._validations;
74
- }
75
- get asyncValidations() {
76
- return this._asyncValidations;
77
- }
78
- get requiredExpression() {
79
- return this._requiredExpression;
80
- }
81
- get disabledExpression() {
82
- return this._disabledExpression;
83
- }
84
- get hiddenExpression() {
85
- return this._hiddenExpression;
86
- }
87
- get className() {
88
- return this._className;
89
- }
90
- get fieldClassName() {
91
- return this._fieldClassName;
92
- }
93
- get labelClassName() {
94
- return this._labelClassName;
95
- }
96
- get inputClassName() {
97
- return this._inputClassName;
98
- }
99
- get size() {
100
- return this._size;
101
- }
102
- get isSizeSmall() {
103
- return this._size === FieldSizeEnum.Small;
104
- }
105
- get isSizeLarge() {
106
- return this._size === FieldSizeEnum.Large;
107
- }
108
- withLabel(label) {
109
- this._label = label;
110
- return this;
111
- }
112
- withPlaceholder(placeholder) {
113
- this._placeholder = placeholder;
114
- return this;
115
- }
116
- withHelpText(helpText) {
117
- this._helpText = helpText;
118
- return this;
119
- }
120
- withRequired(required = true, requiredExpression, hideLabelMarker = false) {
121
- this._required = required;
122
- if (requiredExpression) {
123
- this._requiredExpression = requiredExpression;
124
- }
125
- this._requiredHideLabelMarker = hideLabelMarker;
126
- return this;
127
- }
128
- withDisabled(disabled = true, disabledExpression) {
129
- this._disabled = disabled;
130
- if (disabledExpression) {
131
- this._disabledExpression = disabledExpression;
132
- }
133
- return this;
134
- }
135
- withHidden(hiddenExpression) {
136
- this._hiddenExpression = hiddenExpression;
137
- return this;
138
- }
139
- withDefaultValue(defaultValue) {
140
- this._defaultValue = defaultValue;
141
- return this;
142
- }
143
- withGetter(getter) {
144
- this._getter = getter;
145
- return this;
146
- }
147
- withSetter(setter) {
148
- this._setter = setter;
149
- return this;
150
- }
151
- withValidation(name, validator, message) {
152
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
153
- return this;
154
- }
155
- withAsyncValidation(name, asyncValidator, message) {
156
- this._asyncValidations.push(new FieldValidationDescriptor(name, asyncValidator, message));
157
- return this;
158
- }
159
- withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
160
- this._className = className;
161
- this._labelClassName = labelClassName;
162
- this._inputClassName = inputClassName;
163
- this._fieldClassName = fieldClassName;
164
- return this;
165
- }
166
- withSize(size = FieldSizeEnum.Normal) {
167
- this._size = size;
168
- return this;
169
- }
170
- nextEvent(type, cmpType, cmpInstance, data) {
171
- this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
172
- }
173
- get events$() {
174
- return this._eventsSubject.asObservable();
175
- }
176
- copyFieldsTo(obj) {
177
- obj._label = this._label;
178
- obj._placeholder = this._placeholder;
179
- obj._helpText = this._helpText;
180
- obj._required = this._required;
181
- obj._disabled = this._disabled;
182
- obj._defaultValue = this._defaultValue;
183
- obj._requiredExpression = this._requiredExpression;
184
- obj._hiddenExpression = this._hiddenExpression;
185
- obj._disabledExpression = this._disabledExpression;
186
- obj._className = this._className;
187
- obj._size = this.size;
188
- obj._getter = this._getter;
189
- obj._setter = this._setter;
190
- obj._validations = this._validations;
191
- obj._asyncValidations = this._asyncValidations;
192
- }
193
- }
194
- export class FieldInputDescriptor extends AFieldDescriptor {
195
- constructor(editor, property) {
196
- super(editor, property);
197
- this._fieldType = FieldInputTypeEnum.Text;
198
- this._numberUseGrouping = true;
199
- this._currencyDisplay = 'symbol';
200
- // radio specific properties
201
- this._radioOptions = [];
202
- this._datePickerShowTime = false;
203
- this._datePickerShowSeconds = true;
204
- // file specific properties
205
- this._fileMultiple = false;
206
- this._fileMaxFileSize = 500000;
207
- }
208
- /**
209
- * converts field to given type with additional arguments
210
- * @param fieldType field type enum
211
- * @param args any additional arguments for field (optional)
212
- */
213
- asType(fieldType, ...args) {
214
- switch (fieldType) {
215
- case FieldInputTypeEnum.Hidden:
216
- return this.asHidden();
217
- case FieldInputTypeEnum.Label:
218
- return this.asLabel();
219
- case FieldInputTypeEnum.Textarea:
220
- return this.asTextarea(...args);
221
- case FieldInputTypeEnum.Number:
222
- return this.asNumber();
223
- case FieldInputTypeEnum.Currency:
224
- return this.asCurrency(...args);
225
- case FieldInputTypeEnum.Switch:
226
- return this.asSwitch();
227
- case FieldInputTypeEnum.Radio:
228
- return this.asRadio(args[0], args[1]);
229
- case FieldInputTypeEnum.Datepicker:
230
- return this.asDatePicker(...args);
231
- case FieldInputTypeEnum.Mask:
232
- return this.asMask(args[0], args[1]);
233
- case FieldInputTypeEnum.File:
234
- return this.asFile(...args);
235
- case FieldInputTypeEnum.Custom:
236
- return this.asCustomComponent(args[0]);
237
- case FieldInputTypeEnum.Text:
238
- return this.asText();
239
- }
240
- }
241
- get fieldType() {
242
- return this._fieldType;
243
- }
244
- get rows() {
245
- return this._rows;
246
- }
247
- get numberMin() {
248
- return this._numberMin;
249
- }
250
- get numberMax() {
251
- return this._numberMax;
252
- }
253
- get numberStep() {
254
- return this._numberStep;
255
- }
256
- get numberMinFractionDigits() {
257
- return this._numberMinFractionDigits;
258
- }
259
- get numberMaxFractionDigits() {
260
- return this._numberMaxFractionDigits;
261
- }
262
- get numberUseGrouping() {
263
- return this._numberUseGrouping;
264
- }
265
- get radioOptions() {
266
- return this._radioOptions;
267
- }
268
- get datePickerFormat() {
269
- return this._datePickerFormat;
270
- }
271
- get datePickerMin() {
272
- return this._datePickerMin;
273
- }
274
- get datePickerMax() {
275
- return this._datePickerMax;
276
- }
277
- get datePickerShowTime() {
278
- return this._datePickerShowTime;
279
- }
280
- get datePickerShowSeconds() {
281
- return this._datePickerShowSeconds;
282
- }
283
- get maxLength() {
284
- return this._maxLength;
285
- }
286
- get minLength() {
287
- return this._minLength;
288
- }
289
- get pattern() {
290
- return this._pattern;
291
- }
292
- get mask() {
293
- return this._mask;
294
- }
295
- get slotChar() {
296
- return this._slotChar;
297
- }
298
- get fileMultiple() {
299
- return this._fileMultiple;
300
- }
301
- get fileMaxFileSize() {
302
- return this._fileMaxFileSize;
303
- }
304
- get fileAccept() {
305
- return this._fileAccept;
306
- }
307
- get fileOnSelectHandler() {
308
- return this._fileOnSelectHandler;
309
- }
310
- get customComponentName() {
311
- return this._customComponentName;
312
- }
313
- get locale() {
314
- return this._locale;
315
- }
316
- get currency() {
317
- return this._currency;
318
- }
319
- get currencyFromProperty() {
320
- return this._currencyFromProperty;
321
- }
322
- get currencyDisplay() {
323
- return this._currencyDisplay;
324
- }
325
- asHidden() {
326
- this._fieldType = FieldInputTypeEnum.Hidden;
327
- return this;
328
- }
329
- asLabel() {
330
- this._fieldType = FieldInputTypeEnum.Label;
331
- return this;
332
- }
333
- asText() {
334
- this._fieldType = FieldInputTypeEnum.Text;
335
- return this;
336
- }
337
- asTextarea(rows = 3) {
338
- this._fieldType = FieldInputTypeEnum.Textarea;
339
- this._rows = rows;
340
- return this;
341
- }
342
- asNumber() {
343
- this._fieldType = FieldInputTypeEnum.Number;
344
- return this;
345
- }
346
- asCurrency(currencyFromProperty, currency, currencyDisplay) {
347
- this._fieldType = FieldInputTypeEnum.Currency;
348
- this._currencyFromProperty = currencyFromProperty;
349
- this._currency = currency ?? this._currency;
350
- this._currencyDisplay = currencyDisplay ?? this._currencyDisplay;
351
- return this.withNumberFractions(2, 2);
352
- }
353
- asSwitch() {
354
- this._fieldType = FieldInputTypeEnum.Switch;
355
- return this;
356
- }
357
- asRadio(options, optionsTitlePath) {
358
- this._fieldType = FieldInputTypeEnum.Radio;
359
- this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
360
- return this;
361
- }
362
- asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
363
- this._fieldType = FieldInputTypeEnum.Radio;
364
- if (typeof optionsTitlePath === 'undefined') {
365
- optionsTitlePath = TypeUtil.findEnumName(enumType);
366
- }
367
- this._radioOptions = Array.isArray(values)
368
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
369
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
370
- return this;
371
- }
372
- asDatePicker(format, min, max, showTime, showSeconds) {
373
- this._fieldType = FieldInputTypeEnum.Datepicker;
374
- this._datePickerFormat = format;
375
- this._datePickerMin = min;
376
- this._datePickerMax = max;
377
- this._datePickerShowTime = showTime ?? false;
378
- this._datePickerShowSeconds = showSeconds ?? true;
379
- return this;
380
- }
381
- asMask(mask, slotChar) {
382
- this._fieldType = FieldInputTypeEnum.Mask;
383
- this._mask = mask;
384
- this._slotChar = slotChar;
385
- return this;
386
- }
387
- asFile(multiple = false, maxFileSize = 500000, accept) {
388
- this._fieldType = FieldInputTypeEnum.File;
389
- this._fileMultiple = multiple;
390
- this._fileMaxFileSize = maxFileSize;
391
- this._fileAccept = accept;
392
- return this;
393
- }
394
- asCustomComponent(customComponentName) {
395
- this._fieldType = FieldInputTypeEnum.Custom;
396
- this._customComponentName = customComponentName;
397
- return this;
398
- }
399
- withNumberValidation(min, max, step) {
400
- this._numberStep = step ?? this._numberStep;
401
- this._numberMin = min ?? this._numberMin ?? Number.MIN_SAFE_INTEGER;
402
- this._numberMax = max ?? this._numberMax ?? Number.MAX_SAFE_INTEGER;
403
- return this;
404
- }
405
- withLocale(locale) {
406
- this._locale = locale;
407
- return this;
408
- }
409
- withNumberFractions(min, max) {
410
- this._numberMinFractionDigits = min;
411
- this._numberMaxFractionDigits = max;
412
- return this;
413
- }
414
- withNumberGrouping(useGrouping = true) {
415
- this._numberUseGrouping = useGrouping;
416
- return this;
417
- }
418
- withTextValidation(minLength, maxLength, pattern) {
419
- this._minLength = minLength;
420
- this._maxLength = maxLength;
421
- this._pattern = pattern;
422
- return this;
423
- }
424
- withTextValidationEmail() {
425
- if (this.fieldType === FieldInputTypeEnum.Text) {
426
- this.withValidation('email', Validators.email);
427
- }
428
- return this;
429
- }
430
- withFileOnSelectHandler(fn) {
431
- this._fileOnSelectHandler = fn;
432
- }
433
- copy() {
434
- const field = new FieldInputDescriptor(this._editor, this._property);
435
- this.copyFieldsTo(field);
436
- field._fieldType = this._fieldType;
437
- field._rows = this._rows;
438
- field._numberMin = this._numberMin;
439
- field._numberMax = this._numberMax;
440
- field._numberStep = this._numberStep;
441
- field._numberMinFractionDigits = this._numberMinFractionDigits;
442
- field._numberMaxFractionDigits = this._numberMaxFractionDigits;
443
- field._numberUseGrouping = this._numberUseGrouping;
444
- field._radioOptions = [...this._radioOptions];
445
- field._datePickerFormat = this._datePickerFormat;
446
- field._datePickerMin = this._datePickerMin;
447
- field._datePickerMax = this._datePickerMax;
448
- field._datePickerShowTime = this._datePickerShowTime;
449
- field._datePickerShowSeconds = this._datePickerShowSeconds;
450
- field._maxLength = this._maxLength;
451
- field._minLength = this._minLength;
452
- field._pattern = this._pattern;
453
- field._mask = this._mask;
454
- field._slotChar = this._slotChar;
455
- field._fileMultiple = this._fileMultiple;
456
- field._fileMaxFileSize = this._fileMaxFileSize;
457
- field._fileAccept = this._fileAccept;
458
- field._fileOnSelectHandler = this._fileOnSelectHandler;
459
- field._customComponentName = this._customComponentName;
460
- field._locale = this._locale;
461
- field._currency = this._currency;
462
- field._currencyDisplay = this._currencyDisplay;
463
- field._currencyFromProperty = this._currencyFromProperty;
464
- return field;
465
- }
466
- }
467
- export class FieldActionDescriptor extends AFieldDescriptor {
468
- constructor(editor, property) {
469
- super(editor, property);
470
- this._button = new ActionButtonDescriptor();
471
- this._fieldActionName = property;
472
- let displayName = property;
473
- if (this._editor.model)
474
- displayName = `${this._editor.model.typeName}.${displayName}`;
475
- this._fieldActionNameLong = displayName;
476
- }
477
- get button() {
478
- return this._button;
479
- }
480
- get runFunction() {
481
- return this._runFunction;
482
- }
483
- withButtonDescriptor(button) {
484
- this._button = button;
485
- return this;
486
- }
487
- withButton(label, icon = null, styleLevel = StyleLevelEnum.Default, styleText = false) {
488
- this._button = new ActionButtonDescriptor().withLabel(label).withIcon(icon).withStyleClass(new ButtonStyleBuilder(styleLevel).withTextButton(styleText));
489
- return this;
490
- }
491
- withRunFunction(fn) {
492
- this._runFunction = fn;
493
- return this;
494
- }
495
- copy() {
496
- const field = new FieldActionDescriptor(this._editor, this._property);
497
- this.copyFieldsTo(field);
498
- field._button = this._button.copy();
499
- field._runFunction = this._runFunction?.bind(field);
500
- return field;
501
- }
502
- }
503
- export class FieldLookupDescriptor extends AFieldDescriptor {
504
- constructor(editor, property, modelType) {
505
- super(editor, property);
506
- this._lookupType = FieldLookupTypeEnum.Dropdown;
507
- this._itemsLabelTranslate = false;
508
- this._dropdownClassName = 'mng-filter-lookup-dropdown';
509
- this._autocompleteOpenOnFocus = false;
510
- this._autocompleteInlineSearch = false;
511
- this._autocompleteAutoClear = false;
512
- this._autocompleteSelectFirst = false;
513
- this._modelType = modelType;
514
- ModelUtil.trySetLookupItemsProperties(this);
515
- }
516
- get lookupType() {
517
- return this._lookupType;
518
- }
519
- get itemsLabelProperty() {
520
- return this._itemsLabelProperty;
521
- }
522
- get itemsLabelTranslate() {
523
- return this._itemsLabelTranslate;
524
- }
525
- get itemsValueProperty() {
526
- return this._itemsValueProperty;
527
- }
528
- get itemsDisabledProperty() {
529
- return this._itemsDisabledProperty;
530
- }
531
- get dataKeyProperty() {
532
- return this._dataKeyProperty;
533
- }
534
- get dataProvider() {
535
- return this._dataProvider;
536
- }
537
- get autocompleteOpenOnFocus() {
538
- return this._autocompleteOpenOnFocus;
539
- }
540
- get autocompleteInlineSearch() {
541
- return this._autocompleteInlineSearch;
542
- }
543
- get autocompleteAutoClear() {
544
- return this._autocompleteAutoClear;
545
- }
546
- get autocompleteSelectFirst() {
547
- return this._autocompleteSelectFirst;
548
- }
549
- get dropdownClassName() {
550
- return this._dropdownClassName;
551
- }
552
- get modelType() {
553
- return this._modelType;
554
- }
555
- get dialogTableDescriptor() {
556
- return this._dialogTableDescriptor;
557
- }
558
- get dialogTableDataProvider() {
559
- return this._dialogTableDataProvider;
560
- }
561
- withItemsLabelProperty(itemsLabelProperty, translate = false) {
562
- this._itemsLabelProperty = itemsLabelProperty;
563
- this._itemsLabelTranslate = translate;
564
- return this;
565
- }
566
- withItemsValueProperty(itemsValueProperty) {
567
- this._itemsValueProperty = itemsValueProperty;
568
- this._dataKeyProperty = undefined;
569
- return this;
570
- }
571
- withItemsDisabledProperty(itemsDisabledProperty) {
572
- this._itemsDisabledProperty = itemsDisabledProperty;
573
- return this;
574
- }
575
- withDataKeyProperty(property) {
576
- this._dataKeyProperty = property;
577
- this._itemsValueProperty = undefined;
578
- return this;
579
- }
580
- withLookup(lookup, serviceType) {
581
- const dataProvider = new LookupDataProvider(this._modelType);
582
- if (serviceType) {
583
- dataProvider.withServiceType(serviceType);
584
- }
585
- dataProvider.withLookup(lookup);
586
- this._dataProvider = dataProvider;
587
- return this;
588
- }
589
- withLookupDataProvider(dataProvider) {
590
- this._dataProvider = dataProvider;
591
- return this;
592
- }
593
- withConfig(config) {
594
- return super.withConfig(config);
595
- }
596
- asAutocomplete(openOnFocus = false, inlineSearch = false, selectFirst = false, autoClear = false) {
597
- this._lookupType = FieldLookupTypeEnum.Autocomplete;
598
- this._autocompleteAutoClear = autoClear;
599
- this._autocompleteSelectFirst = selectFirst;
600
- this._autocompleteOpenOnFocus = openOnFocus;
601
- this._autocompleteInlineSearch = inlineSearch;
602
- return this;
603
- }
604
- asDialog(lookupTableDescriptor, tableDataProvider) {
605
- this._lookupType = FieldLookupTypeEnum.Dialog;
606
- this._dialogTableDescriptor = lookupTableDescriptor;
607
- this._dialogTableDataProvider = tableDataProvider;
608
- return this;
609
- }
610
- copy() {
611
- const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
612
- this.copyFieldsTo(field);
613
- field._lookupType = this._lookupType;
614
- field._itemsLabelProperty = this._itemsLabelProperty;
615
- field._itemsLabelTranslate = this._itemsLabelTranslate;
616
- field._itemsValueProperty = this._itemsValueProperty;
617
- field._itemsDisabledProperty = this._itemsDisabledProperty;
618
- field._dataKeyProperty = this._dataKeyProperty;
619
- field._dataProvider = this._dataProvider;
620
- field._dropdownClassName = this._dropdownClassName;
621
- field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
622
- field._autocompleteInlineSearch = this._autocompleteInlineSearch;
623
- field._dialogTableDescriptor = this._dialogTableDescriptor;
624
- return field;
625
- }
626
- }
627
- export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
628
- constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
629
- super(editor, property, null);
630
- this._nameAsValue = false;
631
- this._enumType = enumType;
632
- this._nameAsValue = nameAsValue;
633
- if (typeof optionsTitlePath === 'undefined') {
634
- optionsTitlePath = TypeUtil.findEnumName(enumType);
635
- }
636
- this._optionEnumValues = Array.isArray(options)
637
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
638
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
639
- const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
640
- this.withLookupDataProvider(dataProvider);
641
- this.withItemsLabelProperty('title', optionsTitlePath !== null);
642
- this.withItemsValueProperty('value');
643
- this.withItemsDisabledProperty('disabled');
644
- }
645
- get enumType() {
646
- return this._enumType;
647
- }
648
- withDisabledOptions(...disabledOptions) {
649
- for (const disabledOption of disabledOptions) {
650
- const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
651
- if (disabledOptionValue) {
652
- const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
653
- if (option) {
654
- option.disabled = true;
655
- }
656
- }
657
- }
658
- return this;
659
- }
660
- withDefaultValueEnum(defaultValue) {
661
- const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
662
- if (defaultOptionValue) {
663
- const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
664
- if (option) {
665
- this.withDefaultValue(this._itemsValueProperty ? option[this._itemsValueProperty] : option);
666
- }
667
- }
668
- return this;
669
- }
670
- asAutocomplete(openOnFocus = true) {
671
- super.asAutocomplete(openOnFocus, true);
672
- return this;
673
- }
674
- copy() {
675
- const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
676
- this.copyFieldsTo(field);
677
- field._lookupType = this._lookupType;
678
- field._itemsLabelProperty = this._itemsLabelProperty;
679
- field._itemsValueProperty = this._itemsValueProperty;
680
- field._itemsDisabledProperty = this._itemsDisabledProperty;
681
- field._dataKeyProperty = this._dataKeyProperty;
682
- field._dataProvider = this._dataProvider;
683
- return field;
684
- }
685
- }
686
- export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
687
- constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
688
- super(editor, property);
689
- this._fieldType = FieldManyToManyEditorTypeEnum.DialogTableMultiselect;
690
- this._lookupTableDataProvider = null;
691
- this._actions = [];
692
- this._hasLookupExcludeValues = false;
693
- this._excludeFilterProperty = '';
694
- this._excludeValueProperty = '';
695
- this._mainTableDescriptor = mainTableDescriptor;
696
- this._lookupTableDescriptor = lookupTableDescriptor;
697
- this._actions.push(FieldManyToManyEditorActionEnum.Add, FieldManyToManyEditorActionEnum.Delete);
698
- }
699
- get fieldType() {
700
- return this._fieldType;
701
- }
702
- get lookupTableDataProvider() {
703
- return this._lookupTableDataProvider;
704
- }
705
- get actions() {
706
- return this._actions;
707
- }
708
- get hasLookupExcludeValues() {
709
- return this._hasLookupExcludeValues;
710
- }
711
- get excludeFilterProperty() {
712
- return this._excludeFilterProperty;
713
- }
714
- get excludeValueProperty() {
715
- return this._excludeValueProperty;
716
- }
717
- get mainTableDescriptor() {
718
- return this._mainTableDescriptor;
719
- }
720
- get lookupTableDescriptor() {
721
- return this._lookupTableDescriptor;
722
- }
723
- withLookup(getAll, serviceType) {
724
- const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
725
- if (serviceType) {
726
- dataProvider.withServiceType(serviceType);
727
- }
728
- dataProvider.withGetAll(getAll);
729
- this._lookupTableDataProvider = dataProvider;
730
- return this;
731
- }
732
- withLookupDataProvider(dataProvider) {
733
- this._lookupTableDataProvider = dataProvider;
734
- return this;
735
- }
736
- withActions(actions = []) {
737
- this.actions.push(...actions);
738
- return this;
739
- }
740
- withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
741
- this._hasLookupExcludeValues = hasLookupExclude;
742
- this._excludeFilterProperty = filterProperty;
743
- this._excludeValueProperty = valueProperty;
744
- return this;
745
- }
746
- copy() {
747
- const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
748
- this.copyFieldsTo(field);
749
- field._fieldType = this._fieldType;
750
- field._actions = this._actions.map(a => a);
751
- field._lookupTableDataProvider = this._lookupTableDataProvider;
752
- field._hasLookupExcludeValues = this._hasLookupExcludeValues;
753
- field._excludeFilterProperty = this._excludeFilterProperty;
754
- field._excludeValueProperty = this._excludeValueProperty;
755
- return field;
756
- }
757
- }
758
- export class FieldManyEditorDescriptor extends AFieldDescriptor {
759
- constructor(editor, property, tableviewDescriptor) {
760
- super(editor, property);
761
- this._fieldType = FieldManyEditorTypeEnum.DialogEditor;
762
- this._fieldActions = [];
763
- this._actions = [];
764
- // this._modelType = modelType;
765
- this._tableviewDescriptor = tableviewDescriptor;
766
- this._fieldActions.push(FieldManyEditorActionEnum.View, FieldManyEditorActionEnum.Add, FieldManyEditorActionEnum.Edit, FieldManyEditorActionEnum.Delete);
767
- }
768
- get fieldType() {
769
- return this._fieldType;
770
- }
771
- get fieldActions() {
772
- return this._fieldActions;
773
- }
774
- get actions() {
775
- return this._actions;
776
- }
777
- get tableviewDescriptor() {
778
- return this._tableviewDescriptor;
779
- }
780
- get tableDescriptor() {
781
- return this._tableviewDescriptor.table;
782
- }
783
- get editorForCreate() {
784
- return this._tableviewDescriptor.addEditor;
785
- }
786
- get editorForRead() {
787
- return this._tableviewDescriptor.detailsEditor;
788
- }
789
- get editorForUpdate() {
790
- return this._tableviewDescriptor.editEditor;
791
- }
792
- withFieldAction(action) {
793
- this._fieldActions.push(action);
794
- return this;
795
- }
796
- withFieldActions(actions) {
797
- this._fieldActions = actions;
798
- return this;
799
- }
800
- withAction(action) {
801
- this._actions.push(action);
802
- return this;
803
- }
804
- copy() {
805
- const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
806
- this.copyFieldsTo(field);
807
- field._fieldType = this._fieldType;
808
- field._fieldActions = this._fieldActions.map(a => a);
809
- return field;
810
- }
811
- }
812
- export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
813
- constructor(editor, name) {
814
- super(editor);
815
- this._fields = [];
816
- this._validations = [];
817
- this._name = `${this.baseName}${name}`;
818
- this._default = name === EditorDescriptor.defaultGroupName;
819
- }
820
- removeField(property, filterFunction) {
821
- this._fields = filterFunction(this._fields);
822
- return this._fields;
823
- }
824
- get title() {
825
- return this._title;
826
- }
827
- get validations() {
828
- return this._validations;
829
- }
830
- get baseName() {
831
- return `${this.groupName()}_`;
832
- }
833
- get name() {
834
- return this._name;
835
- }
836
- get default() {
837
- return this._default;
838
- }
839
- withTitle(title) {
840
- this._title = title;
841
- return this;
842
- }
843
- withValidation(name, validator, message) {
844
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
845
- return this;
846
- }
847
- }
848
- export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
849
- constructor(editor, name) {
850
- super(editor, name);
851
- }
852
- get fields() {
853
- return this._fields;
854
- }
855
- groupName() {
856
- return 'tab';
857
- }
858
- addField(field) {
859
- this._fields.push(field);
860
- return this;
861
- }
862
- copy() {
863
- const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
864
- tab._title = this._title;
865
- tab._fields = this.fields.map(f => f.copy());
866
- return tab;
867
- }
868
- }
869
- export class FieldGroupDescriptor extends AFieldGroupDescriptor {
870
- constructor(editor, name) {
871
- super(editor, name);
872
- this._type = FieldGroupTypeEnum.Fieldset;
873
- if (this._default) {
874
- this.asLogical();
875
- }
876
- }
877
- get type() {
878
- return this._type;
879
- }
880
- get fields() {
881
- return this._fields;
882
- }
883
- groupName() {
884
- return 'group';
885
- }
886
- addField(field) {
887
- this._fields.push(field);
888
- return this;
889
- }
890
- asLogical() {
891
- this._type = FieldGroupTypeEnum.Logical;
892
- return this;
893
- }
894
- copy() {
895
- const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
896
- group._type = this._type;
897
- group._title = this._title;
898
- group._fields = this.fields.map(f => f.copy());
899
- return group;
900
- }
901
- }
1
+ import { Validators } from '@angular/forms';
2
+ import { Subject, of } from 'rxjs';
3
+ import { MngFormFieldEvent } from '../components/form/models';
4
+ import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
+ import { ButtonStyleBuilder } from '../styles';
6
+ import { StyleLevelEnum } from '../styles/models';
7
+ import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
8
+ import { ActionButtonDescriptor, EditorDescriptor, FieldValidationDescriptor } from './';
9
+ import { FieldGroupTypeEnum, FieldInputTypeEnum, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorTypeEnum, FieldSizeEnum } from './types';
10
+ export class AGenericFieldDescriptor {
11
+ constructor(editor) {
12
+ this._config = {};
13
+ this._editor = editor;
14
+ }
15
+ get editor() {
16
+ return this._editor;
17
+ }
18
+ get config() {
19
+ return this._config;
20
+ }
21
+ withConfig(config) {
22
+ this._config = config;
23
+ return this;
24
+ }
25
+ }
26
+ export class AFieldDescriptor extends AGenericFieldDescriptor {
27
+ constructor(editor, property) {
28
+ super(editor);
29
+ this._required = false;
30
+ this._requiredHideLabelMarker = false;
31
+ this._disabled = false;
32
+ this._validations = [];
33
+ this._asyncValidations = [];
34
+ this._className = '';
35
+ this._labelClassName = '';
36
+ this._inputClassName = '';
37
+ this._size = FieldSizeEnum.Normal;
38
+ this._eventsSubject = new Subject();
39
+ this._property = property;
40
+ this._label = I18nUtils.Type.getPropertyKey(this._editor.model.i18nBaseKey, property);
41
+ }
42
+ get property() {
43
+ return this._property;
44
+ }
45
+ get label() {
46
+ return this._label;
47
+ }
48
+ get placeholder() {
49
+ return this._placeholder;
50
+ }
51
+ get helpText() {
52
+ return this._helpText;
53
+ }
54
+ get required() {
55
+ return this._required;
56
+ }
57
+ get requiredHideLabelMarker() {
58
+ return this._requiredHideLabelMarker;
59
+ }
60
+ get disabled() {
61
+ return this._disabled;
62
+ }
63
+ get defaultValue() {
64
+ return this._defaultValue;
65
+ }
66
+ get getter() {
67
+ return this._getter;
68
+ }
69
+ get setter() {
70
+ return this._setter;
71
+ }
72
+ get validations() {
73
+ return this._validations;
74
+ }
75
+ get asyncValidations() {
76
+ return this._asyncValidations;
77
+ }
78
+ get requiredExpression() {
79
+ return this._requiredExpression;
80
+ }
81
+ get disabledExpression() {
82
+ return this._disabledExpression;
83
+ }
84
+ get hiddenExpression() {
85
+ return this._hiddenExpression;
86
+ }
87
+ get className() {
88
+ return this._className;
89
+ }
90
+ get fieldClassName() {
91
+ return this._fieldClassName;
92
+ }
93
+ get labelClassName() {
94
+ return this._labelClassName;
95
+ }
96
+ get inputClassName() {
97
+ return this._inputClassName;
98
+ }
99
+ get size() {
100
+ return this._size;
101
+ }
102
+ get isSizeSmall() {
103
+ return this._size === FieldSizeEnum.Small;
104
+ }
105
+ get isSizeLarge() {
106
+ return this._size === FieldSizeEnum.Large;
107
+ }
108
+ withLabel(label) {
109
+ this._label = label;
110
+ return this;
111
+ }
112
+ withPlaceholder(placeholder) {
113
+ this._placeholder = placeholder;
114
+ return this;
115
+ }
116
+ withHelpText(helpText) {
117
+ this._helpText = helpText;
118
+ return this;
119
+ }
120
+ withRequired(required = true, requiredExpression, hideLabelMarker = false) {
121
+ this._required = required;
122
+ if (requiredExpression) {
123
+ this._requiredExpression = requiredExpression;
124
+ }
125
+ this._requiredHideLabelMarker = hideLabelMarker;
126
+ return this;
127
+ }
128
+ withDisabled(disabled = true, disabledExpression) {
129
+ this._disabled = disabled;
130
+ if (disabledExpression) {
131
+ this._disabledExpression = disabledExpression;
132
+ }
133
+ return this;
134
+ }
135
+ withHidden(hiddenExpression) {
136
+ this._hiddenExpression = hiddenExpression;
137
+ return this;
138
+ }
139
+ withDefaultValue(defaultValue) {
140
+ this._defaultValue = defaultValue;
141
+ return this;
142
+ }
143
+ withGetter(getter) {
144
+ this._getter = getter;
145
+ return this;
146
+ }
147
+ withSetter(setter) {
148
+ this._setter = setter;
149
+ return this;
150
+ }
151
+ withValidation(name, validator, message) {
152
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
153
+ return this;
154
+ }
155
+ withAsyncValidation(name, asyncValidator, message) {
156
+ this._asyncValidations.push(new FieldValidationDescriptor(name, asyncValidator, message));
157
+ return this;
158
+ }
159
+ withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
160
+ this._className = className;
161
+ this._labelClassName = labelClassName;
162
+ this._inputClassName = inputClassName;
163
+ this._fieldClassName = fieldClassName;
164
+ return this;
165
+ }
166
+ withSize(size = FieldSizeEnum.Normal) {
167
+ this._size = size;
168
+ return this;
169
+ }
170
+ nextEvent(type, cmpType, cmpInstance, data) {
171
+ this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
172
+ }
173
+ get events$() {
174
+ return this._eventsSubject.asObservable();
175
+ }
176
+ copyFieldsTo(obj) {
177
+ obj._label = this._label;
178
+ obj._placeholder = this._placeholder;
179
+ obj._helpText = this._helpText;
180
+ obj._required = this._required;
181
+ obj._disabled = this._disabled;
182
+ obj._defaultValue = this._defaultValue;
183
+ obj._requiredExpression = this._requiredExpression;
184
+ obj._hiddenExpression = this._hiddenExpression;
185
+ obj._disabledExpression = this._disabledExpression;
186
+ obj._className = this._className;
187
+ obj._size = this.size;
188
+ obj._getter = this._getter;
189
+ obj._setter = this._setter;
190
+ obj._validations = this._validations;
191
+ obj._asyncValidations = this._asyncValidations;
192
+ }
193
+ }
194
+ export class FieldInputDescriptor extends AFieldDescriptor {
195
+ constructor(editor, property) {
196
+ super(editor, property);
197
+ this._fieldType = FieldInputTypeEnum.Text;
198
+ this._numberUseGrouping = true;
199
+ this._currencyDisplay = 'symbol';
200
+ // radio specific properties
201
+ this._radioOptions = [];
202
+ this._datePickerShowTime = false;
203
+ this._datePickerShowSeconds = true;
204
+ // file specific properties
205
+ this._fileMultiple = false;
206
+ this._fileMaxFileSize = 500000;
207
+ }
208
+ /**
209
+ * converts field to given type with additional arguments
210
+ * @param fieldType field type enum
211
+ * @param args any additional arguments for field (optional)
212
+ */
213
+ asType(fieldType, ...args) {
214
+ switch (fieldType) {
215
+ case FieldInputTypeEnum.Hidden:
216
+ return this.asHidden();
217
+ case FieldInputTypeEnum.Label:
218
+ return this.asLabel();
219
+ case FieldInputTypeEnum.Textarea:
220
+ return this.asTextarea(...args);
221
+ case FieldInputTypeEnum.Number:
222
+ return this.asNumber();
223
+ case FieldInputTypeEnum.Currency:
224
+ return this.asCurrency(...args);
225
+ case FieldInputTypeEnum.Switch:
226
+ return this.asSwitch();
227
+ case FieldInputTypeEnum.Radio:
228
+ return this.asRadio(args[0], args[1]);
229
+ case FieldInputTypeEnum.Datepicker:
230
+ return this.asDatePicker(...args);
231
+ case FieldInputTypeEnum.Mask:
232
+ return this.asMask(args[0], args[1]);
233
+ case FieldInputTypeEnum.File:
234
+ return this.asFile(...args);
235
+ case FieldInputTypeEnum.Custom:
236
+ return this.asCustomComponent(args[0]);
237
+ case FieldInputTypeEnum.Text:
238
+ return this.asText();
239
+ }
240
+ }
241
+ get fieldType() {
242
+ return this._fieldType;
243
+ }
244
+ get rows() {
245
+ return this._rows;
246
+ }
247
+ get numberMin() {
248
+ return this._numberMin;
249
+ }
250
+ get numberMax() {
251
+ return this._numberMax;
252
+ }
253
+ get numberStep() {
254
+ return this._numberStep;
255
+ }
256
+ get numberMinFractionDigits() {
257
+ return this._numberMinFractionDigits;
258
+ }
259
+ get numberMaxFractionDigits() {
260
+ return this._numberMaxFractionDigits;
261
+ }
262
+ get numberUseGrouping() {
263
+ return this._numberUseGrouping;
264
+ }
265
+ get radioOptions() {
266
+ return this._radioOptions;
267
+ }
268
+ get datePickerFormat() {
269
+ return this._datePickerFormat;
270
+ }
271
+ get datePickerMin() {
272
+ return this._datePickerMin;
273
+ }
274
+ get datePickerMax() {
275
+ return this._datePickerMax;
276
+ }
277
+ get datePickerShowTime() {
278
+ return this._datePickerShowTime;
279
+ }
280
+ get datePickerShowSeconds() {
281
+ return this._datePickerShowSeconds;
282
+ }
283
+ get maxLength() {
284
+ return this._maxLength;
285
+ }
286
+ get minLength() {
287
+ return this._minLength;
288
+ }
289
+ get pattern() {
290
+ return this._pattern;
291
+ }
292
+ get mask() {
293
+ return this._mask;
294
+ }
295
+ get slotChar() {
296
+ return this._slotChar;
297
+ }
298
+ get fileMultiple() {
299
+ return this._fileMultiple;
300
+ }
301
+ get fileMaxFileSize() {
302
+ return this._fileMaxFileSize;
303
+ }
304
+ get fileAccept() {
305
+ return this._fileAccept;
306
+ }
307
+ get fileOnSelectHandler() {
308
+ return this._fileOnSelectHandler;
309
+ }
310
+ get customComponentName() {
311
+ return this._customComponentName;
312
+ }
313
+ get locale() {
314
+ return this._locale;
315
+ }
316
+ get currency() {
317
+ return this._currency;
318
+ }
319
+ get currencyFromProperty() {
320
+ return this._currencyFromProperty;
321
+ }
322
+ get currencyDisplay() {
323
+ return this._currencyDisplay;
324
+ }
325
+ asHidden() {
326
+ this._fieldType = FieldInputTypeEnum.Hidden;
327
+ return this;
328
+ }
329
+ asLabel() {
330
+ this._fieldType = FieldInputTypeEnum.Label;
331
+ return this;
332
+ }
333
+ asText() {
334
+ this._fieldType = FieldInputTypeEnum.Text;
335
+ return this;
336
+ }
337
+ asTextarea(rows = 3) {
338
+ this._fieldType = FieldInputTypeEnum.Textarea;
339
+ this._rows = rows;
340
+ return this;
341
+ }
342
+ asNumber() {
343
+ this._fieldType = FieldInputTypeEnum.Number;
344
+ return this;
345
+ }
346
+ asCurrency(currencyFromProperty, currency, currencyDisplay) {
347
+ this._fieldType = FieldInputTypeEnum.Currency;
348
+ this._currencyFromProperty = currencyFromProperty;
349
+ this._currency = currency ?? this._currency;
350
+ this._currencyDisplay = currencyDisplay ?? this._currencyDisplay;
351
+ return this.withNumberFractions(2, 2);
352
+ }
353
+ asSwitch() {
354
+ this._fieldType = FieldInputTypeEnum.Switch;
355
+ return this;
356
+ }
357
+ asRadio(options, optionsTitlePath) {
358
+ this._fieldType = FieldInputTypeEnum.Radio;
359
+ this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
360
+ return this;
361
+ }
362
+ asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
363
+ this._fieldType = FieldInputTypeEnum.Radio;
364
+ if (typeof optionsTitlePath === 'undefined') {
365
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
366
+ }
367
+ this._radioOptions = Array.isArray(values)
368
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
369
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
370
+ return this;
371
+ }
372
+ asDatePicker(format, min, max, showTime, showSeconds) {
373
+ this._fieldType = FieldInputTypeEnum.Datepicker;
374
+ this._datePickerFormat = format;
375
+ this._datePickerMin = min;
376
+ this._datePickerMax = max;
377
+ this._datePickerShowTime = showTime ?? false;
378
+ this._datePickerShowSeconds = showSeconds ?? true;
379
+ return this;
380
+ }
381
+ asMask(mask, slotChar) {
382
+ this._fieldType = FieldInputTypeEnum.Mask;
383
+ this._mask = mask;
384
+ this._slotChar = slotChar;
385
+ return this;
386
+ }
387
+ asFile(multiple = false, maxFileSize = 500000, accept) {
388
+ this._fieldType = FieldInputTypeEnum.File;
389
+ this._fileMultiple = multiple;
390
+ this._fileMaxFileSize = maxFileSize;
391
+ this._fileAccept = accept;
392
+ return this;
393
+ }
394
+ asCustomComponent(customComponentName) {
395
+ this._fieldType = FieldInputTypeEnum.Custom;
396
+ this._customComponentName = customComponentName;
397
+ return this;
398
+ }
399
+ withNumberValidation(min, max, step) {
400
+ this._numberStep = step ?? this._numberStep;
401
+ this._numberMin = min ?? this._numberMin ?? Number.MIN_SAFE_INTEGER;
402
+ this._numberMax = max ?? this._numberMax ?? Number.MAX_SAFE_INTEGER;
403
+ return this;
404
+ }
405
+ withLocale(locale) {
406
+ this._locale = locale;
407
+ return this;
408
+ }
409
+ withNumberFractions(min, max) {
410
+ this._numberMinFractionDigits = min;
411
+ this._numberMaxFractionDigits = max;
412
+ return this;
413
+ }
414
+ withNumberGrouping(useGrouping = true) {
415
+ this._numberUseGrouping = useGrouping;
416
+ return this;
417
+ }
418
+ withTextValidation(minLength, maxLength, pattern) {
419
+ this._minLength = minLength;
420
+ this._maxLength = maxLength;
421
+ this._pattern = pattern;
422
+ return this;
423
+ }
424
+ withTextValidationEmail() {
425
+ if (this.fieldType === FieldInputTypeEnum.Text) {
426
+ this.withValidation('email', Validators.email);
427
+ }
428
+ return this;
429
+ }
430
+ withFileOnSelectHandler(fn) {
431
+ this._fileOnSelectHandler = fn;
432
+ }
433
+ copy() {
434
+ const field = new FieldInputDescriptor(this._editor, this._property);
435
+ this.copyFieldsTo(field);
436
+ field._fieldType = this._fieldType;
437
+ field._rows = this._rows;
438
+ field._numberMin = this._numberMin;
439
+ field._numberMax = this._numberMax;
440
+ field._numberStep = this._numberStep;
441
+ field._numberMinFractionDigits = this._numberMinFractionDigits;
442
+ field._numberMaxFractionDigits = this._numberMaxFractionDigits;
443
+ field._numberUseGrouping = this._numberUseGrouping;
444
+ field._radioOptions = [...this._radioOptions];
445
+ field._datePickerFormat = this._datePickerFormat;
446
+ field._datePickerMin = this._datePickerMin;
447
+ field._datePickerMax = this._datePickerMax;
448
+ field._datePickerShowTime = this._datePickerShowTime;
449
+ field._datePickerShowSeconds = this._datePickerShowSeconds;
450
+ field._maxLength = this._maxLength;
451
+ field._minLength = this._minLength;
452
+ field._pattern = this._pattern;
453
+ field._mask = this._mask;
454
+ field._slotChar = this._slotChar;
455
+ field._fileMultiple = this._fileMultiple;
456
+ field._fileMaxFileSize = this._fileMaxFileSize;
457
+ field._fileAccept = this._fileAccept;
458
+ field._fileOnSelectHandler = this._fileOnSelectHandler;
459
+ field._customComponentName = this._customComponentName;
460
+ field._locale = this._locale;
461
+ field._currency = this._currency;
462
+ field._currencyDisplay = this._currencyDisplay;
463
+ field._currencyFromProperty = this._currencyFromProperty;
464
+ return field;
465
+ }
466
+ }
467
+ export class FieldActionDescriptor extends AFieldDescriptor {
468
+ constructor(editor, property) {
469
+ super(editor, property);
470
+ this._button = new ActionButtonDescriptor();
471
+ this._fieldActionName = property;
472
+ let displayName = property;
473
+ if (this._editor.model)
474
+ displayName = `${this._editor.model.typeName}.${displayName}`;
475
+ this._fieldActionNameLong = displayName;
476
+ }
477
+ get button() {
478
+ return this._button;
479
+ }
480
+ get runFunction() {
481
+ return this._runFunction;
482
+ }
483
+ withButtonDescriptor(button) {
484
+ this._button = button;
485
+ return this;
486
+ }
487
+ withButton(label, icon = null, styleLevel = StyleLevelEnum.Default, styleText = false) {
488
+ this._button = new ActionButtonDescriptor().withLabel(label).withIcon(icon).withStyleClass(new ButtonStyleBuilder(styleLevel).withTextButton(styleText));
489
+ return this;
490
+ }
491
+ withRunFunction(fn) {
492
+ this._runFunction = fn;
493
+ return this;
494
+ }
495
+ copy() {
496
+ const field = new FieldActionDescriptor(this._editor, this._property);
497
+ this.copyFieldsTo(field);
498
+ field._button = this._button.copy();
499
+ field._runFunction = this._runFunction?.bind(field);
500
+ return field;
501
+ }
502
+ }
503
+ export class FieldLookupDescriptor extends AFieldDescriptor {
504
+ constructor(editor, property, modelType) {
505
+ super(editor, property);
506
+ this._lookupType = FieldLookupTypeEnum.Dropdown;
507
+ this._itemsLabelTranslate = false;
508
+ this._dropdownClassName = 'mng-filter-lookup-dropdown';
509
+ this._autocompleteOpenOnFocus = false;
510
+ this._autocompleteInlineSearch = false;
511
+ this._autocompleteAutoClear = false;
512
+ this._autocompleteSelectFirst = false;
513
+ this._modelType = modelType;
514
+ ModelUtil.trySetLookupItemsProperties(this);
515
+ }
516
+ get lookupType() {
517
+ return this._lookupType;
518
+ }
519
+ get itemsLabelProperty() {
520
+ return this._itemsLabelProperty;
521
+ }
522
+ get itemsLabelTranslate() {
523
+ return this._itemsLabelTranslate;
524
+ }
525
+ get itemsValueProperty() {
526
+ return this._itemsValueProperty;
527
+ }
528
+ get itemsDisabledProperty() {
529
+ return this._itemsDisabledProperty;
530
+ }
531
+ get dataKeyProperty() {
532
+ return this._dataKeyProperty;
533
+ }
534
+ get dataProvider() {
535
+ return this._dataProvider;
536
+ }
537
+ get autocompleteOpenOnFocus() {
538
+ return this._autocompleteOpenOnFocus;
539
+ }
540
+ get autocompleteInlineSearch() {
541
+ return this._autocompleteInlineSearch;
542
+ }
543
+ get autocompleteAutoClear() {
544
+ return this._autocompleteAutoClear;
545
+ }
546
+ get autocompleteSelectFirst() {
547
+ return this._autocompleteSelectFirst;
548
+ }
549
+ get dropdownClassName() {
550
+ return this._dropdownClassName;
551
+ }
552
+ get modelType() {
553
+ return this._modelType;
554
+ }
555
+ get dialogTableDescriptor() {
556
+ return this._dialogTableDescriptor;
557
+ }
558
+ get dialogTableDataProvider() {
559
+ return this._dialogTableDataProvider;
560
+ }
561
+ withItemsLabelProperty(itemsLabelProperty, translate = false) {
562
+ this._itemsLabelProperty = itemsLabelProperty;
563
+ this._itemsLabelTranslate = translate;
564
+ return this;
565
+ }
566
+ withItemsValueProperty(itemsValueProperty) {
567
+ this._itemsValueProperty = itemsValueProperty;
568
+ this._dataKeyProperty = undefined;
569
+ return this;
570
+ }
571
+ withItemsDisabledProperty(itemsDisabledProperty) {
572
+ this._itemsDisabledProperty = itemsDisabledProperty;
573
+ return this;
574
+ }
575
+ withDataKeyProperty(property) {
576
+ this._dataKeyProperty = property;
577
+ this._itemsValueProperty = undefined;
578
+ return this;
579
+ }
580
+ withLookup(lookup, serviceType) {
581
+ const dataProvider = new LookupDataProvider(this._modelType);
582
+ if (serviceType) {
583
+ dataProvider.withServiceType(serviceType);
584
+ }
585
+ dataProvider.withLookup(lookup);
586
+ this._dataProvider = dataProvider;
587
+ return this;
588
+ }
589
+ withLookupDataProvider(dataProvider) {
590
+ this._dataProvider = dataProvider;
591
+ return this;
592
+ }
593
+ withConfig(config) {
594
+ return super.withConfig(config);
595
+ }
596
+ asAutocomplete(openOnFocus = false, inlineSearch = false, selectFirst = false, autoClear = false) {
597
+ this._lookupType = FieldLookupTypeEnum.Autocomplete;
598
+ this._autocompleteAutoClear = autoClear;
599
+ this._autocompleteSelectFirst = selectFirst;
600
+ this._autocompleteOpenOnFocus = openOnFocus;
601
+ this._autocompleteInlineSearch = inlineSearch;
602
+ return this;
603
+ }
604
+ asDialog(lookupTableDescriptor, tableDataProvider) {
605
+ this._lookupType = FieldLookupTypeEnum.Dialog;
606
+ this._dialogTableDescriptor = lookupTableDescriptor;
607
+ this._dialogTableDataProvider = tableDataProvider;
608
+ return this;
609
+ }
610
+ copy() {
611
+ const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
612
+ this.copyFieldsTo(field);
613
+ field._lookupType = this._lookupType;
614
+ field._itemsLabelProperty = this._itemsLabelProperty;
615
+ field._itemsLabelTranslate = this._itemsLabelTranslate;
616
+ field._itemsValueProperty = this._itemsValueProperty;
617
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
618
+ field._dataKeyProperty = this._dataKeyProperty;
619
+ field._dataProvider = this._dataProvider;
620
+ field._dropdownClassName = this._dropdownClassName;
621
+ field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
622
+ field._autocompleteInlineSearch = this._autocompleteInlineSearch;
623
+ field._dialogTableDescriptor = this._dialogTableDescriptor;
624
+ return field;
625
+ }
626
+ }
627
+ export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
628
+ constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
629
+ super(editor, property, null);
630
+ this._nameAsValue = false;
631
+ this._enumType = enumType;
632
+ this._nameAsValue = nameAsValue;
633
+ if (typeof optionsTitlePath === 'undefined') {
634
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
635
+ }
636
+ this._optionEnumValues = Array.isArray(options)
637
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
638
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
639
+ const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
640
+ this.withLookupDataProvider(dataProvider);
641
+ this.withItemsLabelProperty('title', optionsTitlePath !== null);
642
+ this.withItemsValueProperty('value');
643
+ this.withItemsDisabledProperty('disabled');
644
+ }
645
+ get enumType() {
646
+ return this._enumType;
647
+ }
648
+ withDisabledOptions(...disabledOptions) {
649
+ for (const disabledOption of disabledOptions) {
650
+ const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
651
+ if (disabledOptionValue) {
652
+ const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
653
+ if (option) {
654
+ option.disabled = true;
655
+ }
656
+ }
657
+ }
658
+ return this;
659
+ }
660
+ withDefaultValueEnum(defaultValue) {
661
+ const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
662
+ if (defaultOptionValue) {
663
+ const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
664
+ if (option) {
665
+ this.withDefaultValue(this._itemsValueProperty ? option[this._itemsValueProperty] : option);
666
+ }
667
+ }
668
+ return this;
669
+ }
670
+ asAutocomplete(openOnFocus = true) {
671
+ super.asAutocomplete(openOnFocus, true);
672
+ return this;
673
+ }
674
+ copy() {
675
+ const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
676
+ this.copyFieldsTo(field);
677
+ field._lookupType = this._lookupType;
678
+ field._itemsLabelProperty = this._itemsLabelProperty;
679
+ field._itemsValueProperty = this._itemsValueProperty;
680
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
681
+ field._dataKeyProperty = this._dataKeyProperty;
682
+ field._dataProvider = this._dataProvider;
683
+ return field;
684
+ }
685
+ }
686
+ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
687
+ constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
688
+ super(editor, property);
689
+ this._fieldType = FieldManyToManyEditorTypeEnum.DialogTableMultiselect;
690
+ this._lookupTableDataProvider = null;
691
+ this._actions = [];
692
+ this._hasLookupExcludeValues = false;
693
+ this._excludeFilterProperty = '';
694
+ this._excludeValueProperty = '';
695
+ this._mainTableDescriptor = mainTableDescriptor;
696
+ this._lookupTableDescriptor = lookupTableDescriptor;
697
+ this._actions.push(FieldManyToManyEditorActionEnum.Add, FieldManyToManyEditorActionEnum.Delete);
698
+ }
699
+ get fieldType() {
700
+ return this._fieldType;
701
+ }
702
+ get lookupTableDataProvider() {
703
+ return this._lookupTableDataProvider;
704
+ }
705
+ get actions() {
706
+ return this._actions;
707
+ }
708
+ get hasLookupExcludeValues() {
709
+ return this._hasLookupExcludeValues;
710
+ }
711
+ get excludeFilterProperty() {
712
+ return this._excludeFilterProperty;
713
+ }
714
+ get excludeValueProperty() {
715
+ return this._excludeValueProperty;
716
+ }
717
+ get mainTableDescriptor() {
718
+ return this._mainTableDescriptor;
719
+ }
720
+ get lookupTableDescriptor() {
721
+ return this._lookupTableDescriptor;
722
+ }
723
+ withLookup(getAll, serviceType) {
724
+ const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
725
+ if (serviceType) {
726
+ dataProvider.withServiceType(serviceType);
727
+ }
728
+ dataProvider.withGetAll(getAll);
729
+ this._lookupTableDataProvider = dataProvider;
730
+ return this;
731
+ }
732
+ withLookupDataProvider(dataProvider) {
733
+ this._lookupTableDataProvider = dataProvider;
734
+ return this;
735
+ }
736
+ withActions(actions = []) {
737
+ this.actions.push(...actions);
738
+ return this;
739
+ }
740
+ withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
741
+ this._hasLookupExcludeValues = hasLookupExclude;
742
+ this._excludeFilterProperty = filterProperty;
743
+ this._excludeValueProperty = valueProperty;
744
+ return this;
745
+ }
746
+ copy() {
747
+ const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
748
+ this.copyFieldsTo(field);
749
+ field._fieldType = this._fieldType;
750
+ field._actions = this._actions.map(a => a);
751
+ field._lookupTableDataProvider = this._lookupTableDataProvider;
752
+ field._hasLookupExcludeValues = this._hasLookupExcludeValues;
753
+ field._excludeFilterProperty = this._excludeFilterProperty;
754
+ field._excludeValueProperty = this._excludeValueProperty;
755
+ return field;
756
+ }
757
+ }
758
+ export class FieldManyEditorDescriptor extends AFieldDescriptor {
759
+ constructor(editor, property, tableviewDescriptor) {
760
+ super(editor, property);
761
+ this._fieldType = FieldManyEditorTypeEnum.DialogEditor;
762
+ this._fieldActions = [];
763
+ this._actions = [];
764
+ // this._modelType = modelType;
765
+ this._tableviewDescriptor = tableviewDescriptor;
766
+ this._fieldActions.push(FieldManyEditorActionEnum.View, FieldManyEditorActionEnum.Add, FieldManyEditorActionEnum.Edit, FieldManyEditorActionEnum.Delete);
767
+ }
768
+ get fieldType() {
769
+ return this._fieldType;
770
+ }
771
+ get fieldActions() {
772
+ return this._fieldActions;
773
+ }
774
+ get actions() {
775
+ return this._actions;
776
+ }
777
+ get tableviewDescriptor() {
778
+ return this._tableviewDescriptor;
779
+ }
780
+ get tableDescriptor() {
781
+ return this._tableviewDescriptor.table;
782
+ }
783
+ get editorForCreate() {
784
+ return this._tableviewDescriptor.addEditor;
785
+ }
786
+ get editorForRead() {
787
+ return this._tableviewDescriptor.detailsEditor;
788
+ }
789
+ get editorForUpdate() {
790
+ return this._tableviewDescriptor.editEditor;
791
+ }
792
+ withFieldAction(action) {
793
+ this._fieldActions.push(action);
794
+ return this;
795
+ }
796
+ withFieldActions(actions) {
797
+ this._fieldActions = actions;
798
+ return this;
799
+ }
800
+ withAction(action) {
801
+ this._actions.push(action);
802
+ return this;
803
+ }
804
+ copy() {
805
+ const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
806
+ this.copyFieldsTo(field);
807
+ field._fieldType = this._fieldType;
808
+ field._fieldActions = this._fieldActions.map(a => a);
809
+ return field;
810
+ }
811
+ }
812
+ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
813
+ constructor(editor, name) {
814
+ super(editor);
815
+ this._fields = [];
816
+ this._validations = [];
817
+ this._name = `${this.baseName}${name}`;
818
+ this._default = name === EditorDescriptor.defaultGroupName;
819
+ }
820
+ removeField(property, filterFunction) {
821
+ this._fields = filterFunction(this._fields);
822
+ return this._fields;
823
+ }
824
+ get title() {
825
+ return this._title;
826
+ }
827
+ get validations() {
828
+ return this._validations;
829
+ }
830
+ get baseName() {
831
+ return `${this.groupName()}_`;
832
+ }
833
+ get name() {
834
+ return this._name;
835
+ }
836
+ get default() {
837
+ return this._default;
838
+ }
839
+ withTitle(title) {
840
+ this._title = title;
841
+ return this;
842
+ }
843
+ withValidation(name, validator, message) {
844
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
845
+ return this;
846
+ }
847
+ }
848
+ export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
849
+ constructor(editor, name) {
850
+ super(editor, name);
851
+ }
852
+ get fields() {
853
+ return this._fields;
854
+ }
855
+ groupName() {
856
+ return 'tab';
857
+ }
858
+ addField(field) {
859
+ this._fields.push(field);
860
+ return this;
861
+ }
862
+ copy() {
863
+ const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
864
+ tab._title = this._title;
865
+ tab._fields = this.fields.map(f => f.copy());
866
+ return tab;
867
+ }
868
+ }
869
+ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
870
+ constructor(editor, name) {
871
+ super(editor, name);
872
+ this._type = FieldGroupTypeEnum.Fieldset;
873
+ if (this._default) {
874
+ this.asLogical();
875
+ }
876
+ }
877
+ get type() {
878
+ return this._type;
879
+ }
880
+ get fields() {
881
+ return this._fields;
882
+ }
883
+ groupName() {
884
+ return 'group';
885
+ }
886
+ addField(field) {
887
+ this._fields.push(field);
888
+ return this;
889
+ }
890
+ asLogical() {
891
+ this._type = FieldGroupTypeEnum.Logical;
892
+ return this;
893
+ }
894
+ copy() {
895
+ const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
896
+ group._type = this._type;
897
+ group._title = this._title;
898
+ group._fields = this.fields.map(f => f.copy());
899
+ return group;
900
+ }
901
+ }
902
902
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWtCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNELE9BQU8sRUFBYSxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBbUQsTUFBTSwyQkFBMkIsQ0FBQztBQUU5RyxPQUFPLEVBQTBDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFckgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxzQkFBc0IsRUFBb0IsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQXVDLE1BQU0sSUFBSSxDQUFDO0FBRS9JLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLCtCQUErQixFQUMvQiw2QkFBNkIsRUFDN0IsYUFBYSxFQUNoQixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLE9BQWdCLHVCQUF1QjtJQUl6QyxZQUFzQixNQUE0QjtRQUZ4QyxZQUFPLEdBQWdCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLE1BQU07UUFDYixPQUFP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QyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxJQUFJO1FBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBb0IsQ0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3QsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge01uZ0Zvcm1GaWVsZEV2ZW50LCBNbmdGb3JtRmllbGRFdmVudERhdGEsIE1uZ0Zvcm1GaWVsZEV2ZW50VHlwZUVudW19IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMnO1xuaW1wb3J0IHtGaWVsZEFjdGlvbkNvbnRleHR9IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMvZmllbGQtYWN0aW9uLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEYXRhUHJvdmlkZXIsIExvb2t1cERhdGFQcm92aWRlciwgVGFibGV2aWV3RGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0VudW1WYWx1ZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7QnV0dG9uU3R5bGVCdWlsZGVyfSBmcm9tICcuLi9zdHlsZXMnO1xuaW1wb3J0IHtTdHlsZUxldmVsRW51bX0gZnJvbSAnLi4vc3R5bGVzL21vZGVscyc7XG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bUNvbnN0YW50VHlwZSwgRW51bVR5cGUsIE1uZ0ZpZWxkQXN5bmNWYWxpZGF0b3IsIE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UsIE1uZ0ZpZWxkVmFsaWRhdG9yfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0VudW1VdGlsLCBJMThuVXRpbHMsIE1vZGVsVXRpbCwgVHlwZVV0aWx9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7QWN0aW9uQnV0dG9uRGVzY3JpcHRvciwgQWN0aW9uRGVzY3JpcHRvciwgRWRpdG9yRGVzY3JpcHRvciwgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0ZpZWxkQ29uZmlnLCBGaWVsZExvb2t1cENvbmZpZywgSUxvb2t1cERlc2NyaXB0b3J9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICAgIEZpZWxkR3JvdXBUeXBlRW51bSxcbiAgICBGaWVsZElucHV0VHlwZUVudW0sXG4gICAgRmllbGRMb29rdXBUeXBlRW51bSxcbiAgICBGaWVsZE1hbnlFZGl0b3JBY3Rpb25FbnVtLFxuICAgIEZpZWxkTWFueUVkaXRvclR5cGVFbnVtLFxuICAgIEZpZWxkTWFueVRvTWFueUVkaXRvckFjdGlvbkVudW0sXG4gICAgRmllbGRNYW55VG9NYW55RWRpdG9yVHlwZUVudW0sXG4gICAgRmllbGRTaXplRW51bVxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+O1xuICAgIHByb3RlY3RlZCBfY29uZmlnOiBGaWVsZENvbmZpZyA9IHt9O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4pIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29uZmlnKGNvbmZpZzogRmllbGRDb25maWcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wcm9wZXJ0eTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfbGFiZWw/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHJvdGVjdGVkIF9wbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2hlbHBUZXh0Pzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfcmVxdWlyZWRIaWRlTGFiZWxNYXJrZXIgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VmFsdWU/OiBUO1xuICAgIHByb3RlY3RlZCBfZ2V0dGVyPzogKGl0ZW06IEVUKSA9PiBUO1xuICAgIHByb3RlY3RlZCBfc2V0dGVyPzogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25zOiBBcnJheTxGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yPiA9IFtdO1xuICAgIHByb3RlY3RlZCBfYXN5bmNWYWxpZGF0aW9uczogQXJyYXk8RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcj4gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgoZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9oaWRkZW5FeHByZXNzaW9uPzogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfZmllbGRDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9sYWJlbENsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfaW5wdXRDbGFzc05hbWUgPSAnJztcbiAgICBwcm90ZWN0ZWQgX3NpemU6IEZpZWxkU2l6ZUVudW0gPSBGaWVsZFNpemVFbnVtLk5vcm1hbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1uZ0Zvcm1GaWVsZEV2ZW50PFQsIEVUPj4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gSTE4blV0aWxzLlR5cGUuZ2V0UHJvcGVydHlLZXkodGhpcy5fZWRpdG9yLm1vZGVsLmkxOG5CYXNlS2V5LCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWxwVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlbHBUZXh0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkSGlkZUxhYmVsTWFya2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWRIaWRlTGFiZWxNYXJrZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFzeW5jVmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hc3luY1ZhbGlkYXRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWRFeHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWRFeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWRFeHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWRFeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlkZGVuRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGRlbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZENsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWxDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlucHV0Q2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGRTaXplRW51bS5TbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUxhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGRTaXplRW51bS5MYXJnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgY29weSgpOiBBRmllbGREZXNjcmlwdG9yPFQsIEVUPjtcblxuICAgIHB1YmxpYyB3aXRoTGFiZWwobGFiZWw6IHN0cmluZyB8IG51bGwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSGVscFRleHQoaGVscFRleHQ6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oZWxwVGV4dCA9IGhlbHBUZXh0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJlcXVpcmVkKHJlcXVpcmVkID0gdHJ1ZSwgcmVxdWlyZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj4sIGhpZGVMYWJlbE1hcmtlciA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVkID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmIChyZXF1aXJlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHJlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXF1aXJlZEhpZGVMYWJlbE1hcmtlciA9IGhpZGVMYWJlbE1hcmtlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZChkaXNhYmxlZCA9IHRydWUsIGRpc2FibGVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgoZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIGlmIChkaXNhYmxlZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkRXhwcmVzc2lvbiA9IGRpc2FibGVkRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhpZGRlbihoaWRkZW5FeHByZXNzaW9uOiBzdHJpbmcgfCAoKGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9oaWRkZW5FeHByZXNzaW9uID0gaGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlOiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhHZXR0ZXIoZ2V0dGVyOiAoaXRlbTogRVQpID0+IFQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZ2V0dGVyID0gZ2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNldHRlcihzZXR0ZXI6IChpdGVtOiBFVCwgdmFsdWU6IFQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc2V0dGVyID0gc2V0dGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBc3luY1ZhbGlkYXRpb24obmFtZTogc3RyaW5nLCBhc3luY1ZhbGlkYXRvcj86IE1uZ0ZpZWxkQXN5bmNWYWxpZGF0b3IsIG1lc3NhZ2U/OiBNbmdGaWVsZFZhbGlkYXRpb25NZXNzYWdlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCBhc3luY1ZhbGlkYXRvciwgbWVzc2FnZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZywgbGFiZWxDbGFzc05hbWUgPSAnJywgaW5wdXRDbGFzc05hbWUgPSAnJywgZmllbGRDbGFzc05hbWU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9sYWJlbENsYXNzTmFtZSA9IGxhYmVsQ2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9pbnB1dENsYXNzTmFtZSA9IGlucHV0Q2xhc3NOYW1lO1xuICAgICAgICB0aGlzLl9maWVsZENsYXNzTmFtZSA9IGZpZWxkQ2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNpemUoc2l6ZTogRmllbGRTaXplRW51bSA9IEZpZWxkU2l6ZUVudW0uTm9ybWFsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dEV2ZW50KHR5cGU6IE1uZ0Zvcm1GaWVsZEV2ZW50VHlwZUVudW0sIGNtcFR5cGU6IFR5cGU8YW55PiwgY21wSW5zdGFuY2U6IGFueSwgZGF0YT86IE1uZ0Zvcm1GaWVsZEV2ZW50RGF0YTxULCBFVD4pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzU3ViamVjdC5uZXh0KG5ldyBNbmdGb3JtRmllbGRFdmVudCh0eXBlLCBjbXBUeXBlLCBjbXBJbnN0YW5jZSwgZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXZlbnRzJCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcHlGaWVsZHNUbyhvYmo6IEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+KSB7XG4gICAgICAgIG9iai5fbGFiZWwgPSB0aGlzLl9sYWJlbDtcbiAgICAgICAgb2JqLl9wbGFjZWhvbGRlciA9IHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgICAgICBvYmouX2hlbHBUZXh0ID0gdGhpcy5faGVscFRleHQ7XG4gICAgICAgIG9iai5fcmVxdWlyZWQgPSB0aGlzLl9yZXF1aXJlZDtcbiAgICAgICAgb2JqLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICBvYmouX2RlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgb2JqLl9yZXF1aXJlZEV4cHJlc3Npb24gPSB0aGlzLl9yZXF1aXJlZEV4cHJlc3Npb247XG4gICAgICAgIG9iai5faGlkZGVuRXhwcmVzc2lvbiA9IHRoaXMuX2hpZGRlbkV4cHJlc3Npb247XG4gICAgICAgIG9iai5fZGlzYWJsZWRFeHByZXNzaW9uID0gdGhpcy5fZGlzYWJsZWRFeHByZXNzaW9uO1xuICAgICAgICBvYmouX2NsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcbiAgICAgICAgb2JqLl9zaXplID0gdGhpcy5zaXplO1xuICAgICAgICBvYmouX2dldHRlciA9IHRoaXMuX2dldHRlcjtcbiAgICAgICAgb2JqLl9zZXR0ZXIgPSB0aGlzLl9zZXR0ZXI7XG4gICAgICAgIG9iai5fdmFsaWRhdGlvbnMgPSB0aGlzLl92YWxpZGF0aW9ucztcbiAgICAgICAgb2JqLl9hc3luY1ZhbGlkYXRpb25zID0gdGhpcy5fYXN5bmNWYWxpZGF0aW9ucztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgRmlsZSB8IEZpbGVbXSwgRVQ+IHtcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXRUeXBlRW51bSA9IEZpZWxkSW5wdXRUeXBlRW51bS5UZXh0O1xuXG4gICAgLy8gdGV4dGFyZWEgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3Jvd3M/OiBudW1iZXI7XG5cbiAgICAvLyBudW1iZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX251bWJlck1pbj86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyU3RlcD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJVc2VHcm91cGluZyA9IHRydWU7XG4gICAgcHJpdmF0ZSBfbG9jYWxlPzogc3RyaW5nO1xuXG4gICAgLy8gY3VycmVuY3kgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX2N1cnJlbmN5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2N1cnJlbmN5RGlzcGxheTogJ3N5bWJvbCcgfCAnY29kZScgfCAnbmFtZScgPSAnc3ltYm9sJztcbiAgICBwcml2YXRlIF9jdXJyZW5jeUZyb21Qcm9wZXJ0eT86IHN0cmluZztcblxuICAgIC8vIHJhZGlvIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9yYWRpb09wdGlvbnM6IEFycmF5PEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZT4+ID0gW107XG5cbiAgICAvLyBkYXRlcGlja2VyIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyRm9ybWF0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNaW4/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJNYXg/OiBEYXRlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJTaG93VGltZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2RhdGVQaWNrZXJTaG93U2Vjb25kcyA9IHRydWU7XG5cbiAgICAvLyBpbnB1dCBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfbWF4TGVuZ3RoPzogbnVtYmVyO1xuICAgIHByaXZhdGUgX21pbkxlbmd0aD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9wYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwO1xuXG4gICAgLy8gbWFzayBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfbWFzaz86IHN0cmluZztcbiAgICBwcml2YXRlIF9zbG90Q2hhcj86IHN0cmluZztcblxuICAgIC8vIGZpbGUgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX2ZpbGVNdWx0aXBsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2ZpbGVNYXhGaWxlU2l6ZSA9IDUwMDAwMDtcbiAgICBwcml2YXRlIF9maWxlQWNjZXB0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZpbGVPblNlbGVjdEhhbmRsZXI/OiAoZmlsZTogRmlsZVtdIHwgbnVsbCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB2b2lkO1xuXG4gICAgLy8gY3VzdG9tIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfY3VzdG9tQ29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydHMgZmllbGQgdG8gZ2l2ZW4gdHlwZSB3aXRoIGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogQHBhcmFtIGZpZWxkVHlwZSBmaWVsZCB0eXBlIGVudW1cbiAgICAgKiBAcGFyYW0gYXJncyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGZpZWxkIChvcHRpb25hbClcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNUeXBlKGZpZWxkVHlwZTogRmllbGRJbnB1dFR5cGVFbnVtLCAuLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uSGlkZGVuOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzSGlkZGVuKCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5MYWJlbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc0xhYmVsKCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5UZXh0YXJlYTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc1RleHRhcmVhKC4uLmFyZ3MpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uTnVtYmVyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5DdXJyZW5jeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc0N1cnJlbmN5KC4uLmFyZ3MpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uU3dpdGNoOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzU3dpdGNoKCk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5SYWRpbzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc1JhZGlvKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uRGF0ZXBpY2tlcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc0RhdGVQaWNrZXIoLi4uYXJncyk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5NYXNrOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzTWFzayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLkZpbGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNGaWxlKC4uLmFyZ3MpO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uQ3VzdG9tOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzQ3VzdG9tQ29tcG9uZW50KGFyZ3NbMF0pO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uVGV4dDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc1RleHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNYXg7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJTdGVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyU3RlcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1pbkZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJNYXhGcmFjdGlvbkRpZ2l0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyVXNlR3JvdXBpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJVc2VHcm91cGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJhZGlvT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGlvT3B0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyRm9ybWF0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlck1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJNaW47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJTaG93VGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJTaG93VGltZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJTaG93U2Vjb25kcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJTaG93U2Vjb25kcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1pbkxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hc2s7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzbG90Q2hhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDaGFyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsZU11bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZU11bHRpcGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsZU1heEZpbGVTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZU1heEZpbGVTaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsZUFjY2VwdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVBY2NlcHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlT25TZWxlY3RIYW5kbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZU9uU2VsZWN0SGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1c3RvbUNvbXBvbmVudE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVuY3koKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW5jeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5RnJvbVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lGcm9tUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW5jeURpc3BsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW5jeURpc3BsYXk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzSGlkZGVuKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uSGlkZGVuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNMYWJlbCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLkxhYmVsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNUZXh0KCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uVGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dGFyZWEocm93cyA9IDMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLlRleHRhcmVhO1xuICAgICAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTnVtYmVyKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uTnVtYmVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNDdXJyZW5jeShjdXJyZW5jeUZyb21Qcm9wZXJ0eT86IHN0cmluZywgY3VycmVuY3k/OiBzdHJpbmcsIGN1cnJlbmN5RGlzcGxheT86ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5DdXJyZW5jeTtcbiAgICAgICAgdGhpcy5fY3VycmVuY3lGcm9tUHJvcGVydHkgPSBjdXJyZW5jeUZyb21Qcm9wZXJ0eTtcbiAgICAgICAgdGhpcy5fY3VycmVuY3kgPSBjdXJyZW5jeSA/PyB0aGlzLl9jdXJyZW5jeTtcbiAgICAgICAgdGhpcy5fY3VycmVuY3lEaXNwbGF5ID0gY3VycmVuY3lEaXNwbGF5ID8/IHRoaXMuX2N1cnJlbmN5RGlzcGxheTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aE51bWJlckZyYWN0aW9ucygyLCAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNTd2l0Y2goKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5Td2l0Y2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvKG9wdGlvbnM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIG9wdGlvbnNUaXRsZVBhdGg/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLlJhZGlvO1xuICAgICAgICB0aGlzLl9yYWRpb09wdGlvbnMgPSBvcHRpb25zLm1hcChvID0+IDxFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyPj57dmFsdWU6IG8sIHRpdGxlOiBgJHtvcHRpb25zVGl0bGVQYXRoID8gYCR7b3B0aW9uc1RpdGxlUGF0aH0uYCA6ICcnfSR7b31gfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1JhZGlvRnJvbUVudW0oZW51bVR5cGU6IEVudW1UeXBlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCwgdmFsdWVzPzogQXJyYXk8RW51bUNvbnN0YW50VHlwZT4sIG5hbWVBc1ZhbHVlID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLlJhZGlvO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnNUaXRsZVBhdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvcHRpb25zVGl0bGVQYXRoID0gVHlwZVV0aWwuZmluZEVudW1OYW1lKGVudW1UeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yYWRpb09wdGlvbnMgPSBBcnJheS5pc0FycmF5KHZhbHVlcylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIHZhbHVlcywgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKVxuICAgICAgICAgICAgOiBFbnVtVXRpbC5mcm9tQ29uc3RhbnRzQXNFbnVtVmFsdWVBcnJheShlbnVtVHlwZSwgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGggPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRGF0ZVBpY2tlcihmb3JtYXQ/OiBzdHJpbmcsIG1pbj86IERhdGUsIG1heD86IERhdGUsIHNob3dUaW1lPzogYm9vbGVhbiwgc2hvd1NlY29uZHM/OiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5EYXRlcGlja2VyO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyRm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWluID0gbWluO1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyTWF4ID0gbWF4O1xuICAgICAgICB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWUgPSBzaG93VGltZSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlclNob3dTZWNvbmRzID0gc2hvd1NlY29uZHMgPz8gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTWFzayhtYXNrOiBzdHJpbmcsIHNsb3RDaGFyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLk1hc2s7XG4gICAgICAgIHRoaXMuX21hc2sgPSBtYXNrO1xuICAgICAgICB0aGlzLl9zbG90Q2hhciA9IHNsb3RDaGFyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNGaWxlKG11bHRpcGxlID0gZmFsc2UsIG1heEZpbGVTaXplID0gNTAwMDAwLCBhY2NlcHQ/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLkZpbGU7XG4gICAgICAgIHRoaXMuX2ZpbGVNdWx0aXBsZSA9IG11bHRpcGxlO1xuICAgICAgICB0aGlzLl9maWxlTWF4RmlsZVNpemUgPSBtYXhGaWxlU2l6ZTtcbiAgICAgICAgdGhpcy5fZmlsZUFjY2VwdCA9IGFjY2VwdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uQ3VzdG9tO1xuICAgICAgICB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lID0gY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhOdW1iZXJWYWxpZGF0aW9uKG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyLCBzdGVwPzogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX251bWJlclN0ZXAgPSBzdGVwID8/IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIHRoaXMuX251bWJlck1pbiA9IG1pbiA/PyB0aGlzLl9udW1iZXJNaW4gPz8gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHRoaXMuX251bWJlck1heCA9IG1heCA/PyB0aGlzLl9udW1iZXJNYXggPz8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9jYWxlKGxvY2FsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhOdW1iZXJGcmFjdGlvbnMobWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMgPSBtaW47XG4gICAgICAgIHRoaXMuX251bWJlck1heEZyYWN0aW9uRGlnaXRzID0gbWF4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE51bWJlckdyb3VwaW5nKHVzZUdyb3VwaW5nID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9udW1iZXJVc2VHcm91cGluZyA9IHVzZUdyb3VwaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRleHRWYWxpZGF0aW9uKG1pbkxlbmd0aD86IG51bWJlciwgbWF4TGVuZ3RoPzogbnVtYmVyLCBwYXR0ZXJuPzogc3RyaW5nIHwgUmVnRXhwKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX21pbkxlbmd0aCA9IG1pbkxlbmd0aDtcbiAgICAgICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUZXh0VmFsaWRhdGlvbkVtYWlsKCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5maWVsZFR5cGUgPT09IEZpZWxkSW5wdXRUeXBlRW51bS5UZXh0KSB7XG4gICAgICAgICAgICB0aGlzLndpdGhWYWxpZGF0aW9uKCdlbWFpbCcsIFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmlsZU9uU2VsZWN0SGFuZGxlcihmbjogKGZpbGU6IEZpbGVbXSB8IG51bGwsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLl9maWxlT25TZWxlY3RIYW5kbGVyID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRJbnB1dERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9yb3dzID0gdGhpcy5fcm93cztcbiAgICAgICAgZmllbGQuX251bWJlck1pbiA9IHRoaXMuX251bWJlck1pbjtcbiAgICAgICAgZmllbGQuX251bWJlck1heCA9IHRoaXMuX251bWJlck1heDtcbiAgICAgICAgZmllbGQuX251bWJlclN0ZXAgPSB0aGlzLl9udW1iZXJTdGVwO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX251bWJlck1heEZyYWN0aW9uRGlnaXRzID0gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIGZpZWxkLl9udW1iZXJVc2VHcm91cGluZyA9IHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgICAgICBmaWVsZC5fcmFkaW9PcHRpb25zID0gWy4uLnRoaXMuX3JhZGlvT3B0aW9uc107XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyRm9ybWF0ID0gdGhpcy5fZGF0ZVBpY2tlckZvcm1hdDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJNaW4gPSB0aGlzLl9kYXRlUGlja2VyTWluO1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1heCA9IHRoaXMuX2RhdGVQaWNrZXJNYXg7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyU2hvd1RpbWUgPSB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWU7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyU2hvd1NlY29uZHMgPSB0aGlzLl9kYXRlUGlja2VyU2hvd1NlY29uZHM7XG4gICAgICAgIGZpZWxkLl9tYXhMZW5ndGggPSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICAgIGZpZWxkLl9taW5MZW5ndGggPSB0aGlzLl9taW5MZW5ndGg7XG4gICAgICAgIGZpZWxkLl9wYXR0ZXJuID0gdGhpcy5fcGF0dGVybjtcbiAgICAgICAgZmllbGQuX21hc2sgPSB0aGlzLl9tYXNrO1xuICAgICAgICBmaWVsZC5fc2xvdENoYXIgPSB0aGlzLl9zbG90Q2hhcjtcbiAgICAgICAgZmllbGQuX2ZpbGVNdWx0aXBsZSA9IHRoaXMuX2ZpbGVNdWx0aXBsZTtcbiAgICAgICAgZmllbGQuX2ZpbGVNYXhGaWxlU2l6ZSA9IHRoaXMuX2ZpbGVNYXhGaWxlU2l6ZTtcbiAgICAgICAgZmllbGQuX2ZpbGVBY2NlcHQgPSB0aGlzLl9maWxlQWNjZXB0O1xuICAgICAgICBmaWVsZC5fZmlsZU9uU2VsZWN0SGFuZGxlciA9IHRoaXMuX2ZpbGVPblNlbGVjdEhhbmRsZXI7XG4gICAgICAgIGZpZWxkLl9jdXN0b21Db21wb25lbnROYW1lID0gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgZmllbGQuX2xvY2FsZSA9IHRoaXMuX2xvY2FsZTtcbiAgICAgICAgZmllbGQuX2N1cnJlbmN5ID0gdGhpcy5fY3VycmVuY3k7XG4gICAgICAgIGZpZWxkLl9jdXJyZW5jeURpc3BsYXkgPSB0aGlzLl9jdXJyZW5jeURpc3BsYXk7XG4gICAgICAgIGZpZWxkLl9jdXJyZW5jeUZyb21Qcm9wZXJ0eSA9IHRoaXMuX2N1cnJlbmN5RnJvbVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRBY3Rpb25EZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8dm9pZCwgRVQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ZpZWxkQWN0aW9uTmFtZTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZmllbGRBY3Rpb25OYW1lTG9uZzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9idXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpO1xuXG4gICAgcHJvdGVjdGVkIF9ydW5GdW5jdGlvbj86IChjdHg6IEZpZWxkQWN0aW9uQ29udGV4dDxFVD4pID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbk5hbWUgPSBwcm9wZXJ0eTtcbiAgICAgICAgbGV0IGRpc3BsYXlOYW1lID0gcHJvcGVydHk7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0b3IubW9kZWwpIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fZWRpdG9yLm1vZGVsLnR5cGVOYW1lfS4ke2Rpc3BsYXlOYW1lfWA7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9uTmFtZUxvbmcgPSBkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJ1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1dHRvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhCdXR0b25EZXNjcmlwdG9yKGJ1dHRvbjogQWN0aW9uQnV0dG9uRGVzY3JpcHRvcik6IHRoaXMge1xuICAgICAgICB0aGlzLl9idXR0b24gPSBidXR0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnV0dG9uKGxhYmVsPzogc3RyaW5nIHwgbnVsbCwgaWNvbjogc3RyaW5nIHwgbnVsbCA9IG51bGwsIHN0eWxlTGV2ZWwgPSBTdHlsZUxldmVsRW51bS5EZWZhdWx0LCBzdHlsZVRleHQgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9idXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpLndpdGhMYWJlbChsYWJlbCkud2l0aEljb24oaWNvbikud2l0aFN0eWxlQ2xhc3MobmV3IEJ1dHRvblN0eWxlQnVpbGRlcihzdHlsZUxldmVsKS53aXRoVGV4dEJ1dHRvbihzdHlsZVRleHQpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5GdW5jdGlvbihmbjogKGN0eDogRmllbGRBY3Rpb25Db250ZXh0PEVUPikgPT4gdm9pZCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9ydW5GdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEFjdGlvbkRlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRBY3Rpb25EZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5KTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fYnV0dG9uID0gdGhpcy5fYnV0dG9uLmNvcHkoKTtcbiAgICAgICAgZmllbGQuX3J1bkZ1bmN0aW9uID0gdGhpcy5fcnVuRnVuY3Rpb24/LmJpbmQoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IGltcGxlbWVudHMgSUxvb2t1cERlc2NyaXB0b3I8VD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD4gfCBudWxsO1xuICAgIHByb3RlY3RlZCBfbG9va3VwVHlwZTogRmllbGRMb29rdXBUeXBlRW51bSA9IEZpZWxkTG9va3VwVHlwZUVudW0uRHJvcGRvd247XG4gICAgcHJvdGVjdGVkIF9pdGVtc0xhYmVsUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9pdGVtc0xhYmVsVHJhbnNsYXRlID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9pdGVtc1ZhbHVlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9pdGVtc0Rpc2FibGVkUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9kYXRhS2V5UHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9kYXRhUHJvdmlkZXI/OiBJTG9va3VwRGF0YVByb3ZpZGVyPFQsIGFueT47XG5cbiAgICBwcm90ZWN0ZWQgX2Ryb3Bkb3duQ2xhc3NOYW1lID0gJ21uZy1maWx0ZXItbG9va3VwLWRyb3Bkb3duJztcblxuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlQXV0b0NsZWFyID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9hdXRvY29tcGxldGVTZWxlY3RGaXJzdCA9IGZhbHNlO1xuXG4gICAgcHJvdGVjdGVkIF9kaWFsb2dUYWJsZURlc2NyaXB0b3I/OiBUYWJsZURlc2NyaXB0b3I8VD47XG4gICAgcHJvdGVjdGVkIF9kaWFsb2dUYWJsZURhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD4gfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLl9tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XG4gICAgICAgIE1vZGVsVXRpbC50cnlTZXRMb29rdXBJdGVtc1Byb3BlcnRpZXModGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9va3VwVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zTGFiZWxQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTGFiZWxQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zTGFiZWxUcmFuc2xhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsVHJhbnNsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNWYWx1ZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXNEaXNhYmxlZFByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNEaXNhYmxlZFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YUtleVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUtleVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGF1dG9jb21wbGV0ZUlubGluZVNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGF1dG9jb21wbGV0ZUF1dG9DbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZUF1dG9DbGVhcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGF1dG9jb21wbGV0ZVNlbGVjdEZpcnN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlU2VsZWN0Rmlyc3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkcm9wZG93bkNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3Bkb3duQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWxUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zTGFiZWxQcm9wZXJ0eShpdGVtc0xhYmVsUHJvcGVydHk6IHN0cmluZywgdHJhbnNsYXRlID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICB0aGlzLl9pdGVtc0xhYmVsVHJhbnNsYXRlID0gdHJhbnNsYXRlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2RhdGFLZXlQcm9wZXJ0eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0Rpc2FibGVkUHJvcGVydHkoaXRlbXNEaXNhYmxlZFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNEaXNhYmxlZFByb3BlcnR5ID0gaXRlbXNEaXNhYmxlZFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERhdGFLZXlQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFLZXlQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhDb25maWcoY29uZmlnOiBGaWVsZExvb2t1cENvbmZpZyk6IHRoaXMge1xuICAgICAgICByZXR1cm4gc3VwZXIud2l0aENvbmZpZyhjb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cyA9IGZhbHNlLCBpbmxpbmVTZWFyY2ggPSBmYWxzZSwgc2VsZWN0Rmlyc3QgPSBmYWxzZSwgYXV0b0NsZWFyID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVHlwZSA9IEZpZWxkTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVBdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZVNlbGVjdEZpcnN0ID0gc2VsZWN0Rmlyc3Q7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzID0gb3Blbk9uRm9jdXM7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IGlubGluZVNlYXJjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRGlhbG9nKGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCB0YWJsZURhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFR5cGUgPSBGaWVsZExvb2t1cFR5cGVFbnVtLkRpYWxvZztcbiAgICAgICAgdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlciA9IHRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFRyYW5zbGF0ZSA9IHRoaXMuX2l0ZW1zTGFiZWxUcmFuc2xhdGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIGZpZWxkLl9kcm9wZG93bkNsYXNzTmFtZSA9IHRoaXMuX2Ryb3Bkb3duQ2xhc3NOYW1lO1xuICAgICAgICBmaWVsZC5fYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXMgPSB0aGlzLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cztcbiAgICAgICAgZmllbGQuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaDtcbiAgICAgICAgZmllbGQuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvciA9IHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgRmllbGRMb29rdXBEZXNjcmlwdG9yPEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+LCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VudW1UeXBlOiBFbnVtVHlwZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25FbnVtVmFsdWVzOiBFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyPltdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX25hbWVBc1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nLCBlbnVtVHlwZTogRW51bVR5cGUsIG9wdGlvbnM/OiBBcnJheTxFbnVtQ29uc3RhbnRUeXBlPiwgbmFtZUFzVmFsdWUgPSBmYWxzZSwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSwgbnVsbCk7XG4gICAgICAgIHRoaXMuX2VudW1UeXBlID0gZW51bVR5cGU7XG4gICAgICAgIHRoaXMuX25hbWVBc1ZhbHVlID0gbmFtZUFzVmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1RpdGxlUGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnNUaXRsZVBhdGggPSBUeXBlVXRpbC5maW5kRW51bU5hbWUoZW51bVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29wdGlvbkVudW1WYWx1ZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpXG4gICAgICAgICAgICA/IEVudW1VdGlsLmZyb21WYWx1ZXNBc0VudW1WYWx1ZUFycmF5KGVudW1UeXBlLCBvcHRpb25zLCBuYW1lQXNWYWx1ZSwgb3B0aW9uc1RpdGxlUGF0aCA/PyB1bmRlZmluZWQpXG4gICAgICAgICAgICA6IEVudW1VdGlsLmZyb21Db25zdGFudHNBc0VudW1WYWx1ZUFycmF5KGVudW1UeXBlLCBuYW1lQXNWYWx1ZSwgb3B0aW9uc1RpdGxlUGF0aCA/PyB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgTG9va3VwRGF0YVByb3ZpZGVyPEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+LCBhbnk+KG51bGwpLndpdGhMb29rdXAoKCkgPT4gb2YodGhpcy5fb3B0aW9uRW51bVZhbHVlcykpO1xuICAgICAgICB0aGlzLndpdGhMb29rdXBEYXRhUHJvdmlkZXIoZGF0YVByb3ZpZGVyKTtcbiAgICAgICAgdGhpcy53aXRoSXRlbXNMYWJlbFByb3BlcnR5KCd0aXRsZScsIG9wdGlvbnNUaXRsZVBhdGggIT09IG51bGwpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc1ZhbHVlUHJvcGVydHkoJ3ZhbHVlJyk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zRGlzYWJsZWRQcm9wZXJ0eSgnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVudW1UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW51bVR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaXNhYmxlZE9wdGlvbnMoLi4uZGlzYWJsZWRPcHRpb25zOiBBcnJheTxFbnVtQ29uc3RhbnRUeXBlPik6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGRpc2FibGVkT3B0aW9uIG9mIGRpc2FibGVkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZGlzYWJsZWRPcHRpb25WYWx1ZSA9IHRoaXMuX25hbWVBc1ZhbHVlID8gRW51bVV0aWwuZ2V0Q29uc3RhbnROYW1lKHRoaXMuX2VudW1UeXBlLCBkaXNhYmxlZE9wdGlvbikgOiBkaXNhYmxlZE9wdGlvbjtcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZE9wdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fb3B0aW9uRW51bVZhbHVlcy5maW5kKG8gPT4gby52YWx1ZSA9PT0gZGlzYWJsZWRPcHRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERlZmF1bHRWYWx1ZUVudW0oZGVmYXVsdFZhbHVlOiBFbnVtQ29uc3RhbnRUeXBlKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25WYWx1ZSA9IHRoaXMuX25hbWVBc1ZhbHVlID8gRW51bVV0aWwuZ2V0Q29uc3RhbnROYW1lKHRoaXMuX2VudW1UeXBlLCBkZWZhdWx0VmFsdWUpIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICBpZiAoZGVmYXVsdE9wdGlvblZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25FbnVtVmFsdWVzLmZpbmQobyA9PiBvLnZhbHVlID09PSBkZWZhdWx0T3B0aW9uVmFsdWUpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMud2l0aERlZmF1bHRWYWx1ZSh0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPyBvcHRpb25bdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5IGFzIGtleW9mIG9iamVjdF0gOiBvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBhc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cyA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgc3VwZXIuYXNBdXRvY29tcGxldGUob3Blbk9uRm9jdXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgY29weSgpOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX2VudW1UeXBlLCBbXSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2xvb2t1cFR5cGUgPSB0aGlzLl9sb29rdXBUeXBlO1xuICAgICAgICBmaWVsZC5faXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNWYWx1ZVByb3BlcnR5ID0gdGhpcy5faXRlbXNWYWx1ZVByb3BlcnR5O1xuICAgICAgICBmaWVsZC5faXRlbXNEaXNhYmxlZFByb3BlcnR5ID0gdGhpcy5faXRlbXNEaXNhYmxlZFByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZGF0YUtleVByb3BlcnR5ID0gdGhpcy5fZGF0YUtleVByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZGF0YVByb3ZpZGVyID0gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciBtYWluIHRhYmxlIGNvbXBvbmVudFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+OyAvLyB0YWJsZSBkZXNjcmlwdG9yIGZvciB3aGVyZSBzZWxlY3Qgd2lsbCBiZSBhcHBsaWVkXG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JUeXBlRW51bSA9IEZpZWxkTWFueVRvTWFueUVkaXRvclR5cGVFbnVtLkRpYWxvZ1RhYmxlTXVsdGlzZWxlY3Q7XG4gICAgcHJpdmF0ZSBfbG9va3VwVGFibGVEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gJyc7XG4gICAgcHJpdmF0ZSBfZXhjbHVkZVZhbHVlUHJvcGVydHkgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPiwgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IgPSBtYWluVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IgPSBsb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChGaWVsZE1hbnlUb01hbnlFZGl0b3JBY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55VG9NYW55RWRpdG9yQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVGFibGVEYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzTG9va3VwRXhjbHVkZVZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlRmlsdGVyUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBleGNsdWRlVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWFpblRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUYWJsZURlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXA8Uz4oZ2V0QWxsOiAocXVlcnlQYXJhbTogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8TWVkaXVzUXVlcnlSZXN1bHQ8VD4+LCBzZXJ2aWNlVHlwZT86IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IFRhYmxldmlld0RhdGFQcm92aWRlcjxULCBTPih0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLm1vZGVsLnR5cGUpO1xuICAgICAgICBpZiAoc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoU2VydmljZVR5cGUoc2VydmljZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFQcm92aWRlci53aXRoR2V0QWxsKGdldEFsbCk7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFjdGlvbnMoYWN0aW9uczogQXJyYXk8RmllbGRNYW55VG9NYW55RWRpdG9yQWN0aW9uRW51bT4gPSBbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCguLi5hY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb29rdXBFeGNsdWRlKGZpbHRlclByb3BlcnR5OiBzdHJpbmcsIHZhbHVlUHJvcGVydHk6IHN0cmluZywgaGFzTG9va3VwRXhjbHVkZSA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IGhhc0xvb2t1cEV4Y2x1ZGU7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSA9IGZpbHRlclByb3BlcnR5O1xuICAgICAgICB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHZhbHVlUHJvcGVydHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcih0aGlzLl9lZGl0b3IsIHRoaXMuX3Byb3BlcnR5LCB0aGlzLl9tYWluVGFibGVEZXNjcmlwdG9yLmNvcHkoKSwgdGhpcy5fbG9va3VwVGFibGVEZXNjcmlwdG9yLmNvcHkoKSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX2FjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSB0aGlzLl9sb29rdXBUYWJsZURhdGFQcm92aWRlcjtcbiAgICAgICAgZmllbGQuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzO1xuICAgICAgICBmaWVsZC5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5O1xuICAgICAgICBmaWVsZC5fZXhjbHVkZVZhbHVlUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8VCwgRVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD47XG4gICAgcHJpdmF0ZSBfZmllbGRUeXBlOiBGaWVsZE1hbnlFZGl0b3JUeXBlRW51bSA9IEZpZWxkTWFueUVkaXRvclR5cGVFbnVtLkRpYWxvZ0VkaXRvcjtcbiAgICBwcml2YXRlIF9maWVsZEFjdGlvbnM6IEFycmF5PEZpZWxkTWFueUVkaXRvckFjdGlvbkVudW0+ID0gW107XG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8vIHRoaXMuX21vZGVsVHlwZSA9IG1vZGVsVHlwZTtcbiAgICAgICAgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvciA9IHRhYmxldmlld0Rlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucy5wdXNoKEZpZWxkTWFueUVkaXRvckFjdGlvbkVudW0uVmlldywgRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bS5BZGQsIEZpZWxkTWFueUVkaXRvckFjdGlvbkVudW0uRWRpdCwgRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bS5EZWxldGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRUeXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRBY3Rpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZXZpZXdEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IudGFibGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JDcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmFkZEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmRldGFpbHNFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JGb3JVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yLmVkaXRFZGl0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWVsZEFjdGlvbihhY3Rpb246IEZpZWxkTWFueUVkaXRvckFjdGlvbkVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWVsZEFjdGlvbnMoYWN0aW9uczogRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bVtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkQWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fZmllbGRBY3Rpb25zID0gdGhpcy5fZmllbGRBY3Rpb25zLm1hcChhID0+IGEpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZWZhdWx0OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9maWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdID0gW107XG4gICAgcHJvdGVjdGVkIF92YWxpZGF0aW9uczogQXJyYXk8RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcj4gPSBbXTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yKTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IGAke3RoaXMuYmFzZU5hbWV9JHtuYW1lfWA7XG4gICAgICAgIHRoaXMuX2RlZmF1bHQgPSBuYW1lID09PSBFZGl0b3JEZXNjcmlwdG9yLmRlZmF1bHRHcm91cE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUZpZWxkKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlckZ1bmN0aW9uOiAoZmllbGRzOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXSkgPT4gQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+W10pOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXSB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IGZpbHRlckZ1bmN0aW9uKHRoaXMuX2ZpZWxkcyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdldCBmaWVsZHMoKTogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+W107XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiYXNlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ3JvdXBOYW1lKCl9X2A7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0O1xuICAgIH1cblxuICAgIGFic3RyYWN0IGdyb3VwTmFtZSgpOiBzdHJpbmc7XG5cbiAgICBhYnN0cmFjdCBhZGRGaWVsZChmaWVsZDogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+KTogdGhpcztcblxuICAgIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPjtcblxuICAgIHB1YmxpYyB3aXRoVGl0bGUodGl0bGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbGlkYXRpb24obmFtZTogc3RyaW5nLCB2YWxpZGF0b3I/OiBNbmdGaWVsZFZhbGlkYXRvciwgbWVzc2FnZT86IE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbnMucHVzaChuZXcgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMgYXMgQXJyYXk8RmllbGRHcm91cERlc2NyaXB0b3I8RVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAndGFiJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQoZmllbGQ6IEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IHRhYiA9IG5ldyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIHRhYi5fdGl0bGUgPSB0aGlzLl90aXRsZTtcbiAgICAgICAgdGFiLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiB0YWI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IEZpZWxkR3JvdXBUeXBlRW51bS5GaWVsZHNldDtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IsIG5hbWUpO1xuICAgICAgICBpZiAodGhpcy5fZGVmYXVsdCkge1xuICAgICAgICAgICAgdGhpcy5hc0xvZ2ljYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzIGFzIEFycmF5PEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4+O1xuICAgIH1cblxuICAgIHB1YmxpYyBncm91cE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdncm91cCc7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEZpZWxkKGZpZWxkOiBBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTG9naWNhbCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9IEZpZWxkR3JvdXBUeXBlRW51bS5Mb2dpY2FsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMuYmFzZU5hbWUubGVuZ3RoKSk7XG4gICAgICAgIGdyb3VwLl90eXBlID0gdGhpcy5fdHlwZTtcbiAgICAgICAgZ3JvdXAuX3RpdGxlID0gdGhpcy5fdGl0bGU7XG4gICAgICAgIGdyb3VwLl9maWVsZHMgPSB0aGlzLmZpZWxkcy5tYXAoZiA9PiBmLmNvcHkoKSk7XG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9XG59XG4iXX0=