@kaspernj/api-maker 1.0.2060 → 1.0.2061

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 (401) hide show
  1. package/build/api.d.ts.map +1 -1
  2. package/build/api.js +44 -51
  3. package/build/attribute-not-loaded-error.d.ts.map +1 -1
  4. package/build/attribute-not-loaded-error.js +2 -4
  5. package/build/base-component.d.ts.map +1 -1
  6. package/build/base-component.js +3 -5
  7. package/build/base-error.d.ts.map +1 -1
  8. package/build/base-error.js +11 -16
  9. package/build/base-model/attribute.d.ts.map +1 -1
  10. package/build/base-model/attribute.js +4 -9
  11. package/build/base-model/column.d.ts.map +1 -1
  12. package/build/base-model/column.js +2 -4
  13. package/build/base-model/reflection.d.ts.map +1 -1
  14. package/build/base-model/reflection.js +10 -48
  15. package/build/base-model/scope.d.ts.map +1 -1
  16. package/build/base-model/scope.js +5 -40
  17. package/build/base-model.js +85 -122
  18. package/build/bootstrap/attribute-row.d.ts.map +1 -1
  19. package/build/bootstrap/attribute-row.js +93 -126
  20. package/build/bootstrap/attribute-rows.d.ts.map +1 -1
  21. package/build/bootstrap/attribute-rows.js +21 -28
  22. package/build/bootstrap/card.d.ts.map +1 -1
  23. package/build/bootstrap/card.js +101 -120
  24. package/build/bootstrap/checkbox.d.ts.map +1 -1
  25. package/build/bootstrap/checkbox.js +64 -60
  26. package/build/bootstrap/checkboxes.d.ts.map +1 -1
  27. package/build/bootstrap/checkboxes.js +124 -155
  28. package/build/bootstrap/index.d.ts.map +1 -1
  29. package/build/bootstrap/index.js +2 -2
  30. package/build/bootstrap/input.d.ts +1 -1
  31. package/build/bootstrap/input.d.ts.map +1 -1
  32. package/build/bootstrap/input.js +108 -88
  33. package/build/bootstrap/invalid-feedback.d.ts +5 -2
  34. package/build/bootstrap/invalid-feedback.d.ts.map +1 -1
  35. package/build/bootstrap/invalid-feedback.js +13 -17
  36. package/build/bootstrap/paginate.d.ts.map +1 -1
  37. package/build/bootstrap/paginate.js +132 -136
  38. package/build/bootstrap/radio-buttons.d.ts +1 -1
  39. package/build/bootstrap/radio-buttons.d.ts.map +1 -1
  40. package/build/bootstrap/radio-buttons.js +40 -34
  41. package/build/bootstrap/select.d.ts +1 -1
  42. package/build/bootstrap/select.d.ts.map +1 -1
  43. package/build/bootstrap/select.js +48 -35
  44. package/build/bootstrap/sort-link.d.ts.map +1 -1
  45. package/build/bootstrap/sort-link.js +75 -112
  46. package/build/cable-connection-pool.d.ts +6 -7
  47. package/build/cable-connection-pool.d.ts.map +1 -1
  48. package/build/cable-connection-pool.js +30 -37
  49. package/build/cable-subscription-pool.d.ts.map +1 -1
  50. package/build/cable-subscription-pool.js +65 -103
  51. package/build/cable-subscription.d.ts.map +1 -1
  52. package/build/cable-subscription.js +6 -11
  53. package/build/cache-key-generator.d.ts.map +1 -1
  54. package/build/cache-key-generator.js +5 -10
  55. package/build/can-can.d.ts.map +1 -1
  56. package/build/can-can.js +37 -77
  57. package/build/channels-consumer.d.ts.map +1 -1
  58. package/build/channels-consumer.js +5 -9
  59. package/build/collection-loader.d.ts.map +1 -1
  60. package/build/collection-loader.js +31 -35
  61. package/build/collection.d.ts.map +1 -1
  62. package/build/collection.js +20 -58
  63. package/build/command-submit-data.d.ts.map +1 -1
  64. package/build/command-submit-data.js +8 -13
  65. package/build/commands-pool.d.ts.map +1 -1
  66. package/build/commands-pool.js +77 -82
  67. package/build/compose.d.ts.map +1 -1
  68. package/build/compose.js +2 -4
  69. package/build/config.d.ts.map +1 -1
  70. package/build/config.js +5 -39
  71. package/build/custom-error.d.ts.map +1 -1
  72. package/build/custom-error.js +4 -8
  73. package/build/data-set-to-attributes.d.ts.map +1 -1
  74. package/build/data-set-to-attributes.js +3 -38
  75. package/build/deserializer.d.ts.map +1 -1
  76. package/build/deserializer.js +18 -56
  77. package/build/destroy-error.d.ts.map +1 -1
  78. package/build/destroy-error.js +4 -8
  79. package/build/devise.d.ts.map +1 -1
  80. package/build/devise.js +17 -55
  81. package/build/draggable-sort/controller.d.ts.map +1 -1
  82. package/build/draggable-sort/controller.js +79 -81
  83. package/build/draggable-sort/index.d.ts.map +1 -1
  84. package/build/draggable-sort/index.js +68 -109
  85. package/build/draggable-sort/item.d.ts.map +1 -1
  86. package/build/draggable-sort/item.js +132 -173
  87. package/build/error-logger.d.ts.map +1 -1
  88. package/build/error-logger.js +9 -14
  89. package/build/error-messages.d.ts.map +1 -1
  90. package/build/error-messages.js +5 -7
  91. package/build/event-connection.d.ts +4 -1
  92. package/build/event-connection.d.ts.map +1 -1
  93. package/build/event-connection.js +16 -21
  94. package/build/event-emitter-listener.d.ts.map +1 -1
  95. package/build/event-emitter-listener.js +4 -8
  96. package/build/event-model-class.d.ts +4 -1
  97. package/build/event-model-class.d.ts.map +1 -1
  98. package/build/event-model-class.js +13 -21
  99. package/build/events.d.ts.map +1 -1
  100. package/build/events.js +4 -5
  101. package/build/form.d.ts +3 -2
  102. package/build/form.d.ts.map +1 -1
  103. package/build/form.js +54 -96
  104. package/build/history-expo.d.ts.map +1 -1
  105. package/build/history-expo.js +6 -10
  106. package/build/history-react-native.d.ts.map +1 -1
  107. package/build/history-react-native.js +9 -13
  108. package/build/history.d.ts.map +1 -1
  109. package/build/history.js +3 -4
  110. package/build/index.d.ts.map +1 -1
  111. package/build/index.js +2 -4
  112. package/build/inputs/attachment.d.ts.map +1 -1
  113. package/build/inputs/attachment.js +84 -83
  114. package/build/inputs/auto-submit.d.ts.map +1 -1
  115. package/build/inputs/auto-submit.js +6 -41
  116. package/build/inputs/checkbox.d.ts.map +1 -1
  117. package/build/inputs/checkbox.js +81 -121
  118. package/build/inputs/checkboxes.d.ts +1 -1
  119. package/build/inputs/checkboxes.d.ts.map +1 -1
  120. package/build/inputs/checkboxes.js +83 -112
  121. package/build/inputs/id-for-component.d.ts.map +1 -1
  122. package/build/inputs/id-for-component.js +3 -38
  123. package/build/inputs/input-wrapper.d.ts +2 -1
  124. package/build/inputs/input-wrapper.d.ts.map +1 -1
  125. package/build/inputs/input-wrapper.js +6 -11
  126. package/build/inputs/input.d.ts +1 -1
  127. package/build/inputs/input.d.ts.map +1 -1
  128. package/build/inputs/input.js +160 -199
  129. package/build/inputs/money.d.ts.map +1 -1
  130. package/build/inputs/money.js +129 -162
  131. package/build/inputs/name-for-component.d.ts.map +1 -1
  132. package/build/inputs/name-for-component.js +3 -38
  133. package/build/inputs/select.d.ts +1 -1
  134. package/build/inputs/select.d.ts.map +1 -1
  135. package/build/inputs/select.js +74 -77
  136. package/build/instance-of-class-name.d.ts.map +1 -1
  137. package/build/instance-of-class-name.js +5 -6
  138. package/build/is-expo.d.ts.map +1 -1
  139. package/build/is-expo.js +6 -7
  140. package/build/key-value-store.d.ts.map +1 -1
  141. package/build/key-value-store.js +4 -9
  142. package/build/link.d.ts.map +1 -1
  143. package/build/link.js +53 -63
  144. package/build/logger.d.ts.map +1 -1
  145. package/build/logger.js +4 -6
  146. package/build/merge-styles.d.ts.map +1 -1
  147. package/build/merge-styles.js +4 -6
  148. package/build/modal.d.ts.map +1 -1
  149. package/build/modal.js +24 -24
  150. package/build/model-class-require.d.ts.map +1 -1
  151. package/build/model-class-require.js +4 -39
  152. package/build/model-events.d.ts.map +1 -1
  153. package/build/model-events.js +14 -19
  154. package/build/model-name.d.ts.map +1 -1
  155. package/build/model-name.js +7 -45
  156. package/build/model-prop-type.d.ts.map +1 -1
  157. package/build/model-prop-type.js +9 -14
  158. package/build/model-recipes-loader.d.ts.map +1 -1
  159. package/build/model-recipes-loader.js +8 -13
  160. package/build/model-recipes-model-loader.d.ts +7 -7
  161. package/build/model-recipes-model-loader.d.ts.map +1 -1
  162. package/build/model-recipes-model-loader.js +18 -56
  163. package/build/models-response-reader.d.ts.map +1 -1
  164. package/build/models-response-reader.js +7 -45
  165. package/build/models.d.ts.map +1 -1
  166. package/build/models.js +5 -9
  167. package/build/money-formatter.d.ts +2 -2
  168. package/build/money-formatter.d.ts.map +1 -1
  169. package/build/money-formatter.js +13 -18
  170. package/build/not-loaded-error.d.ts.map +1 -1
  171. package/build/not-loaded-error.js +2 -4
  172. package/build/params.d.ts.map +1 -1
  173. package/build/params.js +13 -18
  174. package/build/preloaded.d.ts.map +1 -1
  175. package/build/preloaded.js +5 -43
  176. package/build/resize-observer.d.ts.map +1 -1
  177. package/build/resize-observer.js +6 -10
  178. package/build/rest-props-validator.d.ts.map +1 -1
  179. package/build/rest-props-validator.js +2 -3
  180. package/build/result.d.ts.map +1 -1
  181. package/build/result.js +2 -4
  182. package/build/router/route.d.ts +4 -4
  183. package/build/router/route.d.ts.map +1 -1
  184. package/build/router/route.js +188 -224
  185. package/build/router/switch.d.ts +2 -1
  186. package/build/router/switch.d.ts.map +1 -1
  187. package/build/router/switch.js +57 -99
  188. package/build/router.d.ts +2 -1
  189. package/build/router.d.ts.map +1 -1
  190. package/build/router.js +37 -73
  191. package/build/routes-native.d.ts.map +1 -1
  192. package/build/routes-native.js +15 -53
  193. package/build/routes.d.ts.map +1 -1
  194. package/build/routes.js +13 -48
  195. package/build/run-last.d.ts.map +1 -1
  196. package/build/run-last.js +11 -13
  197. package/build/serializer.d.ts.map +1 -1
  198. package/build/serializer.js +5 -7
  199. package/build/services.d.ts.map +1 -1
  200. package/build/services.js +4 -9
  201. package/build/session-status-updater.d.ts.map +1 -1
  202. package/build/session-status-updater.js +21 -59
  203. package/build/source-maps-loader.js +12 -50
  204. package/build/super-admin/config-reader.d.ts.map +1 -1
  205. package/build/super-admin/config-reader.js +9 -44
  206. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts.map +1 -1
  207. package/build/super-admin/edit-page/edit-attribute-checkbox.js +53 -94
  208. package/build/super-admin/edit-page/edit-attribute-content.d.ts.map +1 -1
  209. package/build/super-admin/edit-page/edit-attribute-content.js +47 -56
  210. package/build/super-admin/edit-page/edit-attribute-input.d.ts.map +1 -1
  211. package/build/super-admin/edit-page/edit-attribute-input.js +60 -98
  212. package/build/super-admin/edit-page/edit-attribute.d.ts.map +1 -1
  213. package/build/super-admin/edit-page/edit-attribute.js +45 -79
  214. package/build/super-admin/edit-page.d.ts.map +1 -1
  215. package/build/super-admin/edit-page.js +95 -128
  216. package/build/super-admin/has-edit-config.d.ts.map +1 -1
  217. package/build/super-admin/has-edit-config.js +4 -8
  218. package/build/super-admin/index-page.d.ts.map +1 -1
  219. package/build/super-admin/index-page.js +19 -24
  220. package/build/super-admin/index.d.ts.map +1 -1
  221. package/build/super-admin/index.js +101 -115
  222. package/build/super-admin/layout/header/index.d.ts +25 -1
  223. package/build/super-admin/layout/header/index.d.ts.map +1 -1
  224. package/build/super-admin/layout/header/index.js +116 -142
  225. package/build/super-admin/layout/index.d.ts.map +1 -1
  226. package/build/super-admin/layout/index.js +88 -111
  227. package/build/super-admin/layout/menu/index.d.ts +4 -1
  228. package/build/super-admin/layout/menu/index.d.ts.map +1 -1
  229. package/build/super-admin/layout/menu/index.js +113 -132
  230. package/build/super-admin/layout/menu/menu-content.d.ts.map +1 -1
  231. package/build/super-admin/layout/menu/menu-content.js +26 -64
  232. package/build/super-admin/layout/menu/menu-item.d.ts.map +1 -1
  233. package/build/super-admin/layout/menu/menu-item.js +55 -62
  234. package/build/super-admin/layout/no-access.d.ts.map +1 -1
  235. package/build/super-admin/layout/no-access.js +16 -19
  236. package/build/super-admin/model-class-table.d.ts.map +1 -1
  237. package/build/super-admin/model-class-table.js +45 -88
  238. package/build/super-admin/models.d.ts.map +1 -1
  239. package/build/super-admin/models.js +3 -37
  240. package/build/super-admin/show-nav.d.ts.map +1 -1
  241. package/build/super-admin/show-nav.js +37 -66
  242. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts.map +1 -1
  243. package/build/super-admin/show-page/belongs-to-attribute-row.js +20 -51
  244. package/build/super-admin/show-page/index.d.ts.map +1 -1
  245. package/build/super-admin/show-page/index.js +102 -137
  246. package/build/super-admin/show-reflection-actions.d.ts.map +1 -1
  247. package/build/super-admin/show-reflection-actions.js +42 -78
  248. package/build/super-admin/show-reflection-link.d.ts.map +1 -1
  249. package/build/super-admin/show-reflection-link.js +23 -27
  250. package/build/super-admin/show-reflection-page.d.ts.map +1 -1
  251. package/build/super-admin/show-reflection-page.js +36 -73
  252. package/build/table/column-content.d.ts.map +1 -1
  253. package/build/table/column-content.js +58 -97
  254. package/build/table/column-identifier.d.ts.map +1 -1
  255. package/build/table/column-identifier.js +2 -4
  256. package/build/table/column-visible.d.ts.map +1 -1
  257. package/build/table/column-visible.js +2 -4
  258. package/build/table/components/column.d.ts.map +1 -1
  259. package/build/table/components/column.js +8 -13
  260. package/build/table/components/flat-list.d.ts.map +1 -1
  261. package/build/table/components/flat-list.js +8 -13
  262. package/build/table/components/header.d.ts.map +1 -1
  263. package/build/table/components/header.js +10 -15
  264. package/build/table/components/row.d.ts.map +1 -1
  265. package/build/table/components/row.js +10 -15
  266. package/build/table/filters/attribute-element.d.ts.map +1 -1
  267. package/build/table/filters/attribute-element.js +38 -44
  268. package/build/table/filters/filter-form.d.ts.map +1 -1
  269. package/build/table/filters/filter-form.js +315 -312
  270. package/build/table/filters/filter.d.ts.map +1 -1
  271. package/build/table/filters/filter.js +54 -54
  272. package/build/table/filters/index.d.ts.map +1 -1
  273. package/build/table/filters/index.js +114 -106
  274. package/build/table/filters/load-search-modal.d.ts.map +1 -1
  275. package/build/table/filters/load-search-modal.js +95 -114
  276. package/build/table/filters/reflection-element.d.ts.map +1 -1
  277. package/build/table/filters/reflection-element.js +30 -36
  278. package/build/table/filters/save-search-modal.d.ts.map +1 -1
  279. package/build/table/filters/save-search-modal.js +46 -46
  280. package/build/table/filters/scope-element.d.ts.map +1 -1
  281. package/build/table/filters/scope-element.js +32 -38
  282. package/build/table/header-column-content.d.ts.map +1 -1
  283. package/build/table/header-column-content.js +37 -39
  284. package/build/table/header-column.d.ts.map +1 -1
  285. package/build/table/header-column.js +92 -131
  286. package/build/table/header-select.d.ts.map +1 -1
  287. package/build/table/header-select.js +57 -54
  288. package/build/table/model-callback-args.d.ts.map +1 -1
  289. package/build/table/model-callback-args.js +3 -38
  290. package/build/table/model-column.d.ts.map +1 -1
  291. package/build/table/model-column.js +67 -98
  292. package/build/table/model-row.d.ts.map +1 -1
  293. package/build/table/model-row.js +89 -115
  294. package/build/table/select-calculator.d.ts.map +1 -1
  295. package/build/table/select-calculator.js +13 -51
  296. package/build/table/settings/column-row.d.ts.map +1 -1
  297. package/build/table/settings/column-row.js +70 -106
  298. package/build/table/settings/download-action.d.ts.map +1 -1
  299. package/build/table/settings/download-action.js +58 -48
  300. package/build/table/settings/index.d.ts.map +1 -1
  301. package/build/table/settings/index.js +52 -80
  302. package/build/table/table-settings.d.ts.map +1 -1
  303. package/build/table/table-settings.js +169 -207
  304. package/build/table/table.d.ts.map +1 -1
  305. package/build/table/table.js +639 -616
  306. package/build/table/use-sorting.d.ts.map +1 -1
  307. package/build/table/use-sorting.js +6 -11
  308. package/build/table/widths.d.ts.map +1 -1
  309. package/build/table/widths.js +9 -11
  310. package/build/table/worker-plugins-check-all-checkbox.d.ts.map +1 -1
  311. package/build/table/worker-plugins-check-all-checkbox.js +74 -117
  312. package/build/table/worker-plugins-checkbox.d.ts.map +1 -1
  313. package/build/table/worker-plugins-checkbox.js +72 -115
  314. package/build/translated-attributes.d.ts.map +1 -1
  315. package/build/translated-attributes.js +2 -4
  316. package/build/translated-collections.d.ts.map +1 -1
  317. package/build/translated-collections.js +8 -13
  318. package/build/updated-attribute.d.ts +2 -1
  319. package/build/updated-attribute.d.ts.map +1 -1
  320. package/build/updated-attribute.js +16 -21
  321. package/build/url-encode.d.ts.map +1 -1
  322. package/build/url-encode.js +4 -9
  323. package/build/use-breakpoint.d.ts.map +1 -1
  324. package/build/use-breakpoint.js +20 -58
  325. package/build/use-can-can.d.ts.map +1 -1
  326. package/build/use-can-can.js +15 -20
  327. package/build/use-collection.d.ts +4 -4
  328. package/build/use-collection.d.ts.map +1 -1
  329. package/build/use-collection.js +33 -70
  330. package/build/use-created-event.d.ts.map +1 -1
  331. package/build/use-created-event.js +22 -26
  332. package/build/use-current-user-context.d.ts +1 -1
  333. package/build/use-current-user-context.d.ts.map +1 -1
  334. package/build/use-current-user-context.js +37 -73
  335. package/build/use-current-user.d.ts.map +1 -1
  336. package/build/use-current-user.js +11 -16
  337. package/build/use-destroyed-event.d.ts.map +1 -1
  338. package/build/use-destroyed-event.js +13 -17
  339. package/build/use-event-emitter.d.ts.map +1 -1
  340. package/build/use-event-emitter.js +7 -12
  341. package/build/use-event-listener.d.ts.map +1 -1
  342. package/build/use-event-listener.js +7 -11
  343. package/build/use-input.d.ts.map +1 -1
  344. package/build/use-input.js +28 -32
  345. package/build/use-model-event.d.ts.map +1 -1
  346. package/build/use-model-event.js +13 -17
  347. package/build/use-model.d.ts.map +1 -1
  348. package/build/use-model.js +27 -64
  349. package/build/use-resize-observer.d.ts.map +1 -1
  350. package/build/use-resize-observer.js +8 -12
  351. package/build/use-router.d.ts +5 -2
  352. package/build/use-router.d.ts.map +1 -1
  353. package/build/use-router.js +24 -61
  354. package/build/use-screen-layout.d.ts.map +1 -1
  355. package/build/use-screen-layout.js +11 -15
  356. package/build/use-styles.d.ts +1 -1
  357. package/build/use-styles.d.ts.map +1 -1
  358. package/build/use-styles.js +13 -51
  359. package/build/use-updated-event.d.ts.map +1 -1
  360. package/build/use-updated-event.js +13 -17
  361. package/build/use-validation-errors.d.ts.map +1 -1
  362. package/build/use-validation-errors.js +9 -13
  363. package/build/utils/button.d.ts.map +1 -1
  364. package/build/utils/button.js +93 -95
  365. package/build/utils/card.d.ts.map +1 -1
  366. package/build/utils/card.js +38 -70
  367. package/build/utils/checkbox.d.ts.map +1 -1
  368. package/build/utils/checkbox.js +56 -92
  369. package/build/utils/checkboxes.d.ts.map +1 -1
  370. package/build/utils/checkboxes.js +111 -150
  371. package/build/utils/default-style.d.ts +7 -3
  372. package/build/utils/default-style.d.ts.map +1 -1
  373. package/build/utils/default-style.js +16 -55
  374. package/build/utils/header.d.ts +2 -1
  375. package/build/utils/header.d.ts.map +1 -1
  376. package/build/utils/header.js +6 -11
  377. package/build/utils/icon.d.ts.map +1 -1
  378. package/build/utils/icon.js +22 -60
  379. package/build/utils/invalid-feedback.d.ts.map +1 -1
  380. package/build/utils/invalid-feedback.js +17 -22
  381. package/build/utils/modal.d.ts.map +1 -1
  382. package/build/utils/modal.js +30 -63
  383. package/build/utils/text.d.ts.map +1 -1
  384. package/build/utils/text.js +10 -13
  385. package/build/validation-error.d.ts.map +1 -1
  386. package/build/validation-error.js +24 -62
  387. package/build/validation-errors.d.ts.map +1 -1
  388. package/build/validation-errors.js +24 -63
  389. package/build/with-api-maker.d.ts.map +1 -1
  390. package/build/with-api-maker.js +13 -51
  391. package/build/with-collection.d.ts.map +1 -1
  392. package/build/with-collection.js +11 -49
  393. package/build/with-current-user.d.ts +2 -1
  394. package/build/with-current-user.d.ts.map +1 -1
  395. package/build/with-current-user.js +6 -11
  396. package/build/with-model.d.ts.map +1 -1
  397. package/build/with-model.js +8 -13
  398. package/build/with-router.d.ts +2 -1
  399. package/build/with-router.d.ts.map +1 -1
  400. package/build/with-router.js +6 -11
  401. package/package.json +4 -2
@@ -1,59 +1,21 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const attribute_1 = __importDefault(require("./base-model/attribute"));
40
- const attribute_not_loaded_error_1 = __importDefault(require("./attribute-not-loaded-error"));
41
- const cache_key_generator_1 = __importDefault(require("./cache-key-generator"));
42
- const collection_js_1 = __importDefault(require("./collection.js"));
43
- const commands_pool_js_1 = __importDefault(require("./commands-pool.js"));
44
- const config_js_1 = __importDefault(require("./config.js"));
45
- const custom_error_js_1 = __importDefault(require("./custom-error.js"));
46
- const diggerize_1 = require("diggerize");
47
- const form_data_objectizer_1 = __importDefault(require("form-data-objectizer"));
48
- const inflection = __importStar(require("inflection"));
49
- const model_name_1 = __importDefault(require("./model-name"));
50
- const not_loaded_error_1 = __importDefault(require("./not-loaded-error"));
51
- const object_to_formdata_1 = __importDefault(require("object-to-formdata"));
52
- const reflection_1 = __importDefault(require("./base-model/reflection"));
53
- const scope_1 = __importDefault(require("./base-model/scope"));
54
- const services_js_1 = __importDefault(require("./services.js"));
55
- const validation_error_js_1 = __importDefault(require("./validation-error.js"));
56
- const validation_errors_js_1 = require("./validation-errors.js");
1
+ import Attribute from "./base-model/attribute";
2
+ import AttributeNotLoadedError from "./attribute-not-loaded-error";
3
+ import CacheKeyGenerator from "./cache-key-generator";
4
+ import Collection from "./collection.js";
5
+ import CommandsPool from "./commands-pool.js";
6
+ import Config from "./config.js";
7
+ import CustomError from "./custom-error.js";
8
+ import { digg } from "diggerize";
9
+ import FormDataObjectizer from "form-data-objectizer";
10
+ import * as inflection from "inflection";
11
+ import ModelName from "./model-name";
12
+ import NotLoadedError from "./not-loaded-error";
13
+ import objectToFormData from "object-to-formdata";
14
+ import Reflection from "./base-model/reflection";
15
+ import Scope from "./base-model/scope";
16
+ import Services from "./services.js";
17
+ import ValidationError from "./validation-error.js";
18
+ import { ValidationErrors } from "./validation-errors.js";
57
19
  /**
58
20
  * @typedef {object} ModelClassDataType
59
21
  * @property {import("./base-model/attribute.js").AttributeArgType[]} attributes
@@ -76,21 +38,22 @@ function objectToUnderscore(object) {
76
38
  }
77
39
  return newObject;
78
40
  }
79
- class BaseModel {
41
+ export default class BaseModel {
42
+ static apiMakerType = "BaseModel";
80
43
  /** @returns {Attribute[]} */
81
44
  static attributes() {
82
45
  const attributes = this.modelClassData().attributes;
83
46
  const result = [];
84
47
  for (const attributeKey in attributes) {
85
48
  const attributeData = attributes[attributeKey];
86
- const attribute = new attribute_1.default(attributeData);
49
+ const attribute = new Attribute(attributeData);
87
50
  result.push(attribute);
88
51
  }
89
52
  return result;
90
53
  }
91
54
  /** @returns {boolean} */
92
55
  static hasAttribute(attributeName) {
93
- const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
56
+ const attributes = digg(this.modelClassData(), "attributes");
94
57
  const lowerCaseAttributeName = inflection.underscore(attributeName);
95
58
  if (lowerCaseAttributeName in attributes)
96
59
  return true;
@@ -103,6 +66,13 @@ class BaseModel {
103
66
  static modelClassData() {
104
67
  throw new Error("modelClassData should be overriden by child");
105
68
  }
69
+ /**
70
+ * @param {ValidationErrors} validationErrors
71
+ * @returns {CustomEvent}
72
+ */
73
+ static newCustomEvent = (validationErrors) => {
74
+ return new CustomEvent("validation-errors", { detail: validationErrors });
75
+ };
106
76
  /**
107
77
  * @param {ValidationErrors} validationErrors
108
78
  * @param {object} [options]
@@ -130,7 +100,7 @@ class BaseModel {
130
100
  return model;
131
101
  }
132
102
  else {
133
- throw new custom_error_js_1.default("Record not found");
103
+ throw new CustomError("Record not found");
134
104
  }
135
105
  }
136
106
  /**
@@ -140,21 +110,21 @@ class BaseModel {
140
110
  * @returns {Promise<InstanceType<T>>}
141
111
  */
142
112
  static async findOrCreateBy(findOrCreateByArgs, args = {}) {
143
- const result = await services_js_1.default.current().sendRequest("Models::FindOrCreateBy", {
113
+ const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
144
114
  additional_data: args.additionalData,
145
115
  find_or_create_by_args: findOrCreateByArgs,
146
- resource_name: (0, diggerize_1.digg)(this.modelClassData(), "name")
116
+ resource_name: digg(this.modelClassData(), "name")
147
117
  });
148
- const model = /** @type {InstanceType<T>} */ ((0, diggerize_1.digg)(result, "model"));
118
+ const model = /** @type {InstanceType<T>} */ (digg(result, "model"));
149
119
  return model;
150
120
  }
151
121
  /** @returns {ModelName} */
152
122
  static modelName() {
153
- return new model_name_1.default({ modelClassData: this.modelClassData() });
123
+ return new ModelName({ modelClassData: this.modelClassData() });
154
124
  }
155
125
  /** @returns {string} */
156
126
  static primaryKey() {
157
- return (0, diggerize_1.digg)(this.modelClassData(), "primaryKey");
127
+ return digg(this.modelClassData(), "primaryKey");
158
128
  }
159
129
  /**
160
130
  * @template {typeof BaseModel} MC
@@ -164,7 +134,7 @@ class BaseModel {
164
134
  */
165
135
  static ransack(query = {}) {
166
136
  const ModelClass = /** @type {MC} */ (this);
167
- return new collection_js_1.default({ modelClass: ModelClass }, { ransack: query });
137
+ return new Collection({ modelClass: ModelClass }, { ransack: query });
168
138
  }
169
139
  /**
170
140
  * @template {typeof BaseModel} MC
@@ -177,10 +147,10 @@ class BaseModel {
177
147
  }
178
148
  /** @returns {Reflection[]} */
179
149
  static ransackableAssociations() {
180
- const relationships = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_associations");
150
+ const relationships = digg(this.modelClassData(), "ransackable_associations");
181
151
  const reflections = [];
182
152
  for (const relationshipData of relationships) {
183
- reflections.push(new reflection_1.default(relationshipData));
153
+ reflections.push(new Reflection(relationshipData));
184
154
  }
185
155
  return reflections;
186
156
  }
@@ -189,26 +159,26 @@ class BaseModel {
189
159
  const attributes = this.modelClassData().ransackable_attributes;
190
160
  const result = [];
191
161
  for (const attributeData of attributes) {
192
- result.push(new attribute_1.default(attributeData));
162
+ result.push(new Attribute(attributeData));
193
163
  }
194
164
  return result;
195
165
  }
196
166
  /** @returns {Scope[]} */
197
167
  static ransackableScopes() {
198
- const ransackableScopes = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_scopes");
168
+ const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
199
169
  const result = [];
200
170
  for (const scopeData of ransackableScopes) {
201
- const scope = new scope_1.default(scopeData);
171
+ const scope = new Scope(scopeData);
202
172
  result.push(scope);
203
173
  }
204
174
  return result;
205
175
  }
206
176
  /** @returns {Reflection[]} */
207
177
  static reflections() {
208
- const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
178
+ const relationships = digg(this.modelClassData(), "relationships");
209
179
  const reflections = [];
210
180
  for (const relationshipData of relationships) {
211
- const reflection = new reflection_1.default(relationshipData);
181
+ const reflection = new Reflection(relationshipData);
212
182
  reflections.push(reflection);
213
183
  }
214
184
  return reflections;
@@ -231,7 +201,6 @@ class BaseModel {
231
201
  }
232
202
  }
233
203
  constructor(args = {}) {
234
- this._callMemberCommand = (args, commandArgs) => commands_pool_js_1.default.addCommand(args, commandArgs);
235
204
  this.changes = {};
236
205
  this.newRecord = args.isNewRecord;
237
206
  this.relationshipsCache = {};
@@ -299,7 +268,7 @@ class BaseModel {
299
268
  can(givenAbilityName) {
300
269
  const abilityName = inflection.underscore(givenAbilityName);
301
270
  if (!(abilityName in this.abilities)) {
302
- throw new Error(`Ability ${abilityName} hasn't been loaded for ${(0, diggerize_1.digg)(this.modelClassData(), "name")}`);
271
+ throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
303
272
  }
304
273
  return this.abilities[abilityName];
305
274
  }
@@ -344,12 +313,12 @@ class BaseModel {
344
313
  }
345
314
  /** @returns {string} */
346
315
  localCacheKey() {
347
- const cacheKeyGenerator = new cache_key_generator_1.default(this);
316
+ const cacheKeyGenerator = new CacheKeyGenerator(this);
348
317
  return cacheKeyGenerator.local();
349
318
  }
350
319
  /** @returns {string} */
351
320
  fullCacheKey() {
352
- const cacheKeyGenerator = new cache_key_generator_1.default(this);
321
+ const cacheKeyGenerator = new CacheKeyGenerator(this);
353
322
  return cacheKeyGenerator.cacheKey();
354
323
  }
355
324
  /**
@@ -377,7 +346,7 @@ class BaseModel {
377
346
  dataToUse[paramKey] = modelData;
378
347
  let response;
379
348
  try {
380
- response = await commands_pool_js_1.default.addCommand({
349
+ response = await CommandsPool.addCommand({
381
350
  args: {
382
351
  save: dataToUse
383
352
  },
@@ -405,7 +374,7 @@ class BaseModel {
405
374
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
406
375
  let response;
407
376
  try {
408
- response = await commands_pool_js_1.default.addCommand({
377
+ response = await CommandsPool.addCommand({
409
378
  args: {
410
379
  save: objectData
411
380
  },
@@ -427,7 +396,7 @@ class BaseModel {
427
396
  }
428
397
  /** @returns {Promise<{model: BaseModel, response: object}>} */
429
398
  async destroy() {
430
- const response = await commands_pool_js_1.default.addCommand({
399
+ const response = await CommandsPool.addCommand({
431
400
  args: { query_params: this.collection && this.collection.params() },
432
401
  command: `${this.modelClassData().collectionName}-destroy`,
433
402
  collectionName: this.modelClassData().collectionName,
@@ -459,7 +428,7 @@ class BaseModel {
459
428
  const ransackParams = {};
460
429
  ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
461
430
  const abilitiesParams = {};
462
- abilitiesParams[(0, diggerize_1.digg)(this.modelClassData(), "name")] = abilitiesToLoad;
431
+ abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
463
432
  const anotherModel = await this.modelClass()
464
433
  .ransack(ransackParams)
465
434
  .abilities(abilitiesParams)
@@ -477,10 +446,11 @@ class BaseModel {
477
446
  * @returns {Record<string, any>}
478
447
  */
479
448
  getAttributes() { return Object.assign(this.modelData, this.changes); }
449
+ asd;
480
450
  handleResponseError(response) {
481
451
  // @ts-expect-error
482
452
  BaseModel.parseValidationErrors({ model: this, response });
483
- throw new custom_error_js_1.default("Response wasn't successful", { model: this, response });
453
+ throw new CustomError("Response wasn't successful", { model: this, response });
484
454
  }
485
455
  /**
486
456
  * @returns {number | string}
@@ -519,13 +489,13 @@ class BaseModel {
519
489
  * @param {ParseValidationErrorsOptions} args.options
520
490
  */
521
491
  static parseValidationErrors({ error, model, options }) {
522
- if (!(error instanceof validation_error_js_1.default))
492
+ if (!(error instanceof ValidationError))
523
493
  return;
524
494
  if (!error.args.response.validation_errors)
525
495
  return;
526
- const validationErrors = new validation_errors_js_1.ValidationErrors({
496
+ const validationErrors = new ValidationErrors({
527
497
  model,
528
- validationErrors: (0, diggerize_1.digg)(error, "args", "response", "validation_errors")
498
+ validationErrors: digg(error, "args", "response", "validation_errors")
529
499
  });
530
500
  BaseModel.sendValidationErrorsEvent(validationErrors, options);
531
501
  if (!options || options.throwValidationError != false) {
@@ -533,9 +503,9 @@ class BaseModel {
533
503
  }
534
504
  }
535
505
  static humanAttributeName(attributeName) {
536
- const keyName = (0, diggerize_1.digg)(this.modelClassData(), "i18nKey");
506
+ const keyName = digg(this.modelClassData(), "i18nKey");
537
507
  // @ts-expect-error
538
- const i18n = config_js_1.default.getI18n();
508
+ const i18n = Config.getI18n();
539
509
  if (i18n)
540
510
  return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, { defaultValue: attributeName });
541
511
  return inflection.humanize(attributeName);
@@ -546,9 +516,9 @@ class BaseModel {
546
516
  */
547
517
  isAttributeChanged(attributeName) {
548
518
  const attributeNameUnderscore = inflection.underscore(attributeName);
549
- const attributeData = this.modelClassData().attributes.find((attribute) => (0, diggerize_1.digg)(attribute, "name") == attributeNameUnderscore);
519
+ const attributeData = this.modelClassData().attributes.find((attribute) => digg(attribute, "name") == attributeNameUnderscore);
550
520
  if (!attributeData) {
551
- const attributeNames = this.modelClassData().attributes.map((attribute) => (0, diggerize_1.digg)(attribute, "name"));
521
+ const attributeNames = this.modelClassData().attributes.map((attribute) => digg(attribute, "name"));
552
522
  throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
553
523
  }
554
524
  if (!(attributeNameUnderscore in this.changes))
@@ -634,7 +604,7 @@ class BaseModel {
634
604
  setNewModelData(model) {
635
605
  if (!("modelData" in model))
636
606
  throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
637
- this.previousModelData = Object.assign({}, (0, diggerize_1.digg)(this, "modelData"));
607
+ this.previousModelData = Object.assign({}, digg(this, "modelData"));
638
608
  for (const attributeName in model.modelData) {
639
609
  this.modelData[attributeName] = model.modelData[attributeName];
640
610
  }
@@ -721,7 +691,7 @@ class BaseModel {
721
691
  dataToUse[paramKey] = modelData;
722
692
  let response;
723
693
  try {
724
- response = await commands_pool_js_1.default.addCommand({
694
+ response = await CommandsPool.addCommand({
725
695
  args: {
726
696
  query_params: this.collection && this.collection.params(),
727
697
  save: dataToUse
@@ -748,13 +718,13 @@ class BaseModel {
748
718
  }
749
719
  }
750
720
  _refreshModelFromResponse(response) {
751
- let newModel = (0, diggerize_1.digg)(response, "model");
721
+ let newModel = digg(response, "model");
752
722
  if (Array.isArray(newModel))
753
723
  newModel = newModel[0];
754
724
  this.setNewModel(newModel);
755
725
  }
756
726
  _refreshModelDataFromResponse(response) {
757
- let newModel = (0, diggerize_1.digg)(response, "model");
727
+ let newModel = digg(response, "model");
758
728
  if (Array.isArray(newModel))
759
729
  newModel = newModel[0];
760
730
  this.setNewModelData(newModel);
@@ -766,8 +736,8 @@ class BaseModel {
766
736
  */
767
737
  static _objectDataFromGivenRawData(rawData, options) {
768
738
  if (rawData instanceof FormData || rawData.nodeName == "FORM") {
769
- const formData = form_data_objectizer_1.default.formDataFromObject(rawData, options);
770
- return form_data_objectizer_1.default.toObject(formData);
739
+ const formData = FormDataObjectizer.formDataFromObject(rawData, options);
740
+ return FormDataObjectizer.toObject(formData);
771
741
  }
772
742
  return rawData;
773
743
  }
@@ -775,7 +745,7 @@ class BaseModel {
775
745
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
776
746
  let response;
777
747
  try {
778
- response = await commands_pool_js_1.default.addCommand({
748
+ response = await CommandsPool.addCommand({
779
749
  args: {
780
750
  query_params: this.collection && this.collection.params(),
781
751
  save: objectData,
@@ -805,7 +775,7 @@ class BaseModel {
805
775
  const paramKey = this.modelClassData().paramKey;
806
776
  const dataToUse = {};
807
777
  dataToUse[paramKey] = modelData;
808
- const response = await commands_pool_js_1.default.addCommand({
778
+ const response = await CommandsPool.addCommand({
809
779
  args: {
810
780
  save: dataToUse
811
781
  },
@@ -853,7 +823,7 @@ class BaseModel {
853
823
  static async _callCollectionCommand(args, commandArgs) {
854
824
  const formOrDataObject = args.args;
855
825
  try {
856
- return await commands_pool_js_1.default.addCommand(args, commandArgs);
826
+ return await CommandsPool.addCommand(args, commandArgs);
857
827
  }
858
828
  catch (error) {
859
829
  let form;
@@ -868,6 +838,7 @@ class BaseModel {
868
838
  throw error;
869
839
  }
870
840
  }
841
+ _callMemberCommand = (args, commandArgs) => CommandsPool.addCommand(args, commandArgs);
871
842
  static _postDataFromArgs(args) {
872
843
  let postData;
873
844
  if (args) {
@@ -875,7 +846,7 @@ class BaseModel {
875
846
  postData = args;
876
847
  }
877
848
  else {
878
- postData = object_to_formdata_1.default.serialize(args, {}, null, "args");
849
+ postData = objectToFormData.serialize(args, {}, null, "args");
879
850
  }
880
851
  }
881
852
  else {
@@ -904,12 +875,12 @@ class BaseModel {
904
875
  }
905
876
  else if (this.isNewRecord()) {
906
877
  // Return null if this is a new record and the attribute name is a recognized attribute
907
- const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
878
+ const attributes = digg(this.modelClassData(), "attributes");
908
879
  if (attributeName in attributes)
909
880
  return null;
910
881
  }
911
882
  if (this.isPersisted()) {
912
- throw new attribute_not_loaded_error_1.default(`No such attribute: ${(0, diggerize_1.digg)(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
883
+ throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
913
884
  }
914
885
  }
915
886
  /**
@@ -940,7 +911,7 @@ class BaseModel {
940
911
  return this.relationshipsCache[args.reflectionName];
941
912
  }
942
913
  else {
943
- const collection = new collection_js_1.default(args, queryArgs);
914
+ const collection = new Collection(args, queryArgs);
944
915
  const model = await collection.first();
945
916
  this.relationshipsCache[args.reflectionName] = model;
946
917
  return model;
@@ -956,8 +927,8 @@ class BaseModel {
956
927
  if (this.isNewRecord())
957
928
  return null;
958
929
  const loadedRelationships = Object.keys(this.relationshipsCache);
959
- const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
960
- throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
930
+ const modelClassName = digg(this.modelClassData(), "name");
931
+ throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
961
932
  }
962
933
  /**
963
934
  * @template {typeof import("./base-model.js").default} AssocMC
@@ -972,7 +943,7 @@ class BaseModel {
972
943
  else if (args.reflectionName in this.relationshipsCache) {
973
944
  return this.relationshipsCache[args.reflectionName];
974
945
  }
975
- const collection = new collection_js_1.default(args, queryArgs);
946
+ const collection = new Collection(args, queryArgs);
976
947
  const models = await collection.toArray();
977
948
  this.relationshipsCache[args.reflectionName] = models;
978
949
  return models;
@@ -991,7 +962,7 @@ class BaseModel {
991
962
  return this.relationshipsCache[args.reflectionName];
992
963
  }
993
964
  else {
994
- const collection = new collection_js_1.default(args, queryArgs);
965
+ const collection = new Collection(args, queryArgs);
995
966
  const model = await collection.first();
996
967
  this.relationshipsCache[args.reflectionName] = model;
997
968
  return model;
@@ -1008,8 +979,8 @@ class BaseModel {
1008
979
  return null;
1009
980
  }
1010
981
  const loadedRelationships = Object.keys(this.relationshipsCache);
1011
- const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1012
- throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
982
+ const modelClassName = digg(this.modelClassData(), "name");
983
+ throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
1013
984
  }
1014
985
  _readModelDataFromArgs(args) {
1015
986
  this.abilities = args.data.b || {};
@@ -1021,21 +992,21 @@ class BaseModel {
1021
992
  if (!this.preloadedRelationships) {
1022
993
  return;
1023
994
  }
1024
- const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
995
+ const relationships = digg(this.modelClassData(), "relationships");
1025
996
  for (const relationshipName in this.preloadedRelationships) {
1026
997
  const relationshipData = this.preloadedRelationships[relationshipName];
1027
- const relationshipClassData = relationships.find((relationship) => (0, diggerize_1.digg)(relationship, "name") == relationshipName);
998
+ const relationshipClassData = relationships.find((relationship) => digg(relationship, "name") == relationshipName);
1028
999
  if (!relationshipClassData) {
1029
- const modelName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1000
+ const modelName = digg(this.modelClassData(), "name");
1030
1001
  const relationshipsList = relationships.map((relationship) => relationship.name).join(", ");
1031
1002
  throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
1032
1003
  }
1033
- const relationshipType = (0, diggerize_1.digg)(relationshipClassData, "collectionName");
1004
+ const relationshipType = digg(relationshipClassData, "collectionName");
1034
1005
  if (relationshipName in this.relationshipsCache) {
1035
1006
  throw new Error(`${relationshipName} has already been loaded`);
1036
1007
  }
1037
1008
  if (!relationshipClassData) {
1038
- throw new Error(`No relationship on ${(0, diggerize_1.digg)(this.modelClassData(), "name")} by that name: ${relationshipName}`);
1009
+ throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
1039
1010
  }
1040
1011
  if (!relationshipData) {
1041
1012
  this.relationshipsCache[relationshipName] = null;
@@ -1062,12 +1033,4 @@ class BaseModel {
1062
1033
  */
1063
1034
  primaryKey() { return this.readAttributeUnderscore(this.modelClass().primaryKey()); }
1064
1035
  }
1065
- BaseModel.apiMakerType = "BaseModel";
1066
- /**
1067
- * @param {ValidationErrors} validationErrors
1068
- * @returns {CustomEvent}
1069
- */
1070
- BaseModel.newCustomEvent = (validationErrors) => {
1071
- return new CustomEvent("validation-errors", { detail: validationErrors });
1072
- };
1073
- exports.default = BaseModel;
1036
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxPQUFPLHVCQUF1QixNQUFNLDhCQUE4QixDQUFBO0FBQ2xFLE9BQU8saUJBQWlCLE1BQU0sdUJBQXVCLENBQUE7QUFDckQsT0FBTyxVQUFVLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFDcEMsT0FBTyxjQUFjLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSxvQkFBb0IsQ0FBQTtBQUNqRCxPQUFPLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxvQkFBb0IsQ0FBQTtBQUN0QyxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUE7QUFDcEMsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFdkQ7Ozs7Ozs7O0dBUUc7QUFFSDs7OztHQUlHO0FBRUgsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNO0lBQ2hDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUVwQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FB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QUE7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBRXpDLEtBQUssTUFBTSxjQUFjLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtvQkFFbEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtnQkFFcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFBO2dCQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFBO1lBQzlDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBdHRyaWJ1dGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGVcIlxuaW1wb3J0IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yIGZyb20gXCIuL2F0dHJpYnV0ZS1ub3QtbG9hZGVkLWVycm9yXCJcbmltcG9ydCBDYWNoZUtleUdlbmVyYXRvciBmcm9tIFwiLi9jYWNoZS1rZXktZ2VuZXJhdG9yXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb24uanNcIlxuaW1wb3J0IENvbW1hbmRzUG9vbCBmcm9tIFwiLi9jb21tYW5kcy1wb29sLmpzXCJcbmltcG9ydCBDb25maWcgZnJvbSBcIi4vY29uZmlnLmpzXCJcbmltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBGb3JtRGF0YU9iamVjdGl6ZXIgZnJvbSBcImZvcm0tZGF0YS1vYmplY3RpemVyXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IE1vZGVsTmFtZSBmcm9tIFwiLi9tb2RlbC1uYW1lXCJcbmltcG9ydCBOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9ub3QtbG9hZGVkLWVycm9yXCJcbmltcG9ydCBvYmplY3RUb0Zvcm1EYXRhIGZyb20gXCJvYmplY3QtdG8tZm9ybWRhdGFcIlxuaW1wb3J0IFJlZmxlY3Rpb24gZnJvbSBcIi4vYmFzZS1tb2RlbC9yZWZsZWN0aW9uXCJcbmltcG9ydCBTY29wZSBmcm9tIFwiLi9iYXNlLW1vZGVsL3Njb3BlXCJcbmltcG9ydCBTZXJ2aWNlcyBmcm9tIFwiLi9zZXJ2aWNlcy5qc1wiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3IuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JzfSBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTW9kZWxDbGFzc0RhdGFUeXBlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIikuQXR0cmlidXRlQXJnVHlwZVtdfSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmltYXJ5S2V5XG4gKiBAcHJvcGVydHkge29iamVjdH0gcmFuc2Fja2FibGVfYXR0cmlidXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc1xuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JtXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gKi9cblxuZnVuY3Rpb24gb2JqZWN0VG9VbmRlcnNjb3JlKG9iamVjdCkge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICAvKiogQHJldHVybnMge0F0dHJpYnV0ZVtdfSAqL1xuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVLZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlS2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChhdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9XG4gICAqL1xuICBzdGF0aWMgbW9kZWxDbGFzc0RhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzc0RhdGEgc2hvdWxkIGJlIG92ZXJyaWRlbiBieSBjaGlsZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQgPSAodmFsaWRhdGlvbkVycm9ycykgPT4ge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuZm9ybV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAgICovXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHF1ZXJ5ID0ge31cblxuICAgIHF1ZXJ5W2Ake3RoaXMucHJpbWFyeUtleSgpfV9lcWBdID0gaWRcblxuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChhd2FpdCB0aGlzLnJhbnNhY2socXVlcnkpLmZpcnN0KCkpXG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZWNvcmQgbm90IGZvdW5kXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBmaW5kT3JDcmVhdGVCeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JDcmVhdGVCeShmaW5kT3JDcmVhdGVCeUFyZ3MsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNlcnZpY2VzLmN1cnJlbnQoKS5zZW5kUmVxdWVzdChcIk1vZGVsczo6RmluZE9yQ3JlYXRlQnlcIiwge1xuICAgICAgYWRkaXRpb25hbF9kYXRhOiBhcmdzLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgZmluZF9vcl9jcmVhdGVfYnlfYXJnczogZmluZE9yQ3JlYXRlQnlBcmdzLFxuICAgICAgcmVzb3VyY2VfbmFtZTogZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgIH0pXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKGRpZ2cocmVzdWx0LCBcIm1vZGVsXCIpKVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsTmFtZX0gKi9cbiAgc3RhdGljIG1vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsTmFtZSh7bW9kZWxDbGFzc0RhdGE6IHRoaXMubW9kZWxDbGFzc0RhdGEoKX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IE1DXG4gICAqIEB0aGlzIHtNQ31cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcXVlcnldXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdDxNQz59XG4gICAqL1xuICBzdGF0aWMgcmFuc2FjayhxdWVyeSA9IHt9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7TUN9ICovICh0aGlzKVxuXG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHttb2RlbENsYXNzOiBNb2RlbENsYXNzfSwge3JhbnNhY2s6IHF1ZXJ5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IE1DXG4gICAqIEB0aGlzIHtNQ31cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VsZWN0XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8TUM+fVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVBc3NvY2lhdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX2Fzc29jaWF0aW9uc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZWZsZWN0aW9ucy5wdXNoKG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEYXRhIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTY29wZVtdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVTY29wZXMoKSB7XG4gICAgY29uc3QgcmFuc2Fja2FibGVTY29wZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9zY29wZXNcIilcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzY29wZURhdGEgb2YgcmFuc2Fja2FibGVTY29wZXMpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHNjb3BlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9uW119ICovXG4gIHN0YXRpYyByZWZsZWN0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWZsZWN0aW9uID0gbmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgcmVmbGVjdGlvbnMucHVzaChyZWZsZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9ufSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbihuYW1lKSB7XG4gICAgY29uc3QgZm91bmRSZWZsZWN0aW9uID0gdGhpcy5yZWZsZWN0aW9ucygpLmZpbmQoKHJlZmxlY3Rpb24pID0+IHJlZmxlY3Rpb24ubmFtZSgpID09IG5hbWUpXG5cbiAgICBpZiAoIWZvdW5kUmVmbGVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHJlZmxlY3Rpb246ICR7bmFtZX0gaW4gJHt0aGlzLnJlZmxlY3Rpb25zKCkubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSkuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kUmVmbGVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB0aGlzLm5ld1JlY29yZCA9IGFyZ3MuaXNOZXdSZWNvcmRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHt9XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0ge31cblxuICAgIGlmIChhcmdzICYmIGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGEuYSkge1xuICAgICAgdGhpcy5fcmVhZE1vZGVsRGF0YUZyb21BcmdzKGFyZ3MpXG4gICAgfSBlbHNlIGlmIChhcmdzLmEpIHtcbiAgICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5iIHx8IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmEpXG4gICAgfSBlbHNlIGlmIChhcmdzKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbmV3QXR0cmlidXRlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3QXR0cmlidXRlc1trZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgICAgbGV0IGFwcGx5Q2hhbmdlID0gdHJ1ZVxuICAgICAgbGV0IGRlbGV0ZUNoYW5nZSA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLmlzQXR0cmlidXRlTG9hZGVkKGtleSkpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoa2V5KVxuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlVW5kZXJzY29yZV1cblxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgICBkZWxldGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXSA9IG5ld1ZhbHVlXG4gICAgICB9IGVsc2UgaWYgKGRlbGV0ZUNoYW5nZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBhdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLm1vZGVsRGF0YVtrZXldXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jaGFuZ2VzKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY2hhbmdlc1trZXldXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBnaXZlbkFiaWxpdHlOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY2FuKGdpdmVuQWJpbGl0eU5hbWUpIHtcbiAgICBjb25zdCBhYmlsaXR5TmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShnaXZlbkFiaWxpdHlOYW1lKVxuXG4gICAgaWYgKCEoYWJpbGl0eU5hbWUgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFiaWxpdHkgJHthYmlsaXR5TmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIGZvciAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hYmlsaXRpZXNbYWJpbGl0eU5hbWVdXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtCYXNlTW9kZWx9IFNlbGZcbiAgICogQHRoaXMge1NlbGZ9XG4gICAqIEByZXR1cm5zIHtTZWxmfVxuICAgKi9cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU2VsZn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTW9kZWxDbGFzcygpXG5cbiAgICBjbG9uZS5hYmlsaXRpZXMgPSB7Li4udGhpcy5hYmlsaXRpZXN9XG4gICAgY2xvbmUubW9kZWxEYXRhID0gey4uLnRoaXMubW9kZWxEYXRhfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHMgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHNDYWNoZX1cblxuICAgIHJldHVybiBjbG9uZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9ICovXG4gIGNhY2hlS2V5KCkge1xuICAgIGlmICh0aGlzLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGNvbnN0IGtleVBhcnRzID0gW1xuICAgICAgICB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXksXG4gICAgICAgIHRoaXMucHJpbWFyeUtleSgpXG4gICAgICBdXG5cbiAgICAgIGlmIChcInVwZGF0ZWRfYXRcIiBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0KClcblxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRBdCAhPSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgd2Fzbid0IGFuIG9iamVjdDogJHt0eXBlb2YgdXBkYXRlZEF0fWApXG4gICAgICAgIH0gZWxzZSBpZiAoIShcImdldFRpbWVcIiBpbiB1cGRhdGVkQXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgZGlkbid0IHN1cHBvcnQgZ2V0VGltZSB3aXRoIGNsYXNzOiAke3VwZGF0ZWRBdC5jb25zdHJ1Y3RvciAmJiB1cGRhdGVkQXQuY29uc3RydWN0b3IubmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbG9jYWxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmxvY2FsKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmdWxsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5jYWNoZUtleSgpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEByZXR1cm5zIHtDb2xsZWN0aW9uPE1DPn1cbiAgICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXR0cmlidXRlcykgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fSAqL1xuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtxdWVyeV9wYXJhbXM6IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKCl9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWRlc3Ryb3lgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJkZXN0cm95XCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBlbnN1cmVBYmlsaXRpZXMobGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgLy8gUG9wdWxhdGUgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgYWJpbGl0aWVzIGN1cnJlbnRseSBub3QgbG9hZGVkXG4gICAgY29uc3QgYWJpbGl0aWVzVG9Mb2FkID0gW11cblxuICAgIGZvciAoY29uc3QgYWJpbGl0eUluTGlzdCBvZiBsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAgIGlmICghKGFiaWxpdHlJbkxpc3QgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICAgIGFiaWxpdGllc1RvTG9hZC5wdXNoKGFiaWxpdHlJbkxpc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCB0aGUgbWlzc2luZyBhYmlsaXRpZXMgaWYgYW55XG4gICAgaWYgKGFiaWxpdGllc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcmltYXJ5S2V5TmFtZSA9IHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IHt9XG4gICAgICByYW5zYWNrUGFyYW1zW2Ake3ByaW1hcnlLZXlOYW1lfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgICAgY29uc3QgYWJpbGl0aWVzUGFyYW1zID0ge31cbiAgICAgIGFiaWxpdGllc1BhcmFtc1tkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXSA9IGFiaWxpdGllc1RvTG9hZFxuXG4gICAgICBjb25zdCBhbm90aGVyTW9kZWwgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MoKVxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKSB9XG5hc2RcbiAgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICAgIHRocm93IG5ldyBDdXN0b21FcnJvcihcIlJlc3BvbnNlIHdhc24ndCBzdWNjZXNzZnVsXCIsIHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9XG4gICAqL1xuICBpZGVudGlmaWVyS2V5KCkge1xuICAgIGlmICghdGhpcy5faWRlbnRpZmllcktleSkgdGhpcy5faWRlbnRpZmllcktleSA9IHRoaXMuaXNQZXJzaXN0ZWQoKSA/IHRoaXMucHJpbWFyeUtleSgpIDogdGhpcy51bmlxdWVLZXkoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXJLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7IHJldHVybiB0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpIHtcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25QcmVzZW50KGFzc29jaWF0aW9uTmFtZSkge1xuICAgIGlmICh0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSkgcmV0dXJuIHRydWVcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2FueX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gYXJncy5vcHRpb25zXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGh1bWFuQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3Qga2V5TmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImkxOG5LZXlcIilcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBpMThuID0gQ29uZmlnLmdldEkxOG4oKVxuXG4gICAgaWYgKGkxOG4pIHJldHVybiBpMThuLnQoYGFjdGl2ZXJlY29yZC5hdHRyaWJ1dGVzLiR7a2V5TmFtZX0uJHtCYXNlTW9kZWwuc25ha2VDYXNlKGF0dHJpYnV0ZU5hbWUpfWAsIHtkZWZhdWx0VmFsdWU6IGF0dHJpYnV0ZU5hbWV9KVxuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uaHVtYW5pemUoYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpXG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUGVyc2lzdGVkKCkgeyByZXR1cm4gIXRoaXMuaXNOZXdSZWNvcmQoKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzbmFrZUNhc2Uoc3RyaW5nKSB7IHJldHVybiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLnByZXZpb3VzTW9kZWxEYXRhKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5maW5kKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLnByZXZpb3VzTW9kZWxEYXRhKSlcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucHJldmlvdXNNb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kTmFtZSA9IGBfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlKX1DaGFuZ2VkYFxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2NoYW5nZWRNZXRob2ROYW1lXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW25hbWVdXG4gICAgfVxuICB9XG5cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRpZ2codGhpcywgXCJtb2RlbERhdGFcIikpXG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKClcbiAgICBjb25zdCByYW5zYWNrUGFyYW1zID0ge31cbiAgICByYW5zYWNrUGFyYW1zW2Ake3RoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICBsZXQgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3MoKS5yYW5zYWNrKHJhbnNhY2tQYXJhbXMpXG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBpZiAocGFyYW1zLnByZWxvYWQpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnByZWxvYWQgPSBwYXJhbXMucHJlbG9hZFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gcGFyYW1zLnNlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gcGFyYW1zLnNlbGVjdF9jb2x1bW5zXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHttb2RlbDogQmFzZU1vZGVsLCByZXNwb25zZT86IG9iamVjdH0+fVxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fVxuICAgKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAgICogICBtb2RlbDogQmFzZU1vZGVsLFxuICAgKiAgIHJlc3BvbnNlPzogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG5ld0F0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAobmV3QXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcykubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXN9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmNoYW5nZXNcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIF9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWwobmV3TW9kZWwpXG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGxldCBuZXdNb2RlbCA9IGRpZ2cocmVzcG9uc2UsIFwibW9kZWxcIilcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld01vZGVsKSkgbmV3TW9kZWwgPSBuZXdNb2RlbFswXVxuXG4gICAgdGhpcy5zZXROZXdNb2RlbERhdGEobmV3TW9kZWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IFJlY29yZDxzdHJpbmcsIGFueT59IHJhd0RhdGFcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICBzdGF0aWMgX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAocmF3RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8IHJhd0RhdGEubm9kZU5hbWUgPT0gXCJGT1JNXCIpIHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gRm9ybURhdGFPYmplY3RpemVyLmZvcm1EYXRhRnJvbU9iamVjdChyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgICByZXR1cm4gRm9ybURhdGFPYmplY3RpemVyLnRvT2JqZWN0KGZvcm1EYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByYXdEYXRhXG4gIH1cblxuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogb2JqZWN0RGF0YSxcbiAgICAgICAgICAgIHNpbXBsZV9tb2RlbF9lcnJvcnM6IG9wdGlvbnM/LnNpbXBsZU1vZGVsRXJyb3JzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgfVxuXG4gIGlzVmFsaWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIHlldFwiKVxuICB9XG5cbiAgYXN5bmMgaXNWYWxpZE9uU2VydmVyKCkge1xuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuZ2V0QXR0cmlidXRlcygpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS12YWxpZGAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcInZhbGlkXCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIHJldHVybiB7dmFsaWQ6IHJlc3BvbnNlLnZhbGlkLCBlcnJvcnM6IHJlc3BvbnNlLmVycm9yc31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0Jhc2VNb2RlbH0gU2VsZlxuICAgKiBAdGhpcyB7U2VsZn1cbiAgICogQHJldHVybnMge3R5cGVvZiBCYXNlTW9kZWwgJiAobmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU2VsZil9XG4gICAqL1xuICBtb2RlbENsYXNzKCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gIH1cblxuICBwcmVsb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUsIG1vZGVsKSB7XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwc1tCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXJrRm9yRGVzdHJ1Y3Rpb24oKSB7XG4gICAgdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBtYXJrZWRGb3JEZXN0cnVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uIHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHVuaXF1ZUtleSgpIHtcbiAgICBpZiAoIXRoaXMudW5pcXVlS2V5VmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbiA9IDUwMDAwMDAwMDAwMDAwMDBcbiAgICAgIGNvbnN0IG1heCA9IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgIGNvbnN0IHJhbmRvbUJldHdlZW4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pXG4gICAgICB0aGlzLnVuaXF1ZUtleVZhbHVlID0gcmFuZG9tQmV0d2VlblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleVZhbHVlXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX2NhbGxDb2xsZWN0aW9uQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncykge1xuICAgIGNvbnN0IGZvcm1PckRhdGFPYmplY3QgPSBhcmdzLmFyZ3NcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxldCBmb3JtXG5cbiAgICAgIGlmIChjb21tYW5kQXJncy5mb3JtKSB7XG4gICAgICAgIGZvcm0gPSBjb21tYW5kQXJncy5mb3JtXG4gICAgICB9IGVsc2UgaWYgKGZvcm1PckRhdGFPYmplY3Q/Lm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICAgIGZvcm0gPSBmb3JtT3JEYXRhT2JqZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtKSBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgb3B0aW9uczoge2Zvcm19fSlcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBfY2FsbE1lbWJlckNvbW1hbmQgPSAoYXJncywgY29tbWFuZEFyZ3MpID0+IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuXG4gIHN0YXRpYyBfcG9zdERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgbGV0IHBvc3REYXRhXG5cbiAgICBpZiAoYXJncykge1xuICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICBwb3N0RGF0YSA9IGFyZ3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3REYXRhID0gb2JqZWN0VG9Gb3JtRGF0YS5zZXJpYWxpemUoYXJncywge30sIG51bGwsIFwiYXJnc1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3REYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgcmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIC8vIFJldHVybiBudWxsIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGFuZCB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSByZWNvZ25pemVkIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlOiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IyR7YXR0cmlidXRlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbERhdGEpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIF9pc1ByZXNlbnQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmIHZhbHVlLm1hdGNoKC9eXFxzKiQvKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIF9sb2FkQmVsb25nc1RvUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbG9hZGVkUmVsYXRpb25zaGlwcyA9IE9iamVjdC5rZXlzKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuXG4gICAgdGhyb3cgbmV3IE5vdExvYWRlZEVycm9yKGAke21vZGVsQ2xhc3NOYW1lfSMke3JlZmxlY3Rpb25OYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LiBPbmx5IHRoZXNlIHdlcmUgbG9hZGVkOiAke2xvYWRlZFJlbGF0aW9uc2hpcHMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IEFzc29jTUNcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPEFzc29jTUM+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxJbnN0YW5jZVR5cGU8QXNzb2NNQz4+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzTWFueVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IEFzc29jTUNcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPEFzc29jTUM+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8QXNzb2NNQz4+fVxuICAgKi9cbiAgYXN5bmMgX2xvYWRIYXNPbmVSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG5cbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcblxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRIYXNPbmVSZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcnxzdHJpbmd9XG4gICAqL1xuICBwcmltYXJ5S2V5KCkgeyByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZSh0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KCkpIH1cbn1cbiJdfQ==