@mediusinc/mng-commons 0.9.7 → 0.10.3-rc

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 (321) hide show
  1. package/assets/i18n/en.json +5 -5
  2. package/assets/i18n/sl.json +5 -5
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +68 -67
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +23 -23
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +151 -151
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  19. package/esm2020/lib/components/action/action.component.mjs +200 -178
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +248 -248
  21. package/esm2020/lib/components/action/index.mjs +3 -3
  22. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  23. package/esm2020/lib/components/action/models/action-execution.model.mjs +236 -235
  24. package/esm2020/lib/components/action/models/index.mjs +2 -2
  25. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  26. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +278 -276
  27. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +169 -168
  28. package/esm2020/lib/components/form/editor/form-editor.component.mjs +211 -211
  29. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +48 -48
  30. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +43 -43
  31. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  32. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +102 -101
  33. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -17
  34. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +179 -179
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +173 -173
  36. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +155 -155
  37. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  38. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  39. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +15 -15
  40. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  41. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  42. package/esm2020/lib/components/form/index.mjs +3 -3
  43. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  44. package/esm2020/lib/components/form/models/index.mjs +1 -1
  45. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  47. package/esm2020/lib/components/layout/index.mjs +7 -7
  48. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  49. package/esm2020/lib/components/layout/menu-item.component.mjs +239 -217
  50. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  51. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  52. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  53. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  54. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  55. package/esm2020/lib/components/tableview/index.mjs +6 -6
  56. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  57. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  58. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +57 -57
  59. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +61 -61
  60. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +102 -102
  61. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  62. package/esm2020/lib/components/tableview/table/table.component.mjs +497 -497
  63. package/esm2020/lib/components/tableview/tableview.component.mjs +91 -91
  64. package/esm2020/lib/config/formly.config.mjs +180 -180
  65. package/esm2020/lib/config/index.mjs +1 -1
  66. package/esm2020/lib/config/models/index.mjs +1 -1
  67. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  68. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  69. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  70. package/esm2020/lib/data-providers/index.mjs +5 -5
  71. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  72. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  73. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  74. package/esm2020/lib/descriptors/action.descriptor.mjs +588 -566
  75. package/esm2020/lib/descriptors/column.descriptor.mjs +264 -264
  76. package/esm2020/lib/descriptors/editor.descriptor.mjs +146 -146
  77. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  78. package/esm2020/lib/descriptors/field.descriptor.mjs +820 -815
  79. package/esm2020/lib/descriptors/filter.descriptor.mjs +288 -288
  80. package/esm2020/lib/descriptors/index.mjs +9 -9
  81. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  82. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  83. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  84. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  85. package/esm2020/lib/descriptors/table.descriptor.mjs +197 -197
  86. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  87. package/esm2020/lib/descriptors/types/action.type.mjs +52 -52
  88. package/esm2020/lib/descriptors/types/column.type.mjs +10 -10
  89. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  90. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  91. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  92. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  93. package/esm2020/lib/descriptors/types/table.type.mjs +17 -17
  94. package/esm2020/lib/directives/component.directive.mjs +43 -43
  95. package/esm2020/lib/directives/index.mjs +2 -2
  96. package/esm2020/lib/directives/template.directive.mjs +27 -27
  97. package/esm2020/lib/mng-commons.module.mjs +442 -438
  98. package/esm2020/lib/models/column-value.model.mjs +1 -1
  99. package/esm2020/lib/models/enum.model.mjs +1 -1
  100. package/esm2020/lib/models/error.model.mjs +1 -1
  101. package/esm2020/lib/models/index.mjs +7 -7
  102. package/esm2020/lib/models/menu.model.mjs +2 -2
  103. package/esm2020/lib/models/user.model.mjs +1 -1
  104. package/esm2020/lib/models/version.model.mjs +1 -1
  105. package/esm2020/lib/models/view-container.model.mjs +1 -1
  106. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  107. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  108. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  109. package/esm2020/lib/pipes/index.mjs +5 -5
  110. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  111. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  112. package/esm2020/lib/router/index.mjs +3 -2
  113. package/esm2020/lib/router/models/index.mjs +1 -1
  114. package/esm2020/lib/router/models/router.model.mjs +2 -2
  115. package/esm2020/lib/router/route-builder.mjs +426 -432
  116. package/esm2020/lib/router/tableview-route-builder.mjs +160 -0
  117. package/esm2020/lib/security/authorization.guard.mjs +26 -0
  118. package/esm2020/lib/security/authorization.service.mjs +47 -0
  119. package/esm2020/lib/security/authorization.util.mjs +16 -0
  120. package/esm2020/lib/security/index.mjs +4 -0
  121. package/esm2020/lib/security/model/authorization.type.mjs +8 -0
  122. package/esm2020/lib/security/model/index.mjs +4 -0
  123. package/esm2020/lib/security/model/permission-service.interface.mjs +2 -0
  124. package/esm2020/lib/security/model/permissions.model.mjs +95 -0
  125. package/esm2020/lib/services/action-executor.service.mjs +536 -536
  126. package/esm2020/lib/services/commons.service.mjs +343 -331
  127. package/esm2020/lib/services/configuration.service.mjs +111 -111
  128. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  129. package/esm2020/lib/services/index.mjs +6 -6
  130. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  131. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  132. package/esm2020/lib/services/internal/index.mjs +2 -2
  133. package/esm2020/lib/services/navigation.service.mjs +47 -47
  134. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  135. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  136. package/esm2020/lib/services/providers/index.mjs +2 -2
  137. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  138. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  139. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  140. package/esm2020/lib/services/tokens/index.mjs +4 -4
  141. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  142. package/esm2020/lib/services/version.service.mjs +39 -38
  143. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  144. package/esm2020/lib/types/index.mjs +2 -2
  145. package/esm2020/lib/types/type.decorator.mjs +12 -12
  146. package/esm2020/lib/types/type.model.mjs +1 -1
  147. package/esm2020/lib/utils/action-data-provider.util.mjs +145 -145
  148. package/esm2020/lib/utils/editor-formly.util.mjs +243 -240
  149. package/esm2020/lib/utils/enum.util.mjs +81 -81
  150. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  151. package/esm2020/lib/utils/index.mjs +7 -7
  152. package/esm2020/lib/utils/model.util.mjs +59 -59
  153. package/esm2020/lib/utils/notification.util.mjs +45 -45
  154. package/esm2020/lib/utils/route.util.mjs +23 -23
  155. package/esm2020/lib/utils/styles.util.mjs +40 -40
  156. package/esm2020/lib/utils/type.util.mjs +76 -76
  157. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  158. package/esm2020/public-api.mjs +52 -42
  159. package/fesm2015/mediusinc-mng-commons.mjs +10664 -10243
  160. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  161. package/fesm2020/mediusinc-mng-commons.mjs +10513 -10091
  162. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  163. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  164. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  165. package/lib/api/models/filter-param.model.d.ts +23 -23
  166. package/lib/api/models/index.d.ts +8 -8
  167. package/lib/api/models/mappers.d.ts +6 -6
  168. package/lib/api/models/query-mode.model.d.ts +16 -16
  169. package/lib/api/models/query-param.model.d.ts +31 -31
  170. package/lib/api/models/query-result.model.d.ts +23 -23
  171. package/lib/api/models/serialization.model.d.ts +8 -8
  172. package/lib/api/services/api.abstract.service.d.ts +24 -24
  173. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  174. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  175. package/lib/api/services/index.d.ts +3 -3
  176. package/lib/api/utils/index.d.ts +2 -2
  177. package/lib/api/utils/medius-rest.util.d.ts +15 -15
  178. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  179. package/lib/components/action/action.component.d.ts +75 -69
  180. package/lib/components/action/editor/action-editor.component.d.ts +64 -64
  181. package/lib/components/action/index.d.ts +3 -3
  182. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  183. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  184. package/lib/components/action/models/index.d.ts +2 -2
  185. package/lib/components/action/route/action-route.component.d.ts +31 -31
  186. package/lib/components/form/autocomplete/autocomplete.component.d.ts +56 -56
  187. package/lib/components/form/dropdown/dropdown.component.d.ts +47 -47
  188. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  189. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +15 -15
  190. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  191. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +13 -13
  192. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +23 -23
  193. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +10 -6
  194. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +45 -45
  195. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +23 -23
  196. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +38 -38
  197. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  198. package/lib/components/form/formly/fields/index.d.ts +9 -9
  199. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  200. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  201. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  202. package/lib/components/form/index.d.ts +3 -3
  203. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  204. package/lib/components/form/models/index.d.ts +1 -1
  205. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  206. package/lib/components/layout/footer.component.d.ts +9 -9
  207. package/lib/components/layout/index.d.ts +7 -7
  208. package/lib/components/layout/main-layout.component.d.ts +20 -20
  209. package/lib/components/layout/menu-item.component.d.ts +44 -37
  210. package/lib/components/layout/menu.component.d.ts +10 -10
  211. package/lib/components/layout/services/index.d.ts +1 -1
  212. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  213. package/lib/components/layout/topbar.component.d.ts +24 -24
  214. package/lib/components/layout/version.component.d.ts +19 -19
  215. package/lib/components/tableview/index.d.ts +6 -6
  216. package/lib/components/tableview/models/index.d.ts +1 -1
  217. package/lib/components/tableview/models/table.event.d.ts +17 -17
  218. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  219. package/lib/components/tableview/route/tableview-route.component.d.ts +23 -21
  220. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +32 -32
  221. package/lib/components/tableview/table/column-value/column-value.component.d.ts +29 -29
  222. package/lib/components/tableview/table/table.component.d.ts +108 -108
  223. package/lib/components/tableview/tableview.component.d.ts +41 -41
  224. package/lib/config/formly.config.d.ts +15 -15
  225. package/lib/config/index.d.ts +1 -1
  226. package/lib/config/models/index.d.ts +1 -1
  227. package/lib/config/models/mng-config.model.d.ts +36 -36
  228. package/lib/data-providers/base.data-provider.d.ts +14 -14
  229. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  230. package/lib/data-providers/index.d.ts +5 -5
  231. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  232. package/lib/data-providers/table.data-provider.d.ts +14 -14
  233. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  234. package/lib/descriptors/action.descriptor.d.ts +234 -227
  235. package/lib/descriptors/column.descriptor.d.ts +82 -82
  236. package/lib/descriptors/editor.descriptor.d.ts +37 -37
  237. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  238. package/lib/descriptors/field.descriptor.d.ts +294 -292
  239. package/lib/descriptors/filter.descriptor.d.ts +106 -106
  240. package/lib/descriptors/index.d.ts +9 -9
  241. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  242. package/lib/descriptors/interfaces/index.d.ts +2 -2
  243. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  244. package/lib/descriptors/model.descriptor.d.ts +15 -15
  245. package/lib/descriptors/table.descriptor.d.ts +66 -66
  246. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  247. package/lib/descriptors/types/action.type.d.ts +45 -45
  248. package/lib/descriptors/types/column.type.d.ts +9 -9
  249. package/lib/descriptors/types/editor.type.d.ts +6 -6
  250. package/lib/descriptors/types/field.type.d.ts +44 -44
  251. package/lib/descriptors/types/filter.type.d.ts +27 -27
  252. package/lib/descriptors/types/index.d.ts +6 -6
  253. package/lib/descriptors/types/table.type.d.ts +13 -13
  254. package/lib/directives/component.directive.d.ts +16 -16
  255. package/lib/directives/index.d.ts +2 -2
  256. package/lib/directives/template.directive.d.ts +13 -13
  257. package/lib/mng-commons.module.d.ts +87 -87
  258. package/lib/models/column-value.model.d.ts +4 -4
  259. package/lib/models/enum.model.d.ts +6 -6
  260. package/lib/models/error.model.d.ts +14 -14
  261. package/lib/models/index.d.ts +7 -7
  262. package/lib/models/menu.model.d.ts +27 -25
  263. package/lib/models/user.model.d.ts +8 -8
  264. package/lib/models/version.model.d.ts +18 -18
  265. package/lib/models/view-container.model.d.ts +6 -6
  266. package/lib/pipes/boolean.pipe.d.ts +7 -7
  267. package/lib/pipes/enum.pipe.d.ts +8 -8
  268. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  269. package/lib/pipes/index.d.ts +5 -5
  270. package/lib/pipes/json-path.pipe.d.ts +13 -13
  271. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  272. package/lib/router/index.d.ts +2 -1
  273. package/lib/router/models/index.d.ts +1 -1
  274. package/lib/router/models/router.model.d.ts +27 -22
  275. package/lib/router/route-builder.d.ts +98 -86
  276. package/lib/router/tableview-route-builder.d.ts +34 -0
  277. package/lib/security/authorization.guard.d.ts +11 -0
  278. package/lib/security/authorization.service.d.ts +19 -0
  279. package/lib/security/authorization.util.d.ts +5 -0
  280. package/lib/security/index.d.ts +3 -0
  281. package/lib/security/model/authorization.type.d.ts +6 -0
  282. package/lib/security/model/index.d.ts +3 -0
  283. package/lib/security/model/permission-service.interface.d.ts +6 -0
  284. package/lib/security/model/permissions.model.d.ts +44 -0
  285. package/lib/services/action-executor.service.d.ts +149 -149
  286. package/lib/services/commons.service.d.ts +78 -73
  287. package/lib/services/configuration.service.d.ts +36 -36
  288. package/lib/services/error-mapper.service.d.ts +7 -7
  289. package/lib/services/index.d.ts +6 -6
  290. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  291. package/lib/services/internal/commons-init.service.d.ts +16 -16
  292. package/lib/services/internal/index.d.ts +2 -2
  293. package/lib/services/navigation.service.d.ts +14 -14
  294. package/lib/services/providers/config-service.provider.d.ts +6 -6
  295. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  296. package/lib/services/providers/index.d.ts +2 -2
  297. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  298. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  299. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  300. package/lib/services/tokens/index.d.ts +4 -4
  301. package/lib/services/tokens/module-config.token.d.ts +3 -3
  302. package/lib/services/version.service.d.ts +13 -13
  303. package/lib/services/view-container.component.service.d.ts +22 -22
  304. package/lib/types/index.d.ts +2 -2
  305. package/lib/types/type.decorator.d.ts +4 -4
  306. package/lib/types/type.model.d.ts +23 -23
  307. package/lib/utils/action-data-provider.util.d.ts +20 -20
  308. package/lib/utils/editor-formly.util.d.ts +11 -11
  309. package/lib/utils/enum.util.d.ts +50 -50
  310. package/lib/utils/i18n.util.d.ts +56 -56
  311. package/lib/utils/index.d.ts +7 -7
  312. package/lib/utils/model.util.d.ts +8 -8
  313. package/lib/utils/notification.util.d.ts +11 -11
  314. package/lib/utils/route.util.d.ts +4 -4
  315. package/lib/utils/styles.util.d.ts +14 -14
  316. package/lib/utils/type.util.d.ts +36 -36
  317. package/mediusinc-mng-commons-0.10.3-rc.tgz +0 -0
  318. package/mediusinc-mng-commons.d.ts +5 -5
  319. package/package.json +1 -1
  320. package/public-api.d.ts +32 -30
  321. package/version-info.json +6 -6
@@ -1,217 +1,239 @@
1
- import { animate, state, style, transition, trigger } from '@angular/animations';
2
- import { Component, Input } from '@angular/core';
3
- import { GuardsCheckEnd, NavigationEnd } from '@angular/router';
4
- import { BehaviorSubject, Observable, combineLatest, distinctUntilChanged, from, of } from 'rxjs';
5
- import { first, map } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/router";
8
- import * as i2 from "../../services";
9
- import * as i3 from "./services";
10
- import * as i4 from "@angular/common";
11
- import * as i5 from "primeng/ripple";
12
- import * as i6 from "@ngx-translate/core";
13
- export class MngMenuItemComponent {
14
- constructor(injector, router, route, mngCommons, mainLayoutService) {
15
- this.injector = injector;
16
- this.router = router;
17
- this.route = route;
18
- this.mngCommons = mngCommons;
19
- this.mainLayoutService = mainLayoutService;
20
- this.index = 0;
21
- this.root = false;
22
- this.parentKey = null;
23
- this.key = '';
24
- this.active = false;
25
- this.hover = false;
26
- this.isAllowedSubject = new BehaviorSubject(true);
27
- this.isAllowed$ = this.isAllowedSubject.asObservable().pipe(distinctUntilChanged());
28
- }
29
- ngOnInit() {
30
- if (!this.mngCommons.menuModeIsSlim && this.item.routerLink) {
31
- this.updateActiveStateFromRoute();
32
- }
33
- this.key = this.parentKey ? this.parentKey + '-' + this.index : String(this.index);
34
- if (this.item.routerLink) {
35
- if (typeof this.item.routerLink === 'string') {
36
- this.itemUrl = this.item.routerLink;
37
- }
38
- else {
39
- this.itemUrl = this.router.parseUrl(this.item.routerLink.join('/'));
40
- }
41
- }
42
- this.menuSourceSubscription = this.mngCommons.menuActiveKey$.subscribe(key => {
43
- // deactivate current active menu
44
- if (this.active && this.key !== key && key.indexOf(this.key) !== 0) {
45
- this.active = false;
46
- }
47
- });
48
- this.menuResetSubscription = this.mngCommons.menuReset$.subscribe(() => {
49
- this.active = false;
50
- });
51
- this.routerEventsSubscription = this.router.events.subscribe(next => {
52
- if (next instanceof GuardsCheckEnd && next.shouldActivate) {
53
- this.checkIfMenuItemIsAllowedFromGuard(next.state);
54
- }
55
- else if (next instanceof NavigationEnd) {
56
- if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
57
- this.active = false;
58
- }
59
- else {
60
- this.updateActiveStateFromRoute();
61
- }
62
- }
63
- });
64
- this.checkIfMenuItemIsAllowedFromGuard(this.router.routerState.snapshot);
65
- }
66
- updateActiveStateFromRoute() {
67
- if (this.itemUrl) {
68
- this.active = this.router.isActive(this.itemUrl, this.item.items ? false : true);
69
- }
70
- else {
71
- this.active = false;
72
- }
73
- }
74
- itemClick(event) {
75
- // avoid processing disabled items
76
- if (this.item.disabled) {
77
- event.preventDefault();
78
- return;
79
- }
80
- // navigate with hover in horizontal mode
81
- if (this.root) {
82
- this.mainLayoutService.menuHoverActive = !this.mainLayoutService.menuHoverActive;
83
- }
84
- // notify other items
85
- this.mngCommons.menuChangeActiveKey(this.key);
86
- // toggle active state
87
- if (this.item.items) {
88
- this.active = !this.active;
89
- }
90
- else {
91
- // activate item
92
- this.active = true;
93
- if (this.mainLayoutService.isMobile()) {
94
- this.mainLayoutService.staticMenuMobileActive = false;
95
- }
96
- if (this.mngCommons.menuModeIsOverlay) {
97
- this.mainLayoutService.overlayMenuActive = false;
98
- }
99
- // reset horizontal menu
100
- if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
101
- this.mngCommons.menuReset();
102
- this.mainLayoutService.menuHoverActive = false;
103
- }
104
- }
105
- }
106
- onMouseEnter() {
107
- // activate item on hover
108
- if (this.root && this.mainLayoutService.menuHoverActive && this.mngCommons.menuModeIsSlim && this.mainLayoutService.isDesktop()) {
109
- this.mngCommons.menuChangeActiveKey(this.key);
110
- this.active = true;
111
- }
112
- }
113
- ngOnDestroy() {
114
- this.menuSourceSubscription?.unsubscribe();
115
- this.menuResetSubscription?.unsubscribe();
116
- this.routerEventsSubscription?.unsubscribe();
117
- this.guardsSubscription?.unsubscribe();
118
- }
119
- checkIfMenuItemIsAllowedFromGuard(routerState) {
120
- this.guardsSubscription?.unsubscribe();
121
- if (this.item.guards?.length) {
122
- const obs = [];
123
- for (const guard of this.item.guards) {
124
- const tokenInjectedInstance = this.injector.get(guard);
125
- if (tokenInjectedInstance && 'canActivate' in tokenInjectedInstance) {
126
- const guardInstance = tokenInjectedInstance;
127
- const canActivateRes = guardInstance.canActivate(this.route.snapshot, routerState);
128
- let canActivateObs;
129
- if (canActivateRes instanceof Observable) {
130
- canActivateObs = canActivateRes;
131
- }
132
- else if (canActivateRes instanceof Promise) {
133
- canActivateObs = from(canActivateRes);
134
- }
135
- else {
136
- canActivateObs = of(canActivateRes);
137
- }
138
- obs.push(canActivateObs.pipe(first(), map(res => res === true) // if url tree is present, that means redirect and implies not allowed
139
- ));
140
- }
141
- }
142
- this.guardsSubscription = combineLatest(obs)
143
- .pipe(first())
144
- .subscribe(next => {
145
- const result = next.every(n => n === true);
146
- this.isAllowedSubject.next(result);
147
- });
148
- }
149
- else {
150
- this.isAllowedSubject.next(true);
151
- }
152
- }
153
- }
154
- MngMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngMenuItemComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.MngCommonsService }, { token: i3.MngMainLayoutComponentService }], target: i0.ɵɵFactoryTarget.Component });
155
- MngMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey" }, host: { properties: { "class.layout-root-menuitem": "root", "class.active-menuitem": "active" } }, ngImport: i0, template: "<ng-container>\n <div *ngIf=\"root && item.visible !== false && (isAllowed$ | async) === true\" class=\"layout-menuitem-root-text\">{{ item.label! | translate }}</div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible !== false && (isAllowed$ | async) === true\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible !== false && (isAllowed$ | async) === true\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{exact: true}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"((item.items && active) || (item.items && (mngCommons.menuModeIsStatic$ | async) && (root || active))) && item.visible !== false && (isAllowed$ | async) === true\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\"></li>\n </ng-template>\n </ul>\n</ng-container>\n", components: [{ type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "index", "root", "parentKey"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i5.Ripple, selector: "[pRipple]" }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe, "translate": i6.TranslatePipe }, animations: [
156
- trigger('children', [
157
- state('void', style({
158
- height: '0px'
159
- })),
160
- state('hiddenAnimated', style({
161
- height: '0px'
162
- })),
163
- state('visibleAnimated', style({
164
- height: '*'
165
- })),
166
- state('visible', style({
167
- height: '*',
168
- 'z-index': 100
169
- })),
170
- state('hidden', style({
171
- height: '0px',
172
- 'z-index': '*'
173
- })),
174
- transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
175
- transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
176
- transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
177
- ])
178
- ] });
179
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngMenuItemComponent, decorators: [{
180
- type: Component,
181
- args: [{ selector: '[mng-menuitem]', host: {
182
- '[class.layout-root-menuitem]': 'root',
183
- '[class.active-menuitem]': 'active'
184
- }, animations: [
185
- trigger('children', [
186
- state('void', style({
187
- height: '0px'
188
- })),
189
- state('hiddenAnimated', style({
190
- height: '0px'
191
- })),
192
- state('visibleAnimated', style({
193
- height: '*'
194
- })),
195
- state('visible', style({
196
- height: '*',
197
- 'z-index': 100
198
- })),
199
- state('hidden', style({
200
- height: '0px',
201
- 'z-index': '*'
202
- })),
203
- transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
204
- transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
205
- transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
206
- ])
207
- ], template: "<ng-container>\n <div *ngIf=\"root && item.visible !== false && (isAllowed$ | async) === true\" class=\"layout-menuitem-root-text\">{{ item.label! | translate }}</div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible !== false && (isAllowed$ | async) === true\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible !== false && (isAllowed$ | async) === true\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{exact: true}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"((item.items && active) || (item.items && (mngCommons.menuModeIsStatic$ | async) && (root || active))) && item.visible !== false && (isAllowed$ | async) === true\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\"></li>\n </ng-template>\n </ul>\n</ng-container>\n" }]
208
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.MngCommonsService }, { type: i3.MngMainLayoutComponentService }]; }, propDecorators: { item: [{
209
- type: Input
210
- }], index: [{
211
- type: Input
212
- }], root: [{
213
- type: Input
214
- }], parentKey: [{
215
- type: Input
216
- }] } });
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUFDLFNBQVMsRUFBWSxLQUFLLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBOEIsY0FBYyxFQUFFLGFBQWEsRUFBdUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVqSSxPQUFPLEVBQUMsZUFBZSxFQUFFLFVBQVUsRUFBZ0IsYUFBYSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUcsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7QUF3RDFDLE1BQU0sT0FBTyxvQkFBb0I7SUFtQjdCLFlBQ1ksUUFBa0IsRUFDbEIsTUFBYyxFQUNkLEtBQXFCLEVBQ3RCLFVBQTZCLEVBQzdCLGlCQUFnRDtRQUovQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBdEJsRCxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGNBQVMsR0FBa0IsSUFBSSxDQUFDO1FBRWxDLFFBQUcsR0FBRyxFQUFFLENB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QUs7NkJBQ2hCLENBQUMsQ0FDTDs0QkFDRCxLQUFLLENBQ0QsaUJBQWlCLEVBQ2pCLEtBQUssQ0FBQztnQ0FDRixNQUFNLEVBQUUsR0FBRzs2QkFDZCxDQUFDLENBQ0w7NEJBQ0QsS0FBSyxDQUNELFNBQVMsRUFDVCxLQUFLLENBQUM7Z0NBQ0YsTUFBTSxFQUFFLEdBQUc7Z0NBQ1gsU0FBUyxFQUFFLEdBQUc7NkJBQ2pCLENBQUMsQ0FDTDs0QkFDRCxLQUFLLENBQ0QsUUFBUSxFQUNSLEtBQUssQ0FBQztnQ0FDRixNQUFNLEVBQUUsS0FBSztnQ0FDYixTQUFTLEVBQUUsR0FBRzs2QkFDakIsQ0FBQyxDQUNMOzRCQUNELFVBQVUsQ0FBQyxtQ0FBbUMsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQzs0QkFDaEcsVUFBVSxDQUFDLG1DQUFtQyxFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDOzRCQUNoRyxVQUFVLENBQUMsa0RBQWtELEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7eUJBQ2xILENBQUM7cUJBQ0w7Nk5BSVEsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7Q29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIENhbkFjdGl2YXRlLCBHdWFyZHNDaGVja0VuZCwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZnJvbSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TW5nTWVudUl0ZW19IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0NvbW1vbnNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge01uZ01haW5MYXlvdXRDb21wb25lbnRTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1ttbmctbWVudWl0ZW1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MubGF5b3V0LXJvb3QtbWVudWl0ZW1dJzogJ3Jvb3QnLFxuICAgICAgICAnW2NsYXNzLmFjdGl2ZS1tZW51aXRlbV0nOiAnYWN0aXZlJ1xuICAgIH0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdjaGlsZHJlbicsIFtcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICd2b2lkJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzBweCdcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdoaWRkZW5BbmltYXRlZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwcHgnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndmlzaWJsZUFuaW1hdGVkJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJyonXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcqJyxcbiAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAxMDBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAnKidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGVBbmltYXRlZCA9PiBoaWRkZW5BbmltYXRlZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbkFuaW1hdGVkID0+IHZpc2libGVBbmltYXRlZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gdmlzaWJsZUFuaW1hdGVkLCB2aXNpYmxlQW5pbWF0ZWQgPT4gdm9pZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKVxuICAgICAgICBdKVxuICAgIF1cbiAgICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBpdGVtITogTW5nTWVudUl0ZW07XG4gICAgQElucHV0KCkgaW5kZXggPSAwO1xuICAgIEBJbnB1dCgpIHJvb3QgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwYXJlbnRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGtleSA9ICcnO1xuICAgIHB1YmxpYyBhY3RpdmUgPSBmYWxzZTtcbiAgICBwdWJsaWMgaG92ZXIgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgaXNBbGxvd2VkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgcHVibGljIGlzQWxsb3dlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcml2YXRlIGl0ZW1Vcmw/OiBzdHJpbmcgfCBVcmxUcmVlO1xuICAgIHByaXZhdGUgbWVudVNvdXJjZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG1lbnVSZXNldFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGd1YXJkc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHB1YmxpYyBtbmdDb21tb25zOiBNbmdDb21tb25zU2VydmljZSxcbiAgICAgICAgcHVibGljIG1haW5MYXlvdXRTZXJ2aWNlOiBNbmdNYWluTGF5b3V0Q29tcG9uZW50U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmlzQWxsb3dlZCQgPSB0aGlzLmlzQWxsb3dlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1uZ0NvbW1vbnMubWVudU1vZGVJc1NsaW0gJiYgdGhpcy5pdGVtLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlU3RhdGVGcm9tUm91dGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMua2V5ID0gdGhpcy5wYXJlbnRLZXkgPyB0aGlzLnBhcmVudEtleSArICctJyArIHRoaXMuaW5kZXggOiBTdHJpbmcodGhpcy5pbmRleCk7XG4gICAgICAgIGlmICh0aGlzLml0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLml0ZW0ucm91dGVyTGluayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1VcmwgPSB0aGlzLml0ZW0ucm91dGVyTGluaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtVXJsID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5pdGVtLnJvdXRlckxpbmsuam9pbignLycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVudVNvdXJjZVN1YnNjcmlwdGlvbiA9IHRoaXMubW5nQ29tbW9ucy5tZW51QWN0aXZlS2V5JC5zdWJzY3JpYmUoa2V5ID0+IHtcbiAgICAgICAgICAgIC8vIGRlYWN0aXZhdGUgY3VycmVudCBhY3RpdmUgbWVudVxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlICYmIHRoaXMua2V5ICE9PSBrZXkgJiYga2V5LmluZGV4T2YodGhpcy5rZXkpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tZW51UmVzZXRTdWJzY3JpcHRpb24gPSB0aGlzLm1uZ0NvbW1vbnMubWVudVJlc2V0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZXJFdmVudHNTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBHdWFyZHNDaGVja0VuZCAmJiBuZXh0LnNob3VsZEFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQobmV4dC5zdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSAmJiAhdGhpcy5tYWluTGF5b3V0U2VydmljZS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGF0ZUZyb21Sb3V0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0YXRlRnJvbVJvdXRlKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtVXJsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMucm91dGVyLmlzQWN0aXZlKHRoaXMuaXRlbVVybCwgdGhpcy5pdGVtLml0ZW1zID8gZmFsc2UgOiB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpdGVtQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIC8vIGF2b2lkIHByb2Nlc3NpbmcgZGlzYWJsZWQgaXRlbXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5hdmlnYXRlIHdpdGggaG92ZXIgaW4gaG9yaXpvbnRhbCBtb2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMubWFpbkxheW91dFNlcnZpY2UubWVudUhvdmVyQWN0aXZlID0gIXRoaXMubWFpbkxheW91dFNlcnZpY2UubWVudUhvdmVyQWN0aXZlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm90aWZ5IG90aGVyIGl0ZW1zXG4gICAgICAgIHRoaXMubW5nQ29tbW9ucy5tZW51Q2hhbmdlQWN0aXZlS2V5KHRoaXMua2V5KTtcblxuICAgICAgICAvLyB0b2dnbGUgYWN0aXZlIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLml0ZW0uaXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWN0aXZhdGUgaXRlbVxuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tYWluTGF5b3V0U2VydmljZS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluTGF5b3V0U2VydmljZS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1uZ0NvbW1vbnMubWVudU1vZGVJc092ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLm92ZXJsYXlNZW51QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlc2V0IGhvcml6b250YWwgbWVudVxuICAgICAgICAgICAgaWYgKHRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSAmJiAhdGhpcy5tYWluTGF5b3V0U2VydmljZS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tbmdDb21tb25zLm1lbnVSZXNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbkxheW91dFNlcnZpY2UubWVudUhvdmVyQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1vdXNlRW50ZXIoKSB7XG4gICAgICAgIC8vIGFjdGl2YXRlIGl0ZW0gb24gaG92ZXJcbiAgICAgICAgaWYgKHRoaXMucm9vdCAmJiB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLm1lbnVIb3ZlckFjdGl2ZSAmJiB0aGlzLm1uZ0NvbW1vbnMubWVudU1vZGVJc1NsaW0gJiYgdGhpcy5tYWluTGF5b3V0U2VydmljZS5pc0Rlc2t0b3AoKSkge1xuICAgICAgICAgICAgdGhpcy5tbmdDb21tb25zLm1lbnVDaGFuZ2VBY3RpdmVLZXkodGhpcy5rZXkpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMubWVudVNvdXJjZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5tZW51UmVzZXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmd1YXJkc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrSWZNZW51SXRlbUlzQWxsb3dlZEZyb21HdWFyZChyb3V0ZXJTdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkge1xuICAgICAgICB0aGlzLmd1YXJkc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5ndWFyZHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgb2JzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuaXRlbS5ndWFyZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbkluamVjdGVkSW5zdGFuY2UgPSB0aGlzLmluamVjdG9yLmdldChndWFyZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuSW5qZWN0ZWRJbnN0YW5jZSAmJiAnY2FuQWN0aXZhdGUnIGluIHRva2VuSW5qZWN0ZWRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBndWFyZEluc3RhbmNlID0gdG9rZW5JbmplY3RlZEluc3RhbmNlIGFzIENhbkFjdGl2YXRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5BY3RpdmF0ZVJlcyA9IGd1YXJkSW5zdGFuY2UuY2FuQWN0aXZhdGUodGhpcy5yb3V0ZS5zbmFwc2hvdCwgcm91dGVyU3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYW5BY3RpdmF0ZU9iczogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5BY3RpdmF0ZVJlcyBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlT2JzID0gY2FuQWN0aXZhdGVSZXM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuQWN0aXZhdGVSZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icyA9IGZyb20oY2FuQWN0aXZhdGVSZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBvZihjYW5BY3RpdmF0ZVJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb2JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHJlcyA9PiByZXMgPT09IHRydWUpIC8vIGlmIHVybCB0cmVlIGlzIHByZXNlbnQsIHRoYXQgbWVhbnMgcmVkaXJlY3QgYW5kIGltcGxpZXMgbm90IGFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmd1YXJkc1N1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3Qob2JzKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dC5ldmVyeShuID0+IG4gPT09IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWxsb3dlZFN1YmplY3QubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0FsbG93ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyPlxuICAgIDxkaXYgKm5nSWY9XCJyb290ICYmIGl0ZW0udmlzaWJsZSAhPT0gZmFsc2UgJiYgKGlzQWxsb3dlZCQgfCBhc3luYykgPT09IHRydWVcIiBjbGFzcz1cImxheW91dC1tZW51aXRlbS1yb290LXRleHRcIj57eyBpdGVtLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgIDxhXG4gICAgICAgICpuZ0lmPVwiKCFpdGVtLnJvdXRlckxpbmsgfHwgaXRlbS5pdGVtcykgJiYgaXRlbS52aXNpYmxlICE9PSBmYWxzZSAmJiAoaXNBbGxvd2VkJCB8IGFzeW5jKSA9PT0gdHJ1ZVwiXG4gICAgICAgIFthdHRyLmhyZWZdPVwiaXRlbS5ocmVmXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLnRhcmdldFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxuICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNsYXNzTmFtZSA/PyAnJ1wiXG4gICAgICAgIHBSaXBwbGU+XG4gICAgICAgIDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvbiA/PyAnJ1wiIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLWljb25cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLXRleHRcIj57eyBpdGVtLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1mdyBwaS1hbmdsZS1kb3duIGxheW91dC1zdWJtZW51LXRvZ2dsZXJcIiAqbmdJZj1cIml0ZW0uaXRlbXNcIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWVudWl0ZW0tYmFkZ2VcIiAqbmdJZj1cIml0ZW0uYmFkZ2VcIj57eyBpdGVtLmJhZGdlIH19PC9zcGFuPlxuICAgIDwvYT5cbiAgICA8YVxuICAgICAgICAqbmdJZj1cIml0ZW0ucm91dGVyTGluayAmJiAhaXRlbS5pdGVtcyAmJiBpdGVtLnZpc2libGUgIT09IGZhbHNlICYmIChpc0FsbG93ZWQkIHwgYXN5bmMpID09PSB0cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXIgPSB0cnVlXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXIgPSBmYWxzZVwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmUtbWVudWl0ZW0tcm91dGVybGlua1wiXG4gICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7ZXhhY3Q6IHRydWV9XCJcbiAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0udGFyZ2V0XCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiMFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NOYW1lID8/ICcnXCJcbiAgICAgICAgcFJpcHBsZT5cbiAgICAgICAgPGkgW25nQ2xhc3NdPVwiaXRlbS5pY29uID8/ICcnXCIgY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0taWNvblwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0tdGV4dFwiPnt7IGl0ZW0ubGFiZWwhIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWZ3IHBpLWFuZ2xlLWRvd24gbGF5b3V0LXN1Ym1lbnUtdG9nZ2xlclwiICpuZ0lmPVwiaXRlbS5pdGVtc1wiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51aXRlbS1iYWRnZVwiICpuZ0lmPVwiaXRlbS5iYWRnZVwiPnt7IGl0ZW0uYmFkZ2UgfX08L3NwYW4+XG4gICAgPC9hPlxuICAgIDx1bFxuICAgICAgICAqbmdJZj1cIigoaXRlbS5pdGVtcyAmJiBhY3RpdmUpIHx8IChpdGVtLml0ZW1zICYmIChtbmdDb21tb25zLm1lbnVNb2RlSXNTdGF0aWMkIHwgYXN5bmMpICYmIChyb290IHx8IGFjdGl2ZSkpKSAmJiBpdGVtLnZpc2libGUgIT09IGZhbHNlICYmIChpc0FsbG93ZWQkIHwgYXN5bmMpID09PSB0cnVlXCJcbiAgICAgICAgW0BjaGlsZHJlbl09XCJcbiAgICAgICAgICAgIChtbmdDb21tb25zLm1lbnVNb2RlSXNTbGltJCB8IGFzeW5jKSAmJiAobWFpbkxheW91dFNlcnZpY2UuaXNNb2JpbGUkIHwgYXN5bmMpID09PSBmYWxzZSAmJiByb290XG4gICAgICAgICAgICAgICAgPyBhY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgPyAndmlzaWJsZSdcbiAgICAgICAgICAgICAgICAgICAgOiAnaGlkZGVuJ1xuICAgICAgICAgICAgICAgIDogKG1uZ0NvbW1vbnMubWVudU1vZGVJc1N0YXRpYyQgfCBhc3luYykgJiYgcm9vdCAmJiAobWFpbkxheW91dFNlcnZpY2UuaXNNb2JpbGUkIHwgYXN5bmMpID09PSBmYWxzZVxuICAgICAgICAgICAgICAgID8gJ3Zpc2libGUnXG4gICAgICAgICAgICAgICAgOiBhY3RpdmVcbiAgICAgICAgICAgICAgICA/ICd2aXNpYmxlQW5pbWF0ZWQnXG4gICAgICAgICAgICAgICAgOiAnaGlkZGVuQW5pbWF0ZWQnXG4gICAgICAgIFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNoaWxkIGxldC1pPVwiaW5kZXhcIiBbbmdGb3JPZl09XCJpdGVtLml0ZW1zXCI+XG4gICAgICAgICAgICA8bGkgbW5nLW1lbnVpdGVtIFtpdGVtXT1cImNoaWxkXCIgW2luZGV4XT1cImlcIiBbcGFyZW50S2V5XT1cImtleVwiIFtjbGFzc109XCJjaGlsZC5iYWRnZUNsYXNzTmFtZVwiPjwvbGk+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC91bD5cbjwvbmctY29udGFpbmVyPlxuIl19
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { Component, HostBinding, Input } from '@angular/core';
3
+ import { GuardsCheckEnd, NavigationEnd } from '@angular/router';
4
+ import { BehaviorSubject, Observable, combineLatest, distinctUntilChanged, from, of } from 'rxjs';
5
+ import { first, map } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/router";
8
+ import * as i2 from "../../security";
9
+ import * as i3 from "../../services";
10
+ import * as i4 from "./services";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "primeng/ripple";
13
+ import * as i7 from "@ngx-translate/core";
14
+ export class MngMenuItemComponent {
15
+ constructor(injector, router, route, authorization, mngCommons, mainLayoutService) {
16
+ this.injector = injector;
17
+ this.router = router;
18
+ this.route = route;
19
+ this.authorization = authorization;
20
+ this.mngCommons = mngCommons;
21
+ this.mainLayoutService = mainLayoutService;
22
+ this.index = 0;
23
+ this.root = false;
24
+ this.parentKey = null;
25
+ this.hostClassNoPadding = false;
26
+ this.key = '';
27
+ this.active = false;
28
+ this.hover = false;
29
+ this.guardsIsAllowedSubject = new BehaviorSubject(true);
30
+ this.isPermittedSubject = new BehaviorSubject(true);
31
+ this.guardsIsAllowed$ = this.guardsIsAllowedSubject.asObservable().pipe(distinctUntilChanged());
32
+ this.isPermitted$ = this.isPermittedSubject.asObservable().pipe(distinctUntilChanged());
33
+ }
34
+ ngOnInit() {
35
+ if (!this.mngCommons.menuModeIsSlim && this.item.routerLink) {
36
+ this.updateActiveStateFromRoute();
37
+ }
38
+ this.key = this.parentKey ? this.parentKey + '-' + this.index : String(this.index);
39
+ if (this.item.routerLink) {
40
+ if (typeof this.item.routerLink === 'string') {
41
+ this.itemUrl = this.item.routerLink;
42
+ }
43
+ else {
44
+ this.itemUrl = this.router.parseUrl(this.item.routerLink.join('/'));
45
+ }
46
+ }
47
+ this.menuSourceSubscription = this.mngCommons.menuActiveKey$.subscribe(key => {
48
+ // deactivate current active menu
49
+ if (this.active && this.key !== key && key.indexOf(this.key) !== 0) {
50
+ this.active = false;
51
+ }
52
+ });
53
+ this.menuResetSubscription = this.mngCommons.menuReset$.subscribe(() => {
54
+ this.active = false;
55
+ });
56
+ this.routerEventsSubscription = this.router.events.subscribe(next => {
57
+ if (next instanceof GuardsCheckEnd && next.shouldActivate) {
58
+ this.checkIfMenuItemIsAllowedFromGuard(next.state);
59
+ }
60
+ else if (next instanceof NavigationEnd) {
61
+ if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
62
+ this.active = false;
63
+ }
64
+ else {
65
+ this.updateActiveStateFromRoute();
66
+ }
67
+ }
68
+ });
69
+ if (this.item.permissions) {
70
+ this.isPermittedSubscription = this.authorization.isPermitted(this.item.permissions).subscribe({
71
+ next: isPermitted => {
72
+ this.isPermittedSubject.next(isPermitted);
73
+ }
74
+ });
75
+ }
76
+ this.checkIfMenuItemIsAllowedFromGuard(this.router.routerState.snapshot);
77
+ this.isVisibleCombinedSubscription = combineLatest([this.isPermitted$, this.guardsIsAllowed$]).subscribe({
78
+ next: res => {
79
+ this.hostClassNoPadding = res.some(r => r === false);
80
+ }
81
+ });
82
+ }
83
+ updateActiveStateFromRoute() {
84
+ if (this.itemUrl) {
85
+ this.active = this.router.isActive(this.itemUrl, this.item.items ? false : true);
86
+ }
87
+ else {
88
+ this.active = false;
89
+ }
90
+ }
91
+ itemClick(event) {
92
+ // avoid processing disabled items
93
+ if (this.item.disabled) {
94
+ event.preventDefault();
95
+ return;
96
+ }
97
+ // navigate with hover in horizontal mode
98
+ if (this.root) {
99
+ this.mainLayoutService.menuHoverActive = !this.mainLayoutService.menuHoverActive;
100
+ }
101
+ // notify other items
102
+ this.mngCommons.menuChangeActiveKey(this.key);
103
+ // toggle active state
104
+ if (this.item.items) {
105
+ this.active = !this.active;
106
+ }
107
+ else {
108
+ // activate item
109
+ this.active = true;
110
+ if (this.mainLayoutService.isMobile()) {
111
+ this.mainLayoutService.staticMenuMobileActive = false;
112
+ }
113
+ if (this.mngCommons.menuModeIsOverlay) {
114
+ this.mainLayoutService.overlayMenuActive = false;
115
+ }
116
+ // reset horizontal menu
117
+ if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
118
+ this.mngCommons.menuReset();
119
+ this.mainLayoutService.menuHoverActive = false;
120
+ }
121
+ }
122
+ }
123
+ onMouseEnter() {
124
+ // activate item on hover
125
+ if (this.root && this.mainLayoutService.menuHoverActive && this.mngCommons.menuModeIsSlim && this.mainLayoutService.isDesktop()) {
126
+ this.mngCommons.menuChangeActiveKey(this.key);
127
+ this.active = true;
128
+ }
129
+ }
130
+ ngOnDestroy() {
131
+ this.menuSourceSubscription?.unsubscribe();
132
+ this.menuResetSubscription?.unsubscribe();
133
+ this.routerEventsSubscription?.unsubscribe();
134
+ this.guardsIsAllowedSubscription?.unsubscribe();
135
+ this.isPermittedSubscription?.unsubscribe();
136
+ this.isVisibleCombinedSubscription?.unsubscribe();
137
+ }
138
+ checkIfMenuItemIsAllowedFromGuard(routerState) {
139
+ this.guardsIsAllowedSubscription?.unsubscribe();
140
+ if (this.item.guards?.length) {
141
+ const obs = [];
142
+ for (const guard of this.item.guards) {
143
+ const tokenInjectedInstance = this.injector.get(guard);
144
+ if (tokenInjectedInstance && 'canActivate' in tokenInjectedInstance) {
145
+ const guardInstance = tokenInjectedInstance;
146
+ const canActivateRes = guardInstance.canActivate(this.route.snapshot, routerState);
147
+ let canActivateObs;
148
+ if (canActivateRes instanceof Observable) {
149
+ canActivateObs = canActivateRes;
150
+ }
151
+ else if (canActivateRes instanceof Promise) {
152
+ canActivateObs = from(canActivateRes);
153
+ }
154
+ else {
155
+ canActivateObs = of(canActivateRes);
156
+ }
157
+ obs.push(canActivateObs.pipe(first(), map(res => res === true) // if url tree is present, that means redirect and implies not allowed
158
+ ));
159
+ }
160
+ }
161
+ this.guardsIsAllowedSubscription = combineLatest(obs)
162
+ .pipe(first())
163
+ .subscribe(next => {
164
+ const result = next.every(n => n === true);
165
+ this.guardsIsAllowedSubject.next(result);
166
+ });
167
+ }
168
+ else {
169
+ this.guardsIsAllowedSubject.next(true);
170
+ }
171
+ }
172
+ }
173
+ MngMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngMenuItemComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.MngAuthorizationService }, { token: i3.MngCommonsService }, { token: i4.MngMainLayoutComponentService }], target: i0.ɵɵFactoryTarget.Component });
174
+ MngMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey" }, host: { properties: { "class.layout-root-menuitem": "root", "class.active-menuitem": "active", "class.py-0": "this.hostClassNoPadding" } }, ngImport: i0, template: "<ng-container>\n <div *ngIf=\"root && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{exact: true}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"\n ((item.items && active) || (item.items && (mngCommons.menuModeIsStatic$ | async) && (root || active))) &&\n item.visible !== false &&\n (guardsIsAllowed$ | async) === true &&\n (isPermitted$ | async) === true\n \"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\"></li>\n </ng-template>\n </ul>\n</ng-container>\n", components: [{ type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "index", "root", "parentKey"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i6.Ripple, selector: "[pRipple]" }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i5.AsyncPipe, "translate": i7.TranslatePipe }, animations: [
175
+ trigger('children', [
176
+ state('void', style({
177
+ height: '0px'
178
+ })),
179
+ state('hiddenAnimated', style({
180
+ height: '0px'
181
+ })),
182
+ state('visibleAnimated', style({
183
+ height: '*'
184
+ })),
185
+ state('visible', style({
186
+ height: '*',
187
+ 'z-index': 100
188
+ })),
189
+ state('hidden', style({
190
+ height: '0px',
191
+ 'z-index': '*'
192
+ })),
193
+ transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
194
+ transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
195
+ transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
196
+ ])
197
+ ] });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: MngMenuItemComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ selector: '[mng-menuitem]', host: {
201
+ '[class.layout-root-menuitem]': 'root',
202
+ '[class.active-menuitem]': 'active'
203
+ }, animations: [
204
+ trigger('children', [
205
+ state('void', style({
206
+ height: '0px'
207
+ })),
208
+ state('hiddenAnimated', style({
209
+ height: '0px'
210
+ })),
211
+ state('visibleAnimated', style({
212
+ height: '*'
213
+ })),
214
+ state('visible', style({
215
+ height: '*',
216
+ 'z-index': 100
217
+ })),
218
+ state('hidden', style({
219
+ height: '0px',
220
+ 'z-index': '*'
221
+ })),
222
+ transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
223
+ transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
224
+ transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
225
+ ])
226
+ ], template: "<ng-container>\n <div *ngIf=\"root && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"(!item.routerLink || item.items) && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items && item.visible !== false && (guardsIsAllowed$ | async) === true && (isPermitted$ | async) === true\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{exact: true}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"\n ((item.items && active) || (item.items && (mngCommons.menuModeIsStatic$ | async) && (root || active))) &&\n item.visible !== false &&\n (guardsIsAllowed$ | async) === true &&\n (isPermitted$ | async) === true\n \"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\"></li>\n </ng-template>\n </ul>\n</ng-container>\n" }]
227
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.MngAuthorizationService }, { type: i3.MngCommonsService }, { type: i4.MngMainLayoutComponentService }]; }, propDecorators: { item: [{
228
+ type: Input
229
+ }], index: [{
230
+ type: Input
231
+ }], root: [{
232
+ type: Input
233
+ }], parentKey: [{
234
+ type: Input
235
+ }], hostClassNoPadding: [{
236
+ type: HostBinding,
237
+ args: ['class.py-0']
238
+ }] } });
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQVksS0FBSyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQThCLGNBQWMsRUFBRSxhQUFhLEVBQXVDLE1BQU0saUJBQWlCLENBQUM7QUFFakksT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQWdCLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQXlEMUMsTUFBTSxPQUFPLG9CQUFvQjtJQXlCN0IsWUFDWSxRQUFrQixFQUNsQixNQUFjLEVBQ2QsS0FBcUIsRUFDckIsYUFBc0MsRUFDdkMsVUFBNkIsRUFDN0IsaUJBQWdEO1FBTC9DLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBN0JsRCxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsU0FBSSxHQUFHLEtBQUssQ0FB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QUFHOzZCQUNkLENBQUMsQ0FDTDs0QkFDRCxLQUFLLENBQ0QsU0FBUyxFQUNULEtBQUssQ0FBQztnQ0FDRixNQUFNLEVBQUUsR0FBRztnQ0FDWCxTQUFTLEVBQUUsR0FBRzs2QkFDakIsQ0FBQyxDQUNMOzRCQUNELEtBQUssQ0FDRCxRQUFRLEVBQ1IsS0FBSyxDQUFDO2dDQUNGLE1BQU0sRUFBRSxLQUFLO2dDQUNiLFNBQVMsRUFBRSxHQUFHOzZCQUNqQixDQUFDLENBQ0w7NEJBQ0QsVUFBVSxDQUFDLG1DQUFtQyxFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDOzRCQUNoRyxVQUFVLENBQUMsbUNBQW1DLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7NEJBQ2hHLFVBQVUsQ0FBQyxrREFBa0QsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQzt5QkFDbEgsQ0FBQztxQkFDTDttUUFJUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUU2QixrQkFBa0I7c0JBQXBELFdBQVc7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7Q29tcG9uZW50LCBIb3N0QmluZGluZywgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBDYW5BY3RpdmF0ZSwgR3VhcmRzQ2hlY2tFbmQsIE5hdmlnYXRpb25FbmQsIFJvdXRlciwgUm91dGVyU3RhdGVTbmFwc2hvdCwgVXJsVHJlZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb20sIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Zmlyc3QsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge01uZ01lbnVJdGVtfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtNbmdBdXRob3JpemF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vc2VjdXJpdHknO1xuaW1wb3J0IHtNbmdDb21tb25zU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtNbmdNYWluTGF5b3V0Q29tcG9uZW50U2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbbW5nLW1lbnVpdGVtXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1ob3N0LW1ldGFkYXRhLXByb3BlcnR5XG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmxheW91dC1yb290LW1lbnVpdGVtXSc6ICdyb290JyxcbiAgICAgICAgJ1tjbGFzcy5hY3RpdmUtbWVudWl0ZW1dJzogJ2FjdGl2ZSdcbiAgICB9LFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignY2hpbGRyZW4nLCBbXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndm9pZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwcHgnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAnaGlkZGVuQW5pbWF0ZWQnLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMHB4J1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ3Zpc2libGVBbmltYXRlZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcqJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ3Zpc2libGUnLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnKicsXG4gICAgICAgICAgICAgICAgICAgICd6LWluZGV4JzogMTAwXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzBweCcsXG4gICAgICAgICAgICAgICAgICAgICd6LWluZGV4JzogJyonXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlQW5pbWF0ZWQgPT4gaGlkZGVuQW5pbWF0ZWQnLCBhbmltYXRlKCc0MDBtcyBjdWJpYy1iZXppZXIoMC44NiwgMCwgMC4wNywgMSknKSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCdoaWRkZW5BbmltYXRlZCA9PiB2aXNpYmxlQW5pbWF0ZWQnLCBhbmltYXRlKCc0MDBtcyBjdWJpYy1iZXppZXIoMC44NiwgMCwgMC4wNywgMSknKSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHZpc2libGVBbmltYXRlZCwgdmlzaWJsZUFuaW1hdGVkID0+IHZvaWQnLCBhbmltYXRlKCc0MDBtcyBjdWJpYy1iZXppZXIoMC44NiwgMCwgMC4wNywgMSknKSlcbiAgICAgICAgXSlcbiAgICBdXG4gICAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nTWVudUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgaXRlbSE6IE1uZ01lbnVJdGVtO1xuICAgIEBJbnB1dCgpIGluZGV4ID0gMDtcbiAgICBASW5wdXQoKSByb290ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcGFyZW50S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MucHktMCcpIHByaXZhdGUgaG9zdENsYXNzTm9QYWRkaW5nID0gZmFsc2U7XG5cbiAgICBwdWJsaWMga2V5ID0gJyc7XG4gICAgcHVibGljIGFjdGl2ZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBob3ZlciA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBndWFyZHNJc0FsbG93ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgICBwdWJsaWMgZ3VhcmRzSXNBbGxvd2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcml2YXRlIGlzUGVybWl0dGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgcHVibGljIGlzUGVybWl0dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByaXZhdGUgaXRlbVVybD86IHN0cmluZyB8IFVybFRyZWU7XG4gICAgcHJpdmF0ZSBtZW51U291cmNlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgbWVudVJlc2V0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgcm91dGVyRXZlbnRzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBpc1Zpc2libGVDb21iaW5lZFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgYXV0aG9yaXphdGlvbjogTW5nQXV0aG9yaXphdGlvblNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBtbmdDb21tb25zOiBNbmdDb21tb25zU2VydmljZSxcbiAgICAgICAgcHVibGljIG1haW5MYXlvdXRTZXJ2aWNlOiBNbmdNYWluTGF5b3V0Q29tcG9uZW50U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZCQgPSB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5pc1Blcm1pdHRlZCQgPSB0aGlzLmlzUGVybWl0dGVkU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSAmJiB0aGlzLml0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGF0ZUZyb21Sb3V0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5rZXkgPSB0aGlzLnBhcmVudEtleSA/IHRoaXMucGFyZW50S2V5ICsgJy0nICsgdGhpcy5pbmRleCA6IFN0cmluZyh0aGlzLmluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbS5yb3V0ZXJMaW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbVVybCA9IHRoaXMuaXRlbS5yb3V0ZXJMaW5rO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1VcmwgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLml0ZW0ucm91dGVyTGluay5qb2luKCcvJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW51U291cmNlU3Vic2NyaXB0aW9uID0gdGhpcy5tbmdDb21tb25zLm1lbnVBY3RpdmVLZXkkLnN1YnNjcmliZShrZXkgPT4ge1xuICAgICAgICAgICAgLy8gZGVhY3RpdmF0ZSBjdXJyZW50IGFjdGl2ZSBtZW51XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUgJiYgdGhpcy5rZXkgIT09IGtleSAmJiBrZXkuaW5kZXhPZih0aGlzLmtleSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1lbnVSZXNldFN1YnNjcmlwdGlvbiA9IHRoaXMubW5nQ29tbW9ucy5tZW51UmVzZXQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUobmV4dCA9PiB7XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEd1YXJkc0NoZWNrRW5kICYmIG5leHQuc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZNZW51SXRlbUlzQWxsb3dlZEZyb21HdWFyZChuZXh0LnN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tbmdDb21tb25zLm1lbnVNb2RlSXNTbGltICYmICF0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlRnJvbVJvdXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGVybWl0dGVkU3Vic2NyaXB0aW9uID0gdGhpcy5hdXRob3JpemF0aW9uLmlzUGVybWl0dGVkKHRoaXMuaXRlbS5wZXJtaXNzaW9ucykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBpc1Blcm1pdHRlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNQZXJtaXR0ZWRTdWJqZWN0Lm5leHQoaXNQZXJtaXR0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xuXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tYmluZWRTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzUGVybWl0dGVkJCwgdGhpcy5ndWFyZHNJc0FsbG93ZWQkXSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0Q2xhc3NOb1BhZGRpbmcgPSByZXMuc29tZShyID0+IHIgPT09IGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQWN0aXZlU3RhdGVGcm9tUm91dGUoKSB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1VcmwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdGhpcy5yb3V0ZXIuaXNBY3RpdmUodGhpcy5pdGVtVXJsLCB0aGlzLml0ZW0uaXRlbXMgPyBmYWxzZSA6IHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGl0ZW1DbGljayhldmVudDogRXZlbnQpIHtcbiAgICAgICAgLy8gYXZvaWQgcHJvY2Vzc2luZyBkaXNhYmxlZCBpdGVtc1xuICAgICAgICBpZiAodGhpcy5pdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbmF2aWdhdGUgd2l0aCBob3ZlciBpbiBob3Jpem9udGFsIG1vZGVcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgdGhpcy5tYWluTGF5b3V0U2VydmljZS5tZW51SG92ZXJBY3RpdmUgPSAhdGhpcy5tYWluTGF5b3V0U2VydmljZS5tZW51SG92ZXJBY3RpdmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub3RpZnkgb3RoZXIgaXRlbXNcbiAgICAgICAgdGhpcy5tbmdDb21tb25zLm1lbnVDaGFuZ2VBY3RpdmVLZXkodGhpcy5rZXkpO1xuXG4gICAgICAgIC8vIHRvZ2dsZSBhY3RpdmUgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhY3RpdmF0ZSBpdGVtXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzT3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbkxheW91dFNlcnZpY2Uub3ZlcmxheU1lbnVBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVzZXQgaG9yaXpvbnRhbCBtZW51XG4gICAgICAgICAgICBpZiAodGhpcy5tbmdDb21tb25zLm1lbnVNb2RlSXNTbGltICYmICF0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1uZ0NvbW1vbnMubWVudVJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluTGF5b3V0U2VydmljZS5tZW51SG92ZXJBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW91c2VFbnRlcigpIHtcbiAgICAgICAgLy8gYWN0aXZhdGUgaXRlbSBvbiBob3ZlclxuICAgICAgICBpZiAodGhpcy5yb290ICYmIHRoaXMubWFpbkxheW91dFNlcnZpY2UubWVudUhvdmVyQWN0aXZlICYmIHRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSAmJiB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLmlzRGVza3RvcCgpKSB7XG4gICAgICAgICAgICB0aGlzLm1uZ0NvbW1vbnMubWVudUNoYW5nZUFjdGl2ZUtleSh0aGlzLmtleSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5tZW51U291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLm1lbnVSZXNldFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXJFdmVudHNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmlzUGVybWl0dGVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbWJpbmVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tJZk1lbnVJdGVtSXNBbGxvd2VkRnJvbUd1YXJkKHJvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSB7XG4gICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5pdGVtLmd1YXJkcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBvYnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZ3VhcmQgb2YgdGhpcy5pdGVtLmd1YXJkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuSW5qZWN0ZWRJbnN0YW5jZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KGd1YXJkKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5JbmplY3RlZEluc3RhbmNlICYmICdjYW5BY3RpdmF0ZScgaW4gdG9rZW5JbmplY3RlZEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1YXJkSW5zdGFuY2UgPSB0b2tlbkluamVjdGVkSW5zdGFuY2UgYXMgQ2FuQWN0aXZhdGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbkFjdGl2YXRlUmVzID0gZ3VhcmRJbnN0YW5jZS5jYW5BY3RpdmF0ZSh0aGlzLnJvdXRlLnNuYXBzaG90LCByb3V0ZXJTdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbkFjdGl2YXRlT2JzOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkFjdGl2YXRlUmVzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBjYW5BY3RpdmF0ZVJlcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5BY3RpdmF0ZVJlcyBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlT2JzID0gZnJvbShjYW5BY3RpdmF0ZVJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icyA9IG9mKGNhbkFjdGl2YXRlUmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvYnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlT2JzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAocmVzID0+IHJlcyA9PT0gdHJ1ZSkgLy8gaWYgdXJsIHRyZWUgaXMgcHJlc2VudCwgdGhhdCBtZWFucyByZWRpcmVjdCBhbmQgaW1wbGllcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3Vic2NyaXB0aW9uID0gY29tYmluZUxhdGVzdChvYnMpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKG5leHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LmV2ZXJ5KG4gPT4gbiA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3ViamVjdC5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cInJvb3QgJiYgaXRlbS52aXNpYmxlICE9PSBmYWxzZSAmJiAoZ3VhcmRzSXNBbGxvd2VkJCB8IGFzeW5jKSA9PT0gdHJ1ZSAmJiAoaXNQZXJtaXR0ZWQkIHwgYXN5bmMpID09PSB0cnVlXCIgY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0tcm9vdC10ZXh0XCI+XG4gICAgICAgIHt7IGl0ZW0ubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGFcbiAgICAgICAgKm5nSWY9XCIoIWl0ZW0ucm91dGVyTGluayB8fCBpdGVtLml0ZW1zKSAmJiBpdGVtLnZpc2libGUgIT09IGZhbHNlICYmIChndWFyZHNJc0FsbG93ZWQkIHwgYXN5bmMpID09PSB0cnVlICYmIChpc1Blcm1pdHRlZCQgfCBhc3luYykgPT09IHRydWVcIlxuICAgICAgICBbYXR0ci5ocmVmXT1cIml0ZW0uaHJlZlwiXG4gICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cIm9uTW91c2VFbnRlcigpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaXRlbUNsaWNrKCRldmVudClcIlxuICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlckxpbmtcIlxuICAgICAgICBbYXR0ci50YXJnZXRdPVwiaXRlbS50YXJnZXRcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCIwXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc05hbWUgPz8gJydcIlxuICAgICAgICBwUmlwcGxlPlxuICAgICAgICA8aSBbbmdDbGFzc109XCJpdGVtLmljb24gPz8gJydcIiBjbGFzcz1cImxheW91dC1tZW51aXRlbS1pY29uXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1tZW51aXRlbS10ZXh0XCI+e3sgaXRlbS5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxpIGNsYXNzPVwicGkgcGktZncgcGktYW5nbGUtZG93biBsYXlvdXQtc3VibWVudS10b2dnbGVyXCIgKm5nSWY9XCJpdGVtLml0ZW1zXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnVpdGVtLWJhZGdlXCIgKm5nSWY9XCJpdGVtLmJhZGdlXCI+e3sgaXRlbS5iYWRnZSB9fTwvc3Bhbj5cbiAgICA8L2E+XG4gICAgPGFcbiAgICAgICAgKm5nSWY9XCJpdGVtLnJvdXRlckxpbmsgJiYgIWl0ZW0uaXRlbXMgJiYgaXRlbS52aXNpYmxlICE9PSBmYWxzZSAmJiAoZ3VhcmRzSXNBbGxvd2VkJCB8IGFzeW5jKSA9PT0gdHJ1ZSAmJiAoaXNQZXJtaXR0ZWQkIHwgYXN5bmMpID09PSB0cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXIgPSB0cnVlXCJcbiAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXIgPSBmYWxzZVwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmUtbWVudWl0ZW0tcm91dGVybGlua1wiXG4gICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7ZXhhY3Q6IHRydWV9XCJcbiAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0udGFyZ2V0XCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiMFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3NOYW1lID8/ICcnXCJcbiAgICAgICAgcFJpcHBsZT5cbiAgICAgICAgPGkgW25nQ2xhc3NdPVwiaXRlbS5pY29uID8/ICcnXCIgY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0taWNvblwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXlvdXQtbWVudWl0ZW0tdGV4dFwiPnt7IGl0ZW0ubGFiZWwhIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWZ3IHBpLWFuZ2xlLWRvd24gbGF5b3V0LXN1Ym1lbnUtdG9nZ2xlclwiICpuZ0lmPVwiaXRlbS5pdGVtc1wiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51aXRlbS1iYWRnZVwiICpuZ0lmPVwiaXRlbS5iYWRnZVwiPnt7IGl0ZW0uYmFkZ2UgfX08L3NwYW4+XG4gICAgPC9hPlxuICAgIDx1bFxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKChpdGVtLml0ZW1zICYmIGFjdGl2ZSkgfHwgKGl0ZW0uaXRlbXMgJiYgKG1uZ0NvbW1vbnMubWVudU1vZGVJc1N0YXRpYyQgfCBhc3luYykgJiYgKHJvb3QgfHwgYWN0aXZlKSkpICYmXG4gICAgICAgICAgICBpdGVtLnZpc2libGUgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAoZ3VhcmRzSXNBbGxvd2VkJCB8IGFzeW5jKSA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgKGlzUGVybWl0dGVkJCB8IGFzeW5jKSA9PT0gdHJ1ZVxuICAgICAgICBcIlxuICAgICAgICBbQGNoaWxkcmVuXT1cIlxuICAgICAgICAgICAgKG1uZ0NvbW1vbnMubWVudU1vZGVJc1NsaW0kIHwgYXN5bmMpICYmIChtYWluTGF5b3V0U2VydmljZS5pc01vYmlsZSQgfCBhc3luYykgPT09IGZhbHNlICYmIHJvb3RcbiAgICAgICAgICAgICAgICA/IGFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICA/ICd2aXNpYmxlJ1xuICAgICAgICAgICAgICAgICAgICA6ICdoaWRkZW4nXG4gICAgICAgICAgICAgICAgOiAobW5nQ29tbW9ucy5tZW51TW9kZUlzU3RhdGljJCB8IGFzeW5jKSAmJiByb290ICYmIChtYWluTGF5b3V0U2VydmljZS5pc01vYmlsZSQgfCBhc3luYykgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgPyAndmlzaWJsZSdcbiAgICAgICAgICAgICAgICA6IGFjdGl2ZVxuICAgICAgICAgICAgICAgID8gJ3Zpc2libGVBbmltYXRlZCdcbiAgICAgICAgICAgICAgICA6ICdoaWRkZW5BbmltYXRlZCdcbiAgICAgICAgXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY2hpbGQgbGV0LWk9XCJpbmRleFwiIFtuZ0Zvck9mXT1cIml0ZW0uaXRlbXNcIj5cbiAgICAgICAgICAgIDxsaSBtbmctbWVudWl0ZW0gW2l0ZW1dPVwiY2hpbGRcIiBbaW5kZXhdPVwiaVwiIFtwYXJlbnRLZXldPVwia2V5XCIgW2NsYXNzXT1cImNoaWxkLmJhZGdlQ2xhc3NOYW1lXCI+PC9saT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3VsPlxuPC9uZy1jb250YWluZXI+XG4iXX0=