@veloceapps/sdk 12.0.0-13 → 12.0.0-15

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 (348) hide show
  1. package/cms/index.d.ts +921 -15
  2. package/core/index.d.ts +525 -8
  3. package/fesm2022/veloceapps-sdk-cms.mjs +2617 -0
  4. package/fesm2022/veloceapps-sdk-cms.mjs.map +1 -0
  5. package/{fesm2020 → fesm2022}/veloceapps-sdk-core.mjs +117 -112
  6. package/fesm2022/veloceapps-sdk-core.mjs.map +1 -0
  7. package/{fesm2020 → fesm2022}/veloceapps-sdk.mjs +170 -170
  8. package/fesm2022/veloceapps-sdk.mjs.map +1 -0
  9. package/index.d.ts +330 -1
  10. package/package.json +17 -34
  11. package/cms/cms.actions.d.ts +0 -154
  12. package/cms/cms.default.d.ts +0 -5
  13. package/cms/cms.elements.d.ts +0 -4
  14. package/cms/cms.layouts.d.ts +0 -4
  15. package/cms/components/element-children/element-children.component.d.ts +0 -22
  16. package/cms/components/element-children/element-children.module.d.ts +0 -11
  17. package/cms/components/element-drop-handle/element-drop-handle.component.d.ts +0 -12
  18. package/cms/components/element-drop-handle/element-drop-handle.module.d.ts +0 -9
  19. package/cms/components/element-renderer/element-renderer.component.d.ts +0 -29
  20. package/cms/components/element-renderer/element-renderer.module.d.ts +0 -7
  21. package/cms/components/element-tools-panel/element-tools-panel.component.d.ts +0 -14
  22. package/cms/components/element.component.d.ts +0 -17
  23. package/cms/components/index.d.ts +0 -1
  24. package/cms/components/plugin.component.d.ts +0 -15
  25. package/cms/components/preview/index.d.ts +0 -3
  26. package/cms/components/preview/preview.component.d.ts +0 -32
  27. package/cms/components/preview/preview.module.d.ts +0 -13
  28. package/cms/components/preview/preview.types.d.ts +0 -20
  29. package/cms/decorators/element.decorator.d.ts +0 -2
  30. package/cms/decorators/index.d.ts +0 -1
  31. package/cms/definitions/index.d.ts +0 -1
  32. package/cms/definitions/ui-builder.definitions.d.ts +0 -6
  33. package/cms/directives/custom-template.directive.d.ts +0 -17
  34. package/cms/engine/models/entity.d.ts +0 -11
  35. package/cms/engine/models/plugin.d.ts +0 -5
  36. package/cms/injection-tokens.d.ts +0 -9
  37. package/cms/launcher.module.d.ts +0 -12
  38. package/cms/modules/federated/default-options.d.ts +0 -4
  39. package/cms/modules/federated/export.d.ts +0 -1
  40. package/cms/modules/federated/federated-host.directive.d.ts +0 -8
  41. package/cms/modules/federated/federated.component.d.ts +0 -25
  42. package/cms/modules/federated/federated.module.d.ts +0 -10
  43. package/cms/modules/federated/federated.types.d.ts +0 -26
  44. package/cms/modules/migrations/index.d.ts +0 -2
  45. package/cms/modules/migrations/migrations.d.ts +0 -2
  46. package/cms/modules/migrations/migrations.module.d.ts +0 -6
  47. package/cms/modules/migrations/services/migrations.service.d.ts +0 -10
  48. package/cms/modules/migrations/types/migrations.types.d.ts +0 -2
  49. package/cms/modules/runtime/index.d.ts +0 -3
  50. package/cms/modules/runtime/runtime.module.d.ts +0 -8
  51. package/cms/modules/runtime/services/compilation.service.d.ts +0 -19
  52. package/cms/modules/runtime/services/runtime-editor.service.d.ts +0 -20
  53. package/cms/modules/runtime/services/runtime.service.d.ts +0 -33
  54. package/cms/modules/runtime/tokens.d.ts +0 -3
  55. package/cms/modules/runtime/types/compilation.types.d.ts +0 -8
  56. package/cms/modules/runtime/types/runtime.actions.d.ts +0 -12
  57. package/cms/plugins/element-hover.plugin.d.ts +0 -33
  58. package/cms/plugins/io.plugin.d.ts +0 -9
  59. package/cms/plugins/page.plugin.d.ts +0 -15
  60. package/cms/plugins/region.plugin.d.ts +0 -17
  61. package/cms/plugins/script.plugin.d.ts +0 -10
  62. package/cms/services/element-context.service.d.ts +0 -7
  63. package/cms/services/index.d.ts +0 -2
  64. package/cms/services/io-provider.service.d.ts +0 -15
  65. package/cms/services/resources.service.d.ts +0 -21
  66. package/cms/services/templates.service.d.ts +0 -14
  67. package/cms/types/common.types.d.ts +0 -130
  68. package/cms/types/elements.types.d.ts +0 -2
  69. package/cms/types/index.d.ts +0 -6
  70. package/cms/types/layouts.types.d.ts +0 -102
  71. package/cms/types/pages.types.d.ts +0 -1
  72. package/cms/types/path.types.d.ts +0 -11
  73. package/cms/utils/element-metadata-worker.d.ts +0 -11
  74. package/cms/utils/element.utils.d.ts +0 -20
  75. package/cms/utils/elements-resolver.d.ts +0 -28
  76. package/cms/utils/encoding.utils.d.ts +0 -2
  77. package/cms/utils/index.d.ts +0 -9
  78. package/cms/utils/inject.d.ts +0 -1
  79. package/cms/utils/path.utils.d.ts +0 -3
  80. package/cms/utils/script.utils.d.ts +0 -2
  81. package/cms/utils/transpilation-worker.d.ts +0 -13
  82. package/cms/utils/ui-builder-layout.utils.d.ts +0 -4
  83. package/cms/utils/ui-definition.utils.d.ts +0 -6
  84. package/cms/vendor-map.d.ts +0 -86
  85. package/core/core.module.d.ts +0 -10
  86. package/core/directives/directives.module.d.ts +0 -7
  87. package/core/directives/index.d.ts +0 -2
  88. package/core/directives/primeng-calendar.directive.d.ts +0 -14
  89. package/core/modules/configuration/configuration.module.d.ts +0 -8
  90. package/core/modules/configuration/index.d.ts +0 -6
  91. package/core/modules/configuration/services/configuration-runtime.service.d.ts +0 -19
  92. package/core/modules/configuration/services/configuration-state.service.d.ts +0 -60
  93. package/core/modules/configuration/services/configuration.service.d.ts +0 -38
  94. package/core/modules/configuration/services/guided-selling.service.d.ts +0 -15
  95. package/core/modules/configuration/services/test-mode-configuration.service.d.ts +0 -26
  96. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -3
  97. package/core/modules/configuration/types/configuration.types.d.ts +0 -20
  98. package/core/modules/configuration/types/index.d.ts +0 -2
  99. package/core/modules/flow-configuration/flow-configuration.module.d.ts +0 -7
  100. package/core/modules/flow-configuration/index.d.ts +0 -1
  101. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +0 -23
  102. package/core/modules/index.d.ts +0 -2
  103. package/core/operators/filter-successful-execute.operator.d.ts +0 -3
  104. package/core/operators/index.d.ts +0 -1
  105. package/core/pipes/action-code.pipe.d.ts +0 -8
  106. package/core/pipes/date.pipe.d.ts +0 -13
  107. package/core/pipes/index.d.ts +0 -5
  108. package/core/pipes/number.pipe.d.ts +0 -10
  109. package/core/pipes/pipes.module.d.ts +0 -10
  110. package/core/pipes/price.pipe.d.ts +0 -10
  111. package/core/services/catalog-products.service.d.ts +0 -11
  112. package/core/services/flow-info.service.d.ts +0 -44
  113. package/core/services/flow-state-configuration.service.d.ts +0 -25
  114. package/core/services/flow-state.service.d.ts +0 -70
  115. package/core/services/index.d.ts +0 -8
  116. package/core/services/integration.state.d.ts +0 -16
  117. package/core/services/product-images.service.d.ts +0 -12
  118. package/core/services/runtime-settings.service.d.ts +0 -24
  119. package/core/services/sales-transaction.service.d.ts +0 -27
  120. package/core/types/flow-customization.types.d.ts +0 -10
  121. package/core/types/flow-state.types.d.ts +0 -12
  122. package/core/types/formatting-settings.types.d.ts +0 -13
  123. package/core/types/index.d.ts +0 -5
  124. package/core/types/integration.types.d.ts +0 -10
  125. package/core/types/pipe.types.d.ts +0 -1
  126. package/core/types/ui-definition.types.d.ts +0 -1
  127. package/core/utils/index.d.ts +0 -4
  128. package/core/utils/pcm.utils.d.ts +0 -5
  129. package/core/utils/transaction-item.utils.d.ts +0 -10
  130. package/core/utils/transaction-item.worker.d.ts +0 -8
  131. package/core/utils/ui-definition.utils.d.ts +0 -2
  132. package/esm2020/cms/cms.actions.mjs +0 -151
  133. package/esm2020/cms/cms.default.mjs +0 -5
  134. package/esm2020/cms/cms.elements.mjs +0 -52
  135. package/esm2020/cms/cms.layouts.mjs +0 -239
  136. package/esm2020/cms/components/element-children/element-children.component.mjs +0 -41
  137. package/esm2020/cms/components/element-children/element-children.module.mjs +0 -21
  138. package/esm2020/cms/components/element-drop-handle/element-drop-handle.component.mjs +0 -28
  139. package/esm2020/cms/components/element-drop-handle/element-drop-handle.module.mjs +0 -19
  140. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +0 -117
  141. package/esm2020/cms/components/element-renderer/element-renderer.module.mjs +0 -16
  142. package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +0 -35
  143. package/esm2020/cms/components/element.component.mjs +0 -45
  144. package/esm2020/cms/components/index.mjs +0 -2
  145. package/esm2020/cms/components/plugin.component.mjs +0 -17
  146. package/esm2020/cms/components/preview/index.mjs +0 -4
  147. package/esm2020/cms/components/preview/preview.component.mjs +0 -75
  148. package/esm2020/cms/components/preview/preview.module.mjs +0 -42
  149. package/esm2020/cms/components/preview/preview.types.mjs +0 -2
  150. package/esm2020/cms/decorators/element.decorator.mjs +0 -6
  151. package/esm2020/cms/decorators/index.mjs +0 -2
  152. package/esm2020/cms/definitions/index.mjs +0 -2
  153. package/esm2020/cms/definitions/ui-builder.definitions.mjs +0 -18
  154. package/esm2020/cms/directives/custom-template.directive.mjs +0 -38
  155. package/esm2020/cms/engine/models/entity.mjs +0 -17
  156. package/esm2020/cms/engine/models/plugin.mjs +0 -6
  157. package/esm2020/cms/index.mjs +0 -16
  158. package/esm2020/cms/injection-tokens.mjs +0 -7
  159. package/esm2020/cms/launcher.module.mjs +0 -24
  160. package/esm2020/cms/modules/federated/default-options.mjs +0 -5
  161. package/esm2020/cms/modules/federated/export.mjs +0 -2
  162. package/esm2020/cms/modules/federated/federated-host.directive.mjs +0 -16
  163. package/esm2020/cms/modules/federated/federated.component.mjs +0 -74
  164. package/esm2020/cms/modules/federated/federated.module.mjs +0 -20
  165. package/esm2020/cms/modules/federated/federated.types.mjs +0 -2
  166. package/esm2020/cms/modules/migrations/index.mjs +0 -3
  167. package/esm2020/cms/modules/migrations/migrations.mjs +0 -22
  168. package/esm2020/cms/modules/migrations/migrations.module.mjs +0 -15
  169. package/esm2020/cms/modules/migrations/services/migrations.service.mjs +0 -47
  170. package/esm2020/cms/modules/migrations/types/migrations.types.mjs +0 -2
  171. package/esm2020/cms/modules/runtime/index.mjs +0 -4
  172. package/esm2020/cms/modules/runtime/runtime.module.mjs +0 -32
  173. package/esm2020/cms/modules/runtime/services/compilation.service.mjs +0 -93
  174. package/esm2020/cms/modules/runtime/services/runtime-editor.service.mjs +0 -30
  175. package/esm2020/cms/modules/runtime/services/runtime.service.mjs +0 -117
  176. package/esm2020/cms/modules/runtime/tokens.mjs +0 -3
  177. package/esm2020/cms/modules/runtime/types/compilation.types.mjs +0 -2
  178. package/esm2020/cms/modules/runtime/types/runtime.actions.mjs +0 -2
  179. package/esm2020/cms/plugins/element-hover.plugin.mjs +0 -121
  180. package/esm2020/cms/plugins/io.plugin.mjs +0 -45
  181. package/esm2020/cms/plugins/page.plugin.mjs +0 -37
  182. package/esm2020/cms/plugins/region.plugin.mjs +0 -59
  183. package/esm2020/cms/plugins/script.plugin.mjs +0 -31
  184. package/esm2020/cms/services/element-context.service.mjs +0 -10
  185. package/esm2020/cms/services/index.mjs +0 -3
  186. package/esm2020/cms/services/io-provider.service.mjs +0 -53
  187. package/esm2020/cms/services/resources.service.mjs +0 -71
  188. package/esm2020/cms/services/templates.service.mjs +0 -32
  189. package/esm2020/cms/types/common.types.mjs +0 -2
  190. package/esm2020/cms/types/elements.types.mjs +0 -2
  191. package/esm2020/cms/types/index.mjs +0 -7
  192. package/esm2020/cms/types/layouts.types.mjs +0 -71
  193. package/esm2020/cms/types/pages.types.mjs +0 -2
  194. package/esm2020/cms/types/path.types.mjs +0 -2
  195. package/esm2020/cms/utils/element-metadata-worker.mjs +0 -31
  196. package/esm2020/cms/utils/element.utils.mjs +0 -182
  197. package/esm2020/cms/utils/elements-resolver.mjs +0 -206
  198. package/esm2020/cms/utils/encoding.utils.mjs +0 -29
  199. package/esm2020/cms/utils/index.mjs +0 -10
  200. package/esm2020/cms/utils/inject.mjs +0 -27
  201. package/esm2020/cms/utils/path.utils.mjs +0 -44
  202. package/esm2020/cms/utils/script.utils.mjs +0 -46
  203. package/esm2020/cms/utils/transpilation-worker.mjs +0 -52
  204. package/esm2020/cms/utils/ui-builder-layout.utils.mjs +0 -46
  205. package/esm2020/cms/utils/ui-definition.utils.mjs +0 -85
  206. package/esm2020/cms/veloceapps-sdk-cms.mjs +0 -5
  207. package/esm2020/cms/vendor-map.mjs +0 -83
  208. package/esm2020/core/core.module.mjs +0 -54
  209. package/esm2020/core/directives/directives.module.mjs +0 -16
  210. package/esm2020/core/directives/index.mjs +0 -3
  211. package/esm2020/core/directives/primeng-calendar.directive.mjs +0 -41
  212. package/esm2020/core/index.mjs +0 -9
  213. package/esm2020/core/modules/configuration/configuration.module.mjs +0 -34
  214. package/esm2020/core/modules/configuration/index.mjs +0 -7
  215. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +0 -38
  216. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +0 -381
  217. package/esm2020/core/modules/configuration/services/configuration.service.mjs +0 -172
  218. package/esm2020/core/modules/configuration/services/guided-selling.service.mjs +0 -62
  219. package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +0 -97
  220. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +0 -2
  221. package/esm2020/core/modules/configuration/types/configuration.types.mjs +0 -2
  222. package/esm2020/core/modules/configuration/types/index.mjs +0 -3
  223. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +0 -17
  224. package/esm2020/core/modules/flow-configuration/index.mjs +0 -2
  225. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +0 -80
  226. package/esm2020/core/modules/index.mjs +0 -3
  227. package/esm2020/core/operators/filter-successful-execute.operator.mjs +0 -5
  228. package/esm2020/core/operators/index.mjs +0 -2
  229. package/esm2020/core/pipes/action-code.pipe.mjs +0 -20
  230. package/esm2020/core/pipes/date.pipe.mjs +0 -44
  231. package/esm2020/core/pipes/index.mjs +0 -6
  232. package/esm2020/core/pipes/number.pipe.mjs +0 -27
  233. package/esm2020/core/pipes/pipes.module.mjs +0 -19
  234. package/esm2020/core/pipes/price.pipe.mjs +0 -30
  235. package/esm2020/core/services/catalog-products.service.mjs +0 -25
  236. package/esm2020/core/services/flow-info.service.mjs +0 -146
  237. package/esm2020/core/services/flow-state-configuration.service.mjs +0 -120
  238. package/esm2020/core/services/flow-state.service.mjs +0 -417
  239. package/esm2020/core/services/index.mjs +0 -9
  240. package/esm2020/core/services/integration.state.mjs +0 -36
  241. package/esm2020/core/services/product-images.service.mjs +0 -30
  242. package/esm2020/core/services/runtime-settings.service.mjs +0 -112
  243. package/esm2020/core/services/sales-transaction.service.mjs +0 -67
  244. package/esm2020/core/types/flow-customization.types.mjs +0 -3
  245. package/esm2020/core/types/flow-state.types.mjs +0 -2
  246. package/esm2020/core/types/formatting-settings.types.mjs +0 -3
  247. package/esm2020/core/types/index.mjs +0 -6
  248. package/esm2020/core/types/integration.types.mjs +0 -2
  249. package/esm2020/core/types/pipe.types.mjs +0 -2
  250. package/esm2020/core/types/ui-definition.types.mjs +0 -2
  251. package/esm2020/core/utils/index.mjs +0 -5
  252. package/esm2020/core/utils/pcm.utils.mjs +0 -15
  253. package/esm2020/core/utils/transaction-item.utils.mjs +0 -144
  254. package/esm2020/core/utils/transaction-item.worker.mjs +0 -16
  255. package/esm2020/core/utils/ui-definition.utils.mjs +0 -9
  256. package/esm2020/core/veloceapps-sdk-core.mjs +0 -5
  257. package/esm2020/index.mjs +0 -2
  258. package/esm2020/src/components/dialog/dialog.component.mjs +0 -36
  259. package/esm2020/src/components/dialog/dialog.module.mjs +0 -19
  260. package/esm2020/src/components/dialog/dialog.types.mjs +0 -2
  261. package/esm2020/src/components/flow-header/flow-header.component.mjs +0 -107
  262. package/esm2020/src/components/flow-header/flow-header.module.mjs +0 -19
  263. package/esm2020/src/components/flow-header/index.mjs +0 -2
  264. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +0 -107
  265. package/esm2020/src/components/guided-selling/guided-selling.module.mjs +0 -19
  266. package/esm2020/src/configure-primeng.mjs +0 -33
  267. package/esm2020/src/constants.mjs +0 -2
  268. package/esm2020/src/flow-routing.module.mjs +0 -97
  269. package/esm2020/src/flow.component.mjs +0 -39
  270. package/esm2020/src/flow.module.mjs +0 -60
  271. package/esm2020/src/guards/flow.guard.mjs +0 -35
  272. package/esm2020/src/guards/product-unload.guard.mjs +0 -49
  273. package/esm2020/src/guards/root.guard.mjs +0 -46
  274. package/esm2020/src/index.mjs +0 -5
  275. package/esm2020/src/pages/assets/assets.component.mjs +0 -106
  276. package/esm2020/src/pages/assets/assets.module.mjs +0 -20
  277. package/esm2020/src/pages/catalog/catalog.component.mjs +0 -106
  278. package/esm2020/src/pages/catalog/catalog.module.mjs +0 -20
  279. package/esm2020/src/pages/debug/debug.component.mjs +0 -49
  280. package/esm2020/src/pages/debug/debug.module.mjs +0 -46
  281. package/esm2020/src/pages/product/product.component.mjs +0 -55
  282. package/esm2020/src/pages/product/product.module.mjs +0 -20
  283. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +0 -27
  284. package/esm2020/src/pages/record-not-found/record-not-found.module.mjs +0 -20
  285. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +0 -106
  286. package/esm2020/src/pages/shopping-cart/shopping-cart.module.mjs +0 -20
  287. package/esm2020/src/resolvers/flow.resolver.mjs +0 -50
  288. package/esm2020/src/resolvers/pcm-model.resolver.mjs +0 -12
  289. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +0 -64
  290. package/esm2020/src/resolvers/ui-definition.resolver.mjs +0 -44
  291. package/esm2020/src/services/flow-dialog.service.mjs +0 -91
  292. package/esm2020/src/services/flow-router.service.mjs +0 -173
  293. package/esm2020/src/services/flow.service.mjs +0 -102
  294. package/esm2020/src/services/guided-selling.service.mjs +0 -34
  295. package/esm2020/src/services/index.mjs +0 -4
  296. package/esm2020/src/types/index.mjs +0 -2
  297. package/esm2020/src/types/route.types.mjs +0 -2
  298. package/esm2020/veloceapps-sdk.mjs +0 -5
  299. package/fesm2015/veloceapps-sdk-cms.mjs +0 -2514
  300. package/fesm2015/veloceapps-sdk-cms.mjs.map +0 -1
  301. package/fesm2015/veloceapps-sdk-core.mjs +0 -2104
  302. package/fesm2015/veloceapps-sdk-core.mjs.map +0 -1
  303. package/fesm2015/veloceapps-sdk.mjs +0 -1598
  304. package/fesm2015/veloceapps-sdk.mjs.map +0 -1
  305. package/fesm2020/veloceapps-sdk-cms.mjs +0 -2613
  306. package/fesm2020/veloceapps-sdk-cms.mjs.map +0 -1
  307. package/fesm2020/veloceapps-sdk-core.mjs.map +0 -1
  308. package/fesm2020/veloceapps-sdk.mjs.map +0 -1
  309. package/src/components/dialog/dialog.component.d.ts +0 -13
  310. package/src/components/dialog/dialog.module.d.ts +0 -9
  311. package/src/components/dialog/dialog.types.d.ts +0 -7
  312. package/src/components/flow-header/flow-header.component.d.ts +0 -25
  313. package/src/components/flow-header/flow-header.module.d.ts +0 -9
  314. package/src/components/flow-header/index.d.ts +0 -1
  315. package/src/components/guided-selling/guided-selling.component.d.ts +0 -25
  316. package/src/components/guided-selling/guided-selling.module.d.ts +0 -9
  317. package/src/configure-primeng.d.ts +0 -1
  318. package/src/constants.d.ts +0 -1
  319. package/src/flow-routing.module.d.ts +0 -11
  320. package/src/flow.component.d.ts +0 -21
  321. package/src/flow.module.d.ts +0 -16
  322. package/src/guards/flow.guard.d.ts +0 -2
  323. package/src/guards/product-unload.guard.d.ts +0 -16
  324. package/src/guards/root.guard.d.ts +0 -14
  325. package/src/index.d.ts +0 -4
  326. package/src/pages/assets/assets.component.d.ts +0 -31
  327. package/src/pages/assets/assets.module.d.ts +0 -10
  328. package/src/pages/catalog/catalog.component.d.ts +0 -31
  329. package/src/pages/catalog/catalog.module.d.ts +0 -10
  330. package/src/pages/debug/debug.component.d.ts +0 -21
  331. package/src/pages/debug/debug.module.d.ts +0 -14
  332. package/src/pages/product/product.component.d.ts +0 -24
  333. package/src/pages/product/product.module.d.ts +0 -10
  334. package/src/pages/record-not-found/record-not-found.component.d.ts +0 -12
  335. package/src/pages/record-not-found/record-not-found.module.d.ts +0 -9
  336. package/src/pages/shopping-cart/shopping-cart.component.d.ts +0 -31
  337. package/src/pages/shopping-cart/shopping-cart.module.d.ts +0 -10
  338. package/src/resolvers/flow.resolver.d.ts +0 -14
  339. package/src/resolvers/pcm-model.resolver.d.ts +0 -3
  340. package/src/resolvers/sales-transaction.resolver.d.ts +0 -18
  341. package/src/resolvers/ui-definition.resolver.d.ts +0 -3
  342. package/src/services/flow-dialog.service.d.ts +0 -23
  343. package/src/services/flow-router.service.d.ts +0 -42
  344. package/src/services/flow.service.d.ts +0 -21
  345. package/src/services/guided-selling.service.d.ts +0 -13
  346. package/src/services/index.d.ts +0 -3
  347. package/src/types/index.d.ts +0 -1
  348. package/src/types/route.types.d.ts +0 -4
@@ -1,381 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { FlowStateApiService } from '@veloceapps/api';
3
- import { PCMApiService, SalesTransactionApiService, } from '@veloceapps/api/v2';
4
- import { ToastService, ToastType } from '@veloceapps/components';
5
- import { EntityUtil, isDefined, UUID, } from '@veloceapps/core';
6
- import { assign, cloneDeep } from 'lodash';
7
- import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, finalize, first, map, of, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, } from 'rxjs';
8
- import { FlowInfoService, FlowStateService, SalesTransactionService } from '../../../services';
9
- import { FlowConfigurationService } from '../../flow-configuration';
10
- import { ConfigurationRuntimeService } from './configuration-runtime.service';
11
- import { ConfigurationService } from './configuration.service';
12
- import { generateTransactionItem } from '../../../utils';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "./configuration-runtime.service";
15
- import * as i2 from "./configuration.service";
16
- import * as i3 from "../../../services";
17
- import * as i4 from "../../flow-configuration";
18
- import * as i5 from "@veloceapps/api";
19
- import * as i6 from "@veloceapps/api/v2";
20
- import * as i7 from "@veloceapps/components";
21
- export class ConfigurationStateService {
22
- constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService, pcmApiService) {
23
- this.configurationRuntimeService = configurationRuntimeService;
24
- this.configurationService = configurationService;
25
- this.flowStateService = flowStateService;
26
- this.flowInfoService = flowInfoService;
27
- this.flowConfigurationService = flowConfigurationService;
28
- this.flowStateApiService = flowStateApiService;
29
- this.salesTransactionService = salesTransactionService;
30
- this.salesTransactionApiService = salesTransactionApiService;
31
- this.toastService = toastService;
32
- this.pcmApiService = pcmApiService;
33
- this.isInitialized$ = new BehaviorSubject(false);
34
- this.canceledConfiguration$ = new Subject();
35
- this.NOT_INITIALIZED = Symbol();
36
- this.EXECUTION_BUFFER_TIME = 100;
37
- this.executedFunctions = {};
38
- this.stateId = null;
39
- this.ownerId = '';
40
- this.subscriptions = {};
41
- this.configurationStore = {};
42
- this.executionInProgress$ = new BehaviorSubject(false);
43
- this.statefulRequestStream$ = new Subject();
44
- this.statelessExecutionRequest$ = null;
45
- this.statefulExecutionRequest$ = this.initBufferedRequest$();
46
- }
47
- get isExecutionInProgress$() {
48
- return this.executionInProgress$.asObservable();
49
- }
50
- init$() {
51
- let request$;
52
- if (this.flowStateService.stateId && this.isStatefulConfiguration) {
53
- request$ = this.initStateful$();
54
- }
55
- else {
56
- request$ = this.configurationService.init$();
57
- }
58
- return request$.pipe(take(1), tap(() => {
59
- this.isInitialized$.next(true);
60
- this.canceledConfiguration$ = new Subject();
61
- }));
62
- }
63
- cleanup() {
64
- Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
65
- this.subscriptions = {};
66
- if (this.stateId) {
67
- this.cancelConfiguration();
68
- }
69
- this.configurationStore = {};
70
- this.executedFunctions = {};
71
- this.configurationService.reset();
72
- this.configurationRuntimeService.reset();
73
- }
74
- execute$(exec) {
75
- const request = this.execToRequest(exec);
76
- return this.executeRequest$(request).pipe(map(result => {
77
- // Keep only requested results
78
- const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
79
- if (exec.selectors?.[requestId]) {
80
- trunk[requestId] = result;
81
- }
82
- return trunk;
83
- }, {});
84
- return actualSelectors;
85
- }));
86
- }
87
- dispatch$(actionName, inputData = {}) {
88
- const exec = {
89
- actions: [{ name: actionName, inputData }],
90
- };
91
- const request = this.execToRequest(exec);
92
- const executionRequest$ = this.executeRequest$(request);
93
- if (this.isStatefulConfiguration) {
94
- return executionRequest$;
95
- }
96
- // prevent parallel configuration requests in stateless mode
97
- if (!this.statelessExecutionRequest$) {
98
- this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
99
- }
100
- return this.statelessExecutionRequest$;
101
- }
102
- select$(selectorName, inputData = {}) {
103
- const requestId = UUID.UUID();
104
- const request = this.execToRequest({
105
- selectors: {
106
- [requestId]: {
107
- name: selectorName,
108
- inputData,
109
- },
110
- },
111
- });
112
- return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
113
- }
114
- subscribe$(selectorName, inputData = {}, options) {
115
- const requestId = UUID.UUID();
116
- let subscription = this.subscriptions[requestId];
117
- if (!subscription) {
118
- const request = this.execToRequest({
119
- selectors: {
120
- [requestId]: {
121
- name: selectorName,
122
- inputData,
123
- },
124
- },
125
- });
126
- subscription = {
127
- request,
128
- data$: new BehaviorSubject(this.NOT_INITIALIZED),
129
- };
130
- this.subscriptions[requestId] = subscription;
131
- if (!options?.cold) {
132
- this.executeRequest$(request).subscribe();
133
- }
134
- }
135
- return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
136
- if (!this.subscriptions[requestId]?.data$.observed) {
137
- delete this.subscriptions[requestId];
138
- }
139
- }), takeUntil(this.canceledConfiguration$));
140
- }
141
- saveConfiguration() {
142
- if (this.isStatefulConfiguration) {
143
- return this.flowStateApiService.saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
144
- }
145
- const state = this.salesTransactionService.state;
146
- if (!state) {
147
- return of({ id: '' });
148
- }
149
- const { standalone } = this.flowInfoService.flow.properties;
150
- const transactionContext = this.salesTransactionService.state;
151
- const configurationRoot = this.configurationService.root;
152
- if (!transactionContext || !configurationRoot) {
153
- return of({ id: '' });
154
- }
155
- const stateItems = transactionContext.salesTransaction.salesTransactionItems;
156
- const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
157
- let salesTransactionItems;
158
- if (isNewTransactionItem) {
159
- salesTransactionItems = [...stateItems, configurationRoot];
160
- }
161
- else {
162
- salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
163
- }
164
- const newState = {
165
- ...transactionContext,
166
- salesTransaction: {
167
- ...transactionContext.salesTransaction,
168
- salesTransactionItems,
169
- },
170
- };
171
- if (standalone) {
172
- const request = {
173
- transactionContext: newState,
174
- flowId: this.flowInfoService.flow.id,
175
- };
176
- return this.salesTransactionApiService.save(request).pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(id => ({ id })));
177
- }
178
- return this.flowConfigurationService.calculate$(newState).pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(() => ({ id: '' })));
179
- }
180
- cancelConfiguration() {
181
- if (!this.isInitialized$.value) {
182
- return of(undefined);
183
- }
184
- this.canceledConfiguration$.next();
185
- this.canceledConfiguration$.complete();
186
- this.subscriptions = {};
187
- this.isInitialized$.next(false);
188
- if (!this.isInitialized$.value || !this.isStatefulConfiguration) {
189
- return of(undefined);
190
- }
191
- return this.flowStateApiService.cancelConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '');
192
- }
193
- get isStatefulConfiguration() {
194
- return this.flowInfoService.flow?.properties.stateful ?? false;
195
- }
196
- initStateful$() {
197
- this.ownerId = this.configurationRuntimeService.uiDefinitionContainer?.id ?? '';
198
- const { productId, transactionItemId } = this.flowInfoService.context;
199
- if (!productId || !this.flowStateService.stateId) {
200
- return of(undefined);
201
- }
202
- const container = this.configurationRuntimeService.uiDefinitionContainer;
203
- let request$;
204
- if (!transactionItemId) {
205
- request$ = this.pcmApiService.fetchPCMByProductId(productId).pipe(switchMap(pcm => {
206
- return this.flowStateApiService.newConfiguration(this.flowStateService.stateId || '', {
207
- transactionItem: generateTransactionItem(pcm, this.configurationService.state?.salesTransaction.id),
208
- actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
209
- selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
210
- });
211
- }));
212
- }
213
- else {
214
- request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
215
- transactionItemId,
216
- actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
217
- selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
218
- });
219
- }
220
- return request$.pipe(map(r => {
221
- this.stateId = r.stateId;
222
- return undefined;
223
- }));
224
- }
225
- execToRequest(exec) {
226
- return {
227
- actions: exec.actions?.map(action => ({
228
- apiName: action.name,
229
- ownerId: this.ownerId,
230
- inputData: action.inputData ?? {},
231
- })),
232
- selectors: exec.selectors &&
233
- Object.entries(exec.selectors).reduce((trunk, [key, selector]) => ({
234
- ...trunk,
235
- [key]: { apiName: selector.name, ownerId: this.ownerId, inputData: selector.inputData ?? {} },
236
- }), {}),
237
- };
238
- }
239
- handleSelectorsResponse(selectors) {
240
- Object.entries(selectors).forEach(([requestId, selectorResult]) => {
241
- if (!selectorResult.success) {
242
- this.toastService.add({ severity: ToastType.error, summary: selectorResult.errorMessage });
243
- }
244
- const subscription$ = this.subscriptions[requestId]?.data$;
245
- if (subscription$) {
246
- subscription$.next(selectorResult);
247
- }
248
- });
249
- }
250
- executeRequest$(req, forceSubscriptions) {
251
- const fullRequest = cloneDeep(req);
252
- if (fullRequest.actions?.length || forceSubscriptions) {
253
- for (const subscription of Object.values(this.subscriptions)) {
254
- fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
255
- }
256
- }
257
- let execution$;
258
- if (this.isStatefulConfiguration) {
259
- execution$ = this.executeStateful$(fullRequest);
260
- }
261
- else {
262
- execution$ = this.executeStateless$(fullRequest);
263
- }
264
- return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
265
- }
266
- executeStateless$(request) {
267
- this.executionInProgress$.next(true);
268
- return this.configurationService.state$.pipe(first(), switchMap(state => {
269
- // Apply actions and execute configuration/price call
270
- // No need to run configuration if no actions in the request
271
- if (!request.actions?.length) {
272
- return of(undefined);
273
- }
274
- request.actions.forEach(action => {
275
- state = this.executeActionScript(state, action) ?? state;
276
- });
277
- return this.configurationService.configure$(state);
278
- }), map(() => {
279
- // Run selectors and apply them to the state
280
- const configurationState = this.configurationService.state;
281
- if (!configurationState) {
282
- return { stateId: '', selectors: {} };
283
- }
284
- return this.runStatelessSelectors(request, configurationState);
285
- }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
286
- const configurationState = this.configurationService.previousState;
287
- if (configurationState) {
288
- const selectorsResult = this.runStatelessSelectors(request, configurationState);
289
- this.handleSelectorsResponse(selectorsResult.selectors);
290
- }
291
- this.executionInProgress$.next(false);
292
- if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
293
- this.toastService.add({ severity: ToastType.error, summary: String(error) });
294
- }
295
- return throwError(() => error);
296
- }));
297
- }
298
- initBufferedRequest$() {
299
- return this.statefulRequestStream$.pipe(buffer(this.statefulRequestStream$.pipe(debounceTime(this.EXECUTION_BUFFER_TIME))), switchMap(requests => {
300
- if (!this.flowStateService.stateId || !this.stateId) {
301
- throw 'Stateful session is not initialized';
302
- }
303
- // merge buffered requests
304
- const request = {
305
- actions: requests.flatMap(({ actions }) => actions).filter(isDefined),
306
- selectors: requests
307
- .map(({ selectors }) => selectors)
308
- .filter(isDefined)
309
- .reduce((acc, selectorsMap) => Object.assign(acc, selectorsMap), {}),
310
- };
311
- this.executionInProgress$.next(true);
312
- return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
313
- }), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
314
- this.executionInProgress$.next(false);
315
- return throwError(() => e);
316
- }));
317
- }
318
- executeStateful$(request) {
319
- return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
320
- // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
321
- combineLatest([
322
- this.statefulExecutionRequest$,
323
- of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
324
- ])), map(([response]) => response), take(1));
325
- }
326
- executeActionScript(request, processor) {
327
- const { actions } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
328
- const configurationProcessor = actions?.find(action => action.apiName === processor.apiName);
329
- if (!configurationProcessor?.script) {
330
- throw `ConfigurationProcessor ${processor.apiName} not found`;
331
- }
332
- return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
333
- }
334
- executeSelectorScript(request, processor) {
335
- const { selectors } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
336
- const configurationProcessor = selectors?.find(selector => selector.apiName === processor.apiName);
337
- if (!configurationProcessor?.script) {
338
- throw `ConfigurationProcessor ${processor.apiName} not found`;
339
- }
340
- return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
341
- }
342
- executeProcessorScript(request, configurationProcessor, inputData) {
343
- let functionToExecute = this.executedFunctions[configurationProcessor.apiName];
344
- if (!functionToExecute) {
345
- const script = `${configurationProcessor.script}\nreturn transform;`;
346
- const sourceMap = `\n//# sourceURL=${configurationProcessor.apiName}.js`;
347
- functionToExecute = new Function(script + sourceMap)();
348
- this.executedFunctions[configurationProcessor.apiName] = functionToExecute;
349
- }
350
- return functionToExecute({
351
- request,
352
- inputData,
353
- flowStore: this.flowStateService.getFlowStore(),
354
- configurationStore: this.configurationStore,
355
- });
356
- }
357
- runStatelessSelectors(request, configurationState) {
358
- return EntityUtil.entries(request.selectors ?? {}).reduce((result, [key, selector]) => {
359
- try {
360
- result.selectors[key] = {
361
- success: true,
362
- result: this.executeSelectorScript(configurationState, selector),
363
- };
364
- }
365
- catch (e) {
366
- console.error(e);
367
- result.selectors[key] = {
368
- success: false,
369
- errorMessage: String(e),
370
- };
371
- }
372
- return result;
373
- }, { stateId: '', selectors: {} });
374
- }
375
- }
376
- ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: i1.ConfigurationRuntimeService }, { token: i2.ConfigurationService }, { token: i3.FlowStateService }, { token: i3.FlowInfoService }, { token: i4.FlowConfigurationService }, { token: i5.FlowStateApiService }, { token: i3.SalesTransactionService }, { token: i6.SalesTransactionApiService }, { token: i7.ToastService }, { token: i6.PCMApiService }], target: i0.ɵɵFactoryTarget.Injectable });
377
- ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
379
- type: Injectable
380
- }], ctorParameters: function () { return [{ type: i1.ConfigurationRuntimeService }, { type: i2.ConfigurationService }, { type: i3.FlowStateService }, { type: i3.FlowInfoService }, { type: i4.FlowConfigurationService }, { type: i5.FlowStateApiService }, { type: i3.SalesTransactionService }, { type: i6.SalesTransactionApiService }, { type: i7.ToastService }, { type: i6.PCMApiService }]; } });
381
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9tb2R1bGVzL2NvbmZpZ3VyYXRpb24vc2VydmljZXMvY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYiwwQkFBMEIsR0FHM0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFHTCxVQUFVLEVBTVYsU0FBUyxFQUdULElBQUksR0FDTCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFjLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxHQUFHLEVBRUgsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUs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QUNULFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFO1lBQy9DLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQixDQUMzQixPQUFxQyxFQUNyQyxrQkFBc0M7UUFFdEMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLE1BQWdDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJO2dCQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUc7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJO29CQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO2lCQUNqRSxDQUFDO2FBQ0g7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHO29CQUN0QixPQUFPLEVBQUUsS0FBSztvQkFDZCxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDeEIsQ0FBQzthQUNIO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxFQUNELEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQy9CLENBQUM7SUFDSixDQUFDOztzSEFqZlUseUJBQXlCOzBIQUF6Qix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZsb3dTdGF0ZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9hcGknO1xuaW1wb3J0IHtcbiAgUENNQXBpU2VydmljZSxcbiAgU2FsZXNUcmFuc2FjdGlvbkFwaVNlcnZpY2UsXG4gIFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXF1ZXN0LFxuICBTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVzcG9uc2UsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaS92Mic7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuLFxuICBFbnRpdHlVdGlsLFxuICBGbG93U3RhdGVFeGVjdXRhYmxlRFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0LFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQsXG4gIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2UsXG4gIGlzRGVmaW5lZCxcbiAgU2FsZXNUcmFuc2FjdGlvbkl0ZW0sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVVVJRCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBhc3NpZ24sIGNsb25lRGVlcCwgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGJ1ZmZlcixcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGbG93SW5mb1NlcnZpY2UsIEZsb3dTdGF0ZVNlcnZpY2UsIFNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2Zsb3ctc3RhdGUudHlwZXMnO1xuaW1wb3J0IHsgRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZmxvdy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi1ydW50aW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRyYW5zYWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxudHlwZSBTdGF0ZVN1YnNjcmlwdGlvbiA9IHtcbiAgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTztcbiAgZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPjtcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGVTZXJ2aWNlIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGNhbmNlbGVkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgTk9UX0lOSVRJQUxJWkVEID0gU3ltYm9sKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhFQ1VUSU9OX0JVRkZFUl9USU1FID0gMTAwO1xuXG4gIHByaXZhdGUgZXhlY3V0ZWRGdW5jdGlvbnM6IERpY3Rpb25hcnk8Q29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuPiA9IHt9O1xuICBwcml2YXRlIHN0YXRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG93bmVySWQgPSAnJztcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGF0ZVN1YnNjcmlwdGlvbj4gPSB7fTtcbiAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgcHJpdmF0ZSBleGVjdXRpb25JblByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN0YXRlZnVsUmVxdWVzdFN0cmVhbSQgPSBuZXcgU3ViamVjdDxGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPPigpO1xuICBwcml2YXRlIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQ6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PjtcbiAgcHJpdmF0ZSBzdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JDogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2U6IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dTdGF0ZVNlcnZpY2U6IEZsb3dTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93SW5mb1NlcnZpY2U6IEZsb3dJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dDb25maWd1cmF0aW9uU2VydmljZTogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd1N0YXRlQXBpU2VydmljZTogRmxvd1N0YXRlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25BcGlTZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGNtQXBpU2VydmljZTogUENNQXBpU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkID0gdGhpcy5pbml0QnVmZmVyZWRSZXF1ZXN0JCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4ZWN1dGlvbkluUHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGxldCByZXF1ZXN0JDtcbiAgICBpZiAodGhpcy5mbG93U3RhdGVTZXJ2aWNlLnN0YXRlSWQgJiYgdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmVxdWVzdCQgPSB0aGlzLmluaXRTdGF0ZWZ1bCQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdCQgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkJC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5zdWJzY3JpcHRpb25zKS5mb3JFYWNoKCh7IGRhdGEkIH0pID0+IGRhdGEkLmNvbXBsZXRlKCkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuc3RhdGVJZCkge1xuICAgICAgdGhpcy5jYW5jZWxDb25maWd1cmF0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uU3RvcmUgPSB7fTtcbiAgICB0aGlzLmV4ZWN1dGVkRnVuY3Rpb25zID0ge307XG4gICAgdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSQoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0WydzZWxlY3RvcnMnXT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmV4ZWNUb1JlcXVlc3QoZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBLZWVwIG9ubHkgcmVxdWVzdGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0b3JzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZT4sIFtyZXF1ZXN0SWQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIGlmIChleGVjLnNlbGVjdG9ycz8uW3JlcXVlc3RJZF0pIHtcbiAgICAgICAgICAgICAgdHJ1bmtbcmVxdWVzdElkXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVuaztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxTZWxlY3RvcnM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoJChhY3Rpb25OYW1lOiBzdHJpbmcsIGlucHV0RGF0YTogdW5rbm93biA9IHt9KTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBleGVjOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYWN0aW9uczogW3sgbmFtZTogYWN0aW9uTmFtZSwgaW5wdXREYXRhIH1dLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChleGVjKTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlcXVlc3QkID0gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCk7XG5cbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGlvblJlcXVlc3QkO1xuICAgIH1cblxuICAgIC8vIHByZXZlbnQgcGFyYWxsZWwgY29uZmlndXJhdGlvbiByZXF1ZXN0cyBpbiBzdGF0ZWxlc3MgbW9kZVxuICAgIGlmICghdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCkge1xuICAgICAgdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCA9IGV4ZWN1dGlvblJlcXVlc3QkLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLnN0YXRlbGVzc0V4ZWN1dGlvblJlcXVlc3QkID0gbnVsbCkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVsZXNzRXhlY3V0aW9uUmVxdWVzdCQ7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0JDxSZXNwb25zZSA9IHVua25vd24+KFxuICAgIHNlbGVjdG9yTmFtZTogc3RyaW5nLFxuICAgIGlucHV0RGF0YTogdW5rbm93biA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gVVVJRC5VVUlEKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdCh7XG4gICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLnNlbGVjdG9yc1tyZXF1ZXN0SWRdIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN1YnNjcmliZSQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzZWxlY3Rvck5hbWU6IHN0cmluZyxcbiAgICBpbnB1dERhdGE6IHVua25vd24gPSB7fSxcbiAgICBvcHRpb25zPzogRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IFVVSUQuVVVJRCgpO1xuXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHtcbiAgICAgICAgc2VsZWN0b3JzOiB7XG4gICAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICAgIGlucHV0RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZGF0YSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj4odGhpcy5OT1RfSU5JVElBTElaRUQpLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdID0gc3Vic2NyaXB0aW9uO1xuXG4gICAgICBpZiAoIW9wdGlvbnM/LmNvbGQpIHtcbiAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5kYXRhJC5waXBlKFxuICAgICAgZmlsdGVyKGRhdGEgPT4gZGF0YSAhPSB0aGlzLk5PVF9JTklUSUFMSVpFRCksXG4gICAgICBtYXAoZGF0YSA9PiBkYXRhIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0/LmRhdGEkLm9ic2VydmVkKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUNvbmZpZ3VyYXRpb24oKTogT2JzZXJ2YWJsZTxTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVzcG9uc2U+IHtcbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCA/PyAnJywgdGhpcy5zdGF0ZUlkID8/ICcnKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAociA9PiB0aGlzLmZsb3dTdGF0ZVNlcnZpY2UuZXhlY3V0ZVJlcXVlc3QkKHt9LCB0cnVlKS5waXBlKG1hcCgoKSA9PiByKSkpLFxuICAgICAgICBtYXAociA9PiAoeyBpZDogci5xdW90ZUlkIH0pKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXRlO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybiBvZih7IGlkOiAnJyB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YW5kYWxvbmUgfSA9IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3cucHJvcGVydGllcztcbiAgICBjb25zdCB0cmFuc2FjdGlvbkNvbnRleHQgPSB0aGlzLnNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXRlO1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb290ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5yb290O1xuICAgIGlmICghdHJhbnNhY3Rpb25Db250ZXh0IHx8ICFjb25maWd1cmF0aW9uUm9vdCkge1xuICAgICAgcmV0dXJuIG9mKHsgaWQ6ICcnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlSXRlbXMgPSB0cmFuc2FjdGlvbkNvbnRleHQuc2FsZXNUcmFuc2FjdGlvbi5zYWxlc1RyYW5zYWN0aW9uSXRlbXM7XG4gICAgY29uc3QgaXNOZXdUcmFuc2FjdGlvbkl0ZW0gPSBzdGF0ZUl0ZW1zLmV2ZXJ5KHRpID0+IHRpLmlkICE9PSBjb25maWd1cmF0aW9uUm9vdC5pZCk7XG5cbiAgICBsZXQgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zOiBTYWxlc1RyYW5zYWN0aW9uSXRlbVtdO1xuICAgIGlmIChpc05ld1RyYW5zYWN0aW9uSXRlbSkge1xuICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zID0gWy4uLnN0YXRlSXRlbXMsIGNvbmZpZ3VyYXRpb25Sb290XTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zID0gc3RhdGVJdGVtcy5tYXAodGkgPT4gKHRpLmlkID09PSBjb25maWd1cmF0aW9uUm9vdC5pZCA/IGNvbmZpZ3VyYXRpb25Sb290IDogdGkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGF0ZTogVHJhbnNhY3Rpb25Db250ZXh0ID0ge1xuICAgICAgLi4udHJhbnNhY3Rpb25Db250ZXh0LFxuICAgICAgc2FsZXNUcmFuc2FjdGlvbjoge1xuICAgICAgICAuLi50cmFuc2FjdGlvbkNvbnRleHQuc2FsZXNUcmFuc2FjdGlvbixcbiAgICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICB0cmFuc2FjdGlvbkNvbnRleHQ6IG5ld1N0YXRlLFxuICAgICAgICBmbG93SWQ6IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3cuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZS5zYXZlKHJlcXVlc3QpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChyID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpLnBpcGUobWFwKCgpID0+IHIpKSksXG4gICAgICAgIG1hcChpZCA9PiAoeyBpZCB9KSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZsb3dDb25maWd1cmF0aW9uU2VydmljZS5jYWxjdWxhdGUkKG5ld1N0YXRlKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpKSxcbiAgICAgIG1hcCgoKSA9PiAoeyBpZDogJycgfSkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCQudmFsdWUpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG4gICAgdGhpcy5jYW5jZWxlZENvbmZpZ3VyYXRpb24kLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkJC52YWx1ZSB8fCAhdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2UuY2FuY2VsQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCA/PyAnJywgdGhpcy5zdGF0ZUlkID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzU3RhdGVmdWxDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZsb3dJbmZvU2VydmljZS5mbG93Py5wcm9wZXJ0aWVzLnN0YXRlZnVsID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhdGVmdWwkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHRoaXMub3duZXJJZCA9IHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvbkNvbnRhaW5lcj8uaWQgPz8gJyc7XG4gICAgY29uc3QgeyBwcm9kdWN0SWQsIHRyYW5zYWN0aW9uSXRlbUlkIH0gPSB0aGlzLmZsb3dJbmZvU2VydmljZS5jb250ZXh0O1xuICAgIGlmICghcHJvZHVjdElkIHx8ICF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCkge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyO1xuXG4gICAgbGV0IHJlcXVlc3QkOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD47XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uSXRlbUlkKSB7XG4gICAgICByZXF1ZXN0JCA9IHRoaXMucGNtQXBpU2VydmljZS5mZXRjaFBDTUJ5UHJvZHVjdElkKHByb2R1Y3RJZCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHBjbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5uZXdDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkIHx8ICcnLCB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbkl0ZW06IGdlbmVyYXRlVHJhbnNhY3Rpb25JdGVtKHBjbSwgdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5zdGF0ZT8uc2FsZXNUcmFuc2FjdGlvbi5pZCksXG4gICAgICAgICAgICBhY3Rpb25zT3ZlcnJpZGU6IGNvbnRhaW5lcj8uYWN0aW9ucz8ubWFwKHByb2Nlc3NvciA9PiAoeyAuLi5wcm9jZXNzb3IsIG93bmVySWQ6IHRoaXMub3duZXJJZCB9KSksXG4gICAgICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnN0YXJ0Q29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwge1xuICAgICAgICB0cmFuc2FjdGlvbkl0ZW1JZCxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBjb250YWluZXI/LmFjdGlvbnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICBtYXAociA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVJZCA9IHIuc3RhdGVJZDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUb1JlcXVlc3QoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8ge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBleGVjLmFjdGlvbnM/Lm1hcChhY3Rpb24gPT4gKHtcbiAgICAgICAgYXBpTmFtZTogYWN0aW9uLm5hbWUsXG4gICAgICAgIG93bmVySWQ6IHRoaXMub3duZXJJZCxcbiAgICAgICAgaW5wdXREYXRhOiBhY3Rpb24uaW5wdXREYXRhID8/IHt9LFxuICAgICAgfSkpLFxuICAgICAgc2VsZWN0b3JzOlxuICAgICAgICBleGVjLnNlbGVjdG9ycyAmJlxuICAgICAgICBPYmplY3QuZW50cmllcyhleGVjLnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlRXhlY3V0YWJsZURUTz4sIFtrZXksIHNlbGVjdG9yXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW2tleV06IHsgYXBpTmFtZTogc2VsZWN0b3IubmFtZSwgb3duZXJJZDogdGhpcy5vd25lcklkLCBpbnB1dERhdGE6IHNlbGVjdG9yLmlucHV0RGF0YSA/PyB7fSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9yczogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTx1bmtub3duPj4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhzZWxlY3RvcnMpLmZvckVhY2goKFtyZXF1ZXN0SWQsIHNlbGVjdG9yUmVzdWx0XSkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3RvclJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IHNlbGVjdG9yUmVzdWx0LmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uJCA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdPy5kYXRhJDtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24kKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiQubmV4dChzZWxlY3RvclJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0JChcbiAgICByZXE6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gICAgZm9yY2VTdWJzY3JpcHRpb25zPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdCA9IGNsb25lRGVlcChyZXEpO1xuICAgIGlmIChmdWxsUmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgZm9yY2VTdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgZnVsbFJlcXVlc3Quc2VsZWN0b3JzID0gYXNzaWduKGZ1bGxSZXF1ZXN0LnNlbGVjdG9ycywgc3Vic2NyaXB0aW9uLnJlcXVlc3Quc2VsZWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXhlY3V0aW9uJDtcblxuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICBleGVjdXRpb24kID0gdGhpcy5leGVjdXRlU3RhdGVmdWwkKGZ1bGxSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlY3V0aW9uJCA9IHRoaXMuZXhlY3V0ZVN0YXRlbGVzcyQoZnVsbFJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBleGVjdXRpb24kLnBpcGUodGFwKHJlc3VsdCA9PiB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHJlc3VsdC5zZWxlY3RvcnMpKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3MkKHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8pOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnN0YXRlJC5waXBlKFxuICAgICAgZmlyc3QoKSxcbiAgICAgIHN3aXRjaE1hcChzdGF0ZSA9PiB7XG4gICAgICAgIC8vIEFwcGx5IGFjdGlvbnMgYW5kIGV4ZWN1dGUgY29uZmlndXJhdGlvbi9wcmljZSBjYWxsXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcnVuIGNvbmZpZ3VyYXRpb24gaWYgbm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAoIXJlcXVlc3QuYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHN0YXRlID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KHN0YXRlLCBhY3Rpb24pID8/IHN0YXRlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmUkKHN0YXRlKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgLy8gUnVuIHNlbGVjdG9ycyBhbmQgYXBwbHkgdGhlbSB0byB0aGUgc3RhdGVcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvblN0YXRlID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5zdGF0ZTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uU3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0ZUlkOiAnJywgc2VsZWN0b3JzOiB7fSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU3RhdGVsZXNzU2VsZWN0b3JzKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25TdGF0ZSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uU3RhdGUgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnByZXZpb3VzU3RhdGU7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RvcnNSZXN1bHQgPSB0aGlzLnJ1blN0YXRlbGVzc1NlbGVjdG9ycyhyZXF1ZXN0LCBjb25maWd1cmF0aW9uU3RhdGUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0b3JzUmVzcG9uc2Uoc2VsZWN0b3JzUmVzdWx0LnNlbGVjdG9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BzLnN1cHByZXNzVG9hc3RNZXNzYWdlcykge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IFN0cmluZyhlcnJvcikgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVmZmVyZWRSZXF1ZXN0JCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLnBpcGUoXG4gICAgICBidWZmZXIodGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuRVhFQ1VUSU9OX0JVRkZFUl9USU1FKSkpLFxuICAgICAgc3dpdGNoTWFwKHJlcXVlc3RzID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCB8fCAhdGhpcy5zdGF0ZUlkKSB7XG4gICAgICAgICAgdGhyb3cgJ1N0YXRlZnVsIHNlc3Npb24gaXMgbm90IGluaXRpYWxpemVkJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1lcmdlIGJ1ZmZlcmVkIHJlcXVlc3RzXG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8gPSB7XG4gICAgICAgICAgYWN0aW9uczogcmVxdWVzdHMuZmxhdE1hcCgoeyBhY3Rpb25zIH0pID0+IGFjdGlvbnMpLmZpbHRlcihpc0RlZmluZWQpLFxuICAgICAgICAgIHNlbGVjdG9yczogcmVxdWVzdHNcbiAgICAgICAgICAgIC5tYXAoKHsgc2VsZWN0b3JzIH0pID0+IHNlbGVjdG9ycylcbiAgICAgICAgICAgIC5maWx0ZXIoaXNEZWZpbmVkKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBzZWxlY3RvcnNNYXApID0+IE9iamVjdC5hc3NpZ24oYWNjLCBzZWxlY3RvcnNNYXApLCB7fSksXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLmV4ZWN1dGVDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkLCB0aGlzLnN0YXRlSWQsIHJlcXVlc3QpO1xuICAgICAgfSksXG4gICAgICB0YXAoKHsgc3RhdGVJZCB9KSA9PiAodGhpcy5zdGF0ZUlkID0gc3RhdGVJZCkpLFxuICAgICAgc2hhcmUoKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlZnVsJChyZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5waXBlKFxuICAgICAgZmlsdGVyKGluUHJvZ3Jlc3MgPT4gIWluUHJvZ3Jlc3MpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtIHN3aXRjaGVzIHRvIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQgYmVmb3JlIHB1c2hpbmcgYW4gZXhlY3V0aW9uIHJlcXVlc3RcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkLFxuICAgICAgICAgIG9mKHVuZGVmaW5lZCkucGlwZSh0YXAoKCkgPT4gdGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLm5leHQocmVxdWVzdCkpKSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICAgbWFwKChbcmVzcG9uc2VdKSA9PiByZXNwb25zZSksXG4gICAgICB0YWtlKDEpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVBY3Rpb25TY3JpcHQocmVxdWVzdDogVHJhbnNhY3Rpb25Db250ZXh0LCBwcm9jZXNzb3I6IEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8pOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyID8/IHt9O1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSBhY3Rpb25zPy5maW5kKGFjdGlvbiA9PiBhY3Rpb24uYXBpTmFtZSA9PT0gcHJvY2Vzc29yLmFwaU5hbWUpO1xuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uUHJvY2Vzc29yPy5zY3JpcHQpIHtcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7cHJvY2Vzc29yLmFwaU5hbWV9IG5vdCBmb3VuZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0LCBjb25maWd1cmF0aW9uUHJvY2Vzc29yLCBwcm9jZXNzb3IuaW5wdXREYXRhKSBhcyBUcmFuc2FjdGlvbkNvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTZWxlY3RvclNjcmlwdChyZXF1ZXN0OiBUcmFuc2FjdGlvbkNvbnRleHQsIHByb2Nlc3NvcjogRmxvd1N0YXRlRXhlY3V0YWJsZURUTyk6IHVua25vd24ge1xuICAgIGNvbnN0IHsgc2VsZWN0b3JzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZS51aURlZmluaXRpb25Db250YWluZXIgPz8ge307XG4gICAgY29uc3QgY29uZmlndXJhdGlvblByb2Nlc3NvciA9IHNlbGVjdG9ycz8uZmluZChzZWxlY3RvciA9PiBzZWxlY3Rvci5hcGlOYW1lID09PSBwcm9jZXNzb3IuYXBpTmFtZSk7XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25Qcm9jZXNzb3I/LnNjcmlwdCkge1xuICAgICAgdGhyb3cgYENvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgJHtwcm9jZXNzb3IuYXBpTmFtZX0gbm90IGZvdW5kYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IsIHByb2Nlc3Nvci5pbnB1dERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlUHJvY2Vzc29yU2NyaXB0KFxuICAgIHJlcXVlc3Q6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgICBjb25maWd1cmF0aW9uUHJvY2Vzc29yOiBDb25maWd1cmF0aW9uUHJvY2Vzc29yLFxuICAgIGlucHV0RGF0YTogdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgbGV0IGZ1bmN0aW9uVG9FeGVjdXRlID0gdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdO1xuICAgIGlmICghZnVuY3Rpb25Ub0V4ZWN1dGUpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGAke2NvbmZpZ3VyYXRpb25Qcm9jZXNzb3Iuc2NyaXB0fVxcbnJldHVybiB0cmFuc2Zvcm07YDtcbiAgICAgIGNvbnN0IHNvdXJjZU1hcCA9IGBcXG4vLyMgc291cmNlVVJMPSR7Y29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lfS5qc2A7XG4gICAgICBmdW5jdGlvblRvRXhlY3V0ZSA9IG5ldyBGdW5jdGlvbihzY3JpcHQgKyBzb3VyY2VNYXApKCkgYXMgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuO1xuICAgICAgdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdID0gZnVuY3Rpb25Ub0V4ZWN1dGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9FeGVjdXRlKHtcbiAgICAgIHJlcXVlc3QsXG4gICAgICBpbnB1dERhdGEsXG4gICAgICBmbG93U3RvcmU6IHRoaXMuZmxvd1N0YXRlU2VydmljZS5nZXRGbG93U3RvcmUoKSxcbiAgICAgIGNvbmZpZ3VyYXRpb25TdG9yZTogdGhpcy5jb25maWd1cmF0aW9uU3RvcmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJ1blN0YXRlbGVzc1NlbGVjdG9ycyhcbiAgICByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICAgIGNvbmZpZ3VyYXRpb25TdGF0ZTogVHJhbnNhY3Rpb25Db250ZXh0LFxuICApOiBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQge1xuICAgIHJldHVybiBFbnRpdHlVdGlsLmVudHJpZXMocmVxdWVzdC5zZWxlY3RvcnMgPz8ge30pLnJlZHVjZShcbiAgICAgIChyZXN1bHQ6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCwgW2tleSwgc2VsZWN0b3JdKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogdGhpcy5leGVjdXRlU2VsZWN0b3JTY3JpcHQoY29uZmlndXJhdGlvblN0YXRlLCBzZWxlY3RvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IFN0cmluZyhlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7IHN0YXRlSWQ6ICcnLCBzZWxlY3RvcnM6IHt9IH0sXG4gICAgKTtcbiAgfVxufVxuIl19