@sumaris-net/ngx-components 1.23.44 → 2.0.0-rc3

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 (739) hide show
  1. package/doc/build.md +2 -2
  2. package/doc/changelog.md +8 -0
  3. package/esm2020/public_api.mjs +278 -0
  4. package/esm2020/public_test_api.mjs +46 -0
  5. package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
  6. package/esm2020/src/app/admin/admin.module.mjs +34 -0
  7. package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
  8. package/esm2020/src/app/admin/services/person.service.mjs +161 -0
  9. package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
  10. package/esm2020/src/app/admin/users/list/users.mjs +233 -0
  11. package/esm2020/src/app/admin/users/list/users.module.mjs +58 -0
  12. package/esm2020/src/app/core/about/modal-about.mjs +71 -0
  13. package/esm2020/src/app/core/account/account.mjs +230 -0
  14. package/esm2020/src/app/core/auth/form/form-auth.mjs +131 -0
  15. package/esm2020/src/app/core/auth/modal/modal-auth.mjs +72 -0
  16. package/esm2020/src/app/core/core.module.mjs +223 -0
  17. package/esm2020/src/app/core/core.testing.module.mjs +86 -0
  18. package/esm2020/src/app/core/form/editor.class.mjs +672 -0
  19. package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +407 -0
  20. package/esm2020/src/app/core/form/entity-editor.class.mjs +646 -0
  21. package/esm2020/src/app/core/form/entity-metadata.component.mjs +25 -0
  22. package/esm2020/src/app/core/form/form-buttons-bar.component.mjs +71 -0
  23. package/esm2020/src/app/core/form/form.class.mjs +337 -0
  24. package/esm2020/src/app/core/form/form.utils.mjs +299 -0
  25. package/esm2020/src/app/core/form/list.form.mjs +222 -0
  26. package/esm2020/src/app/core/form/properties/properties.form.mjs +129 -0
  27. package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
  28. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
  29. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
  30. package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
  31. package/esm2020/src/app/core/graphql/graphql.service.mjs +730 -0
  32. package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
  33. package/esm2020/src/app/core/home/home.mjs +257 -0
  34. package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
  35. package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
  36. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +337 -0
  37. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +33 -0
  38. package/esm2020/src/app/core/menu/menu.component.mjs +317 -0
  39. package/{esm2015/src/app/core/menu/menu.model.js → esm2020/src/app/core/menu/menu.model.mjs} +0 -0
  40. package/esm2020/src/app/core/menu/menu.module.mjs +45 -0
  41. package/{esm2015/src/app/core/menu/menu.service.js → esm2020/src/app/core/menu/menu.service.mjs} +9 -7
  42. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
  43. package/esm2020/src/app/core/peer/select-peer.modal.mjs +130 -0
  44. package/esm2020/src/app/core/peer/select-peer.module.mjs +35 -0
  45. package/esm2020/src/app/core/register/confirm/confirm.mjs +81 -0
  46. package/esm2020/src/app/core/register/form/form-register.mjs +181 -0
  47. package/esm2020/src/app/core/register/modal/modal-register.mjs +52 -0
  48. package/esm2020/src/app/core/register/register.module.mjs +42 -0
  49. package/esm2020/src/app/core/services/account.service.mjs +1112 -0
  50. package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
  51. package/esm2020/src/app/core/services/base-entity-service.class.mjs +432 -0
  52. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
  53. package/{esm2015/src/app/core/services/base58.js → esm2020/src/app/core/services/base58.mjs} +0 -0
  54. package/{esm2015/src/app/core/services/config/core.config.js → esm2020/src/app/core/services/config/core.config.mjs} +0 -0
  55. package/esm2020/src/app/core/services/config.service.mjs +354 -0
  56. package/{esm2015/src/app/core/services/crypto.service.js → esm2020/src/app/core/services/crypto.service.mjs} +7 -5
  57. package/{esm2015/src/app/core/services/errors.js → esm2020/src/app/core/services/errors.mjs} +0 -0
  58. package/esm2020/src/app/core/services/local-settings.service.mjs +442 -0
  59. package/esm2020/src/app/core/services/model/account.model.mjs +50 -0
  60. package/esm2020/src/app/core/services/model/config.model.mjs +89 -0
  61. package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
  62. package/esm2020/src/app/core/services/model/entity.decorators.mjs +107 -0
  63. package/esm2020/src/app/core/services/model/entity.model.mjs +242 -0
  64. package/{esm2015/src/app/core/services/model/filter.model.js → esm2020/src/app/core/services/model/filter.model.mjs} +0 -0
  65. package/{esm2015/src/app/core/services/model/history.model.js → esm2020/src/app/core/services/model/history.model.mjs} +0 -0
  66. package/{esm2015/src/app/core/services/model/model.enum.js → esm2020/src/app/core/services/model/model.enum.mjs} +0 -0
  67. package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
  68. package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
  69. package/esm2020/src/app/core/services/model/referential.model.mjs +145 -0
  70. package/esm2020/src/app/core/services/model/settings.model.mjs +75 -0
  71. package/esm2020/src/app/core/services/network.service.mjs +595 -0
  72. package/esm2020/src/app/core/services/network.utils.mjs +16 -0
  73. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
  74. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  75. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  76. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  77. package/esm2020/src/app/core/services/platform.service.mjs +476 -0
  78. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +422 -0
  79. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
  80. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
  81. package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
  82. package/esm2020/src/app/core/services/validator/account.validator.mjs +52 -0
  83. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
  84. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
  85. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +29 -0
  86. package/esm2020/src/app/core/settings/settings.page.mjs +290 -0
  87. package/esm2020/src/app/core/table/actions-column.component.mjs +96 -0
  88. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +394 -0
  89. package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
  90. package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
  91. package/esm2020/src/app/core/table/table.class.mjs +1666 -0
  92. package/esm2020/src/app/core/table/table.utils.mjs +13 -0
  93. package/esm2020/src/app/core/table/testing/table.testing.mjs +264 -0
  94. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
  95. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.mjs +37 -0
  96. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +45 -0
  97. package/esm2020/src/app/core/text-popover/text-form.component.mjs +84 -0
  98. package/esm2020/src/app/core/text-popover/text-popover.component.mjs +92 -0
  99. package/esm2020/src/app/shared/alerts.mjs +238 -0
  100. package/esm2020/src/app/shared/audio/audio.mjs +201 -0
  101. package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
  102. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
  103. package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
  104. package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
  105. package/{esm2015/src/app/shared/constants.js → esm2020/src/app/shared/constants.mjs} +2 -1
  106. package/esm2020/src/app/shared/dates.mjs +134 -0
  107. package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
  108. package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
  109. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
  110. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
  111. package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
  112. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
  113. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
  114. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
  115. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
  116. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  117. package/esm2020/src/app/shared/events.mjs +64 -0
  118. package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
  119. package/esm2020/src/app/shared/file/file.service.mjs +117 -0
  120. package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
  121. package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
  122. package/{esm2015/src/app/shared/file/uri.utils.js → esm2020/src/app/shared/file/uri.utils.mjs} +0 -0
  123. package/{esm2015/src/app/shared/focusable.js → esm2020/src/app/shared/focusable.mjs} +0 -0
  124. package/esm2020/src/app/shared/form/field.component.mjs +244 -0
  125. package/{esm2015/src/app/shared/form/field.model.js → esm2020/src/app/shared/form/field.model.mjs} +1 -1
  126. package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
  127. package/esm2020/src/app/shared/forms.mjs +374 -0
  128. package/esm2020/src/app/shared/functions.mjs +430 -0
  129. package/{esm2015/src/app/shared/gesture/gesture-config.js → esm2020/src/app/shared/gesture/gesture-config.mjs} +7 -5
  130. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
  131. package/{esm2015/src/app/shared/graph/colors.utils.js → esm2020/src/app/shared/graph/colors.utils.mjs} +0 -0
  132. package/esm2020/src/app/shared/graph/graph-colors.mjs +254 -0
  133. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
  134. package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
  135. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  136. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
  137. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
  138. package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
  139. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +279 -0
  140. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +46 -0
  141. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
  142. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +89 -0
  143. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +33 -0
  144. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
  145. package/esm2020/src/app/shared/image/image.model.mjs +2 -0
  146. package/esm2020/src/app/shared/image/image.module.mjs +29 -0
  147. package/esm2020/src/app/shared/image/image.service.mjs +99 -0
  148. package/{esm2015/src/app/shared/inputs.js → esm2020/src/app/shared/inputs.mjs} +4 -4
  149. package/{esm2015/src/app/shared/interceptors/progess.interceptor.js → esm2020/src/app/shared/interceptors/progess.interceptor.mjs} +0 -0
  150. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
  151. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +836 -0
  152. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
  153. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
  154. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +205 -0
  155. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +157 -0
  156. package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
  157. package/esm2020/src/app/shared/material/badge/badge.test.mjs +26 -0
  158. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
  159. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
  160. package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
  161. package/esm2020/src/app/shared/material/chips/material.chips.mjs +691 -0
  162. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +136 -0
  163. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
  164. package/esm2020/src/app/shared/material/datetime/material.date.mjs +388 -0
  165. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +327 -0
  166. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +434 -0
  167. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +110 -0
  168. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +111 -0
  169. package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
  170. package/{esm2015/src/app/shared/material/duration/duration.utils.js → esm2020/src/app/shared/material/duration/duration.utils.mjs} +0 -0
  171. package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
  172. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  173. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
  174. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
  175. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +74 -0
  176. package/{esm2015/src/app/shared/material/material.animations.js → esm2020/src/app/shared/material/material.animations.mjs} +0 -0
  177. package/esm2020/src/app/shared/material/material.module.mjs +224 -0
  178. package/esm2020/src/app/shared/material/material.testing.module.mjs +145 -0
  179. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
  180. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
  181. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
  182. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
  183. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
  184. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
  185. package/{esm2015/src/app/shared/material/numpad/numpad.model.js → esm2020/src/app/shared/material/numpad/numpad.model.mjs} +1 -1
  186. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
  187. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
  188. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +42 -0
  189. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
  190. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +334 -0
  191. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +51 -0
  192. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +65 -0
  193. package/esm2020/src/app/shared/observables.mjs +96 -0
  194. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +135 -0
  195. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
  196. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +49 -0
  197. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +42 -0
  198. package/{esm2015/src/app/shared/pipes/date-from-now.pipe.js → esm2020/src/app/shared/pipes/date-from-now.pipe.mjs} +13 -12
  199. package/{esm2015/src/app/shared/pipes/duration.pipe.js → esm2020/src/app/shared/pipes/duration.pipe.mjs} +13 -12
  200. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
  201. package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
  202. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  203. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
  204. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
  205. package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
  206. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
  207. package/{esm2015/src/app/shared/pipes/number-format.pipe.js → esm2020/src/app/shared/pipes/number-format.pipe.mjs} +14 -9
  208. package/esm2020/src/app/shared/pipes/pipes.module.mjs +210 -0
  209. package/esm2020/src/app/shared/pipes/property.pipes.mjs +96 -0
  210. package/esm2020/src/app/shared/pipes/string.pipes.mjs +69 -0
  211. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
  212. package/esm2020/src/app/shared/platforms.mjs +49 -0
  213. package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
  214. package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
  215. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +331 -0
  216. package/esm2020/src/app/shared/services/progress-bar.service.mjs +32 -0
  217. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
  218. package/esm2020/src/app/shared/services/startable-service.class.mjs +105 -0
  219. package/esm2020/src/app/shared/services/storage/storage.service.mjs +132 -0
  220. package/esm2020/src/app/shared/services/storage/storage.utils.mjs +13 -0
  221. package/esm2020/src/app/shared/services/translate-context.service.mjs +81 -0
  222. package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
  223. package/esm2020/src/app/shared/services.mjs +62 -0
  224. package/esm2020/src/app/shared/shared-routing.module.mjs +63 -0
  225. package/esm2020/src/app/shared/shared.module.mjs +208 -0
  226. package/esm2020/src/app/shared/shared.testing.module.mjs +76 -0
  227. package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
  228. package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
  229. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
  230. package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
  231. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
  232. package/esm2020/src/app/shared/toolbar/toolbar.mjs +226 -0
  233. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
  234. package/{esm2015/src/app/shared/types.js → esm2020/src/app/shared/types.mjs} +0 -0
  235. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
  236. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
  237. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
  238. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
  239. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
  240. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
  241. package/esm2020/src/app/shared/validator/validators.mjs +544 -0
  242. package/{esm2015/src/app/shared/version/versions.js → esm2020/src/app/shared/version/versions.mjs} +0 -0
  243. package/esm2020/src/app/social/job/job.model.mjs +26 -0
  244. package/esm2020/src/app/social/job/job.module.mjs +35 -0
  245. package/esm2020/src/app/social/job/job.service.mjs +71 -0
  246. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +210 -0
  247. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +22 -0
  248. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +53 -0
  249. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
  250. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
  251. package/esm2020/src/app/social/message/message.form.mjs +81 -0
  252. package/esm2020/src/app/social/message/message.modal.mjs +93 -0
  253. package/esm2020/src/app/social/message/message.model.mjs +65 -0
  254. package/esm2020/src/app/social/message/message.module.mjs +35 -0
  255. package/esm2020/src/app/social/message/message.service.mjs +84 -0
  256. package/{esm2015/src/app/social/social.errors.js → esm2020/src/app/social/social.errors.mjs} +0 -0
  257. package/esm2020/src/app/social/social.module.mjs +47 -0
  258. package/esm2020/src/app/social/social.testing.module.mjs +51 -0
  259. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +108 -0
  260. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +212 -0
  261. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +228 -0
  262. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +107 -0
  263. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
  264. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
  265. package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
  266. package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
  267. package/esm2020/src/app/social/user-event/user-event.service.mjs +486 -0
  268. package/{esm2015/src/app/vendor.js → esm2020/src/app/vendor.mjs} +3 -3
  269. package/esm2020/src/environments/environment.class.mjs +5 -0
  270. package/esm2020/src/environments/environment.mjs +86 -0
  271. package/esm2020/sumaris-net.ngx-components.mjs +5 -0
  272. package/fesm2015/sumaris-net.ngx-components.mjs +33173 -0
  273. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
  274. package/fesm2020/sumaris-net.ngx-components.mjs +32440 -0
  275. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
  276. package/index.d.ts +5 -0
  277. package/package.json +27 -32
  278. package/public_api.d.ts +29 -31
  279. package/public_test_api.d.ts +37 -0
  280. package/resources/README.md +8 -0
  281. package/src/app/admin/admin-routing.module.d.ts +7 -0
  282. package/src/app/admin/admin.module.d.ts +7 -0
  283. package/src/app/admin/services/person.service.d.ts +3 -0
  284. package/src/app/admin/services/validator/person.validator.d.ts +8 -5
  285. package/src/app/admin/users/list/users.d.ts +11 -7
  286. package/src/app/admin/users/list/users.module.d.ts +14 -0
  287. package/src/app/core/about/modal-about.d.ts +3 -0
  288. package/src/app/core/account/account.d.ts +11 -8
  289. package/src/app/core/auth/form/form-auth.d.ts +6 -3
  290. package/src/app/core/auth/modal/modal-auth.d.ts +3 -0
  291. package/src/app/core/core.module.d.ts +36 -0
  292. package/src/app/core/core.testing.module.d.ts +10 -0
  293. package/src/app/core/form/editor.class.d.ts +6 -1
  294. package/src/app/core/form/entity-editor-modal.class.d.ts +7 -4
  295. package/src/app/core/form/entity-editor.class.d.ts +4 -1
  296. package/src/app/core/form/entity-metadata.component.d.ts +3 -0
  297. package/src/app/core/form/form-buttons-bar.component.d.ts +3 -0
  298. package/src/app/core/form/form.class.d.ts +12 -9
  299. package/src/app/core/form/form.utils.d.ts +5 -5
  300. package/src/app/core/form/list.form.d.ts +10 -7
  301. package/src/app/core/form/properties/properties.form.d.ts +43 -0
  302. package/src/app/core/form/properties/property.validator.d.ts +13 -0
  303. package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
  304. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  305. package/src/app/core/graphql/graphql.module.d.ts +5 -0
  306. package/src/app/core/graphql/graphql.service.d.ts +9 -2
  307. package/src/app/core/graphql/graphql.utils.d.ts +8 -0
  308. package/src/app/core/home/home.d.ts +4 -1
  309. package/src/app/core/icon/icon.component.d.ts +5 -2
  310. package/src/app/core/icon/icon.module.d.ts +7 -0
  311. package/src/app/core/install/install-upgrade-card.component.d.ts +5 -2
  312. package/src/app/core/install/install-upgrade-card.module.d.ts +10 -0
  313. package/src/app/core/menu/menu.component.d.ts +7 -5
  314. package/src/app/core/menu/menu.module.d.ts +8 -0
  315. package/src/app/core/menu/menu.service.d.ts +3 -0
  316. package/src/app/core/offline/update-offline-mode-card.component.d.ts +3 -0
  317. package/src/app/core/peer/select-peer.modal.d.ts +7 -4
  318. package/src/app/core/peer/select-peer.module.d.ts +9 -0
  319. package/src/app/core/register/confirm/confirm.d.ts +3 -0
  320. package/src/app/core/register/form/form-register.d.ts +10 -7
  321. package/src/app/core/register/modal/modal-register.d.ts +3 -0
  322. package/src/app/core/register/register.module.d.ts +12 -0
  323. package/src/app/core/services/account.service.d.ts +5 -2
  324. package/src/app/core/services/auth-guard.service.d.ts +3 -0
  325. package/src/app/core/services/base-entity-service.class.d.ts +3 -0
  326. package/src/app/core/services/base-graphql-service.class.d.ts +3 -0
  327. package/src/app/core/services/config.service.d.ts +4 -1
  328. package/src/app/core/services/crypto.service.d.ts +3 -0
  329. package/src/app/core/services/local-settings.service.d.ts +5 -1
  330. package/src/app/core/services/model/referential.model.d.ts +1 -1
  331. package/src/app/core/services/network.service.d.ts +6 -5
  332. package/src/app/core/services/pipes/account.pipes.d.ts +7 -0
  333. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +4 -0
  334. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +4 -0
  335. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +7 -0
  336. package/src/app/core/services/platform.service.d.ts +22 -21
  337. package/src/app/core/services/storage/entities-storage.service.d.ts +5 -2
  338. package/src/app/core/services/storage/entity-store.class.d.ts +3 -3
  339. package/src/app/core/services/testing/referential.validator.d.ts +8 -5
  340. package/src/app/core/services/validator/account.validator.d.ts +6 -3
  341. package/src/app/core/services/validator/base.validator.class.d.ts +8 -5
  342. package/src/app/core/services/validator/local-settings.validator.d.ts +8 -5
  343. package/src/app/core/services/validator/user-settings.validator.d.ts +6 -3
  344. package/src/app/core/settings/settings.page.d.ts +8 -5
  345. package/src/app/core/table/actions-column.component.d.ts +3 -0
  346. package/src/app/core/table/entities-table-datasource.class.d.ts +16 -15
  347. package/src/app/core/table/memory-table.class.d.ts +3 -0
  348. package/src/app/core/table/table-select-columns.component.d.ts +4 -5
  349. package/src/app/core/table/table.class.d.ts +52 -34
  350. package/src/app/core/table/table.utils.d.ts +2 -1
  351. package/src/app/core/table/testing/table.testing.d.ts +13 -15
  352. package/src/app/core/table/testing/table.testing.module.d.ts +9 -0
  353. package/src/app/core/text-popover/testing/text-popover.testing.d.ts +4 -1
  354. package/src/app/core/text-popover/testing/text-popover.testing.module.d.ts +9 -0
  355. package/src/app/core/text-popover/text-form.component.d.ts +7 -4
  356. package/src/app/core/text-popover/text-popover.component.d.ts +3 -0
  357. package/src/app/shared/alerts.d.ts +4 -4
  358. package/src/app/shared/audio/audio.d.ts +20 -11
  359. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  360. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  361. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  362. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  363. package/src/app/shared/constants.d.ts +1 -0
  364. package/src/app/shared/debug/debug.component.d.ts +13 -0
  365. package/src/app/shared/debug/debug.module.d.ts +12 -0
  366. package/src/app/shared/directives/autofocus.directive.d.ts +9 -7
  367. package/src/app/shared/directives/autotitle.directive.d.ts +3 -0
  368. package/src/app/shared/directives/directives.module.d.ts +10 -0
  369. package/src/app/shared/directives/drag-and-drop.directive.d.ts +3 -0
  370. package/src/app/shared/directives/ng-var.directive.d.ts +3 -0
  371. package/src/app/shared/directives/resizable/resizable.component.d.ts +3 -0
  372. package/src/app/shared/directives/resizable/resizable.directive.d.ts +3 -0
  373. package/src/app/shared/directives/resizable/resizable.module.d.ts +6 -0
  374. package/src/app/shared/file/file.service.d.ts +3 -0
  375. package/src/app/shared/file/file.utils.d.ts +1 -1
  376. package/src/app/shared/form/field.component.d.ts +12 -3
  377. package/src/app/shared/form/field.model.d.ts +2 -2
  378. package/src/app/shared/form/loading-spinner.d.ts +3 -0
  379. package/src/app/shared/forms.d.ts +13 -13
  380. package/src/app/shared/gesture/gesture-config.d.ts +3 -0
  381. package/src/app/shared/gesture/hammer.utils.d.ts +11 -11
  382. package/src/app/shared/graph/graph-colors.d.ts +8 -7
  383. package/src/app/shared/guard/component-dirty.guard.d.ts +3 -0
  384. package/src/app/shared/help/help.modal.d.ts +4 -1
  385. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -0
  386. package/src/app/shared/hotkeys/hotkeys.service.d.ts +4 -1
  387. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +9 -0
  388. package/src/app/shared/image/gallery/image-gallery.component.d.ts +77 -0
  389. package/src/app/shared/image/gallery/image-gallery.module.d.ts +12 -0
  390. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  391. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  392. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +15 -0
  393. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
  394. package/src/app/shared/image/image.model.d.ts +5 -0
  395. package/src/app/shared/image/image.module.d.ts +8 -0
  396. package/src/app/shared/image/image.service.d.ts +32 -0
  397. package/src/app/shared/inputs.d.ts +3 -3
  398. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
  399. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +11 -40
  400. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +19 -0
  401. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
  402. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +12 -9
  403. package/src/app/shared/material/badge/badge.directive.d.ts +28 -0
  404. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  405. package/src/app/shared/material/badge/badge.test.d.ts +12 -0
  406. package/src/app/shared/material/boolean/boolean.module.d.ts +17 -0
  407. package/src/app/shared/material/boolean/material.boolean.d.ts +7 -4
  408. package/src/app/shared/material/chips/chips.module.d.ts +19 -0
  409. package/src/app/shared/material/chips/material.chips.d.ts +11 -8
  410. package/src/app/shared/material/chips/testing/chips.test.d.ts +8 -5
  411. package/src/app/shared/material/datetime/datetime.module.d.ts +22 -0
  412. package/src/app/shared/material/datetime/material.date.d.ts +19 -18
  413. package/src/app/shared/material/datetime/material.dateshort.d.ts +10 -9
  414. package/src/app/shared/material/datetime/material.datetime.d.ts +21 -20
  415. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +11 -9
  416. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +11 -9
  417. package/src/app/shared/material/duration/duration.module.d.ts +16 -0
  418. package/src/app/shared/material/duration/material.duration.d.ts +8 -5
  419. package/src/app/shared/material/latlong/material.latlong.d.ts +8 -5
  420. package/src/app/shared/material/latlong/material.latlong.module.d.ts +17 -0
  421. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +10 -7
  422. package/src/app/shared/material/material.module.d.ts +43 -0
  423. package/src/app/shared/material/material.testing.module.d.ts +19 -0
  424. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +3 -0
  425. package/src/app/shared/material/numpad/numpad.component.d.ts +4 -1
  426. package/src/app/shared/material/numpad/numpad.container.d.ts +5 -2
  427. package/src/app/shared/material/numpad/numpad.content.d.ts +3 -0
  428. package/src/app/shared/material/numpad/numpad.directive.d.ts +4 -1
  429. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -0
  430. package/src/app/shared/material/numpad/numpad.model.d.ts +1 -1
  431. package/src/app/shared/material/numpad/numpad.module.d.ts +14 -0
  432. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +7 -4
  433. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +3 -0
  434. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +3 -0
  435. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -3
  436. package/src/app/shared/material/swipe/swipe.module.d.ts +13 -0
  437. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +7 -4
  438. package/src/app/shared/pipes/arrays.pipe.d.ts +17 -0
  439. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  440. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +4 -0
  441. package/src/app/shared/pipes/date-format.pipe.d.ts +4 -0
  442. package/src/app/shared/pipes/date-from-now.pipe.d.ts +4 -0
  443. package/src/app/shared/pipes/duration.pipe.d.ts +4 -0
  444. package/src/app/shared/pipes/file-size.pipe.d.ts +3 -0
  445. package/src/app/shared/pipes/form.pipes.d.ts +18 -5
  446. package/src/app/shared/pipes/highlight.pipe.d.ts +4 -0
  447. package/src/app/shared/pipes/latlong-format.pipe.d.ts +7 -0
  448. package/src/app/shared/pipes/maps.pipe.d.ts +10 -0
  449. package/src/app/shared/pipes/math.pipes.d.ts +10 -0
  450. package/src/app/shared/pipes/ng-init.pipe.d.ts +3 -0
  451. package/src/app/shared/pipes/number-format.pipe.d.ts +4 -0
  452. package/src/app/shared/pipes/pipes.module.d.ts +24 -0
  453. package/src/app/shared/pipes/property.pipes.d.ts +6 -0
  454. package/src/app/shared/pipes/string.pipes.d.ts +11 -0
  455. package/src/app/shared/pipes/translate-context.pipe.d.ts +7 -0
  456. package/src/app/shared/platforms.d.ts +1 -0
  457. package/src/app/shared/services/memory-entity-service.class.d.ts +3 -0
  458. package/src/app/shared/services/progress-bar.service.d.ts +4 -1
  459. package/src/app/shared/services/startable-observable-service.class.d.ts +1 -1
  460. package/src/app/shared/services/startable-service.class.d.ts +1 -1
  461. package/src/app/shared/services/storage/storage.service.d.ts +23 -0
  462. package/src/app/shared/services/storage/storage.utils.d.ts +19 -0
  463. package/src/app/shared/services/translate-context.service.d.ts +3 -0
  464. package/src/app/shared/services/validator-service.class.d.ts +2 -2
  465. package/src/app/shared/shared-routing.module.d.ts +7 -0
  466. package/src/app/shared/shared.module.d.ts +23 -0
  467. package/src/app/shared/shared.testing.module.d.ts +12 -0
  468. package/src/app/shared/testing/tests.page.d.ts +3 -0
  469. package/src/app/shared/toast/toast.testing.d.ts +6 -5
  470. package/src/app/shared/toast/toast.testing.module.d.ts +9 -0
  471. package/src/app/shared/toast/toasts.d.ts +5 -2
  472. package/src/app/shared/toolbar/modal-toolbar.d.ts +5 -2
  473. package/src/app/shared/toolbar/toolbar.d.ts +9 -5
  474. package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
  475. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +4 -1
  476. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +9 -0
  477. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +3 -0
  478. package/src/app/shared/upload-file/upload-file.component.d.ts +3 -0
  479. package/src/app/shared/validator/form-error-adapter.class.d.ts +3 -0
  480. package/src/app/shared/validator/validators.d.ts +9 -9
  481. package/src/app/social/job/job.module.d.ts +9 -0
  482. package/src/app/social/job/job.service.d.ts +3 -0
  483. package/src/app/social/job/progression/job-progression.icon.d.ts +4 -1
  484. package/src/app/social/job/progression/job-progression.list.d.ts +3 -0
  485. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -0
  486. package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -0
  487. package/src/app/social/job/testing/job.testing.module.d.ts +9 -0
  488. package/src/app/social/message/message.form.d.ts +5 -2
  489. package/src/app/social/message/message.modal.d.ts +5 -2
  490. package/src/app/social/message/message.module.d.ts +9 -0
  491. package/src/app/social/message/message.service.d.ts +3 -0
  492. package/src/app/social/social.module.d.ts +10 -0
  493. package/src/app/social/social.testing.module.d.ts +9 -0
  494. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -1
  495. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +7 -4
  496. package/src/app/social/user-event/testing/user-event.testing.d.ts +3 -0
  497. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +1 -0
  498. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +9 -0
  499. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +5 -1
  500. package/src/app/social/user-event/user-event.model.d.ts +3 -2
  501. package/src/app/social/user-event/user-event.module.d.ts +10 -0
  502. package/src/app/social/user-event/user-event.service.d.ts +16 -11
  503. package/src/assets/audio/beep-notification.mp3 +0 -0
  504. package/src/assets/i18n/fr.json +9 -2
  505. package/src/environments/environment.class.d.ts +2 -0
  506. package/src/environments/environment.d.ts +1 -1
  507. package/src/theme/_icons.scss +1 -1
  508. package/src/theme/_material.globals.scss +29 -31
  509. package/src/theme/_material.scss +32 -6
  510. package/src/theme/_mixins.scss +4 -4
  511. package/src/theme/_ngx-components.scss +27 -0
  512. package/src/theme/_print.scss +24 -0
  513. package/bundles/sumaris-net.ngx-components.umd.js +0 -35755
  514. package/bundles/sumaris-net.ngx-components.umd.js.map +0 -1
  515. package/bundles/sumaris-net.ngx-components.umd.min.js +0 -25
  516. package/bundles/sumaris-net.ngx-components.umd.min.js.map +0 -1
  517. package/esm2015/public_api.js +0 -245
  518. package/esm2015/src/app/admin/admin-routing.module.js +0 -34
  519. package/esm2015/src/app/admin/admin.module.js +0 -34
  520. package/esm2015/src/app/admin/services/filter/person.filter.js +0 -59
  521. package/esm2015/src/app/admin/services/person.service.js +0 -175
  522. package/esm2015/src/app/admin/services/validator/person.validator.js +0 -37
  523. package/esm2015/src/app/admin/users/list/users.js +0 -216
  524. package/esm2015/src/app/core/about/modal-about.js +0 -63
  525. package/esm2015/src/app/core/account/account.js +0 -240
  526. package/esm2015/src/app/core/auth/form/form-auth.js +0 -134
  527. package/esm2015/src/app/core/auth/modal/modal-auth.js +0 -78
  528. package/esm2015/src/app/core/core.module.js +0 -127
  529. package/esm2015/src/app/core/core.testing.module.js +0 -51
  530. package/esm2015/src/app/core/form/editor.class.js +0 -698
  531. package/esm2015/src/app/core/form/entity-editor-modal.class.js +0 -422
  532. package/esm2015/src/app/core/form/entity-editor.class.js +0 -676
  533. package/esm2015/src/app/core/form/entity-metadata.component.js +0 -22
  534. package/esm2015/src/app/core/form/form-buttons-bar.component.js +0 -63
  535. package/esm2015/src/app/core/form/form.class.js +0 -342
  536. package/esm2015/src/app/core/form/form.utils.js +0 -299
  537. package/esm2015/src/app/core/form/list.form.js +0 -219
  538. package/esm2015/src/app/core/form/properties.form.js +0 -119
  539. package/esm2015/src/app/core/graphql/graphql.module.js +0 -18
  540. package/esm2015/src/app/core/graphql/graphql.service.js +0 -734
  541. package/esm2015/src/app/core/graphql/graphql.utils.js +0 -106
  542. package/esm2015/src/app/core/home/home.js +0 -265
  543. package/esm2015/src/app/core/icon/icon.component.js +0 -32
  544. package/esm2015/src/app/core/icon/icon.module.js +0 -26
  545. package/esm2015/src/app/core/install/install-upgrade-card.component.js +0 -358
  546. package/esm2015/src/app/core/menu/menu.component.js +0 -329
  547. package/esm2015/src/app/core/menu/menu.module.js +0 -28
  548. package/esm2015/src/app/core/offline/update-offline-mode-card.component.js +0 -26
  549. package/esm2015/src/app/core/peer/select-peer.modal.js +0 -134
  550. package/esm2015/src/app/core/register/confirm/confirm.js +0 -86
  551. package/esm2015/src/app/core/register/form/form-register.js +0 -172
  552. package/esm2015/src/app/core/register/modal/modal-register.js +0 -55
  553. package/esm2015/src/app/core/services/account.service.js +0 -1165
  554. package/esm2015/src/app/core/services/auth-guard.service.js +0 -77
  555. package/esm2015/src/app/core/services/base-entity-service.class.js +0 -454
  556. package/esm2015/src/app/core/services/base-graphql-service.class.js +0 -221
  557. package/esm2015/src/app/core/services/config.service.js +0 -385
  558. package/esm2015/src/app/core/services/local-settings.service.js +0 -460
  559. package/esm2015/src/app/core/services/model/account.model.js +0 -50
  560. package/esm2015/src/app/core/services/model/config.model.js +0 -89
  561. package/esm2015/src/app/core/services/model/department.model.js +0 -30
  562. package/esm2015/src/app/core/services/model/entity.decorators.js +0 -104
  563. package/esm2015/src/app/core/services/model/entity.model.js +0 -245
  564. package/esm2015/src/app/core/services/model/peer.model.js +0 -68
  565. package/esm2015/src/app/core/services/model/person.model.js +0 -83
  566. package/esm2015/src/app/core/services/model/referential.model.js +0 -147
  567. package/esm2015/src/app/core/services/model/settings.model.js +0 -75
  568. package/esm2015/src/app/core/services/network.service.js +0 -631
  569. package/esm2015/src/app/core/services/network.utils.js +0 -19
  570. package/esm2015/src/app/core/services/pipes/account.pipes.js +0 -28
  571. package/esm2015/src/app/core/services/pipes/department-to-string.pipe.js +0 -18
  572. package/esm2015/src/app/core/services/pipes/person-to-string.pipe.js +0 -18
  573. package/esm2015/src/app/core/services/pipes/usage-mode.pipes.js +0 -27
  574. package/esm2015/src/app/core/services/platform.service.js +0 -549
  575. package/esm2015/src/app/core/services/storage/entities-storage.service.js +0 -452
  576. package/esm2015/src/app/core/services/storage/entity-store.class.js +0 -461
  577. package/esm2015/src/app/core/services/testing/referential-filter.model.js +0 -23
  578. package/esm2015/src/app/core/services/testing/referential.validator.js +0 -44
  579. package/esm2015/src/app/core/services/validator/account.validator.js +0 -55
  580. package/esm2015/src/app/core/services/validator/base.validator.class.js +0 -48
  581. package/esm2015/src/app/core/services/validator/local-settings.validator.js +0 -72
  582. package/esm2015/src/app/core/services/validator/user-settings.validator.js +0 -30
  583. package/esm2015/src/app/core/settings/settings.page.js +0 -305
  584. package/esm2015/src/app/core/table/actions-column.component.js +0 -74
  585. package/esm2015/src/app/core/table/entities-table-datasource.class.js +0 -405
  586. package/esm2015/src/app/core/table/memory-table.class.js +0 -59
  587. package/esm2015/src/app/core/table/table-select-columns.component.js +0 -44
  588. package/esm2015/src/app/core/table/table.class.js +0 -1677
  589. package/esm2015/src/app/core/table/table.utils.js +0 -13
  590. package/esm2015/src/app/core/table/testing/table.testing.js +0 -242
  591. package/esm2015/src/app/core/table/testing/table.testing.module.js +0 -26
  592. package/esm2015/src/app/core/text-popover/testing/text-popover.testing.js +0 -37
  593. package/esm2015/src/app/core/text-popover/testing/text-popover.testing.module.js +0 -33
  594. package/esm2015/src/app/core/text-popover/text-form.component.js +0 -72
  595. package/esm2015/src/app/core/text-popover/text-popover.component.js +0 -90
  596. package/esm2015/src/app/shared/alerts.js +0 -251
  597. package/esm2015/src/app/shared/audio/audio.js +0 -178
  598. package/esm2015/src/app/shared/dates.js +0 -134
  599. package/esm2015/src/app/shared/directives/autofocus.directive.js +0 -90
  600. package/esm2015/src/app/shared/directives/autotitle.directive.js +0 -27
  601. package/esm2015/src/app/shared/directives/directives.module.js +0 -30
  602. package/esm2015/src/app/shared/directives/drag-and-drop.directive.js +0 -43
  603. package/esm2015/src/app/shared/directives/ng-var.directive.js +0 -32
  604. package/esm2015/src/app/shared/directives/resizable/resizable.component.js +0 -54
  605. package/esm2015/src/app/shared/directives/resizable/resizable.directive.js +0 -34
  606. package/esm2015/src/app/shared/directives/resizable/resizable.module.js +0 -12
  607. package/esm2015/src/app/shared/events.js +0 -61
  608. package/esm2015/src/app/shared/file/csv.utils.js +0 -70
  609. package/esm2015/src/app/shared/file/file.service.js +0 -120
  610. package/esm2015/src/app/shared/file/file.utils.js +0 -116
  611. package/esm2015/src/app/shared/file/images.utils.js +0 -166
  612. package/esm2015/src/app/shared/form/field.component.js +0 -206
  613. package/esm2015/src/app/shared/form/loading-spinner.js +0 -24
  614. package/esm2015/src/app/shared/forms.js +0 -358
  615. package/esm2015/src/app/shared/functions.js +0 -431
  616. package/esm2015/src/app/shared/gesture/hammer.utils.js +0 -2
  617. package/esm2015/src/app/shared/graph/graph-colors.js +0 -205
  618. package/esm2015/src/app/shared/guard/component-dirty.guard.js +0 -61
  619. package/esm2015/src/app/shared/help/help.modal.js +0 -56
  620. package/esm2015/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.js +0 -20
  621. package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +0 -91
  622. package/esm2015/src/app/shared/hotkeys/shared-hotkeys.module.js +0 -29
  623. package/esm2015/src/app/shared/http/http.utils.js +0 -57
  624. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +0 -825
  625. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.module.js +0 -46
  626. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +0 -200
  627. package/esm2015/src/app/shared/material/badge/badge-icon.directive.js +0 -135
  628. package/esm2015/src/app/shared/material/badge/badge-icon.module.js +0 -23
  629. package/esm2015/src/app/shared/material/badge/badge-icon.test.js +0 -17
  630. package/esm2015/src/app/shared/material/boolean/boolean.module.js +0 -41
  631. package/esm2015/src/app/shared/material/boolean/material.boolean.js +0 -223
  632. package/esm2015/src/app/shared/material/chips/chips.module.js +0 -45
  633. package/esm2015/src/app/shared/material/chips/material.chips.js +0 -636
  634. package/esm2015/src/app/shared/material/chips/testing/chips.test.js +0 -138
  635. package/esm2015/src/app/shared/material/datetime/datetime.module.js +0 -54
  636. package/esm2015/src/app/shared/material/datetime/material.date.js +0 -375
  637. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +0 -316
  638. package/esm2015/src/app/shared/material/datetime/material.datetime.js +0 -398
  639. package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +0 -110
  640. package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +0 -108
  641. package/esm2015/src/app/shared/material/duration/duration.module.js +0 -40
  642. package/esm2015/src/app/shared/material/duration/material.duration.js +0 -246
  643. package/esm2015/src/app/shared/material/latlong/latlong.utils.js +0 -249
  644. package/esm2015/src/app/shared/material/latlong/material.latlong.js +0 -350
  645. package/esm2015/src/app/shared/material/latlong/material.latlong.module.js +0 -41
  646. package/esm2015/src/app/shared/material/latlong/testing/latlong.test.js +0 -70
  647. package/esm2015/src/app/shared/material/material.module.js +0 -93
  648. package/esm2015/src/app/shared/material/material.testing.module.js +0 -111
  649. package/esm2015/src/app/shared/material/numpad/numpad.append-to-input.directive.js +0 -96
  650. package/esm2015/src/app/shared/material/numpad/numpad.component.js +0 -73
  651. package/esm2015/src/app/shared/material/numpad/numpad.container.js +0 -149
  652. package/esm2015/src/app/shared/material/numpad/numpad.content.js +0 -14
  653. package/esm2015/src/app/shared/material/numpad/numpad.directive.js +0 -148
  654. package/esm2015/src/app/shared/material/numpad/numpad.dom-service.js +0 -37
  655. package/esm2015/src/app/shared/material/numpad/numpad.module.js +0 -39
  656. package/esm2015/src/app/shared/material/numpad/testing/numpad.test.js +0 -44
  657. package/esm2015/src/app/shared/material/paginator/material.paginator-i18n.js +0 -44
  658. package/esm2015/src/app/shared/material/stepper/material.stepper-i18n.js +0 -24
  659. package/esm2015/src/app/shared/material/swipe/material.swipe.js +0 -308
  660. package/esm2015/src/app/shared/material/swipe/swipe.module.js +0 -33
  661. package/esm2015/src/app/shared/material/swipe/testing/swipe.test.js +0 -68
  662. package/esm2015/src/app/shared/observables.js +0 -99
  663. package/esm2015/src/app/shared/pipes/arrays.pipe.js +0 -110
  664. package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +0 -50
  665. package/esm2015/src/app/shared/pipes/date-format.pipe.js +0 -43
  666. package/esm2015/src/app/shared/pipes/file-size.pipe.js +0 -58
  667. package/esm2015/src/app/shared/pipes/form.pipes.js +0 -177
  668. package/esm2015/src/app/shared/pipes/highlight.pipe.js +0 -43
  669. package/esm2015/src/app/shared/pipes/latlong-format.pipe.js +0 -36
  670. package/esm2015/src/app/shared/pipes/maps.pipe.js +0 -48
  671. package/esm2015/src/app/shared/pipes/math.pipes.js +0 -44
  672. package/esm2015/src/app/shared/pipes/ng-init.pipe.js +0 -18
  673. package/esm2015/src/app/shared/pipes/pipes.module.js +0 -117
  674. package/esm2015/src/app/shared/pipes/property.pipes.js +0 -98
  675. package/esm2015/src/app/shared/pipes/string.pipes.js +0 -53
  676. package/esm2015/src/app/shared/pipes/translate-context.pipe.js +0 -36
  677. package/esm2015/src/app/shared/platforms.js +0 -45
  678. package/esm2015/src/app/shared/services/entity-service.class.js +0 -8
  679. package/esm2015/src/app/shared/services/job.utils.js +0 -96
  680. package/esm2015/src/app/shared/services/memory-entity-service.class.js +0 -342
  681. package/esm2015/src/app/shared/services/progress-bar.service.js +0 -30
  682. package/esm2015/src/app/shared/services/startable-observable-service.class.js +0 -124
  683. package/esm2015/src/app/shared/services/startable-service.class.js +0 -110
  684. package/esm2015/src/app/shared/services/storage.utils.js +0 -41
  685. package/esm2015/src/app/shared/services/translate-context.service.js +0 -83
  686. package/esm2015/src/app/shared/services/validator-service.class.js +0 -2
  687. package/esm2015/src/app/shared/services.js +0 -61
  688. package/esm2015/src/app/shared/shared-routing.module.js +0 -54
  689. package/esm2015/src/app/shared/shared.module.js +0 -135
  690. package/esm2015/src/app/shared/shared.testing.module.js +0 -33
  691. package/esm2015/src/app/shared/testing/tests.page.js +0 -34
  692. package/esm2015/src/app/shared/toast/toast.testing.js +0 -39
  693. package/esm2015/src/app/shared/toast/toast.testing.module.js +0 -33
  694. package/esm2015/src/app/shared/toast/toasts.js +0 -119
  695. package/esm2015/src/app/shared/toolbar/modal-toolbar.js +0 -53
  696. package/esm2015/src/app/shared/toolbar/toolbar.js +0 -213
  697. package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +0 -59
  698. package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.module.js +0 -33
  699. package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +0 -98
  700. package/esm2015/src/app/shared/upload-file/upload-file.component.js +0 -202
  701. package/esm2015/src/app/shared/upload-file/upload-file.model.js +0 -20
  702. package/esm2015/src/app/shared/validator/form-error-adapter.class.js +0 -99
  703. package/esm2015/src/app/shared/validator/validators.js +0 -537
  704. package/esm2015/src/app/social/job/job.model.js +0 -26
  705. package/esm2015/src/app/social/job/job.module.js +0 -25
  706. package/esm2015/src/app/social/job/job.service.js +0 -66
  707. package/esm2015/src/app/social/job/progression/job-progression.icon.js +0 -208
  708. package/esm2015/src/app/social/job/progression/job-progression.list.js +0 -20
  709. package/esm2015/src/app/social/job/testing/job-progression.testing.js +0 -49
  710. package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +0 -52
  711. package/esm2015/src/app/social/job/testing/job.testing.module.js +0 -25
  712. package/esm2015/src/app/social/message/message.form.js +0 -73
  713. package/esm2015/src/app/social/message/message.modal.js +0 -96
  714. package/esm2015/src/app/social/message/message.model.js +0 -65
  715. package/esm2015/src/app/social/message/message.module.js +0 -25
  716. package/esm2015/src/app/social/message/message.service.js +0 -87
  717. package/esm2015/src/app/social/social.module.js +0 -28
  718. package/esm2015/src/app/social/social.testing.module.js +0 -39
  719. package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +0 -106
  720. package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +0 -203
  721. package/esm2015/src/app/social/user-event/testing/user-event.testing.js +0 -230
  722. package/esm2015/src/app/social/user-event/testing/user-event.testing.model.js +0 -103
  723. package/esm2015/src/app/social/user-event/testing/user-event.testing.module.js +0 -25
  724. package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +0 -117
  725. package/esm2015/src/app/social/user-event/user-event.model.js +0 -2
  726. package/esm2015/src/app/social/user-event/user-event.module.js +0 -27
  727. package/esm2015/src/app/social/user-event/user-event.service.js +0 -509
  728. package/esm2015/src/environments/environment.class.js +0 -5
  729. package/esm2015/src/environments/environment.js +0 -81
  730. package/esm2015/sumaris-net.ngx-components.js +0 -21
  731. package/fesm2015/sumaris-net.ngx-components.js +0 -30297
  732. package/fesm2015/sumaris-net.ngx-components.js.map +0 -1
  733. package/src/app/core/form/properties.form.d.ts +0 -40
  734. package/src/app/shared/material/badge/badge-icon.directive.d.ts +0 -28
  735. package/src/app/shared/material/badge/badge-icon.module.d.ts +0 -2
  736. package/src/app/shared/material/badge/badge-icon.test.d.ts +0 -9
  737. package/src/app/shared/services/storage.utils.d.ts +0 -13
  738. package/sumaris-net.ngx-components.d.ts +0 -20
  739. package/sumaris-net.ngx-components.metadata.json +0 -1
@@ -1,1677 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Directive, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core';
3
- import { MatPaginator } from '@angular/material/paginator';
4
- import { MatSort } from '@angular/material/sort';
5
- import { MatTable } from '@angular/material/table';
6
- import { BehaviorSubject, combineLatest, EMPTY, merge, of, Subject, Subscription } from 'rxjs';
7
- import { catchError, debounceTime, distinctUntilChanged, filter, first, map, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
8
- import { EntitiesTableDataSource } from './entities-table-datasource.class';
9
- import { SelectionModel } from '@angular/cdk/collections';
10
- import { EntityUtils } from '../services/model/entity.model';
11
- import { AlertController, ModalController, ToastController } from '@ionic/angular';
12
- import { ActivatedRoute, Router } from '@angular/router';
13
- import { TableSelectColumnsComponent } from './table-select-columns.component';
14
- import { Location } from '@angular/common';
15
- import { ErrorCodes } from '../services/errors';
16
- import { AppFormUtils } from '../form/form.utils';
17
- import { LocalSettingsService } from '../services/local-settings.service';
18
- import { TranslateService } from '@ngx-translate/core';
19
- import { MatAutocompleteConfigHolder } from '../../shared/material/autocomplete/material.autocomplete';
20
- import { createPromiseEventEmitter, emitPromiseEvent } from '../../shared/events';
21
- import { changeCaseToUnderscore, isEmptyArray, isNil, isNotNil, toBoolean } from '../../shared/functions';
22
- import { waitFor, waitForFalse, waitForTrue } from '../../shared/observables';
23
- import { Toasts } from '../../shared/toast/toasts';
24
- import { Alerts } from '../../shared/alerts';
25
- import { FormErrorTranslator } from '../../shared/validator/form-error-adapter.class';
26
- export const SETTINGS_DISPLAY_COLUMNS = 'displayColumns';
27
- export const SETTINGS_SORTED_COLUMN = 'sortedColumn';
28
- export const SETTINGS_FILTER = 'filter';
29
- export const SETTINGS_PAGE_SIZE = 'pageSize';
30
- export const DEFAULT_PAGE_SIZE = 20;
31
- export const DEFAULT_PAGE_SIZE_OPTIONS = [20, 50, 100, 200, 500];
32
- export const RESERVED_START_COLUMNS = ['select', 'id'];
33
- export const RESERVED_END_COLUMNS = ['actions'];
34
- export const DEFAULT_REQUIRED_COLUMNS = ['id'];
35
- export class CellValueChangeListener {
36
- }
37
- // @dynamic
38
- // eslint-disable-next-line @angular-eslint/directive-class-suffix
39
- export class AppTable {
40
- constructor(injector, columns, _dataSource, _filter) {
41
- this.columns = columns;
42
- this._dataSource = _dataSource;
43
- this._filter = _filter;
44
- this._initialized = false;
45
- this._subscription = new Subscription();
46
- this._cellValueChangesDefs = {};
47
- this._enabled = true;
48
- this.allowRowDetail = true;
49
- this.destroySubject = new Subject();
50
- this.excludesColumns = [];
51
- this.totalRowCount = null;
52
- this.readySubject = new BehaviorSubject(false);
53
- this.loadingSubject = new BehaviorSubject(true);
54
- this.savingSubject = new BehaviorSubject(false);
55
- this.touchedSubject = new BehaviorSubject(false);
56
- this.dirtySubject = new BehaviorSubject(false);
57
- this.errorSubject = new BehaviorSubject(undefined);
58
- this.selection = new SelectionModel(true, []);
59
- this.editedRow = undefined;
60
- this.i18nColumnPrefix = 'COMMON.';
61
- this.autoLoad = true;
62
- this.focusFirstColumn = false;
63
- this.confirmBeforeDelete = false;
64
- this.confirmBeforeCancel = false;
65
- this.undoableDeletion = false;
66
- this.propagateRowError = false;
67
- this.defaultPageSize = DEFAULT_PAGE_SIZE;
68
- this.defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
69
- this.onRefresh = new EventEmitter();
70
- this.onOpenRow = new EventEmitter();
71
- this.onNewRow = new EventEmitter();
72
- this.onStartEditingRow = new EventEmitter();
73
- this.onConfirmEditCreateRow = new EventEmitter();
74
- this.onCancelOrDeleteRow = new EventEmitter();
75
- this.onBeforeDeleteRows = createPromiseEventEmitter();
76
- this.onBeforeCancelRows = createPromiseEventEmitter();
77
- this.onBeforeSave = createPromiseEventEmitter();
78
- this.onAfterDeletedRows = new EventEmitter();
79
- this.onSort = new EventEmitter();
80
- this.onDirty = new EventEmitter();
81
- this.onError = new EventEmitter();
82
- this._paginator = null;
83
- this.route = injector.get(ActivatedRoute);
84
- this.router = injector.get(Router);
85
- this.location = injector.get(Location);
86
- this.settings = injector.get(LocalSettingsService);
87
- this.translate = injector.get(TranslateService);
88
- this.modalCtrl = injector.get(ModalController);
89
- this.alertCtrl = injector.get(AlertController);
90
- this.toastController = injector.get(ToastController);
91
- this.formErrorAdapter = injector.get(FormErrorTranslator);
92
- this.mobile = this.settings.mobile;
93
- // Autocomplete fields
94
- this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({
95
- getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b)
96
- });
97
- this.autocompleteFields = this._autocompleteConfigHolder.fields;
98
- }
99
- get error() {
100
- return this.errorSubject.value;
101
- }
102
- /**
103
- * @deprecated
104
- */
105
- get error$() {
106
- return this.errorSubject.asObservable();
107
- }
108
- set error(error) {
109
- this.setError(error);
110
- }
111
- /**
112
- * @deprecated
113
- */
114
- get loading$() {
115
- return this.loadingSubject.asObservable();
116
- }
117
- /**
118
- * @deprecated
119
- */
120
- get saving$() {
121
- return this.savingSubject.asObservable();
122
- }
123
- get firstUserColumn() {
124
- return this.displayedColumns[RESERVED_START_COLUMNS.length];
125
- }
126
- get lastUserColumn() {
127
- return this.displayedColumns[this.displayedColumns.length - RESERVED_END_COLUMNS.length - 1];
128
- }
129
- set dataSource(value) {
130
- this.setDatasource(value);
131
- }
132
- get dataSource() {
133
- return this._dataSource;
134
- }
135
- set filter(value) {
136
- this.setFilter(value);
137
- }
138
- get filter() {
139
- return this._filter;
140
- }
141
- get empty() {
142
- return this.loading || this.totalRowCount === 0;
143
- }
144
- get dirty() {
145
- return this.dirtySubject.value;
146
- }
147
- get valid() {
148
- var _a;
149
- return this.editedRow && this.editedRow.editing ? (_a = this.editedRow.validator) === null || _a === void 0 ? void 0 : _a.valid : true;
150
- }
151
- get invalid() {
152
- var _a;
153
- return this.editedRow && this.editedRow.editing ? (_a = this.editedRow.validator) === null || _a === void 0 ? void 0 : _a.invalid : false;
154
- }
155
- get pending() {
156
- var _a;
157
- return this.editedRow && this.editedRow.editing ? (_a = this.editedRow.validator) === null || _a === void 0 ? void 0 : _a.pending : false;
158
- }
159
- get touched() {
160
- return this.touchedSubject.value;
161
- }
162
- get untouched() {
163
- return !this.touchedSubject.value;
164
- }
165
- disable(opts) {
166
- if (this.sort)
167
- this.sort.disabled = true;
168
- this._enabled = false;
169
- }
170
- enable(opts) {
171
- if (this.sort)
172
- this.sort.disabled = false;
173
- this._enabled = true;
174
- }
175
- get enabled() {
176
- return this._enabled;
177
- }
178
- // FIXME: need to hidden buttons (in HTML), etc. when disabled
179
- set disabled(value) {
180
- if (value !== !this._enabled) {
181
- if (value)
182
- this.disable({ emitEvent: false });
183
- else
184
- this.enable({ emitEvent: false });
185
- }
186
- }
187
- get disabled() {
188
- return !this._enabled;
189
- }
190
- markAsDirty(opts) {
191
- if (this.dirtySubject.value !== true) {
192
- this.dirtySubject.next(true);
193
- if (!opts || opts.emitEvent !== false) {
194
- this.markForCheck();
195
- }
196
- }
197
- }
198
- markAsPristine(opts) {
199
- if (this.dirtySubject.value !== false) {
200
- this.dirtySubject.next(false);
201
- if (!opts || opts.emitEvent !== false) {
202
- this.markForCheck();
203
- }
204
- }
205
- }
206
- markAsUntouched(opts) {
207
- var _a;
208
- let needEmitEvent = false;
209
- if (this.touchedSubject.value) {
210
- this.touchedSubject.next(false);
211
- needEmitEvent = true;
212
- }
213
- if (this.dirty || (this.editedRow && this.editedRow.id !== this.previouslyEditedRowId)) {
214
- // Cancel the current editing row only if editing and if it was not previously saved
215
- if ((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) {
216
- this.dataSource.cancelOrDelete(this.editedRow);
217
- // Mark row as pristine
218
- this.checkIfRowPristine(this.editedRow, { emitEvent: false });
219
- }
220
- this.editedRow = null;
221
- needEmitEvent = true;
222
- }
223
- this.previouslyEditedRowId = undefined;
224
- if (needEmitEvent && (!opts || opts.emitEvent !== false))
225
- this.markForCheck();
226
- }
227
- /**
228
- * @deprecated prefer to use markAllAsTouched()
229
- * @param opts
230
- */
231
- markAsTouched(opts) {
232
- var _a, _b;
233
- console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');
234
- if ((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) {
235
- (_b = this.editedRow.validator) === null || _b === void 0 ? void 0 : _b.markAllAsTouched();
236
- if (!opts || opts.emitEvent !== false) {
237
- this.markForCheck();
238
- }
239
- }
240
- }
241
- markAllAsTouched(opts) {
242
- var _a, _b;
243
- if (this.touchedSubject.value !== true) {
244
- this.touchedSubject.next(true);
245
- if (!opts || opts.emitEvent !== false)
246
- this.markForCheck();
247
- }
248
- if ((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) {
249
- (_b = this.editedRow.validator) === null || _b === void 0 ? void 0 : _b.markAllAsTouched();
250
- }
251
- }
252
- markAsSaving(opts) {
253
- if (this.savingSubject.value !== true) {
254
- this.focusColumn = undefined; // unselect focus column
255
- this.savingSubject.next(true);
256
- if (!opts || opts.emitEvent !== false)
257
- this.markForCheck();
258
- }
259
- }
260
- markAsSaved(opts) {
261
- if (this.savingSubject.value !== false) {
262
- this.savingSubject.next(false);
263
- if (!opts || opts.emitEvent !== false)
264
- this.markForCheck();
265
- }
266
- }
267
- markAsLoading(opts) {
268
- this.setLoading(true, opts);
269
- }
270
- markAsLoaded(opts) {
271
- this.setLoading(false, opts);
272
- }
273
- markAsReady(opts) {
274
- if (this.readySubject.value !== true) {
275
- this.readySubject.next(true);
276
- // If subclasses implements OnReady
277
- if (typeof this['ngOnReady'] === 'function') {
278
- this.ngOnReady();
279
- }
280
- }
281
- }
282
- get loading() {
283
- return this.loadingSubject.value;
284
- }
285
- get loaded() {
286
- return !this.loadingSubject.value;
287
- }
288
- enableSort() {
289
- if (this.sort)
290
- this.sort.disabled = false;
291
- }
292
- disableSort() {
293
- if (this.sort)
294
- this.sort.disabled = true;
295
- }
296
- set pageSize(value) {
297
- this.defaultPageSize = value;
298
- if (this.paginator) {
299
- this.paginator.pageSize = value;
300
- }
301
- }
302
- get pageSize() {
303
- return this.paginator && this.paginator.pageSize || this.defaultPageSize || DEFAULT_PAGE_SIZE;
304
- }
305
- get pageOffset() {
306
- return this.paginator && this.paginator.pageIndex * this.paginator.pageSize || 0;
307
- }
308
- get sortActive() {
309
- return this.sort && this.sort.active;
310
- }
311
- get sortDirection() {
312
- return this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc') || undefined;
313
- }
314
- set paginator(value) {
315
- this._paginator = value;
316
- }
317
- get paginator() {
318
- return this._paginator || this.childPaginator;
319
- }
320
- ngOnInit() {
321
- var _a;
322
- if (this._initialized)
323
- return; // Init only once
324
- this._initialized = true;
325
- // Set defaults
326
- this.readOnly = toBoolean(this.readOnly, ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.config.readOnly) || false); // read/write by default
327
- this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly
328
- this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly
329
- this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly
330
- this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly
331
- this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);
332
- this.errorTranslatorOptions = this.errorTranslatorOptions || { separator: ', ', controlPathTranslator: this }; // Can be override in subclasses constructors
333
- // Check ask user confirmation is possible
334
- if (this.confirmBeforeDelete && !this.alertCtrl)
335
- throw Error('Missing \'alertCtrl\' or \'injector\' in component\'s constructor.');
336
- // Defined unique id for settings for the page
337
- this.settingsId = this.settingsId || this.generateTableId();
338
- this.displayedColumns = this.getDisplayColumns();
339
- // Load the sorted columns, from settings
340
- {
341
- const sortedColumn = this.getSortedColumn();
342
- this.defaultSortBy = sortedColumn.id;
343
- this.defaultSortDirection = sortedColumn.start;
344
- }
345
- this.defaultPageSize = this.getPageSize();
346
- // Propagate error to event emitter
347
- this.registerSubscription(this.errorSubject
348
- .subscribe(value => this.onError.emit(value)));
349
- // Propagate dirty to event emitter
350
- this.registerSubscription(this.dirtySubject
351
- .subscribe(value => this.onDirty.emit(value)));
352
- // Propagate row dirty state to table
353
- this.registerSubscription(this.onStartEditingRow
354
- .pipe(filter(row => (row === null || row === void 0 ? void 0 : row.validator) && true), mergeMap(row => row.validator.valueChanges
355
- .pipe(takeUntil(
356
- // Stop if next another row, or destroying
357
- combineLatest([
358
- this.onStartEditingRow,
359
- this.destroySubject
360
- ])
361
- // DEBUG
362
- //.pipe(
363
- // tap(() => console.debug('TODO stopping previous row listener'))
364
- //)
365
- ), map(() => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; }), filter(dirty => dirty === true), first())))
366
- .subscribe(() => this.markAsDirty()));
367
- // Call datasource refresh, on each refresh events
368
- this.registerSubscription(this.onRefresh
369
- .pipe(startWith(this.autoLoad ? {} : 'skip'), switchMap((event) => {
370
- this.dirtySubject.next(false);
371
- this.selection.clear();
372
- if (event === 'skip') {
373
- return of(undefined);
374
- }
375
- if (!this._dataSource) {
376
- if (this.debug)
377
- console.debug('[table] Skipping data load: no dataSource defined');
378
- return of(undefined);
379
- }
380
- if (this.debug)
381
- console.debug('[table] Calling dataSource.watchAll()...');
382
- return this._dataSource.watchAll(this.pageOffset, this.pageSize, this.sortActive, this.sortDirection, this._filter);
383
- }), catchError(err => {
384
- if (this.debug)
385
- console.error(err);
386
- this.setError(err && err.message || err);
387
- return of(undefined); // Continue
388
- }))
389
- .subscribe(res => this.updateView(res)));
390
- // Listen dataSource loading events
391
- if (this._dataSource)
392
- this.listenDatasourceLoading(this._dataSource);
393
- }
394
- ngAfterViewInit() {
395
- // Detect when super.ngOnInit() not call
396
- if (this.debug && !this.displayedColumns)
397
- console.warn(`[table] Missing 'displayedColumns'. Did you call super.ngOnInit() in component ${this.constructor.name} ?`);
398
- // Start listening sort and paginator events
399
- this.listenSortAndPaginationEvents();
400
- }
401
- ngOnDestroy() {
402
- this._subscription.unsubscribe();
403
- // Unsubscribe column value changes
404
- Object.keys(this._cellValueChangesDefs).forEach(col => this.stopCellValueChanges(col, true));
405
- this._cellValueChangesDefs = {};
406
- this.readySubject.unsubscribe();
407
- this.loadingSubject.unsubscribe();
408
- this.savingSubject.unsubscribe();
409
- this.errorSubject.unsubscribe();
410
- this.dirtySubject.unsubscribe();
411
- this.onRefresh.unsubscribe();
412
- this.onOpenRow.unsubscribe();
413
- this.onNewRow.unsubscribe();
414
- this.onStartEditingRow.unsubscribe();
415
- this.onConfirmEditCreateRow.unsubscribe();
416
- this.onCancelOrDeleteRow.unsubscribe();
417
- this.onBeforeDeleteRows.unsubscribe();
418
- this.onBeforeCancelRows.unsubscribe();
419
- this.onBeforeSave.unsubscribe();
420
- this.onAfterDeletedRows.unsubscribe();
421
- this.onSort.unsubscribe();
422
- this.onDirty.unsubscribe();
423
- this.onError.unsubscribe();
424
- this.destroySubject.next();
425
- this.destroySubject.unsubscribe();
426
- }
427
- updateView(res, opts) {
428
- return __awaiter(this, void 0, void 0, function* () {
429
- if (!res)
430
- return; // Skip (e.g error)
431
- if (res && res.data) {
432
- this.visibleRowCount = res.data.length;
433
- this.totalRowCount = isNotNil(res.total) ? res.total : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE) || 0) + this.visibleRowCount);
434
- if (this.debug)
435
- console.debug(`[table] ${res.data.length} rows loaded`);
436
- }
437
- else {
438
- //if (this.debug) console.debug('[table] NO rows loaded');
439
- this.totalRowCount = 0;
440
- this.visibleRowCount = 0;
441
- }
442
- if (!opts || opts.emitEvent !== false) {
443
- this.markAsUntouched({ emitEvent: false });
444
- this.markAsPristine({ emitEvent: false });
445
- this.markAsLoaded({ emitEvent: false });
446
- }
447
- this.markForCheck();
448
- });
449
- }
450
- setDatasource(datasource) {
451
- if (this._dataSource)
452
- throw new Error('[table] dataSource already set !');
453
- if (datasource && this._dataSource !== datasource) {
454
- this._dataSource = datasource;
455
- if (this._initialized)
456
- this.listenDatasourceLoading(datasource);
457
- }
458
- }
459
- resetDataSource() {
460
- if (this._dataSourceLoadingSubscription) {
461
- this._dataSourceLoadingSubscription.unsubscribe();
462
- this._subscription.remove(this._dataSourceLoadingSubscription);
463
- }
464
- //this._dataSource?.close();
465
- this._dataSource = null;
466
- }
467
- addColumnDef(column) {
468
- this.table.addColumnDef(column);
469
- }
470
- removeColumnDef(column) {
471
- this.table.removeColumnDef(column);
472
- }
473
- setFilter(filter, opts) {
474
- opts = opts || { emitEvent: true };
475
- if (this.saveBeforeFilter) {
476
- // if a dirty table is to be saved before filter
477
- if (this.dirty) {
478
- // Save
479
- this.saveBeforeAction('filter').then(saved => {
480
- // Apply filter only if user didn't cancel the save or the save is ok
481
- if (saved) {
482
- this.applyFilter(filter, opts);
483
- }
484
- });
485
- }
486
- else {
487
- // apply filter on non dirty table
488
- this.applyFilter(filter, opts);
489
- }
490
- }
491
- else {
492
- // apply filter directly
493
- this.applyFilter(filter, opts);
494
- }
495
- }
496
- confirmAndAdd(event, row) {
497
- if (!this.confirmEditCreate(event, row)) {
498
- return false;
499
- }
500
- // Add row
501
- return this.addRow(event);
502
- }
503
- confirmAndBackward(event, row) {
504
- var _a, _b;
505
- // Deleting edited row, if empty and not dirty
506
- const previousRow = this.editedRow;
507
- if (previousRow && (previousRow.id === -1) && ((_a = previousRow.validator) === null || _a === void 0 ? void 0 : _a.invalid) && !((_b = previousRow.validator) === null || _b === void 0 ? void 0 : _b.dirty)) {
508
- this.deleteNewRow(event, previousRow);
509
- // Wait deletion is done, then edit previous row (by id, because of reloading)
510
- this.waitIdle()
511
- .then(() => this.editRowById(event, row.id, { focusColumn: this.lastUserColumn }));
512
- return true;
513
- }
514
- // Edit previous row
515
- this.editRow(event, row, { focusColumn: this.lastUserColumn });
516
- return true;
517
- }
518
- confirmAndForward(event, row) {
519
- var _a;
520
- row = row || this.editedRow;
521
- if (!this.confirmEditCreate(event, row)) {
522
- // If pending: Wait end of validation, then loop
523
- if ((_a = row.validator) === null || _a === void 0 ? void 0 : _a.pending) {
524
- return AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmAndForward(event, row));
525
- }
526
- return false;
527
- }
528
- // Edit next row
529
- this.editRowById(event, row.id + 1, { focusColumn: this.firstUserColumn });
530
- return true;
531
- }
532
- /**
533
- * Confirm the creation of the given row, or if not specified the currently edited row
534
- *
535
- * @param event
536
- * @param row
537
- */
538
- confirmEditCreate(event, row) {
539
- var _a;
540
- row = row || this.editedRow;
541
- if (!row || !row.editing)
542
- return true; // no row to confirm
543
- // Stop event
544
- event === null || event === void 0 ? void 0 : event.stopPropagation();
545
- // Confirmation edition or creation
546
- // TODO: add await ?
547
- const confirmed = row.confirmEditCreate();
548
- if (confirmed) {
549
- // If edit finished, forget edited row
550
- if (row === this.editedRow) {
551
- this.editedRow = undefined;
552
- }
553
- // Mark table as dirty (if row is dirty)
554
- if ((_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty) {
555
- this.markAsDirty({ emitEvent: false /* because of resetError() */ });
556
- }
557
- // Clear error
558
- this.resetError();
559
- // Emit the confirm event
560
- this.onConfirmEditCreateRow.next(row);
561
- return true; // Continue
562
- }
563
- if (row.validator) {
564
- // If pending: Wait end of validation, then loop
565
- // TODO: remove when using async isValid() function
566
- if (row.validator.pending) {
567
- AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmEditCreate(event, row));
568
- return false;
569
- }
570
- // NOT confirmed = row has error
571
- if (this.debug) {
572
- console.warn('[table] Cannot confirm row, because invalid');
573
- AppFormUtils.logFormErrors(row.validator, '[table] ');
574
- }
575
- // fix: mark all controls as touched to show errors
576
- row.validator.markAllAsTouched();
577
- // Compute row error, and propagate to table's error
578
- if (this.propagateRowError) {
579
- const error = this.getRowError(row);
580
- this.setError(error);
581
- }
582
- }
583
- return false;
584
- }
585
- cancelOrDelete(event, row, opts) {
586
- // Delete new row
587
- if (row.id === -1) {
588
- this.deleteNewRow(event, row);
589
- }
590
- // Delete existing (bu not editing) row
591
- else if (!row.editing) {
592
- this.deleteExistingRow(event, row, opts);
593
- }
594
- // Cancel existing (and editing) row
595
- else {
596
- this.cancelExistingRow(event, row, opts);
597
- }
598
- }
599
- addRow(event, insertAt, opts) {
600
- if (this.debug)
601
- console.debug('[table] Asking for new row...');
602
- if (!this._enabled)
603
- return false;
604
- // Use modal if inline edition is disabled
605
- if (!this.inlineEdition) {
606
- this.openNewRowDetail(event);
607
- return false;
608
- }
609
- // Try to finish edited row first
610
- if (!this.confirmEditCreate()) {
611
- return false;
612
- }
613
- // Add new row
614
- this.addRowToTable(insertAt, opts);
615
- return true;
616
- }
617
- save(opts) {
618
- var _a, _b, _c, _d;
619
- return __awaiter(this, void 0, void 0, function* () {
620
- opts = Object.assign({ keepEditing: this.keepEditedRowOnSave }, opts);
621
- if (this.readOnly) {
622
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
623
- }
624
- this.resetError();
625
- // Keep edited row id (should be done BEFORE confirmEditCreate() )
626
- this.previouslyEditedRowId = opts.keepEditing ? ((((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.editing) ? this.editedRow.id : undefined) || ((_b = this.singleSelectedRow) === null || _b === void 0 ? void 0 : _b.id)) : undefined;
627
- const previouslyEditedData = opts.keepEditing ? (isNotNil(this.previouslyEditedRowId) && ((_c = this.editedRow) === null || _c === void 0 ? void 0 : _c.currentData) || ((_d = this.singleSelectedRow) === null || _d === void 0 ? void 0 : _d.currentData)) : undefined;
628
- if (!this.confirmEditCreate()) {
629
- throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };
630
- }
631
- // Mark as saving
632
- this.markAsSaving();
633
- try {
634
- // Calling service save()
635
- if (this.debug)
636
- console.debug('[table] Calling dataSource.save()...');
637
- const isOK = yield this._dataSource.save();
638
- if (isOK)
639
- this.markAsPristine();
640
- return isOK;
641
- }
642
- catch (err) {
643
- this.setError(err && err.message || err);
644
- throw err;
645
- }
646
- finally {
647
- this.markAsSaved();
648
- // Restore previous row
649
- if (isNotNil(this.previouslyEditedRowId)) {
650
- yield this.selectRowByIdOrData(this.previouslyEditedRowId, previouslyEditedData);
651
- }
652
- }
653
- });
654
- }
655
- cancel(event, opts) {
656
- // Check confirmation
657
- if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
658
- event === null || event === void 0 ? void 0 : event.stopPropagation();
659
- this.canCancelRows().then(confirm => {
660
- // If confirmed, loop
661
- if (confirm)
662
- this.cancel(null, { interactive: false });
663
- });
664
- return;
665
- }
666
- this.onRefresh.emit();
667
- }
668
- duplicateRow(event, row, opts) {
669
- var _a;
670
- return __awaiter(this, void 0, void 0, function* () {
671
- event === null || event === void 0 ? void 0 : event.stopPropagation();
672
- row = row || this.singleSelectedRow;
673
- if (!row || !this.confirmEditCreate(event, row)) {
674
- return false;
675
- }
676
- const newRow = yield this.addRowToTable(row.id + 1);
677
- const json = Object.assign(Object.assign({}, row.currentData), { id: null });
678
- // Reset some properties (e.g. rankOrder, etc)
679
- if (opts && opts.skipProperties) {
680
- const newData = newRow.currentData;
681
- opts.skipProperties.forEach(key => json[key] = newData[key]);
682
- }
683
- if (newRow.validator) {
684
- newRow.validator.patchValue(json);
685
- newRow.validator.markAsDirty();
686
- }
687
- else {
688
- if ((_a = newRow.currentData) === null || _a === void 0 ? void 0 : _a.fromObject) {
689
- newRow.currentData.fromObject(json);
690
- }
691
- else {
692
- newRow.currentData = json;
693
- }
694
- this.markAsDirty();
695
- }
696
- // select
697
- this.clickRow(undefined, newRow);
698
- });
699
- }
700
- /** Whether the number of selected elements matches the total number of rows. */
701
- isAllSelected() {
702
- // DEBUG
703
- //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);
704
- return this.selection.selected.length === this.totalRowCount ||
705
- this.selection.selected.length === this.visibleRowCount;
706
- }
707
- /** Selects all rows if they are not all selected; otherwise clear selection. */
708
- masterToggle() {
709
- return __awaiter(this, void 0, void 0, function* () {
710
- if (this.loading)
711
- return;
712
- if (this.isAllSelected()) {
713
- this.selection.clear();
714
- }
715
- else {
716
- const rows = this._dataSource.getRows();
717
- rows.forEach(row => this.selection.select(row));
718
- }
719
- });
720
- }
721
- deleteSelection(event) {
722
- return this.deleteRows(event, this.selection.selected);
723
- }
724
- /**
725
- *
726
- * @param event
727
- * @param row
728
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
729
- * And to force deletion even if table is busy
730
- */
731
- deleteRow(event, row, opts) {
732
- return __awaiter(this, void 0, void 0, function* () {
733
- const deleteCount = yield this.deleteRows(event, [row], opts);
734
- return deleteCount === 1;
735
- });
736
- }
737
- /**
738
- *
739
- * @param event
740
- * @param rows
741
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
742
- * And to force deletion even if table is busy
743
- */
744
- deleteRows(event, rows, opts) {
745
- var _a;
746
- return __awaiter(this, void 0, void 0, function* () {
747
- if (this.readOnly) {
748
- throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };
749
- }
750
- if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
751
- return 0; // SKip
752
- event === null || event === void 0 ? void 0 : event.preventDefault();
753
- if (!this._enabled || isEmptyArray(rows))
754
- return 0; // Skip is disabled, or no rows to delete
755
- if (this.loading && (!opts || opts.interactive !== false)) {
756
- console.warn('[app-table] Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion');
757
- return 0; // Skip if loading
758
- }
759
- // Make sure to keep newly created row
760
- if (((_a = this.editedRow) === null || _a === void 0 ? void 0 : _a.id) === -1 && this.editedRow.editing && !rows.includes(this.editedRow)) {
761
- const confirmed = this.confirmEditCreate();
762
- if (!confirmed)
763
- return 0; // Cannot delete (e.g. edited row is invalid)
764
- }
765
- // Check if can delete
766
- const canDelete = yield this.canDeleteRows(rows, opts);
767
- if (!canDelete)
768
- return 0; // Cannot delete
769
- // Reverse row order (on a copy)
770
- // This is a workaround, need because row.delete() has async execution
771
- // and index cache is updated with a delay
772
- let tempRows = rows.slice()
773
- .sort((a, b) => a.id > b.id ? -1 : 1);
774
- let deletedRows = [];
775
- // If data need to be saved first
776
- if (this.saveBeforeDelete) {
777
- // Exclude invalid rows (because of save() will fail, when exists some invalid rows)
778
- tempRows = tempRows.filter(row => {
779
- // Delete the row :
780
- // - if newly created row (id = -1),
781
- // - or if invalid and not editing (= not cancellable)
782
- if (row.id === -1 || (!row.editing && row.invalid /*do not use !valid because if row is disabled, it will be always !valid */)) {
783
- if (this.debug)
784
- console.debug(`[table] Delete row #${row.id}`);
785
- row.delete();
786
- this.visibleRowCount--;
787
- this.totalRowCount--;
788
- deletedRows.push(row);
789
- if (this.editedRow === row)
790
- this.editedRow = undefined;
791
- return false; // Exclude from the list to delete using the service
792
- }
793
- // Cancel the row (and mark as pristine), when not valid but in edition
794
- else if (row.editing && !row.valid) {
795
- row.cancel();
796
- // Mark row as pristine (if possible)
797
- this.checkIfRowPristine(row, { emitEvent: false, onlySelf: true /*avoid propagation to table*/ });
798
- return true; // Keep the row. the row will be deleted after the save
799
- }
800
- return true;
801
- });
802
- // Apply save, only if there is still some rows to delete
803
- // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)
804
- if (deletedRows.length || tempRows.length) {
805
- // Save data (e.g. when using memory service)
806
- const saved = yield this.saveBeforeAction('delete');
807
- if (!saved) {
808
- // Stop if save cancelled or save failed
809
- return;
810
- }
811
- }
812
- }
813
- try {
814
- // Apply deletion on datasource
815
- // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)
816
- if (tempRows.length) {
817
- if (this.debug)
818
- console.debug(`[table] Delete ${tempRows.length} rows...`);
819
- yield this._dataSource.deleteAll(tempRows);
820
- }
821
- // DO not update manually, because watchALl().subscribe() will update this count
822
- //this.totalRowCount -= deleteCount;
823
- //this.visibleRowCount -= deleteCount;
824
- this.selection.clear();
825
- this.editedRow = undefined;
826
- this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
827
- this.markForCheck();
828
- this.onAfterDeletedRows.next(rows);
829
- return rows.length;
830
- }
831
- catch (err) {
832
- this.setError(err && err.message || err);
833
- throw err;
834
- }
835
- });
836
- }
837
- selectRowById(id) {
838
- return __awaiter(this, void 0, void 0, function* () {
839
- if (id === undefined)
840
- return false;
841
- yield this.waitIdle();
842
- const row = this.dataSource.getRow(id);
843
- if (!row)
844
- return false;
845
- return this.clickRow(null, row);
846
- });
847
- }
848
- /**
849
- * Try to select row by data. Will use dataEquals() (that call EntityUtils.equals()) to find same row's data
850
- * @param data
851
- */
852
- selectRowByData(data) {
853
- return __awaiter(this, void 0, void 0, function* () {
854
- if (data === undefined)
855
- return Promise.resolve(false);
856
- yield this.waitIdle();
857
- const row = this.dataSource.getRows()
858
- .find(row => this.equals(row.currentData, data));
859
- if (!row)
860
- return false;
861
- return this.clickRow(null, row);
862
- });
863
- }
864
- clickRow(event, row) {
865
- if (this.loading) {
866
- // Wait while loading, and loop
867
- if (this.debug)
868
- console.debug("[table] Waiting before apply clickRow() (datasource is busy)...");
869
- this.waitIdle().then(() => this.clickRow(event, row));
870
- return false;
871
- }
872
- // DEBUG
873
- //console.debug("[table] Detect click on row");
874
- if (row.id === -1 || row.editing)
875
- return true; // Already in edition
876
- if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
877
- return false; // Cancelled by event
878
- // Open the detail page (if not inline editing)
879
- if (!this.inlineEdition) {
880
- if (event) {
881
- event.stopPropagation();
882
- event.preventDefault();
883
- }
884
- this.markAsLoading();
885
- this.openRow(row.currentData.id, row)
886
- .then(() => this.markAsLoaded())
887
- .catch(() => this.markAsLoaded());
888
- return true;
889
- }
890
- // Start editing row
891
- return this.editRow(event, row, { focusColumn: undefined /*force to use the click target*/ });
892
- }
893
- moveRow(id, direction) {
894
- this.dataSource.move(id, direction);
895
- }
896
- ready(opts) {
897
- return waitForTrue(this.readySubject, opts);
898
- }
899
- waitIdle(opts) {
900
- return waitForFalse(this.loadingSubject, opts);
901
- }
902
- openSelectColumnsModal(event) {
903
- return __awaiter(this, void 0, void 0, function* () {
904
- // Copy current columns (deep copy)
905
- const columns = this.getCurrentColumns();
906
- const hasTopModal = !!(yield this.modalCtrl.getTop());
907
- const modal = yield this.modalCtrl.create({
908
- component: TableSelectColumnsComponent,
909
- componentProps: { columns },
910
- cssClass: hasTopModal && 'stack-modal'
911
- });
912
- // Open the modal
913
- yield modal.present();
914
- // On dismiss
915
- const { data } = yield modal.onDidDismiss();
916
- if (!data)
917
- return; // CANCELLED
918
- // Apply columns
919
- const userColumns = (data || []).filter(c => c.canHide === false || c.visible).map(c => c.name) || [];
920
- this.displayedColumns = RESERVED_START_COLUMNS.concat(userColumns).concat(RESERVED_END_COLUMNS);
921
- this.markForCheck();
922
- // Update user settings
923
- yield this.settings.savePageSetting(this.settingsId, userColumns, SETTINGS_DISPLAY_COLUMNS);
924
- });
925
- }
926
- trackByFn(index, row) {
927
- return row.id;
928
- }
929
- doRefresh(event) {
930
- this.onRefresh.emit(event);
931
- // When target wait for a complete (e.g. IonRefresher)
932
- if ((event === null || event === void 0 ? void 0 : event.target) && event.target.complete) {
933
- setTimeout(() => __awaiter(this, void 0, void 0, function* () {
934
- yield this.waitIdle();
935
- event.target.complete();
936
- }));
937
- }
938
- }
939
- getCurrentColumns() {
940
- const hiddenColumns = this.columns.slice(RESERVED_START_COLUMNS.length)
941
- .filter(name => this.displayedColumns.indexOf(name) === -1);
942
- return this.displayedColumns
943
- .concat(hiddenColumns)
944
- .filter(name => !RESERVED_START_COLUMNS.includes(name) && !RESERVED_END_COLUMNS.includes(name)
945
- && !this.excludesColumns.includes(name))
946
- .map(name => ({
947
- name,
948
- label: this.getI18nColumnName(name),
949
- visible: this.displayedColumns.indexOf(name) !== -1,
950
- canHide: this.getRequiredColumns().indexOf(name) === -1
951
- }));
952
- }
953
- escapeEditingRow(event, row) {
954
- row = row || this.editedRow;
955
- if (!row || !row.editing)
956
- return;
957
- // DEBUG
958
- //console.debug('[app-table] Cancel the row (keydown.escape)');
959
- if (event) {
960
- // Avoid to cancel the editor
961
- event.preventDefault();
962
- event.stopPropagation();
963
- }
964
- // If new row (no id)
965
- if (row.id === -1) {
966
- if (row.validator) {
967
- // If pending: Wait end of validation, then loop
968
- if (row.validator.pending) {
969
- AppFormUtils.waitWhilePending(row.validator).then(() => this.escapeEditingRow(event, row));
970
- return;
971
- }
972
- // Row is invalid: delete the row
973
- if (row.validator.invalid) {
974
- this.deleteNewRow(event, row);
975
- return;
976
- }
977
- }
978
- }
979
- // If the row exists (has an id)
980
- else {
981
- // need to call cancel function (if confirmation will be call before before)
982
- if (this.confirmBeforeCancel) {
983
- this.cancelExistingRow(event, row, { keepEditing: false });
984
- return;
985
- }
986
- }
987
- // By default, try to confirm the row
988
- this.confirmEditCreate(event, row);
989
- }
990
- translateControlPath(path) {
991
- // Can be override by subclasses, to resolve all field name
992
- var _a;
993
- // Use columns key, has default name
994
- const i18nColumnKey = this.getI18nColumnName(path);
995
- return ((_a = this.translate) === null || _a === void 0 ? void 0 : _a.instant(i18nColumnKey)) || i18nColumnKey;
996
- }
997
- /* -- protected method -- */
998
- editRow(event, row, opts) {
999
- if (!this._enabled)
1000
- return false;
1001
- if (this.editedRow === row)
1002
- return true; // Already the edited row
1003
- if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
1004
- return false;
1005
- if (!this.confirmEditCreate()) {
1006
- return false;
1007
- }
1008
- if (!row.editing && !this.loading) {
1009
- this.focusColumn = opts && opts.focusColumn || this.focusColumn;
1010
- this._dataSource.startEdit(row);
1011
- }
1012
- this.editedRow = row;
1013
- this.onStartEditingRow.emit(row);
1014
- return true;
1015
- }
1016
- /**
1017
- * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()
1018
- * @param id
1019
- * @param data
1020
- * @protected
1021
- */
1022
- selectRowByIdOrData(id, data) {
1023
- return __awaiter(this, void 0, void 0, function* () {
1024
- let done = false;
1025
- try {
1026
- // Select by row id (if NOT a new row)
1027
- if (isNotNil(id) || id !== -1) {
1028
- done = yield this.selectRowById(id);
1029
- if (done)
1030
- return true;
1031
- console.warn('[app-table] Save: Cannot reselect row by row.id: ', id);
1032
- }
1033
- // Try by data
1034
- if (data) {
1035
- done = yield this.selectRowByData(data);
1036
- if (done)
1037
- return true;
1038
- console.warn('[app-table] Save: Cannot reselect row by data: ', data);
1039
- }
1040
- return false;
1041
- }
1042
- catch (err) {
1043
- // Log, but continue
1044
- console.error(err && err.message || err);
1045
- return false;
1046
- }
1047
- });
1048
- }
1049
- /**
1050
- * return the selected row if unique in selection
1051
- */
1052
- get singleSelectedRow() {
1053
- var _a;
1054
- return ((_a = this.selection.selected) === null || _a === void 0 ? void 0 : _a.length) === 1 ? this.selection.selected[0] : undefined;
1055
- }
1056
- canDeleteRows(rows, opts) {
1057
- return __awaiter(this, void 0, void 0, function* () {
1058
- // Check using emitter
1059
- if (this.onBeforeDeleteRows.observers.length > 0) {
1060
- try {
1061
- const canDelete = yield emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {
1062
- detail: { rows }
1063
- });
1064
- if (!canDelete)
1065
- return false;
1066
- }
1067
- catch (err) {
1068
- if (err === 'CANCELLED')
1069
- return false; // User cancel
1070
- console.error('Error while checking if can delete rows', err);
1071
- throw err;
1072
- }
1073
- }
1074
- // Ask user confirmation
1075
- if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {
1076
- return this.askDeleteConfirmation(null, rows);
1077
- }
1078
- return true;
1079
- });
1080
- }
1081
- canCancelRows(rows, opts) {
1082
- return __awaiter(this, void 0, void 0, function* () {
1083
- // Get dirty rows
1084
- rows = rows || this.dataSource.getRows().filter(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; });
1085
- if (isEmptyArray(rows))
1086
- return true; // No dirty: OK
1087
- // Check using emitter
1088
- if (this.onBeforeCancelRows.observers.length > 0) {
1089
- try {
1090
- const isCancel = yield emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {
1091
- detail: { rows }
1092
- });
1093
- if (!isCancel)
1094
- return false;
1095
- }
1096
- catch (err) {
1097
- if (err === 'CANCELLED')
1098
- return false; // User cancel
1099
- console.error('Error while checking if can cancel rows', err);
1100
- throw err;
1101
- }
1102
- }
1103
- // Ask user confirmation
1104
- if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {
1105
- return this.askCancelConfirmation(null, rows);
1106
- }
1107
- return true;
1108
- });
1109
- }
1110
- saveBeforeAction(saveAction) {
1111
- return __awaiter(this, void 0, void 0, function* () {
1112
- if (!this.dirty) {
1113
- // Continue without save
1114
- return true;
1115
- }
1116
- let save;
1117
- switch (saveAction) {
1118
- case 'delete':
1119
- save = this.saveBeforeDelete;
1120
- break;
1121
- case 'filter':
1122
- save = this.saveBeforeFilter;
1123
- break;
1124
- case 'sort':
1125
- save = this.saveBeforeSort;
1126
- break;
1127
- default:
1128
- save = true;
1129
- }
1130
- // Default behavior
1131
- let confirmed = true;
1132
- if (save) {
1133
- if (this.onBeforeSave.observers.length > 0) {
1134
- // Ask confirmation
1135
- try {
1136
- const res = yield emitPromiseEvent(this.onBeforeSave, 'beforeSave', {
1137
- detail: { action: saveAction, valid: this.valid }
1138
- });
1139
- confirmed = res.confirmed;
1140
- save = res.save;
1141
- }
1142
- catch (err) {
1143
- if (err === 'CANCELLED')
1144
- return false; // User cancel
1145
- console.error('Error while checking if can delete rows', err);
1146
- throw err;
1147
- }
1148
- }
1149
- }
1150
- if (confirmed) {
1151
- if (save) {
1152
- // User confirmed save
1153
- const saved = yield this.save();
1154
- this.markAsDirty(); // Restore dirty flag
1155
- return saved;
1156
- }
1157
- return true; // No save but continue action
1158
- }
1159
- return false; // User cancel the action
1160
- });
1161
- }
1162
- /**
1163
- * Open a row. By default, will to open row detail page.
1164
- * Can be override by subclasses, BUT prefer to subscribe on onOpenRow
1165
- * @param id
1166
- * @param row
1167
- * @protected
1168
- */
1169
- openRow(id, row) {
1170
- return __awaiter(this, void 0, void 0, function* () {
1171
- if (this.allowRowDetail) {
1172
- if (this.debug && this.dirty) {
1173
- console.warn('[table] Opening row details, but table has unsaved changes!');
1174
- }
1175
- if (this.onOpenRow.observers.length) {
1176
- this.onOpenRow.emit({ id, row });
1177
- return true;
1178
- }
1179
- // No ID defined: unable to open details
1180
- if (isNil(id)) {
1181
- console.warn('[table] Opening row details, but data has no id!');
1182
- return false;
1183
- }
1184
- return this.router.navigate(['.', id.toString()], {
1185
- relativeTo: this.route,
1186
- queryParams: {}
1187
- });
1188
- }
1189
- return false;
1190
- });
1191
- }
1192
- openNewRowDetail(event) {
1193
- return __awaiter(this, void 0, void 0, function* () {
1194
- if (!this.allowRowDetail)
1195
- return false;
1196
- if (this.onNewRow.observers.length) {
1197
- this.onNewRow.emit(event);
1198
- return true;
1199
- }
1200
- return yield this.router.navigate(['new'], {
1201
- relativeTo: this.route
1202
- });
1203
- });
1204
- }
1205
- // can be overridden to add more required columns
1206
- getRequiredColumns() {
1207
- return DEFAULT_REQUIRED_COLUMNS;
1208
- }
1209
- getUserColumns() {
1210
- return this.settings.getPageSettings(this.settingsId, SETTINGS_DISPLAY_COLUMNS);
1211
- }
1212
- getSortedColumn() {
1213
- const data = this.settings.getPageSettings(this.settingsId, SETTINGS_SORTED_COLUMN);
1214
- const parts = data && data.split(':');
1215
- if (parts && parts.length === 2 && this.columns.includes(parts[0])) {
1216
- return { id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false };
1217
- }
1218
- if (this.defaultSortBy) {
1219
- return { id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false };
1220
- }
1221
- return { id: 'id', start: 'asc', disableClear: false };
1222
- }
1223
- getPageSize() {
1224
- const pageSize = this.settings.getPageSettings(this.settingsId, SETTINGS_PAGE_SIZE);
1225
- return pageSize || this.defaultPageSize;
1226
- }
1227
- getDisplayColumns() {
1228
- let userColumns = this.getUserColumns();
1229
- // No user override
1230
- if (!userColumns) {
1231
- // Return default, without columns to hide
1232
- return this.columns.filter(column => !this.excludesColumns.includes(column));
1233
- }
1234
- // Get fixed start columns
1235
- const fixedStartColumns = this.columns.filter(c => RESERVED_START_COLUMNS.includes(c));
1236
- // Remove end columns
1237
- const fixedEndColumns = this.columns.filter(c => RESERVED_END_COLUMNS.includes(c));
1238
- // Remove fixed columns from user columns
1239
- userColumns = userColumns.filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));
1240
- // Add required columns if missing
1241
- userColumns.push(...this.getRequiredColumns().filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c)));
1242
- return fixedStartColumns
1243
- .concat(userColumns)
1244
- .concat(fixedEndColumns)
1245
- // Remove columns to hide
1246
- .filter(column => !this.excludesColumns.includes(column));
1247
- }
1248
- /**
1249
- * Recompute display columns
1250
- *
1251
- * @protected
1252
- */
1253
- updateColumns() {
1254
- this.displayedColumns = this.getDisplayColumns();
1255
- if (!this.loading)
1256
- this.markForCheck();
1257
- }
1258
- registerSubscription(sub) {
1259
- this._subscription.add(sub);
1260
- }
1261
- unregisterSubscription(sub) {
1262
- this._subscription.remove(sub);
1263
- }
1264
- registerAutocompleteField(fieldName, options) {
1265
- return this._autocompleteConfigHolder.add(fieldName, options);
1266
- }
1267
- getI18nColumnName(columnName) {
1268
- return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();
1269
- }
1270
- generateTableId() {
1271
- var _a;
1272
- const id = this.location.path(true)
1273
- .replace(/[?].*$/g, '')
1274
- .replace(/\/[\d]+/g, '_id')
1275
- + '_'
1276
- // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9
1277
- + (((_a = this.constructor['ɵcmp']) === null || _a === void 0 ? void 0 : _a.id) || this.constructor.name);
1278
- //if (this.debug) console.debug("[table] id = " + id);
1279
- return id;
1280
- }
1281
- addRowToTable(insertAt, opts) {
1282
- return __awaiter(this, void 0, void 0, function* () {
1283
- const row = yield this._dataSource.createNew(insertAt, Object.assign({ editing: true }, opts));
1284
- if (!row)
1285
- return undefined;
1286
- if (row.editing) {
1287
- // Update focused column
1288
- this.focusFirstColumn = true;
1289
- this.focusColumn = (opts === null || opts === void 0 ? void 0 : opts.focusColumn) || this.firstUserColumn;
1290
- // Emit start editing event
1291
- this.editedRow = row;
1292
- this.onStartEditingRow.emit(this.editedRow);
1293
- }
1294
- this.totalRowCount++;
1295
- this.visibleRowCount++;
1296
- this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
1297
- // Emit event
1298
- if (!opts || opts.emitEvent !== false)
1299
- this.markForCheck();
1300
- return row;
1301
- });
1302
- }
1303
- registerCellValueChanges(name, formPath, emitInitialValue) {
1304
- formPath = formPath || name;
1305
- emitInitialValue = emitInitialValue || false;
1306
- let def = this._cellValueChangesDefs[name];
1307
- if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {
1308
- throw Error('Already register a cell value change for this name, with different \'formPath\' or \'emitInitialValue\'. Please use same arguments.');
1309
- }
1310
- // Not exists: register new definition
1311
- if (!def) {
1312
- if (this.debug)
1313
- console.debug(`[table] New listener {${name}} for value changes on path ${formPath}`);
1314
- def = {
1315
- subject: new Subject(),
1316
- subscription: null,
1317
- formPath,
1318
- emitInitialValue
1319
- };
1320
- this._cellValueChangesDefs[name] = def;
1321
- // Start the listener, when editing starts
1322
- this.registerSubscription(this.onStartEditingRow.subscribe(row => this.startCellValueChanges(name, row)));
1323
- }
1324
- return def.subject;
1325
- }
1326
- setShowColumn(columnName, show, opts) {
1327
- if (!this.excludesColumns.includes(columnName) !== show) {
1328
- if (!show) {
1329
- this.excludesColumns.push(columnName);
1330
- }
1331
- else {
1332
- const index = this.excludesColumns.findIndex(value => value === columnName);
1333
- if (index >= 0)
1334
- this.excludesColumns.splice(index, 1);
1335
- }
1336
- // Recompute display columns
1337
- if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {
1338
- this.updateColumns();
1339
- }
1340
- }
1341
- }
1342
- getShowColumn(columnName) {
1343
- return !this.excludesColumns.includes(columnName);
1344
- }
1345
- startsWithUpperCase(input, search) {
1346
- return input && input.toUpperCase().startsWith(search);
1347
- }
1348
- markForCheck() {
1349
- // Should be override by subclasses, depending on ChangeDetectionStrategy
1350
- }
1351
- askDeleteConfirmation(event, rows) {
1352
- return __awaiter(this, void 0, void 0, function* () {
1353
- if (this.undoableDeletion) {
1354
- // Special message, for undoable deletion
1355
- return Alerts.askConfirmation((rows === null || rows === void 0 ? void 0 : rows.length) === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);
1356
- }
1357
- // Immediate deletion action
1358
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);
1359
- });
1360
- }
1361
- askCancelConfirmation(event, rows) {
1362
- return __awaiter(this, void 0, void 0, function* () {
1363
- return Alerts.askConfirmation((rows === null || rows === void 0 ? void 0 : rows.length) === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);
1364
- });
1365
- }
1366
- askRestoreConfirmation(event) {
1367
- return __awaiter(this, void 0, void 0, function* () {
1368
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);
1369
- });
1370
- }
1371
- showToast(opts) {
1372
- return __awaiter(this, void 0, void 0, function* () {
1373
- if (!this.toastController)
1374
- throw new Error('Missing toastController in component\'s constructor');
1375
- return Toasts.show(this.toastController, this.translate, opts);
1376
- });
1377
- }
1378
- resetError(opts) {
1379
- this.setError(undefined, opts);
1380
- }
1381
- getRowError(row, opts) {
1382
- row = row || this.editedRow;
1383
- if (!row || !this.formErrorAdapter)
1384
- return undefined;
1385
- return this.formErrorAdapter.translateFormErrors(row.validator, Object.assign(Object.assign({}, this.errorTranslatorOptions), opts));
1386
- }
1387
- setError(value, opts) {
1388
- if (this.errorSubject.value !== value) {
1389
- this.errorSubject.next(value);
1390
- if (!opts || opts.emitEvent !== false) {
1391
- this.markForCheck();
1392
- }
1393
- }
1394
- }
1395
- /**
1396
- * Compare data equality (default by id)
1397
- * Can be overridden to add additional properties to compare
1398
- *
1399
- * @param d1
1400
- * @param d2
1401
- * @protected
1402
- */
1403
- equals(d1, d2) {
1404
- return EntityUtils.equals(d1, d2, 'id');
1405
- }
1406
- markRowAsDirty(row, opts) {
1407
- var _a;
1408
- row = row || this.editedRow;
1409
- if (row)
1410
- (_a = row.validator) === null || _a === void 0 ? void 0 : _a.markAsDirty(opts);
1411
- this.markAsDirty(opts);
1412
- }
1413
- /* -- private method -- */
1414
- listenSortAndPaginationEvents() {
1415
- return __awaiter(this, void 0, void 0, function* () {
1416
- if (!this.table) {
1417
- // DEBUG only -- alert user that table not found in template
1418
- if (this.debug) {
1419
- setTimeout(() => !this.table && console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`), 500);
1420
- }
1421
- // Make sure to wait the table
1422
- yield waitFor(() => !!this.table, { stop: this.destroySubject, stopError: false /*avoid error when destorying the table*/ });
1423
- }
1424
- this.registerSubscription(merge(
1425
- // Listen sort events
1426
- this.sort && this.sort.sortChange
1427
- .pipe(filter(() => !this.sort.disabled), mergeMap(() => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
1428
- // Save sort in settings
1429
- tap(() => {
1430
- const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
1431
- this.settings.savePageSetting(this.settingsId, value, SETTINGS_SORTED_COLUMN);
1432
- }))
1433
- || EMPTY,
1434
- // Listen paginator events
1435
- this.paginator && this.paginator.page
1436
- .pipe(mergeMap((event) => __awaiter(this, void 0, void 0, function* () { return this.saveBeforeAction('sort'); })), filter(res => res === true),
1437
- // Save page size in settings
1438
- tap(() => this.settings.savePageSetting(this.settingsId, this.paginator.pageSize, SETTINGS_PAGE_SIZE))) || EMPTY)
1439
- // Refresh on any sort or paginator events
1440
- .subscribe(value => {
1441
- this.onSort.emit(value);
1442
- this.onRefresh.emit(value);
1443
- }));
1444
- // If the user changes the sort order, reset back to the first page.
1445
- if (this.sort && this.paginator) {
1446
- this.registerSubscription(this.sort.sortChange
1447
- .pipe(filter(() => !this.sort.disabled))
1448
- .subscribe(() => this.paginator.pageIndex = 0));
1449
- }
1450
- });
1451
- }
1452
- editRowById(event, id, opts) {
1453
- return __awaiter(this, void 0, void 0, function* () {
1454
- if (id < 0)
1455
- return;
1456
- if (id >= this.visibleRowCount) {
1457
- this.addRow(event, undefined, Object.assign(Object.assign({}, opts), { editing: true }));
1458
- }
1459
- else {
1460
- const row = yield this.dataSource.getRow(id);
1461
- this.editRow(event, row, opts);
1462
- }
1463
- });
1464
- }
1465
- setLoading(value, opts) {
1466
- if (this.loadingSubject.value !== value) {
1467
- this.loadingSubject.next(value);
1468
- if (!opts || opts.emitEvent !== false) {
1469
- this.markForCheck();
1470
- }
1471
- }
1472
- }
1473
- deleteNewRow(event, row) {
1474
- if (row.id !== -1)
1475
- throw new Error('Row must have id = -1');
1476
- event === null || event === void 0 ? void 0 : event.stopPropagation();
1477
- this.selection.clear();
1478
- this.editedRow = undefined; // unselect row
1479
- this._dataSource.cancelOrDelete(row);
1480
- this.onCancelOrDeleteRow.next(row);
1481
- this.resetError();
1482
- this.totalRowCount--;
1483
- this.visibleRowCount--;
1484
- }
1485
- deleteExistingRow(event, row, opts) {
1486
- // Make sure row will be cancelled, and NOT deleted
1487
- if (row.id === -1)
1488
- throw new Error('Row must have an id');
1489
- if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
1490
- return 0; // SKip
1491
- event === null || event === void 0 ? void 0 : event.preventDefault();
1492
- this.deleteRow(null, row, opts);
1493
- }
1494
- cancelExistingRow(event, row, opts) {
1495
- var _a;
1496
- // Make sure row will be cancelled, and NOT deleted
1497
- if (row.id === -1 || !row.editing)
1498
- throw new Error('Row cannot be canceling, but only deleting');
1499
- const confirmed = (!opts || opts.interactive !== false);
1500
- // Ask user confirmation, if cancel
1501
- if (!confirmed && ((_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty) && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
1502
- event.stopPropagation();
1503
- this.canCancelRows([row], opts)
1504
- .then(confirm => {
1505
- // If confirmed, loop
1506
- if (confirm)
1507
- this.cancelExistingRow(event, row, { interactive: false });
1508
- });
1509
- return;
1510
- }
1511
- const keepEditing = row.editing && (!opts || opts.keepEditing !== false);
1512
- this.editedRow = undefined; // unselect row
1513
- this._dataSource.cancelOrDelete(row);
1514
- this.onCancelOrDeleteRow.next(row);
1515
- // Mark row as pristine
1516
- this.checkIfRowPristine(row);
1517
- // Restore editing state
1518
- if (keepEditing) {
1519
- this.editRow(undefined, row);
1520
- }
1521
- }
1522
- checkIfRowPristine(row, opts) {
1523
- var _a, _b;
1524
- return __awaiter(this, void 0, void 0, function* () {
1525
- // Mark row as pristine
1526
- const markRowAsPristine = ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.config.restoreOriginalDataOnCancel) === true;
1527
- if (markRowAsPristine) {
1528
- (_b = row.validator) === null || _b === void 0 ? void 0 : _b.markAsPristine();
1529
- // Check if table is now pristine
1530
- if (!opts || opts.onlySelf !== true) {
1531
- yield this.checkIfPristine(opts);
1532
- }
1533
- }
1534
- });
1535
- }
1536
- checkIfPristine(opts) {
1537
- return __awaiter(this, void 0, void 0, function* () {
1538
- if (!this.dirty)
1539
- return; // Already pristine
1540
- const rows = this._dataSource.getRows();
1541
- const pristine = (rows || []).findIndex(row => { var _a; return (_a = row.validator) === null || _a === void 0 ? void 0 : _a.dirty; }) === -1;
1542
- if (pristine)
1543
- this.markAsPristine(opts);
1544
- });
1545
- }
1546
- applyFilter(filter, opts) {
1547
- if (this.debug)
1548
- console.debug('[table] Applying filter', filter);
1549
- this._filter = filter;
1550
- if (opts && opts.emitEvent) {
1551
- if (this.paginator && this.paginator.pageIndex > 0) {
1552
- this.paginator.pageIndex = 0;
1553
- }
1554
- this.onRefresh.emit();
1555
- }
1556
- }
1557
- listenDatasourceLoading(dataSource) {
1558
- if (!dataSource)
1559
- throw new Error('[table] dataSource not set !');
1560
- // Cleaning previous subscription on datasource
1561
- if (isNotNil(this._dataSourceLoadingSubscription)) {
1562
- if (this.debug)
1563
- console.debug('[table] Many call to listenDatasource(): Cleaning previous subscriptions...');
1564
- this._dataSourceLoadingSubscription.unsubscribe();
1565
- this.unregisterSubscription(this._dataSourceLoadingSubscription);
1566
- }
1567
- // Propage loading to table
1568
- this._dataSourceLoadingSubscription = this._dataSource.loadingSubject
1569
- .pipe(distinctUntilChanged(),
1570
- // If changed to True: propagate as soon as possible
1571
- tap((loading) => loading && this.setLoading(true)),
1572
- // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)
1573
- debounceTime(250), tap(loading => !loading && this.setLoading(false)))
1574
- .subscribe();
1575
- this.registerSubscription(this._dataSourceLoadingSubscription);
1576
- }
1577
- startCellValueChanges(name, row) {
1578
- const def = this._cellValueChangesDefs[name];
1579
- if (!def) {
1580
- console.warn('[table] Listener with name {' + name + '} not registered! Please call registerCellValueChanges() before;');
1581
- return;
1582
- }
1583
- // Stop previous subscription
1584
- if (def.subscription) {
1585
- def.subscription.unsubscribe();
1586
- def.subscription = null;
1587
- }
1588
- else {
1589
- if (this.debug)
1590
- console.debug(`[table] Start values changes on row path {${def.formPath}}`);
1591
- }
1592
- // Listen value changes, and redirect to event emitter
1593
- const control = row.validator && AppFormUtils.getControlFromPath(row.validator, def.formPath);
1594
- if (!control) {
1595
- console.warn(`[table] Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);
1596
- }
1597
- else {
1598
- def.subscription = control.valueChanges
1599
- .pipe(
1600
- // don't emit if control is disabled
1601
- filter(() => control.enabled))
1602
- .subscribe((value) => def.subject.next(value));
1603
- // Emit the actual value
1604
- if (def.emitInitialValue !== false) {
1605
- def.subject.next(control.value);
1606
- }
1607
- }
1608
- }
1609
- stopCellValueChanges(name, destroy) {
1610
- const def = this._cellValueChangesDefs[name];
1611
- if (!def)
1612
- return;
1613
- if (def.subscription) {
1614
- if (this.debug)
1615
- console.debug('[table] Stop value changes on row path {' + def.formPath + '}');
1616
- def.subscription.unsubscribe();
1617
- def.subscription = null;
1618
- }
1619
- if (destroy && def.subject) {
1620
- def.subject.complete();
1621
- def.subject.unsubscribe();
1622
- }
1623
- }
1624
- }
1625
- AppTable.decorators = [
1626
- { type: Directive }
1627
- ];
1628
- AppTable.ctorParameters = () => [
1629
- { type: Injector },
1630
- { type: Array },
1631
- { type: EntitiesTableDataSource },
1632
- { type: undefined }
1633
- ];
1634
- AppTable.propDecorators = {
1635
- settingsId: [{ type: Input }],
1636
- debug: [{ type: Input }],
1637
- i18nColumnPrefix: [{ type: Input }],
1638
- i18nColumnSuffix: [{ type: Input }],
1639
- autoLoad: [{ type: Input }],
1640
- readOnly: [{ type: Input }],
1641
- inlineEdition: [{ type: Input }],
1642
- focusFirstColumn: [{ type: Input }],
1643
- confirmBeforeDelete: [{ type: Input }],
1644
- confirmBeforeCancel: [{ type: Input }],
1645
- undoableDeletion: [{ type: Input }],
1646
- saveBeforeDelete: [{ type: Input }],
1647
- keepEditedRowOnSave: [{ type: Input }],
1648
- saveBeforeSort: [{ type: Input }],
1649
- saveBeforeFilter: [{ type: Input }],
1650
- propagateRowError: [{ type: Input }],
1651
- defaultSortBy: [{ type: Input }],
1652
- defaultSortDirection: [{ type: Input }],
1653
- defaultPageSize: [{ type: Input }],
1654
- defaultPageSizeOptions: [{ type: Input }],
1655
- focusColumn: [{ type: Input }],
1656
- dataSource: [{ type: Input }],
1657
- filter: [{ type: Input }],
1658
- onRefresh: [{ type: Output }],
1659
- onOpenRow: [{ type: Output }],
1660
- onNewRow: [{ type: Output }],
1661
- onStartEditingRow: [{ type: Output }],
1662
- onConfirmEditCreateRow: [{ type: Output }],
1663
- onCancelOrDeleteRow: [{ type: Output }],
1664
- onBeforeDeleteRows: [{ type: Output }],
1665
- onBeforeCancelRows: [{ type: Output }],
1666
- onBeforeSave: [{ type: Output }],
1667
- onAfterDeletedRows: [{ type: Output }],
1668
- onSort: [{ type: Output }],
1669
- onDirty: [{ type: Output }],
1670
- onError: [{ type: Output }],
1671
- disabled: [{ type: Input }],
1672
- paginator: [{ type: Input }],
1673
- table: [{ type: ViewChild, args: [MatTable, { static: false },] }],
1674
- childPaginator: [{ type: ViewChild, args: [MatPaginator, { static: false },] }],
1675
- sort: [{ type: ViewChild, args: [MatSort, { static: false },] }]
1676
- };
1677
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGFibGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsT0FBTyxFQUE2QixNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsSixPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFdBQVcsRUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBQyxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFhLDJCQUEyQixFQUFDLE1BQU0sa0NBQWtDLENB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RGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0UGFnaW5hdG9yfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHtNYXRTb3J0LCBNYXRTb3J0YWJsZSwgU29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge01hdFRhYmxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgRU1QVFksIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwLCBtZXJnZU1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1RhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7RW50aXRpZXNUYWJsZURhdGFTb3VyY2V9IGZyb20gJy4vZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQge1NlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtFbnRpdHlVdGlscywgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7QWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIsIFRvYXN0Q29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtDb2x1bW5JdGVtLCBUYWJsZVNlbGVjdENvbHVtbnNDb21wb25lbnR9IGZyb20gJy4vdGFibGUtc2VsZWN0LWNvbHVtbnMuY29tcG9uZW50JztcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0Vycm9yQ29kZXN9IGZyb20gJy4uL3NlcnZpY2VzL2Vycm9ycyc7XG5pbXBvcnQge0FwcEZvcm1VdGlscywgSUFwcEZvcm0sIE9uUmVhZHl9IGZyb20gJy4uL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge01hdEF1dG9jb21wbGV0ZUNvbmZpZ0hvbGRlciwgTWF0QXV0b2NvbXBsZXRlRmllbGRBZGRPcHRpb25zLCBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZ30gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtDb21wbGV0YWJsZUV2ZW50LCBjcmVhdGVQcm9taXNlRXZlbnRFbWl0dGVyLCBlbWl0UHJvbWlzZUV2ZW50fSBmcm9tICcuLi8uLi9zaGFyZWQvZXZlbnRzJztcbmltcG9ydCB7Y2hhbmdlQ2FzZVRvVW5kZXJzY29yZSwgaXNFbXB0eUFycmF5LCBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgdG9Cb29sZWFufSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7d2FpdEZvciwgd2FpdEZvckZhbHNlLCBXYWl0Rm9yT3B0aW9ucywgd2FpdEZvclRydWV9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQge0FsZXJ0c30gZnJvbSAnLi4vLi4vc2hhcmVkL2FsZXJ0cyc7XG5pbXBvcnQge0Nka0NvbHVtbkRlZn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7TG9hZFJlc3VsdH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7Rm9ybUVycm9yVHJhbnNsYXRvciwgRm9ybUVycm9yVHJhbnNsYXRvck9wdGlvbnMsIElGb3JtQ29udHJvbFBhdGhUcmFuc2xhdG9yfSBmcm9tICcuLi8uLi9zaGFyZWQvdmFsaWRhdG9yL2Zvcm0tZXJyb3ItYWRhcHRlci5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBTRVRUSU5HU19ESVNQTEFZX0NPTFVNTlMgPSAnZGlzcGxheUNvbHVtbnMnO1xuZXhwb3J0IGNvbnN0IFNFVFRJTkdTX1NPUlRFRF9DT0xVTU4gPSAnc29ydGVkQ29sdW1uJztcbmV4cG9ydCBjb25zdCBTRVRUSU5HU19GSUxURVIgPSAnZmlsdGVyJztcbmV4cG9ydCBjb25zdCBTRVRUSU5HU19QQUdFX1NJWkUgPSAncGFnZVNpemUnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMjA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFX1NJWkVfT1BUSU9OUyA9IFsyMCwgNTAsIDEwMCwgMjAwLCA1MDBdO1xuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX1NUQVJUX0NPTFVNTlMgPSBbJ3NlbGVjdCcsICdpZCddO1xuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0VORF9DT0xVTU5TID0gWydhY3Rpb25zJ107XG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVSVJFRF9DT0xVTU5TID0gWydpZCddO1xuXG5leHBvcnQgY2xhc3MgQ2VsbFZhbHVlQ2hhbmdlTGlzdGVuZXIge1xuICBzdWJqZWN0OiBTdWJqZWN0PGFueT47XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uOyAvLyBUaGUgcm93IHN0YXJ0IGVkaXRpbmcgc3Vic2NyaXB0aW9uXG4gIGZvcm1QYXRoOiBzdHJpbmc7XG4gIGVtaXRJbml0aWFsVmFsdWU6IGJvb2xlYW47XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kYWxEZXRhaWxPcHRpb25zPFQgPSBhbnk+IHtcbiAgLy8gRGF0YVxuICBpc05ldzogYm9vbGVhbjtcbiAgZGF0YTogVDtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLy8gQ2FsbGJhY2sgZnVuY3Rpb25zXG4gIG9uRGVsZXRlPzogKGV2ZW50OiBVSUV2ZW50LCBkYXRhOiBUKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgdHlwZSBTYXZlQWN0aW9uVHlwZSA9ICdkZWxldGUnIHwgJ3NvcnQnIHwgJ2ZpbHRlcic7XG5cbi8vIEBkeW5hbWljXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcFRhYmxlPFxuICBUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4sXG4gIEYgPSBhbnksXG4gIElEID0gbnVtYmVyXG4gID5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgSUFwcEZvcm0sIElGb3JtQ29udHJvbFBhdGhUcmFuc2xhdG9yIHtcblxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBfY2VsbFZhbHVlQ2hhbmdlc0RlZnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBDZWxsVmFsdWVDaGFuZ2VMaXN0ZW5lcjtcbiAgfSA9IHt9O1xuXG4gIHByb3RlY3RlZCBfZW5hYmxlZCA9IHRydWU7XG4gIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyOiBNYXRBdXRvY29tcGxldGVDb25maWdIb2xkZXI7XG4gIHByb3RlY3RlZCBhbGxvd1Jvd0RldGFpbCA9IHRydWU7XG4gIHByb3RlY3RlZCByb3V0ZTogQWN0aXZhdGVkUm91dGU7XG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcbiAgcHJvdGVjdGVkIGxvY2F0aW9uOiBMb2NhdGlvbjtcbiAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZTtcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZTtcbiAgcHJvdGVjdGVkIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyO1xuICBwcm90ZWN0ZWQgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXI7XG4gIHByb3RlY3RlZCB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcjtcbiAgcHJvdGVjdGVkIHByZXZpb3VzbHlFZGl0ZWRSb3dJZDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgZm9ybUVycm9yQWRhcHRlcjogRm9ybUVycm9yVHJhbnNsYXRvcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3lTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcblxuICBleGNsdWRlc0NvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdO1xuICB0b3RhbFJvd0NvdW50OiBudW1iZXJ8bnVsbCA9IG51bGw7XG4gIHZpc2libGVSb3dDb3VudDogbnVtYmVyO1xuICBlcnJvclRyYW5zbGF0b3JPcHRpb25zOiBGb3JtRXJyb3JUcmFuc2xhdG9yT3B0aW9ucztcblxuICByZWFkb25seSByZWFkeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBzYXZpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHRvdWNoZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGRpcnR5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcblxuICBnZXQgZXJyb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvclN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldCBlcnJvciQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5lcnJvclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuXG4gIHNldCBlcnJvcihlcnJvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRFcnJvcihlcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldCBsb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0IHNhdmluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2aW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUYWJsZUVsZW1lbnQ8VD4+KHRydWUsIFtdKTtcbiAgZWRpdGVkUm93OiBUYWJsZUVsZW1lbnQ8VD4gPSB1bmRlZmluZWQ7XG4gIGF1dG9jb21wbGV0ZUZpZWxkczoge1trZXk6IHN0cmluZ106IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnfTtcbiAgcmVhZG9ubHkgbW9iaWxlOiBib29sZWFuO1xuXG4gIC8vIFRhYmxlIG9wdGlvbnNcbiAgQElucHV0KCkgc2V0dGluZ3NJZDogc3RyaW5nO1xuICBASW5wdXQoKSBkZWJ1ZzogYm9vbGVhbjtcbiAgQElucHV0KCkgaTE4bkNvbHVtblByZWZpeCA9ICdDT01NT04uJztcbiAgQElucHV0KCkgaTE4bkNvbHVtblN1ZmZpeDogc3RyaW5nO1xuICBASW5wdXQoKSBhdXRvTG9hZCA9IHRydWU7XG4gIEBJbnB1dCgpIHJlYWRPbmx5OiBib29sZWFuO1xuICBASW5wdXQoKSBpbmxpbmVFZGl0aW9uOiBib29sZWFuO1xuICBASW5wdXQoKSBmb2N1c0ZpcnN0Q29sdW1uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbmZpcm1CZWZvcmVEZWxldGUgPSBmYWxzZTtcbiAgQElucHV0KCkgY29uZmlybUJlZm9yZUNhbmNlbCA9IGZhbHNlO1xuICBASW5wdXQoKSB1bmRvYWJsZURlbGV0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNhdmVCZWZvcmVEZWxldGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGtlZXBFZGl0ZWRSb3dPblNhdmU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNhdmVCZWZvcmVTb3J0OiBib29sZWFuO1xuICBASW5wdXQoKSBzYXZlQmVmb3JlRmlsdGVyOiBib29sZWFuO1xuICBASW5wdXQoKSBwcm9wYWdhdGVSb3dFcnJvciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0Qnk6IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb247XG4gIEBJbnB1dCgpIGRlZmF1bHRQYWdlU2l6ZSA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICBASW5wdXQoKSBkZWZhdWx0UGFnZVNpemVPcHRpb25zID0gREVGQVVMVF9QQUdFX1NJWkVfT1BUSU9OUztcblxuICAvLyBGb2N1cyBtYW5hZ2VyXG4gIEBJbnB1dCgpIGZvY3VzQ29sdW1uOiBzdHJpbmc7XG5cbiAgZ2V0IGZpcnN0VXNlckNvbHVtbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNbUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5sZW5ndGhdO1xuICB9XG5cbiAgZ2V0IGxhc3RVc2VyQ29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1uc1t0aGlzLmRpc3BsYXllZENvbHVtbnMubGVuZ3RoIC0gUkVTRVJWRURfRU5EX0NPTFVNTlMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KSB7XG4gICAgdGhpcy5zZXREYXRhc291cmNlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBkYXRhU291cmNlKCk6IEVudGl0aWVzVGFibGVEYXRhU291cmNlPFQsIEYsIElEPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyKHZhbHVlOiBGKSB7XG4gICAgdGhpcy5zZXRGaWx0ZXIodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcigpOiBGIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xuICB9XG5cbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgdGhpcy50b3RhbFJvd0NvdW50ID09PSAwO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uUmVmcmVzaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25PcGVuUm93ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkPzogSUQ7IHJvdzogVGFibGVFbGVtZW50PFQ+IH0+KCk7XG4gIEBPdXRwdXQoKSBvbk5ld1JvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25TdGFydEVkaXRpbmdSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQ29uZmlybUVkaXRDcmVhdGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsT3JEZWxldGVSb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uQmVmb3JlRGVsZXRlUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwge3Jvd3M6IFRhYmxlRWxlbWVudDxUPltdfT4oKTtcbiAgQE91dHB1dCgpIG9uQmVmb3JlQ2FuY2VsUm93cyA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8Ym9vbGVhbiwge3Jvd3M6IFRhYmxlRWxlbWVudDxUPltdfT4oKTtcbiAgQE91dHB1dCgpIG9uQmVmb3JlU2F2ZSA9IGNyZWF0ZVByb21pc2VFdmVudEVtaXR0ZXI8e2NvbmZpcm1lZDogYm9vbGVhbjsgc2F2ZTogYm9vbGVhbn0sIHthY3Rpb246IFNhdmVBY3Rpb25UeXBlOyB2YWxpZDogYm9vbGVhbn0+KCk7XG4gIEBPdXRwdXQoKSBvbkFmdGVyRGVsZXRlZFJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlRWxlbWVudDxUPltdPigpO1xuICBAT3V0cHV0KCkgb25Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkRpcnR5ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGdldCBkaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXJ0eVN1YmplY3QudmFsdWU7XG4gIH1cblxuICBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGVkUm93ICYmIHRoaXMuZWRpdGVkUm93LmVkaXRpbmcgPyB0aGlzLmVkaXRlZFJvdy52YWxpZGF0b3I/LnZhbGlkIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZFJvdyAmJiB0aGlzLmVkaXRlZFJvdy5lZGl0aW5nID8gdGhpcy5lZGl0ZWRSb3cudmFsaWRhdG9yPy5pbnZhbGlkIDogZmFsc2U7XG4gIH1cblxuICBnZXQgcGVuZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0ZWRSb3cgJiYgdGhpcy5lZGl0ZWRSb3cuZWRpdGluZyA/IHRoaXMuZWRpdGVkUm93LnZhbGlkYXRvcj8ucGVuZGluZyA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWU7XG4gIH1cblxuICBnZXQgdW50b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGRpc2FibGUob3B0cz86IHtvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZW5hYmxlKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5zb3J0KSB0aGlzLnNvcnQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgLy8gRklYTUU6IG5lZWQgdG8gaGlkZGVuIGJ1dHRvbnMgKGluIEhUTUwpLCBldGMuIHdoZW4gZGlzYWJsZWRcbiAgQElucHV0KCkgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSAhdGhpcy5fZW5hYmxlZCkge1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIGVsc2UgdGhpcy5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9lbmFibGVkO1xuICB9XG5cbiAgbWFya0FzRGlydHkob3B0cz86IHtvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5kaXJ0eVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBtYXJrQXNQcmlzdGluZShvcHRzPzoge29ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5kaXJ0eVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFya0FzVW50b3VjaGVkKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBsZXQgbmVlZEVtaXRFdmVudCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnRvdWNoZWRTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLnRvdWNoZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgbmVlZEVtaXRFdmVudCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpcnR5IHx8ICh0aGlzLmVkaXRlZFJvdyAmJiB0aGlzLmVkaXRlZFJvdy5pZCAhPT0gdGhpcy5wcmV2aW91c2x5RWRpdGVkUm93SWQpKSB7XG4gICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgZWRpdGluZyByb3cgb25seSBpZiBlZGl0aW5nIGFuZCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgc2F2ZWRcbiAgICAgIGlmICh0aGlzLmVkaXRlZFJvdz8uZWRpdGluZykge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuY2FuY2VsT3JEZWxldGUodGhpcy5lZGl0ZWRSb3cpO1xuXG4gICAgICAgIC8vIE1hcmsgcm93IGFzIHByaXN0aW5lXG4gICAgICAgIHRoaXMuY2hlY2tJZlJvd1ByaXN0aW5lKHRoaXMuZWRpdGVkUm93LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0ZWRSb3cgPSBudWxsO1xuICAgICAgbmVlZEVtaXRFdmVudCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucHJldmlvdXNseUVkaXRlZFJvd0lkID0gdW5kZWZpbmVkO1xuICAgIGlmIChuZWVkRW1pdEV2ZW50ICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHByZWZlciB0byB1c2UgbWFya0FsbEFzVG91Y2hlZCgpXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBtYXJrQXNUb3VjaGVkKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBjb25zb2xlLndhcm4oJ1RPRE86IFJlcGxhY2UgdGhpcyBjYWxsIGJ5IG1hcmtBbGxBc1RvdWNoZWQoKSAtIGJlY2F1c2Ugb2YgY2hhbmdlcyBpbiBuZ3gtY29tcG9uZW50cyA+PSAwLjE2LjAnKTtcbiAgICBpZiAodGhpcy5lZGl0ZWRSb3c/LmVkaXRpbmcpIHtcbiAgICAgIHRoaXMuZWRpdGVkUm93LnZhbGlkYXRvcj8ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1hcmtBbGxBc1RvdWNoZWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVkaXRlZFJvdz8uZWRpdGluZykge1xuICAgICAgdGhpcy5lZGl0ZWRSb3cudmFsaWRhdG9yPy5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzU2F2aW5nKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSB1bmRlZmluZWQ7IC8vIHVuc2VsZWN0IGZvY3VzIGNvbHVtblxuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1NhdmVkKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRpbmcob3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFufSkge1xuICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlLCBvcHRzKTtcbiAgfVxuXG4gIG1hcmtBc0xvYWRlZChvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KSB7XG4gICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlLCBvcHRzKTtcbiAgfVxuXG4gIG1hcmtBc1JlYWR5KG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLnJlYWR5U3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5yZWFkeVN1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgLy8gSWYgc3ViY2xhc3NlcyBpbXBsZW1lbnRzIE9uUmVhZHlcbiAgICAgIGlmICh0eXBlb2YgdGhpc1snbmdPblJlYWR5J10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKHRoaXMgYXMgYW55IGFzIE9uUmVhZHkpLm5nT25SZWFkeSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZ1N1YmplY3QudmFsdWU7XG4gIH1cblxuICBlbmFibGVTb3J0KCkge1xuICAgIGlmICh0aGlzLnNvcnQpIHRoaXMuc29ydC5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZGlzYWJsZVNvcnQoKSB7XG4gICAgaWYgKHRoaXMuc29ydCkgdGhpcy5zb3J0LmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5kZWZhdWx0UGFnZVNpemUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yICYmIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIHx8IHRoaXMuZGVmYXVsdFBhZ2VTaXplIHx8IERFRkFVTFRfUEFHRV9TSVpFO1xuICB9XG5cbiAgZ2V0IHBhZ2VPZmZzZXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgfHwgMDtcbiAgfVxuXG4gIGdldCBzb3J0QWN0aXZlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc29ydCAmJiB0aGlzLnNvcnQuYWN0aXZlO1xuICB9XG4gIGdldCBzb3J0RGlyZWN0aW9uKCk6ICdhc2MnIHwgJ2Rlc2MnIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0ICYmIHRoaXMuc29ydC5kaXJlY3Rpb24gJiYgKHRoaXMuc29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICdkZXNjJyA6ICdhc2MnKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvcnxudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBzZXQgcGFnaW5hdG9yKHZhbHVlOiBNYXRQYWdpbmF0b3IpIHtcbiAgICB0aGlzLl9wYWdpbmF0b3IgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnaW5hdG9yIHx8IHRoaXMuY2hpbGRQYWdpbmF0b3I7XG4gIH1cblxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7c3RhdGljOiBmYWxzZX0pIHRhYmxlOiBNYXRUYWJsZTxUPjtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHtzdGF0aWM6IGZhbHNlfSkgY2hpbGRQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0LCB7c3RhdGljOiBmYWxzZX0pIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgY29sdW1uczogc3RyaW5nW10sXG4gICAgcHJvdGVjdGVkIF9kYXRhU291cmNlPzogRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+LFxuICAgIHByaXZhdGUgX2ZpbHRlcj86IEZcbiAgKSB7XG4gICAgdGhpcy5yb3V0ZSA9IGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgdGhpcy5yb3V0ZXIgPSBpbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICB0aGlzLmxvY2F0aW9uID0gaW5qZWN0b3IuZ2V0KExvY2F0aW9uKTtcbiAgICB0aGlzLnNldHRpbmdzID0gaW5qZWN0b3IuZ2V0KExvY2FsU2V0dGluZ3NTZXJ2aWNlKTtcbiAgICB0aGlzLnRyYW5zbGF0ZSA9IGluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLm1vZGFsQ3RybCA9IGluamVjdG9yLmdldChNb2RhbENvbnRyb2xsZXIpO1xuICAgIHRoaXMuYWxlcnRDdHJsID0gaW5qZWN0b3IuZ2V0KEFsZXJ0Q29udHJvbGxlcik7XG4gICAgdGhpcy50b2FzdENvbnRyb2xsZXIgPSBpbmplY3Rvci5nZXQoVG9hc3RDb250cm9sbGVyKTtcbiAgICB0aGlzLmZvcm1FcnJvckFkYXB0ZXIgPSBpbmplY3Rvci5nZXQoRm9ybUVycm9yVHJhbnNsYXRvcik7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzLm1vYmlsZTtcblxuICAgIC8vIEF1dG9jb21wbGV0ZSBmaWVsZHNcbiAgICB0aGlzLl9hdXRvY29tcGxldGVDb25maWdIb2xkZXIgPSBuZXcgTWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyKHtcbiAgICAgIGdldFVzZXJBdHRyaWJ1dGVzOiAoYSwgYikgPT4gdGhpcy5zZXR0aW5ncy5nZXRGaWVsZERpc3BsYXlBdHRyaWJ1dGVzKGEsIGIpXG4gICAgfSk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVGaWVsZHMgPSB0aGlzLl9hdXRvY29tcGxldGVDb25maWdIb2xkZXIuZmllbGRzO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSByZXR1cm47IC8vIEluaXQgb25seSBvbmNlXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgdGhpcy5yZWFkT25seSA9IHRvQm9vbGVhbih0aGlzLnJlYWRPbmx5LCB0aGlzLmRhdGFTb3VyY2U/LmNvbmZpZy5yZWFkT25seSB8fCBmYWxzZSk7IC8vIHJlYWQvd3JpdGUgYnkgZGVmYXVsdFxuICAgIHRoaXMuaW5saW5lRWRpdGlvbiA9ICF0aGlzLnJlYWRPbmx5ICYmIHRvQm9vbGVhbih0aGlzLmlubGluZUVkaXRpb24sIGZhbHNlKTsgLy8gZm9yY2UgdG8gZmFsc2Ugd2hlbiByZWFkb25seVxuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IHRvQm9vbGVhbih0aGlzLnNhdmVCZWZvcmVEZWxldGUsICF0aGlzLnJlYWRPbmx5KTsgLy8gZm9yY2UgdG8gZmFsc2Ugd2hlbiByZWFkb25seVxuICAgIHRoaXMuc2F2ZUJlZm9yZVNvcnQgPSB0b0Jvb2xlYW4odGhpcy5zYXZlQmVmb3JlU29ydCwgIXRoaXMucmVhZE9ubHkpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdG9Cb29sZWFuKHRoaXMuc2F2ZUJlZm9yZUZpbHRlciwgIXRoaXMucmVhZE9ubHkpOyAvLyBmb3JjZSB0byBmYWxzZSB3aGVuIHJlYWRvbmx5XG4gICAgdGhpcy5rZWVwRWRpdGVkUm93T25TYXZlID0gdG9Cb29sZWFuKHRoaXMua2VlcEVkaXRlZFJvd09uU2F2ZSwgdGhpcy5pbmxpbmVFZGl0aW9uKTtcbiAgICB0aGlzLmVycm9yVHJhbnNsYXRvck9wdGlvbnMgPSB0aGlzLmVycm9yVHJhbnNsYXRvck9wdGlvbnMgfHwgeyBzZXBhcmF0b3I6ICcsICcsIGNvbnRyb2xQYXRoVHJhbnNsYXRvcjogdGhpc307IC8vIENhbiBiZSBvdmVycmlkZSBpbiBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yc1xuXG4gICAgLy8gQ2hlY2sgYXNrIHVzZXIgY29uZmlybWF0aW9uIGlzIHBvc3NpYmxlXG4gICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZURlbGV0ZSAmJiAhdGhpcy5hbGVydEN0cmwpIHRocm93IEVycm9yKCdNaXNzaW5nIFxcJ2FsZXJ0Q3RybFxcJyBvciBcXCdpbmplY3RvclxcJyBpbiBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yLicpO1xuXG4gICAgLy8gRGVmaW5lZCB1bmlxdWUgaWQgZm9yIHNldHRpbmdzIGZvciB0aGUgcGFnZVxuICAgIHRoaXMuc2V0dGluZ3NJZCA9IHRoaXMuc2V0dGluZ3NJZCB8fCB0aGlzLmdlbmVyYXRlVGFibGVJZCgpO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5nZXREaXNwbGF5Q29sdW1ucygpO1xuXG4gICAgLy8gTG9hZCB0aGUgc29ydGVkIGNvbHVtbnMsIGZyb20gc2V0dGluZ3NcbiAgICB7XG4gICAgICBjb25zdCBzb3J0ZWRDb2x1bW4gPSB0aGlzLmdldFNvcnRlZENvbHVtbigpO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gc29ydGVkQ29sdW1uLmlkO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9IHNvcnRlZENvbHVtbi5zdGFydDtcbiAgICB9XG5cbiAgICB0aGlzLmRlZmF1bHRQYWdlU2l6ZSA9IHRoaXMuZ2V0UGFnZVNpemUoKTtcblxuICAgIC8vIFByb3BhZ2F0ZSBlcnJvciB0byBldmVudCBlbWl0dGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmVycm9yU3ViamVjdFxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLm9uRXJyb3IuZW1pdCh2YWx1ZSkpKTtcblxuICAgIC8vIFByb3BhZ2F0ZSBkaXJ0eSB0byBldmVudCBlbWl0dGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmRpcnR5U3ViamVjdFxuICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLm9uRGlydHkuZW1pdCh2YWx1ZSkpKTtcblxuICAgIC8vIFByb3BhZ2F0ZSByb3cgZGlydHkgc3RhdGUgdG8gdGFibGVcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvd1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIocm93ID0+IHJvdz8udmFsaWRhdG9yICYmIHRydWUpLFxuICAgICAgICAgIG1lcmdlTWFwKHJvdyA9PiByb3cudmFsaWRhdG9yLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRha2VVbnRpbChcbiAgICAgICAgICAgICAgICAvLyBTdG9wIGlmIG5leHQgYW5vdGhlciByb3csIG9yIGRlc3Ryb3lpbmdcbiAgICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICAgIHRoaXMub25TdGFydEVkaXRpbmdSb3csXG4gICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0XG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgICAgIC8vLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gIHRhcCgoKSA9PiBjb25zb2xlLmRlYnVnKCdUT0RPIHN0b3BwaW5nIHByZXZpb3VzIHJvdyBsaXN0ZW5lcicpKVxuICAgICAgICAgICAgICAgIC8vKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBtYXAoKCkgPT4gcm93LnZhbGlkYXRvcj8uZGlydHkpLFxuICAgICAgICAgICAgICBmaWx0ZXIoZGlydHkgPT4gZGlydHkgPT09IHRydWUpLFxuICAgICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgICAvL3RhcCgoKSA9PiBjb25zb2xlLmRlYnVnKFwiUHJvcGFnYXRlIHJvdydzIGRpcnR5IHRvIHRhYmxlLi4uXCIpKVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubWFya0FzRGlydHkoKSlcbiAgICApO1xuXG4gICAgLy8gQ2FsbCBkYXRhc291cmNlIHJlZnJlc2gsIG9uIGVhY2ggcmVmcmVzaCBldmVudHNcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblJlZnJlc2hcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoPGFueSwgYW55Pih0aGlzLmF1dG9Mb2FkID8ge30gOiAnc2tpcCcpLFxuICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICdza2lwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghdGhpcy5fZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIFNraXBwaW5nIGRhdGEgbG9hZDogbm8gZGF0YVNvdXJjZSBkZWZpbmVkJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gQ2FsbGluZyBkYXRhU291cmNlLndhdGNoQWxsKCkuLi4nKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2Uud2F0Y2hBbGwoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZVNpemUsXG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0QWN0aXZlLFxuICAgICAgICAgICAgICAgIHRoaXMuc29ydERpcmVjdGlvbixcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICB0aGlzLnNldEVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7IC8vIENvbnRpbnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLnVwZGF0ZVZpZXcocmVzKSkpO1xuXG4gICAgLy8gTGlzdGVuIGRhdGFTb3VyY2UgbG9hZGluZyBldmVudHNcbiAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSkgdGhpcy5saXN0ZW5EYXRhc291cmNlTG9hZGluZyh0aGlzLl9kYXRhU291cmNlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBEZXRlY3Qgd2hlbiBzdXBlci5uZ09uSW5pdCgpIG5vdCBjYWxsXG4gICAgaWYgKHRoaXMuZGVidWcgJiYgIXRoaXMuZGlzcGxheWVkQ29sdW1ucykgY29uc29sZS53YXJuKGBbdGFibGVdIE1pc3NpbmcgJ2Rpc3BsYXllZENvbHVtbnMnLiBEaWQgeW91IGNhbGwgc3VwZXIubmdPbkluaXQoKSBpbiBjb21wb25lbnQgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9ID9gKTtcblxuICAgIC8vIFN0YXJ0IGxpc3RlbmluZyBzb3J0IGFuZCBwYWdpbmF0b3IgZXZlbnRzXG4gICAgdGhpcy5saXN0ZW5Tb3J0QW5kUGFnaW5hdGlvbkV2ZW50cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBVbnN1YnNjcmliZSBjb2x1bW4gdmFsdWUgY2hhbmdlc1xuICAgIE9iamVjdC5rZXlzKHRoaXMuX2NlbGxWYWx1ZUNoYW5nZXNEZWZzKS5mb3JFYWNoKGNvbCA9PiB0aGlzLnN0b3BDZWxsVmFsdWVDaGFuZ2VzKGNvbCwgdHJ1ZSkpO1xuICAgIHRoaXMuX2NlbGxWYWx1ZUNoYW5nZXNEZWZzID0ge307XG5cbiAgICB0aGlzLnJlYWR5U3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNhdmluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmVycm9yU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGlydHlTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLm9uUmVmcmVzaC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25PcGVuUm93LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbk5ld1Jvdy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25TdGFydEVkaXRpbmdSb3cudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQ29uZmlybUVkaXRDcmVhdGVSb3cudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQ2FuY2VsT3JEZWxldGVSb3cudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQmVmb3JlRGVsZXRlUm93cy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25CZWZvcmVDYW5jZWxSb3dzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbkJlZm9yZVNhdmUudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQWZ0ZXJEZWxldGVkUm93cy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25Tb3J0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbkRpcnR5LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vbkVycm9yLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0Lm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVWaWV3KHJlczogTG9hZFJlc3VsdDxUPiB8IHVuZGVmaW5lZCwgb3B0cz86IHtcbiAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFyZXMpIHJldHVybjsgLy8gU2tpcCAoZS5nIGVycm9yKVxuICAgIGlmIChyZXMgJiYgcmVzLmRhdGEpIHtcbiAgICAgIHRoaXMudmlzaWJsZVJvd0NvdW50ID0gcmVzLmRhdGEubGVuZ3RoO1xuICAgICAgdGhpcy50b3RhbFJvd0NvdW50ID0gaXNOb3ROaWwocmVzLnRvdGFsKSA/IHJlcy50b3RhbCA6ICgodGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogKHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIHx8IERFRkFVTFRfUEFHRV9TSVpFKSB8fCAwKSArIHRoaXMudmlzaWJsZVJvd0NvdW50KTtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdICR7cmVzLmRhdGEubGVuZ3RofSByb3dzIGxvYWRlZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL2lmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIE5PIHJvd3MgbG9hZGVkJyk7XG4gICAgICB0aGlzLnRvdGFsUm93Q291bnQgPSAwO1xuICAgICAgdGhpcy52aXNpYmxlUm93Q291bnQgPSAwO1xuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubWFya0FzVW50b3VjaGVkKHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGRhdGFzb3VyY2U6IEVudGl0aWVzVGFibGVEYXRhU291cmNlPFQsIEYsIElEPikge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ1t0YWJsZV0gZGF0YVNvdXJjZSBhbHJlYWR5IHNldCAhJyk7XG4gICAgaWYgKGRhdGFzb3VyY2UgJiYgdGhpcy5fZGF0YVNvdXJjZSAhPT0gZGF0YXNvdXJjZSkge1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFzb3VyY2U7XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpIHRoaXMubGlzdGVuRGF0YXNvdXJjZUxvYWRpbmcoZGF0YXNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXREYXRhU291cmNlKCkge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5yZW1vdmUodGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgICAvL3RoaXMuX2RhdGFTb3VyY2U/LmNsb3NlKCk7XG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IG51bGw7XG4gIH1cblxuICBhZGRDb2x1bW5EZWYoY29sdW1uOiBDZGtDb2x1bW5EZWYpIHtcbiAgICB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZihjb2x1bW4pO1xuICB9XG5cbiAgcmVtb3ZlQ29sdW1uRGVmKGNvbHVtbjogQ2RrQ29sdW1uRGVmKSB7XG4gICAgdGhpcy50YWJsZS5yZW1vdmVDb2x1bW5EZWYoY29sdW1uKTtcbiAgfVxuXG4gIHNldEZpbHRlcihmaWx0ZXI6IEYsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IH0pIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7ZW1pdEV2ZW50OiB0cnVlfTtcblxuICAgIGlmICh0aGlzLnNhdmVCZWZvcmVGaWx0ZXIpIHtcblxuICAgICAgLy8gaWYgYSBkaXJ0eSB0YWJsZSBpcyB0byBiZSBzYXZlZCBiZWZvcmUgZmlsdGVyXG4gICAgICBpZiAodGhpcy5kaXJ0eSkge1xuXG4gICAgICAgIC8vIFNhdmVcbiAgICAgICAgdGhpcy5zYXZlQmVmb3JlQWN0aW9uKCdmaWx0ZXInKS50aGVuKHNhdmVkID0+IHtcbiAgICAgICAgICAvLyBBcHBseSBmaWx0ZXIgb25seSBpZiB1c2VyIGRpZG4ndCBjYW5jZWwgdGhlIHNhdmUgb3IgdGhlIHNhdmUgaXMgb2tcbiAgICAgICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyLCBvcHRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhcHBseSBmaWx0ZXIgb24gbm9uIGRpcnR5IHRhYmxlXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoZmlsdGVyLCBvcHRzKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIGFwcGx5IGZpbHRlciBkaXJlY3RseVxuICAgICAgdGhpcy5hcHBseUZpbHRlcihmaWx0ZXIsIG9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1BbmRBZGQoZXZlbnQ/OiBFdmVudCwgcm93PzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50LCByb3cpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEFkZCByb3dcbiAgICByZXR1cm4gdGhpcy5hZGRSb3coZXZlbnQpO1xuICB9XG5cbiAgY29uZmlybUFuZEJhY2t3YXJkKGV2ZW50PzogRXZlbnQsIHJvdz86IFRhYmxlRWxlbWVudDxUPik6IGJvb2xlYW4ge1xuXG4gICAgLy8gRGVsZXRpbmcgZWRpdGVkIHJvdywgaWYgZW1wdHkgYW5kIG5vdCBkaXJ0eVxuICAgIGNvbnN0IHByZXZpb3VzUm93ID0gdGhpcy5lZGl0ZWRSb3c7XG4gICAgaWYgKHByZXZpb3VzUm93ICYmIChwcmV2aW91c1Jvdy5pZCA9PT0gLTEpICYmIHByZXZpb3VzUm93LnZhbGlkYXRvcj8uaW52YWxpZCAmJiAhKHByZXZpb3VzUm93LnZhbGlkYXRvcj8uZGlydHkpKSB7XG4gICAgICB0aGlzLmRlbGV0ZU5ld1JvdyhldmVudCwgcHJldmlvdXNSb3cpO1xuXG4gICAgICAvLyBXYWl0IGRlbGV0aW9uIGlzIGRvbmUsIHRoZW4gZWRpdCBwcmV2aW91cyByb3cgKGJ5IGlkLCBiZWNhdXNlIG9mIHJlbG9hZGluZylcbiAgICAgIHRoaXMud2FpdElkbGUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLmVkaXRSb3dCeUlkKGV2ZW50LCByb3cuaWQsIHtmb2N1c0NvbHVtbjogdGhpcy5sYXN0VXNlckNvbHVtbn0pKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEVkaXQgcHJldmlvdXMgcm93XG4gICAgdGhpcy5lZGl0Um93KGV2ZW50LCByb3csIHtmb2N1c0NvbHVtbjogdGhpcy5sYXN0VXNlckNvbHVtbn0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uZmlybUFuZEZvcndhcmQoZXZlbnQ/OiBFdmVudCwgcm93PzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJvdyA9IHJvdyB8fCB0aGlzLmVkaXRlZFJvdztcbiAgICBpZiAoIXRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpIHtcbiAgICAgIC8vIElmIHBlbmRpbmc6IFdhaXQgZW5kIG9mIHZhbGlkYXRpb24sIHRoZW4gbG9vcFxuICAgICAgaWYgKHJvdy52YWxpZGF0b3I/LnBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHJvdy52YWxpZGF0b3IpLnRoZW4oKCkgPT4gdGhpcy5jb25maXJtQW5kRm9yd2FyZChldmVudCwgcm93KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRWRpdCBuZXh0IHJvd1xuICAgIHRoaXMuZWRpdFJvd0J5SWQoZXZlbnQsIHJvdy5pZCArIDEsIHtmb2N1c0NvbHVtbjogdGhpcy5maXJzdFVzZXJDb2x1bW59KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ2l2ZW4gcm93LCBvciBpZiBub3Qgc3BlY2lmaWVkIHRoZSBjdXJyZW50bHkgZWRpdGVkIHJvd1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgY29uZmlybUVkaXRDcmVhdGUoZXZlbnQ/OiBFdmVudCwgcm93PzogVGFibGVFbGVtZW50PFQ+KTogYm9vbGVhbiB7XG4gICAgcm93ID0gcm93IHx8IHRoaXMuZWRpdGVkUm93O1xuICAgIGlmICghcm93IHx8ICFyb3cuZWRpdGluZykgcmV0dXJuIHRydWU7IC8vIG5vIHJvdyB0byBjb25maXJtXG5cbiAgICAvLyBTdG9wIGV2ZW50XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gQ29uZmlybWF0aW9uIGVkaXRpb24gb3IgY3JlYXRpb25cbiAgICAvLyBUT0RPOiBhZGQgYXdhaXQgP1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IHJvdy5jb25maXJtRWRpdENyZWF0ZSgpO1xuXG4gICAgaWYgKGNvbmZpcm1lZCkge1xuICAgICAgLy8gSWYgZWRpdCBmaW5pc2hlZCwgZm9yZ2V0IGVkaXRlZCByb3dcbiAgICAgIGlmIChyb3cgPT09IHRoaXMuZWRpdGVkUm93KSB7XG4gICAgICAgIHRoaXMuZWRpdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIHRhYmxlIGFzIGRpcnR5IChpZiByb3cgaXMgZGlydHkpXG4gICAgICBpZiAocm93LnZhbGlkYXRvcj8uZGlydHkpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSh7ZW1pdEV2ZW50OiBmYWxzZSAvKiBiZWNhdXNlIG9mIHJlc2V0RXJyb3IoKSAqL30pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBlcnJvclxuICAgICAgdGhpcy5yZXNldEVycm9yKCk7XG5cbiAgICAgIC8vIEVtaXQgdGhlIGNvbmZpcm0gZXZlbnRcbiAgICAgIHRoaXMub25Db25maXJtRWRpdENyZWF0ZVJvdy5uZXh0KHJvdyk7XG5cbiAgICAgIHJldHVybiB0cnVlOyAvLyBDb250aW51ZVxuICAgIH1cblxuICAgIGlmIChyb3cudmFsaWRhdG9yKSB7XG4gICAgICAvLyBJZiBwZW5kaW5nOiBXYWl0IGVuZCBvZiB2YWxpZGF0aW9uLCB0aGVuIGxvb3BcbiAgICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIHVzaW5nIGFzeW5jIGlzVmFsaWQoKSBmdW5jdGlvblxuICAgICAgaWYgKHJvdy52YWxpZGF0b3IucGVuZGluZykge1xuICAgICAgICBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhyb3cudmFsaWRhdG9yKS50aGVuKCgpID0+IHRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIE5PVCBjb25maXJtZWQgPSByb3cgaGFzIGVycm9yXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZV0gQ2Fubm90IGNvbmZpcm0gcm93LCBiZWNhdXNlIGludmFsaWQnKTtcbiAgICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMocm93LnZhbGlkYXRvciwgJ1t0YWJsZV0gJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpeDogbWFyayBhbGwgY29udHJvbHMgYXMgdG91Y2hlZCB0byBzaG93IGVycm9yc1xuICAgICAgcm93LnZhbGlkYXRvci5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAgIC8vIENvbXB1dGUgcm93IGVycm9yLCBhbmQgcHJvcGFnYXRlIHRvIHRhYmxlJ3MgZXJyb3JcbiAgICAgIGlmICh0aGlzLnByb3BhZ2F0ZVJvd0Vycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRSb3dFcnJvcihyb3cpO1xuICAgICAgICB0aGlzLnNldEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjYW5jZWxPckRlbGV0ZShldmVudDogRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW47IGtlZXBFZGl0aW5nPzogYm9vbGVhbjsgfSkge1xuICAgIC8vIERlbGV0ZSBuZXcgcm93XG4gICAgaWYgKHJvdy5pZCA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZGVsZXRlTmV3Um93KGV2ZW50LCByb3cpO1xuICAgIH1cbiAgICAvLyBEZWxldGUgZXhpc3RpbmcgKGJ1IG5vdCBlZGl0aW5nKSByb3dcbiAgICBlbHNlIGlmICghcm93LmVkaXRpbmcpIHtcbiAgICAgIHRoaXMuZGVsZXRlRXhpc3RpbmdSb3coZXZlbnQsIHJvdywgb3B0cyk7XG4gICAgfVxuICAgIC8vIENhbmNlbCBleGlzdGluZyAoYW5kIGVkaXRpbmcpIHJvd1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYW5jZWxFeGlzdGluZ1JvdyhldmVudCwgcm93LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb3coZXZlbnQ/OiBFdmVudCwgaW5zZXJ0QXQ/OiBudW1iZXIsIG9wdHM/OiB7Zm9jdXNDb2x1bW4/OiBzdHJpbmc7IGVkaXRpbmc/OiBib29sZWFuIH0pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBBc2tpbmcgZm9yIG5ldyByb3cuLi4nKTtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFVzZSBtb2RhbCBpZiBpbmxpbmUgZWRpdGlvbiBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5pbmxpbmVFZGl0aW9uKSB7XG4gICAgICB0aGlzLm9wZW5OZXdSb3dEZXRhaWwoZXZlbnQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBmaW5pc2ggZWRpdGVkIHJvdyBmaXJzdFxuICAgIGlmICghdGhpcy5jb25maXJtRWRpdENyZWF0ZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQWRkIG5ldyByb3dcbiAgICB0aGlzLmFkZFJvd1RvVGFibGUoaW5zZXJ0QXQsIG9wdHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShvcHRzPzogeyBrZWVwRWRpdGluZz86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIG9wdHMgPSB7XG4gICAgICBrZWVwRWRpdGluZzogdGhpcy5rZWVwRWRpdGVkUm93T25TYXZlLFxuICAgICAgLi4ub3B0c1xuICAgIH07XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHRocm93IHtjb2RlOiBFcnJvckNvZGVzLlRBQkxFX1JFQURfT05MWSwgbWVzc2FnZTogJ0VSUk9SLlRBQkxFX1JFQURfT05MWSd9O1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuXG4gICAgLy8gS2VlcCBlZGl0ZWQgcm93IGlkIChzaG91bGQgYmUgZG9uZSBCRUZPUkUgY29uZmlybUVkaXRDcmVhdGUoKSApXG4gICAgdGhpcy5wcmV2aW91c2x5RWRpdGVkUm93SWQgPSBvcHRzLmtlZXBFZGl0aW5nID8gKCh0aGlzLmVkaXRlZFJvdz8uZWRpdGluZyA/IHRoaXMuZWRpdGVkUm93LmlkIDogdW5kZWZpbmVkKSB8fCB0aGlzLnNpbmdsZVNlbGVjdGVkUm93Py5pZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJldmlvdXNseUVkaXRlZERhdGEgPSBvcHRzLmtlZXBFZGl0aW5nID8gKGlzTm90TmlsKHRoaXMucHJldmlvdXNseUVkaXRlZFJvd0lkKSAmJiB0aGlzLmVkaXRlZFJvdz8uY3VycmVudERhdGEgfHwgdGhpcy5zaW5nbGVTZWxlY3RlZFJvdz8uY3VycmVudERhdGEpIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCkpIHtcbiAgICAgIHRocm93IHtjb2RlOiBFcnJvckNvZGVzLlRBQkxFX0lOVkFMSURfUk9XX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfSU5WQUxJRF9ST1dfRVJST1InfTtcbiAgICB9XG5cbiAgICAvLyBNYXJrIGFzIHNhdmluZ1xuICAgIHRoaXMubWFya0FzU2F2aW5nKCk7XG5cbiAgICB0cnkge1xuXG4gICAgICAvLyBDYWxsaW5nIHNlcnZpY2Ugc2F2ZSgpXG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBDYWxsaW5nIGRhdGFTb3VyY2Uuc2F2ZSgpLi4uJyk7XG4gICAgICBjb25zdCBpc09LID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5zYXZlKCk7XG5cbiAgICAgIGlmIChpc09LKSB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICAgIHJldHVybiBpc09LO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXRFcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG5cbiAgICAgIC8vIFJlc3RvcmUgcHJldmlvdXMgcm93XG4gICAgICBpZiAoaXNOb3ROaWwodGhpcy5wcmV2aW91c2x5RWRpdGVkUm93SWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0Um93QnlJZE9yRGF0YSh0aGlzLnByZXZpb3VzbHlFZGl0ZWRSb3dJZCwgcHJldmlvdXNseUVkaXRlZERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbmNlbChldmVudD86IEV2ZW50LCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW47IH0pIHtcblxuICAgIC8vIENoZWNrIGNvbmZpcm1hdGlvblxuICAgIGlmICgoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpICYmIHRoaXMuZGlydHkgJiYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCB8fCB0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY2FuQ2FuY2VsUm93cygpLnRoZW4oY29uZmlybSA9PiB7XG4gICAgICAgIC8vIElmIGNvbmZpcm1lZCwgbG9vcFxuICAgICAgICBpZiAoY29uZmlybSkgdGhpcy5jYW5jZWwobnVsbCwge2ludGVyYWN0aXZlOiBmYWxzZX0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICB9XG5cbiAgYXN5bmMgZHVwbGljYXRlUm93KGV2ZW50PzogRXZlbnQsIHJvdz86IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHtcbiAgICBza2lwUHJvcGVydGllcz86IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgcm93ID0gcm93IHx8IHRoaXMuc2luZ2xlU2VsZWN0ZWRSb3c7XG4gICAgaWYgKCFyb3cgfHwgIXRoaXMuY29uZmlybUVkaXRDcmVhdGUoZXZlbnQsIHJvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdSb3cgPSBhd2FpdCB0aGlzLmFkZFJvd1RvVGFibGUocm93LmlkICsgMSk7XG4gICAgY29uc3QganNvbiA9IHsuLi5yb3cuY3VycmVudERhdGEsIGlkOiBudWxsfTtcblxuICAgIC8vIFJlc2V0IHNvbWUgcHJvcGVydGllcyAoZS5nLiByYW5rT3JkZXIsIGV0YylcbiAgICBpZiAob3B0cyAmJiBvcHRzLnNraXBQcm9wZXJ0aWVzKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3Um93LmN1cnJlbnREYXRhO1xuICAgICAgb3B0cy5za2lwUHJvcGVydGllcy5mb3JFYWNoKGtleSA9PiBqc29uW2tleV0gPSBuZXdEYXRhW2tleV0pO1xuICAgIH1cblxuICAgIGlmIChuZXdSb3cudmFsaWRhdG9yKSB7XG4gICAgICBuZXdSb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoanNvbik7XG4gICAgICBuZXdSb3cudmFsaWRhdG9yLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKG5ld1Jvdy5jdXJyZW50RGF0YT8uZnJvbU9iamVjdCkge1xuICAgICAgICBuZXdSb3cuY3VycmVudERhdGEuZnJvbU9iamVjdChqc29uKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdSb3cuY3VycmVudERhdGEgPSBqc29uO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cblxuICAgIC8vIHNlbGVjdFxuICAgIHRoaXMuY2xpY2tSb3codW5kZWZpbmVkLCBuZXdSb3cpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cbiAgaXNBbGxTZWxlY3RlZCgpIHtcbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZygnaXNBbGxTZWxlY3RlZC4gbGVuZ3RocycsIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCwgdGhpcy50b3RhbFJvd0NvdW50KTtcblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMudG90YWxSb3dDb3VudCB8fFxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLnZpc2libGVSb3dDb3VudDtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXG4gIGFzeW5jIG1hc3RlclRvZ2dsZSgpIHtcblxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9kYXRhU291cmNlLmdldFJvd3MoKTtcbiAgICAgIHJvd3MuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVNlbGVjdGlvbihldmVudDogVUlFdmVudCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlUm93cyhldmVudCwgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBvcHRzIFVzZSBpbnRlcmFjdGl2ZT1mYWxzZSB0byBhdm9pZCB1c2VyIGludGVyYWN0aW9uIChlLmcuIHVzZXIgY29uZmlybWF0aW9uKVxuICAgKiAgQW5kIHRvIGZvcmNlIGRlbGV0aW9uIGV2ZW4gaWYgdGFibGUgaXMgYnVzeVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlUm93KGV2ZW50OiBVSUV2ZW50fG51bGwsIHJvdzogVGFibGVFbGVtZW50PFQ+LCBvcHRzPzoge2ludGVyYWN0aXZlPzogYm9vbGVhbjt9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVsZXRlQ291bnQgPSBhd2FpdCB0aGlzLmRlbGV0ZVJvd3MoZXZlbnQsIFtyb3ddLCBvcHRzKTtcbiAgICByZXR1cm4gZGVsZXRlQ291bnQgPT09IDE7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSByb3dzXG4gICAqIEBwYXJhbSBvcHRzIFVzZSBpbnRlcmFjdGl2ZT1mYWxzZSB0byBhdm9pZCB1c2VyIGludGVyYWN0aW9uIChlLmcuIHVzZXIgY29uZmlybWF0aW9uKVxuICAgKiAgICBBbmQgdG8gZm9yY2UgZGVsZXRpb24gZXZlbiBpZiB0YWJsZSBpcyBidXN5XG4gICAqL1xuICBhc3luYyBkZWxldGVSb3dzKGV2ZW50OiBVSUV2ZW50fG51bGwsIHJvd3M6IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzoge2ludGVyYWN0aXZlPzogYm9vbGVhbjt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgdGhyb3cge2NvZGU6IEVycm9yQ29kZXMuVEFCTEVfUkVBRF9PTkxZLCBtZXNzYWdlOiAnRVJST1IuVEFCTEVfUkVBRF9PTkxZJ307XG4gICAgfVxuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuIDA7IC8vIFNLaXBcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICghdGhpcy5fZW5hYmxlZCB8fCBpc0VtcHR5QXJyYXkocm93cykpIHJldHVybiAwOyAvLyBTa2lwIGlzIGRpc2FibGVkLCBvciBubyByb3dzIHRvIGRlbGV0ZVxuICAgIGlmICh0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbYXBwLXRhYmxlXSBTa2lwIGRlbGV0ZVJvd3MoKSBiZWNhdXNlIHRhYmxlIGlzIGJ1c3kgKGxvYWRpbmcpLiBVc2Ugb3B0cy5pbnRlcmFjdGl2ZSA9IGZhbHNlIHRvIGZvcmNlIGRlbGV0aW9uJyk7XG4gICAgICByZXR1cm4gMDsgLy8gU2tpcCBpZiBsb2FkaW5nXG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRvIGtlZXAgbmV3bHkgY3JlYXRlZCByb3dcbiAgICBpZiAodGhpcy5lZGl0ZWRSb3c/LmlkID09PSAtMSAmJiB0aGlzLmVkaXRlZFJvdy5lZGl0aW5nICYmICFyb3dzLmluY2x1ZGVzKHRoaXMuZWRpdGVkUm93KSkge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gdGhpcy5jb25maXJtRWRpdENyZWF0ZSgpO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybiAwOyAvLyBDYW5ub3QgZGVsZXRlIChlLmcuIGVkaXRlZCByb3cgaXMgaW52YWxpZClcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjYW4gZGVsZXRlXG4gICAgY29uc3QgY2FuRGVsZXRlID0gYXdhaXQgdGhpcy5jYW5EZWxldGVSb3dzKHJvd3MsIG9wdHMpO1xuICAgIGlmICghY2FuRGVsZXRlKSByZXR1cm4gMDsgLy8gQ2Fubm90IGRlbGV0ZVxuXG4gICAgLy8gUmV2ZXJzZSByb3cgb3JkZXIgKG9uIGEgY29weSlcbiAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCwgbmVlZCBiZWNhdXNlIHJvdy5kZWxldGUoKSBoYXMgYXN5bmMgZXhlY3V0aW9uXG4gICAgLy8gYW5kIGluZGV4IGNhY2hlIGlzIHVwZGF0ZWQgd2l0aCBhIGRlbGF5XG4gICAgbGV0IHRlbXBSb3dzID0gcm93cy5zbGljZSgpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5pZCA+IGIuaWQgPyAtMSA6IDEpO1xuXG4gICAgbGV0IGRlbGV0ZWRSb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSA9IFtdO1xuXG4gICAgLy8gSWYgZGF0YSBuZWVkIHRvIGJlIHNhdmVkIGZpcnN0XG4gICAgaWYgKHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSkge1xuICAgICAgLy8gRXhjbHVkZSBpbnZhbGlkIHJvd3MgKGJlY2F1c2Ugb2Ygc2F2ZSgpIHdpbGwgZmFpbCwgd2hlbiBleGlzdHMgc29tZSBpbnZhbGlkIHJvd3MpXG4gICAgICB0ZW1wUm93cyA9IHRlbXBSb3dzLmZpbHRlcihyb3cgPT4ge1xuICAgICAgICAvLyBEZWxldGUgdGhlIHJvdyA6XG4gICAgICAgIC8vIC0gaWYgbmV3bHkgY3JlYXRlZCByb3cgKGlkID0gLTEpLFxuICAgICAgICAvLyAtIG9yIGlmIGludmFsaWQgYW5kIG5vdCBlZGl0aW5nICg9IG5vdCBjYW5jZWxsYWJsZSlcbiAgICAgICAgaWYgKHJvdy5pZCA9PT0gLTEgfHwgKCFyb3cuZWRpdGluZyAmJiByb3cuaW52YWxpZCAvKmRvIG5vdCB1c2UgIXZhbGlkIGJlY2F1c2UgaWYgcm93IGlzIGRpc2FibGVkLCBpdCB3aWxsIGJlIGFsd2F5cyAhdmFsaWQgKi8pKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gRGVsZXRlIHJvdyAjJHtyb3cuaWR9YCk7XG4gICAgICAgICAgcm93LmRlbGV0ZSgpO1xuICAgICAgICAgIHRoaXMudmlzaWJsZVJvd0NvdW50LS07XG4gICAgICAgICAgdGhpcy50b3RhbFJvd0NvdW50LS07XG4gICAgICAgICAgZGVsZXRlZFJvd3MucHVzaChyb3cpO1xuICAgICAgICAgIGlmICh0aGlzLmVkaXRlZFJvdyA9PT0gcm93KSB0aGlzLmVkaXRlZFJvdyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEV4Y2x1ZGUgZnJvbSB0aGUgbGlzdCB0byBkZWxldGUgdXNpbmcgdGhlIHNlcnZpY2VcbiAgICAgICAgfVxuICAgICAgICAvLyBDYW5jZWwgdGhlIHJvdyAoYW5kIG1hcmsgYXMgcHJpc3RpbmUpLCB3aGVuIG5vdCB2YWxpZCBidXQgaW4gZWRpdGlvblxuICAgICAgICBlbHNlIGlmIChyb3cuZWRpdGluZyAmJiAhcm93LnZhbGlkKSB7XG4gICAgICAgICAgcm93LmNhbmNlbCgpO1xuICAgICAgICAgIC8vIE1hcmsgcm93IGFzIHByaXN0aW5lIChpZiBwb3NzaWJsZSlcbiAgICAgICAgICB0aGlzLmNoZWNrSWZSb3dQcmlzdGluZShyb3csIHtlbWl0RXZlbnQ6IGZhbHNlLCBvbmx5U2VsZjogdHJ1ZSAvKmF2b2lkIHByb3BhZ2F0aW9uIHRvIHRhYmxlKi99KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcm93LiB0aGUgcm93IHdpbGwgYmUgZGVsZXRlZCBhZnRlciB0aGUgc2F2ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcblxuICAgICAgLy8gQXBwbHkgc2F2ZSwgb25seSBpZiB0aGVyZSBpcyBzdGlsbCBzb21lIHJvd3MgdG8gZGVsZXRlXG4gICAgICAvLyBXQVJOOiBJZiBubyBtb3JlIHJvd3MgKGUuZy4gYmVjYXVzZSBhbGwgaGFzIGJlZW4gY2FuY2VsbGVkKSB0aGVuIGNvbnRpbnVlIGFueXdheSB0byBjbGVhciBlZGl0ZWRSb3cgYW5kIHNlbGVjdGlvbiAoaXNzdWUgSU1BR0lORS02NjkpXG4gICAgICBpZiAoZGVsZXRlZFJvd3MubGVuZ3RoIHx8IHRlbXBSb3dzLmxlbmd0aCkge1xuXG4gICAgICAgIC8vIFNhdmUgZGF0YSAoZS5nLiB3aGVuIHVzaW5nIG1lbW9yeSBzZXJ2aWNlKVxuICAgICAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuc2F2ZUJlZm9yZUFjdGlvbignZGVsZXRlJyk7XG4gICAgICAgIGlmICghc2F2ZWQpIHtcbiAgICAgICAgICAvLyBTdG9wIGlmIHNhdmUgY2FuY2VsbGVkIG9yIHNhdmUgZmFpbGVkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcblxuICAgICAgLy8gQXBwbHkgZGVsZXRpb24gb24gZGF0YXNvdXJjZVxuICAgICAgLy8gSWYgbm8gbW9yZSByb3dzIHRvIGRlbGV0ZSwgY29udGludWUgYW55d2F5IHRvIGNsZWFyIGVkaXRlZFJvdyBhbmQgc2VsZWN0aW9uIChpc3N1ZSBJTUFHSU5FLTY2OSlcbiAgICAgIGlmICh0ZW1wUm93cy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gRGVsZXRlICR7dGVtcFJvd3MubGVuZ3RofSByb3dzLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuZGVsZXRlQWxsKHRlbXBSb3dzKTtcbiAgICAgIH1cblxuICAgICAgLy8gRE8gbm90IHVwZGF0ZSBtYW51YWxseSwgYmVjYXVzZSB3YXRjaEFMbCgpLnN1YnNjcmliZSgpIHdpbGwgdXBkYXRlIHRoaXMgY291bnRcbiAgICAgIC8vdGhpcy50b3RhbFJvd0NvdW50IC09IGRlbGV0ZUNvdW50O1xuICAgICAgLy90aGlzLnZpc2libGVSb3dDb3VudCAtPSBkZWxldGVDb3VudDtcblxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIHRoaXMuZWRpdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSh7ZW1pdEV2ZW50OiBmYWxzZSAvKm1hcmtGb3JDaGVjaygpIGlzIGNhbGxlZCBqdXN0IGFmdGVyKi99KTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIHRoaXMub25BZnRlckRlbGV0ZWRSb3dzLm5leHQocm93cyk7XG5cbiAgICAgIHJldHVybiByb3dzLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VsZWN0Um93QnlJZChpZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCB0aGlzLndhaXRJZGxlKCk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhU291cmNlLmdldFJvdyhpZCk7XG4gICAgaWYgKCFyb3cpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jbGlja1JvdyhudWxsLCByb3cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBzZWxlY3Qgcm93IGJ5IGRhdGEuIFdpbGwgdXNlIGRhdGFFcXVhbHMoKSAodGhhdCBjYWxsIEVudGl0eVV0aWxzLmVxdWFscygpKSB0byBmaW5kIHNhbWUgcm93J3MgZGF0YVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgYXN5bmMgc2VsZWN0Um93QnlEYXRhKGRhdGE6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLndhaXRJZGxlKCk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKVxuICAgICAgLmZpbmQocm93ID0+IHRoaXMuZXF1YWxzKHJvdy5jdXJyZW50RGF0YSwgZGF0YSkpO1xuICAgIGlmICghcm93KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2xpY2tSb3cobnVsbCwgcm93KTtcbiAgfVxuXG4gIGNsaWNrUm93KGV2ZW50OiBVSUV2ZW50fHVuZGVmaW5lZCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICAvLyBXYWl0IHdoaWxlIGxvYWRpbmcsIGFuZCBsb29wXG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhcIlt0YWJsZV0gV2FpdGluZyBiZWZvcmUgYXBwbHkgY2xpY2tSb3coKSAoZGF0YXNvdXJjZSBpcyBidXN5KS4uLlwiKTtcbiAgICAgIHRoaXMud2FpdElkbGUoKS50aGVuKCgpID0+IHRoaXMuY2xpY2tSb3coZXZlbnQsIHJvdykpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiW3RhYmxlXSBEZXRlY3QgY2xpY2sgb24gcm93XCIpO1xuXG4gICAgaWYgKHJvdy5pZCA9PT0gLTEgfHwgcm93LmVkaXRpbmcpIHJldHVybiB0cnVlOyAvLyBBbHJlYWR5IGluIGVkaXRpb25cbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiBmYWxzZTsgLy8gQ2FuY2VsbGVkIGJ5IGV2ZW50XG5cbiAgICAvLyBPcGVuIHRoZSBkZXRhaWwgcGFnZSAoaWYgbm90IGlubGluZSBlZGl0aW5nKVxuICAgIGlmICghdGhpcy5pbmxpbmVFZGl0aW9uKSB7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgICB0aGlzLm9wZW5Sb3cocm93LmN1cnJlbnREYXRhLmlkLCByb3cpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMubWFya0FzTG9hZGVkKCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLm1hcmtBc0xvYWRlZCgpKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgZWRpdGluZyByb3dcbiAgICByZXR1cm4gdGhpcy5lZGl0Um93KGV2ZW50LCByb3csIHtmb2N1c0NvbHVtbjogdW5kZWZpbmVkIC8qZm9yY2UgdG8gdXNlIHRoZSBjbGljayB0YXJnZXQqL30pO1xuICB9XG5cbiAgbW92ZVJvdyhpZDogbnVtYmVyLCBkaXJlY3Rpb246IG51bWJlcikge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5tb3ZlKGlkLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgcmVhZHkob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHdhaXRGb3JUcnVlKHRoaXMucmVhZHlTdWJqZWN0LCBvcHRzKTtcbiAgfVxuXG4gIHdhaXRJZGxlKG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB3YWl0Rm9yRmFsc2UodGhpcy5sb2FkaW5nU3ViamVjdCwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBvcGVuU2VsZWN0Q29sdW1uc01vZGFsKGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgLy8gQ29weSBjdXJyZW50IGNvbHVtbnMgKGRlZXAgY29weSlcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDdXJyZW50Q29sdW1ucygpO1xuXG4gICAgY29uc3QgaGFzVG9wTW9kYWwgPSAhIShhd2FpdCB0aGlzLm1vZGFsQ3RybC5nZXRUb3AoKSk7XG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBUYWJsZVNlbGVjdENvbHVtbnNDb21wb25lbnQsXG4gICAgICBjb21wb25lbnRQcm9wczoge2NvbHVtbnN9LFxuICAgICAgY3NzQ2xhc3M6IGhhc1RvcE1vZGFsICYmICdzdGFjay1tb2RhbCdcbiAgICB9KTtcblxuICAgIC8vIE9wZW4gdGhlIG1vZGFsXG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuXG4gICAgLy8gT24gZGlzbWlzc1xuICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IG1vZGFsLm9uRGlkRGlzbWlzcygpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuOyAvLyBDQU5DRUxMRURcblxuICAgIC8vIEFwcGx5IGNvbHVtbnNcbiAgICBjb25zdCB1c2VyQ29sdW1ucyA9IChkYXRhIHx8IFtdKS5maWx0ZXIoYyA9PiBjLmNhbkhpZGUgPT09IGZhbHNlIHx8IGMudmlzaWJsZSkubWFwKGMgPT4gYy5uYW1lKSB8fCBbXTtcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmNvbmNhdCh1c2VyQ29sdW1ucykuY29uY2F0KFJFU0VSVkVEX0VORF9DT0xVTU5TKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gVXBkYXRlIHVzZXIgc2V0dGluZ3NcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnNhdmVQYWdlU2V0dGluZyh0aGlzLnNldHRpbmdzSWQsIHVzZXJDb2x1bW5zLCBTRVRUSU5HU19ESVNQTEFZX0NPTFVNTlMpO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIHJvdzogVGFibGVFbGVtZW50PFQ+KSB7XG4gICAgcmV0dXJuIHJvdy5pZDtcbiAgfVxuXG4gIGRvUmVmcmVzaChldmVudD86IENvbXBsZXRhYmxlRXZlbnQpIHtcbiAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KGV2ZW50KTtcblxuICAgIC8vIFdoZW4gdGFyZ2V0IHdhaXQgZm9yIGEgY29tcGxldGUgKGUuZy4gSW9uUmVmcmVzaGVyKVxuICAgIGlmIChldmVudD8udGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5jb21wbGV0ZSkge1xuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDdXJyZW50Q29sdW1ucygpOiBDb2x1bW5JdGVtW10ge1xuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuc2xpY2UoUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5sZW5ndGgpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiB0aGlzLmRpc3BsYXllZENvbHVtbnMuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnNcbiAgICAgICAgLmNvbmNhdChoaWRkZW5Db2x1bW5zKVxuICAgICAgICAuZmlsdGVyKG5hbWUgPT4gIVJFU0VSVkVEX1NUQVJUX0NPTFVNTlMuaW5jbHVkZXMobmFtZSkgJiYgIVJFU0VSVkVEX0VORF9DT0xVTU5TLmluY2x1ZGVzKG5hbWUpXG4gICAgICAgICAgICAmJiAhdGhpcy5leGNsdWRlc0NvbHVtbnMuaW5jbHVkZXMobmFtZSkpXG4gICAgICAgIC5tYXAobmFtZSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0STE4bkNvbHVtbk5hbWUobmFtZSksXG4gICAgICAgICAgdmlzaWJsZTogdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmluZGV4T2YobmFtZSkgIT09IC0xLFxuICAgICAgICAgIGNhbkhpZGU6IHRoaXMuZ2V0UmVxdWlyZWRDb2x1bW5zKCkuaW5kZXhPZihuYW1lKSA9PT0gLTFcbiAgICAgICAgfSkpO1xuICB9XG5cbiAgZXNjYXBlRWRpdGluZ1JvdyhldmVudD86IEV2ZW50LCByb3c/OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5lZGl0ZWRSb3c7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5lZGl0aW5nKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZygnW2FwcC10YWJsZV0gQ2FuY2VsIHRoZSByb3cgKGtleWRvd24uZXNjYXBlKScpO1xuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICAvLyBBdm9pZCB0byBjYW5jZWwgdGhlIGVkaXRvclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIElmIG5ldyByb3cgKG5vIGlkKVxuICAgIGlmIChyb3cuaWQgPT09IC0xKSB7XG4gICAgICBpZiAocm93LnZhbGlkYXRvcikge1xuICAgICAgICAvLyBJZiBwZW5kaW5nOiBXYWl0IGVuZCBvZiB2YWxpZGF0aW9uLCB0aGVuIGxvb3BcbiAgICAgICAgaWYgKHJvdy52YWxpZGF0b3IucGVuZGluZykge1xuICAgICAgICAgIEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHJvdy52YWxpZGF0b3IpLnRoZW4oKCkgPT4gdGhpcy5lc2NhcGVFZGl0aW5nUm93KGV2ZW50LCByb3cpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSb3cgaXMgaW52YWxpZDogZGVsZXRlIHRoZSByb3dcbiAgICAgICAgaWYgKHJvdy52YWxpZGF0b3IuaW52YWxpZCkge1xuICAgICAgICAgIHRoaXMuZGVsZXRlTmV3Um93KGV2ZW50LCByb3cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgcm93IGV4aXN0cyAoaGFzIGFuIGlkKVxuICAgIGVsc2Uge1xuICAgICAgLy8gbmVlZCB0byBjYWxsIGNhbmNlbCBmdW5jdGlvbiAoaWYgY29uZmlybWF0aW9uIHdpbGwgYmUgY2FsbCBiZWZvcmUgYmVmb3JlKVxuICAgICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCkge1xuICAgICAgICB0aGlzLmNhbmNlbEV4aXN0aW5nUm93KGV2ZW50LCByb3csIHtrZWVwRWRpdGluZzogZmFsc2V9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHRyeSB0byBjb25maXJtIHRoZSByb3dcbiAgICB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKGV2ZW50LCByb3cpO1xuICB9XG5cbiAgdHJhbnNsYXRlQ29udHJvbFBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBDYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcywgdG8gcmVzb2x2ZSBhbGwgZmllbGQgbmFtZVxuXG4gICAgLy8gVXNlIGNvbHVtbnMga2V5LCBoYXMgZGVmYXVsdCBuYW1lXG4gICAgY29uc3QgaTE4bkNvbHVtbktleSA9IHRoaXMuZ2V0STE4bkNvbHVtbk5hbWUocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlPy5pbnN0YW50KGkxOG5Db2x1bW5LZXkpIHx8IGkxOG5Db2x1bW5LZXk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kIC0tICovXG5cblxuICBwcm90ZWN0ZWQgZWRpdFJvdyhldmVudDogRXZlbnR8dW5kZWZpbmVkLCByb3c6IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHtmb2N1c0NvbHVtbj86IHN0cmluZ30pOiBib29sZWFuIHtcblxuICAgIGlmICghdGhpcy5fZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmVkaXRlZFJvdyA9PT0gcm93KSByZXR1cm4gdHJ1ZTsgLy8gQWxyZWFkeSB0aGUgZWRpdGVkIHJvd1xuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXJvdy5lZGl0aW5nICYmICF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMuZm9jdXNDb2x1bW4gPSBvcHRzICYmIG9wdHMuZm9jdXNDb2x1bW4gfHwgdGhpcy5mb2N1c0NvbHVtbjtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2Uuc3RhcnRFZGl0KHJvdyk7XG4gICAgfVxuICAgIHRoaXMuZWRpdGVkUm93ID0gcm93O1xuICAgIHRoaXMub25TdGFydEVkaXRpbmdSb3cuZW1pdChyb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBzZWxlY3Qgcm93LCBieSByb3cuaWQsIG9yIGJ5IGRhdGEuIFdJbGwgdXNlIEVudGl0eVV0aWxzLmVxdWFscygpXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2VsZWN0Um93QnlJZE9yRGF0YShpZDogbnVtYmVyLCBkYXRhPzogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgdHJ5IHtcblxuICAgICAgLy8gU2VsZWN0IGJ5IHJvdyBpZCAoaWYgTk9UIGEgbmV3IHJvdylcbiAgICAgIGlmIChpc05vdE5pbChpZCkgfHwgaWQgIT09IC0xKSB7XG4gICAgICAgIGRvbmUgPSBhd2FpdCB0aGlzLnNlbGVjdFJvd0J5SWQoaWQpO1xuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybignW2FwcC10YWJsZV0gU2F2ZTogQ2Fubm90IHJlc2VsZWN0IHJvdyBieSByb3cuaWQ6ICcsIGlkKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGJ5IGRhdGFcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRvbmUgPSBhd2FpdCB0aGlzLnNlbGVjdFJvd0J5RGF0YShkYXRhKTtcbiAgICAgICAgaWYgKGRvbmUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1thcHAtdGFibGVdIFNhdmU6IENhbm5vdCByZXNlbGVjdCByb3cgYnkgZGF0YTogJywgZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICAvLyBMb2csIGJ1dCBjb250aW51ZVxuICAgICAgY29uc29sZS5lcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSBzZWxlY3RlZCByb3cgaWYgdW5pcXVlIGluIHNlbGVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBzaW5nbGVTZWxlY3RlZFJvdygpOiBUYWJsZUVsZW1lbnQ8VD4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZD8ubGVuZ3RoID09PSAxID8gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRbMF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FuRGVsZXRlUm93cyhyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSwgb3B0cz86IHsgaW50ZXJhY3RpdmU/OiBib29sZWFuOyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICAvLyBDaGVjayB1c2luZyBlbWl0dGVyXG4gICAgaWYgKHRoaXMub25CZWZvcmVEZWxldGVSb3dzLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYW5EZWxldGUgPSBhd2FpdCBlbWl0UHJvbWlzZUV2ZW50KHRoaXMub25CZWZvcmVEZWxldGVSb3dzLCAnY2FuRGVsZXRlJywge1xuICAgICAgICAgIGRldGFpbDoge3Jvd3N9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNhbkRlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBjaGVja2luZyBpZiBjYW4gZGVsZXRlIHJvd3MnLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNrIHVzZXIgY29uZmlybWF0aW9uXG4gICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZURlbGV0ZSAmJiAoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hc2tEZWxldGVDb25maXJtYXRpb24obnVsbCwgcm93cyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbkNhbmNlbFJvd3Mocm93cz86IFRhYmxlRWxlbWVudDxUPltdLCBvcHRzPzogeyBpbnRlcmFjdGl2ZT86IGJvb2xlYW47IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIC8vIEdldCBkaXJ0eSByb3dzXG4gICAgcm93cyA9IHJvd3MgfHwgdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKS5maWx0ZXIocm93ID0+IHJvdy52YWxpZGF0b3I/LmRpcnR5KTtcblxuICAgIGlmIChpc0VtcHR5QXJyYXkocm93cykpIHJldHVybiB0cnVlOyAvLyBObyBkaXJ0eTogT0tcblxuICAgIC8vIENoZWNrIHVzaW5nIGVtaXR0ZXJcbiAgICBpZiAodGhpcy5vbkJlZm9yZUNhbmNlbFJvd3Mub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzQ2FuY2VsID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cywgJ2NhbkNhbmNlbCcsIHtcbiAgICAgICAgICBkZXRhaWw6IHtyb3dzfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFpc0NhbmNlbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3aGlsZSBjaGVja2luZyBpZiBjYW4gY2FuY2VsIHJvd3MnLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNrIHVzZXIgY29uZmlybWF0aW9uXG4gICAgaWYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCAmJiAoIW9wdHMgfHwgb3B0cy5pbnRlcmFjdGl2ZSAhPT0gZmFsc2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hc2tDYW5jZWxDb25maXJtYXRpb24obnVsbCwgcm93cyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVCZWZvcmVBY3Rpb24oc2F2ZUFjdGlvbjogU2F2ZUFjdGlvblR5cGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGlmICghdGhpcy5kaXJ0eSkge1xuICAgICAgLy8gQ29udGludWUgd2l0aG91dCBzYXZlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgc2F2ZTogYm9vbGVhbjtcbiAgICBzd2l0Y2ggKHNhdmVBY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHNhdmUgPSB0aGlzLnNhdmVCZWZvcmVEZWxldGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmlsdGVyJzpcbiAgICAgICAgc2F2ZSA9IHRoaXMuc2F2ZUJlZm9yZUZpbHRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgc2F2ZSA9IHRoaXMuc2F2ZUJlZm9yZVNvcnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2F2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvclxuICAgIGxldCBjb25maXJtZWQgPSB0cnVlO1xuXG4gICAgaWYgKHNhdmUpIHtcbiAgICAgIGlmICh0aGlzLm9uQmVmb3JlU2F2ZS5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBBc2sgY29uZmlybWF0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZW1pdFByb21pc2VFdmVudCh0aGlzLm9uQmVmb3JlU2F2ZSwgJ2JlZm9yZVNhdmUnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHthY3Rpb246IHNhdmVBY3Rpb24sIHZhbGlkOiB0aGlzLnZhbGlkfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbmZpcm1lZCA9IHJlcy5jb25maXJtZWQ7XG4gICAgICAgICAgc2F2ZSA9IHJlcy5zYXZlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuIGZhbHNlOyAvLyBVc2VyIGNhbmNlbFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGNoZWNraW5nIGlmIGNhbiBkZWxldGUgcm93cycsIGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICBpZiAoc2F2ZSkge1xuICAgICAgICAvLyBVc2VyIGNvbmZpcm1lZCBzYXZlXG4gICAgICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTsgLy8gUmVzdG9yZSBkaXJ0eSBmbGFnXG4gICAgICAgIHJldHVybiBzYXZlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBzYXZlIGJ1dCBjb250aW51ZSBhY3Rpb25cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIFVzZXIgY2FuY2VsIHRoZSBhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgcm93LiBCeSBkZWZhdWx0LCB3aWxsIHRvIG9wZW4gcm93IGRldGFpbCBwYWdlLlxuICAgKiBDYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3NlcywgQlVUIHByZWZlciB0byBzdWJzY3JpYmUgb24gb25PcGVuUm93XG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvcGVuUm93KGlkOiBJRCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5hbGxvd1Jvd0RldGFpbCkge1xuICAgICAgaWYgKHRoaXMuZGVidWcgJiYgdGhpcy5kaXJ0eSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1t0YWJsZV0gT3BlbmluZyByb3cgZGV0YWlscywgYnV0IHRhYmxlIGhhcyB1bnNhdmVkIGNoYW5nZXMhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9uT3BlblJvdy5vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMub25PcGVuUm93LmVtaXQoe2lkLCByb3d9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIElEIGRlZmluZWQ6IHVuYWJsZSB0byBvcGVuIGRldGFpbHNcbiAgICAgIGlmIChpc05pbChpZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIE9wZW5pbmcgcm93IGRldGFpbHMsIGJ1dCBkYXRhIGhhcyBubyBpZCEnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywgaWQudG9TdHJpbmcoKV0sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgcXVlcnlQYXJhbXM6IHt9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9wZW5OZXdSb3dEZXRhaWwoZXZlbnQ/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuYWxsb3dSb3dEZXRhaWwpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLm9uTmV3Um93Lm9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMub25OZXdSb3cuZW1pdChldmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyduZXcnXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gY2FuIGJlIG92ZXJyaWRkZW4gdG8gYWRkIG1vcmUgcmVxdWlyZWQgY29sdW1uc1xuICBwcm90ZWN0ZWQgZ2V0UmVxdWlyZWRDb2x1bW5zKCkge1xuICAgIHJldHVybiBERUZBVUxUX1JFUVVJUkVEX0NPTFVNTlM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0VXNlckNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmdldFBhZ2VTZXR0aW5ncyh0aGlzLnNldHRpbmdzSWQsIFNFVFRJTkdTX0RJU1BMQVlfQ09MVU1OUyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydGVkQ29sdW1uKCk6IE1hdFNvcnRhYmxlIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCBTRVRUSU5HU19TT1JURURfQ09MVU1OKTtcbiAgICBjb25zdCBwYXJ0cyA9IGRhdGEgJiYgZGF0YS5zcGxpdCgnOicpO1xuICAgIGlmIChwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPT09IDIgJiYgdGhpcy5jb2x1bW5zLmluY2x1ZGVzKHBhcnRzWzBdKSkge1xuICAgICAgcmV0dXJuIHtpZDogcGFydHNbMF0sIHN0YXJ0OiBwYXJ0c1sxXSA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycsIGRpc2FibGVDbGVhcjogZmFsc2V9O1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWZhdWx0U29ydEJ5KSB7XG4gICAgICAgcmV0dXJuIHtpZDogdGhpcy5kZWZhdWx0U29ydEJ5LCBzdGFydDogdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiB8fCAnYXNjJywgZGlzYWJsZUNsZWFyOiBmYWxzZX07XG4gICAgfVxuICAgIHJldHVybiB7aWQ6ICdpZCcsIHN0YXJ0OiAnYXNjJywgZGlzYWJsZUNsZWFyOiBmYWxzZX07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFnZVNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuc2V0dGluZ3MuZ2V0UGFnZVNldHRpbmdzPG51bWJlcj4odGhpcy5zZXR0aW5nc0lkLCBTRVRUSU5HU19QQUdFX1NJWkUpO1xuICAgIHJldHVybiBwYWdlU2l6ZSB8fCB0aGlzLmRlZmF1bHRQYWdlU2l6ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREaXNwbGF5Q29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHVzZXJDb2x1bW5zID0gdGhpcy5nZXRVc2VyQ29sdW1ucygpO1xuXG4gICAgLy8gTm8gdXNlciBvdmVycmlkZVxuICAgIGlmICghdXNlckNvbHVtbnMpIHtcbiAgICAgIC8vIFJldHVybiBkZWZhdWx0LCB3aXRob3V0IGNvbHVtbnMgdG8gaGlkZVxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+ICF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4pKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZml4ZWQgc3RhcnQgY29sdW1uc1xuICAgIGNvbnN0IGZpeGVkU3RhcnRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IFJFU0VSVkVEX1NUQVJUX0NPTFVNTlMuaW5jbHVkZXMoYykpO1xuXG4gICAgLy8gUmVtb3ZlIGVuZCBjb2x1bW5zXG4gICAgY29uc3QgZml4ZWRFbmRDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IFJFU0VSVkVEX0VORF9DT0xVTU5TLmluY2x1ZGVzKGMpKTtcblxuICAgIC8vIFJlbW92ZSBmaXhlZCBjb2x1bW5zIGZyb20gdXNlciBjb2x1bW5zXG4gICAgdXNlckNvbHVtbnMgPSB1c2VyQ29sdW1ucy5maWx0ZXIoYyA9PiAhZml4ZWRTdGFydENvbHVtbnMuaW5jbHVkZXMoYykgJiYgIWZpeGVkRW5kQ29sdW1ucy5pbmNsdWRlcyhjKSAmJiB0aGlzLmNvbHVtbnMuaW5jbHVkZXMoYykpO1xuXG4gICAgLy8gQWRkIHJlcXVpcmVkIGNvbHVtbnMgaWYgbWlzc2luZ1xuICAgIHVzZXJDb2x1bW5zLnB1c2goLi4udGhpcy5nZXRSZXF1aXJlZENvbHVtbnMoKS5maWx0ZXIoYyA9PiAhZml4ZWRTdGFydENvbHVtbnMuaW5jbHVkZXMoYykgJiYgIWZpeGVkRW5kQ29sdW1ucy5pbmNsdWRlcyhjKSAmJiAhdXNlckNvbHVtbnMuaW5jbHVkZXMoYykpKTtcblxuICAgIHJldHVybiBmaXhlZFN0YXJ0Q29sdW1uc1xuICAgICAgLmNvbmNhdCh1c2VyQ29sdW1ucylcbiAgICAgIC5jb25jYXQoZml4ZWRFbmRDb2x1bW5zKVxuICAgICAgLy8gUmVtb3ZlIGNvbHVtbnMgdG8gaGlkZVxuICAgICAgLmZpbHRlcihjb2x1bW4gPT4gIXRoaXMuZXhjbHVkZXNDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZSBkaXNwbGF5IGNvbHVtbnNcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5nZXREaXNwbGF5Q29sdW1ucygpO1xuICAgIGlmICghdGhpcy5sb2FkaW5nKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChzdWIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3ViOiBTdWJzY3JpcHRpb24pIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24ucmVtb3ZlKHN1Yik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJBdXRvY29tcGxldGVGaWVsZDxFID0gYW55LCBFRiA9IGFueT4oZmllbGROYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBNYXRBdXRvY29tcGxldGVGaWVsZEFkZE9wdGlvbnM8RSwgRUY+KTogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc8RSwgRUY+IHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyLmFkZChmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEkxOG5Db2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiAodGhpcy5pMThuQ29sdW1uUHJlZml4IHx8ICcnKSArIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUoY29sdW1uTmFtZSkudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZVRhYmxlSWQoKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmxvY2F0aW9uLnBhdGgodHJ1ZSlcbiAgICAgIC5yZXBsYWNlKC9bP10uKiQvZywgJycpXG4gICAgICAucmVwbGFjZSgvXFwvW1xcZF0rL2csICdfaWQnKVxuICAgICAgKyAnXydcbiAgICAgIC8vIEdldCBhIGNvbXBvbmVudCB1bmlxdWUgbmFtZSAtIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MDExNDY4Mi9ob3ctdG8tYWNjZXNzLWNvbXBvbmVudHMtdW5pcXVlLWVuY2Fwc3VsYXRpb24taWQtaW4tYW5ndWxhci05XG4gICAgICArICh0aGlzLmNvbnN0cnVjdG9yWyfJtWNtcCddPy5pZCB8fCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoXCJbdGFibGVdIGlkID0gXCIgKyBpZCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZFJvd1RvVGFibGUoaW5zZXJ0QXQ/OiBudW1iZXIsIG9wdHM/OiB7Zm9jdXNDb2x1bW4/OiBzdHJpbmc7IGVkaXRpbmc/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyB9KTogUHJvbWlzZTxUYWJsZUVsZW1lbnQ8VD4+IHtcblxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuX2RhdGFTb3VyY2UuY3JlYXRlTmV3KGluc2VydEF0LCB7ZWRpdGluZzogdHJ1ZSwgLi4ub3B0c30pO1xuICAgIGlmICghcm93KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHJvdy5lZGl0aW5nKSB7XG4gICAgICAvLyBVcGRhdGUgZm9jdXNlZCBjb2x1bW5cbiAgICAgIHRoaXMuZm9jdXNGaXJzdENvbHVtbiA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzQ29sdW1uID0gb3B0cz8uZm9jdXNDb2x1bW4gfHwgdGhpcy5maXJzdFVzZXJDb2x1bW47XG5cbiAgICAgIC8vIEVtaXQgc3RhcnQgZWRpdGluZyBldmVudFxuICAgICAgdGhpcy5lZGl0ZWRSb3cgPSByb3c7XG4gICAgICB0aGlzLm9uU3RhcnRFZGl0aW5nUm93LmVtaXQodGhpcy5lZGl0ZWRSb3cpO1xuICAgIH1cblxuICAgIHRoaXMudG90YWxSb3dDb3VudCsrO1xuICAgIHRoaXMudmlzaWJsZVJvd0NvdW50Kys7XG5cbiAgICB0aGlzLm1hcmtBc0RpcnR5KHtlbWl0RXZlbnQ6IGZhbHNlIC8qbWFya0ZvckNoZWNrKCkgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIqL30pO1xuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG5cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyQ2VsbFZhbHVlQ2hhbmdlcyhuYW1lOiBzdHJpbmcsIGZvcm1QYXRoPzogc3RyaW5nLCBlbWl0SW5pdGlhbFZhbHVlPzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgZm9ybVBhdGggPSBmb3JtUGF0aCB8fCBuYW1lO1xuICAgIGVtaXRJbml0aWFsVmFsdWUgPSBlbWl0SW5pdGlhbFZhbHVlIHx8IGZhbHNlO1xuICAgIGxldCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoZGVmICYmIChkZWYuZm9ybVBhdGggIT09IGZvcm1QYXRoIHx8IGRlZi5lbWl0SW5pdGlhbFZhbHVlICE9PSBlbWl0SW5pdGlhbFZhbHVlKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgcmVnaXN0ZXIgYSBjZWxsIHZhbHVlIGNoYW5nZSBmb3IgdGhpcyBuYW1lLCB3aXRoIGRpZmZlcmVudCBcXCdmb3JtUGF0aFxcJyBvciBcXCdlbWl0SW5pdGlhbFZhbHVlXFwnLiBQbGVhc2UgdXNlIHNhbWUgYXJndW1lbnRzLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBleGlzdHM6IHJlZ2lzdGVyIG5ldyBkZWZpbml0aW9uXG4gICAgaWYgKCFkZWYpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdGFibGVdIE5ldyBsaXN0ZW5lciB7JHtuYW1lfX0gZm9yIHZhbHVlIGNoYW5nZXMgb24gcGF0aCAke2Zvcm1QYXRofWApO1xuICAgICAgZGVmID0ge1xuICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdDxhbnk+KCksXG4gICAgICAgIHN1YnNjcmlwdGlvbjogbnVsbCxcbiAgICAgICAgZm9ybVBhdGgsXG4gICAgICAgIGVtaXRJbml0aWFsVmFsdWVcbiAgICAgIH07XG4gICAgICB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXSA9IGRlZjtcblxuICAgICAgLy8gU3RhcnQgdGhlIGxpc3RlbmVyLCB3aGVuIGVkaXRpbmcgc3RhcnRzXG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICB0aGlzLm9uU3RhcnRFZGl0aW5nUm93LnN1YnNjcmliZShyb3cgPT4gdGhpcy5zdGFydENlbGxWYWx1ZUNoYW5nZXMobmFtZSwgcm93KSkpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWYuc3ViamVjdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTaG93Q29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZywgc2hvdzogYm9vbGVhbiwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5OYW1lKSAhPT0gc2hvdykge1xuICAgICAgaWYgKCFzaG93KSB7XG4gICAgICAgIHRoaXMuZXhjbHVkZXNDb2x1bW5zLnB1c2goY29sdW1uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZXhjbHVkZXNDb2x1bW5zLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLmV4Y2x1ZGVzQ29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWNvbXB1dGUgZGlzcGxheSBjb2x1bW5zXG4gICAgICBpZiAodGhpcy5kaXNwbGF5ZWRDb2x1bW5zICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaG93Q29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5leGNsdWRlc0NvbHVtbnMuaW5jbHVkZXMoY29sdW1uTmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRzV2l0aFVwcGVyQ2FzZShpbnB1dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbnB1dCAmJiBpbnB1dC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgLy8gU2hvdWxkIGJlIG92ZXJyaWRlIGJ5IHN1YmNsYXNzZXMsIGRlcGVuZGluZyBvbiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFza0RlbGV0ZUNvbmZpcm1hdGlvbihldmVudD86IFVJRXZlbnQsIHJvd3M/OiBUYWJsZUVsZW1lbnQ8VD5bXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLnVuZG9hYmxlRGVsZXRpb24pIHtcbiAgICAgIC8vIFNwZWNpYWwgbWVzc2FnZSwgZm9yIHVuZG9hYmxlIGRlbGV0aW9uXG4gICAgICByZXR1cm4gQWxlcnRzLmFza0NvbmZpcm1hdGlvbihyb3dzPy5sZW5ndGggPT09IDEgPyAnQ09ORklSTS5ERUxFVEVfUk9XJyA6ICdDT05GSVJNLkRFTEVURV9ST1dTJywgdGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gICAgfVxuICAgIC8vIEltbWVkaWF0ZSBkZWxldGlvbiBhY3Rpb25cbiAgICByZXR1cm4gQWxlcnRzLmFza0FjdGlvbkNvbmZpcm1hdGlvbih0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIHRydWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhc2tDYW5jZWxDb25maXJtYXRpb24oZXZlbnQ/OiBVSUV2ZW50LCByb3dzPzogVGFibGVFbGVtZW50PFQ+W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gQWxlcnRzLmFza0NvbmZpcm1hdGlvbihyb3dzPy5sZW5ndGggPT09IDEgPyAnQ09ORklSTS5DQU5DRUxfUk9XJyA6ICdDT05GSVJNLkNBTkNFTF9ST1dTJywgdGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlLCBldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXNrUmVzdG9yZUNvbmZpcm1hdGlvbihldmVudD86IFVJRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gQWxlcnRzLmFza0FjdGlvbkNvbmZpcm1hdGlvbih0aGlzLmFsZXJ0Q3RybCwgdGhpcy50cmFuc2xhdGUsIGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjt9KSB7XG4gICAgdGhpcy5zZXRFcnJvcih1bmRlZmluZWQsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0Vycm9yKHJvdz86IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IEZvcm1FcnJvclRyYW5zbGF0b3JPcHRpb25zKTogc3RyaW5nIHtcbiAgICByb3cgPSByb3cgfHwgdGhpcy5lZGl0ZWRSb3c7XG4gICAgaWYgKCFyb3cgfHwgIXRoaXMuZm9ybUVycm9yQWRhcHRlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmZvcm1FcnJvckFkYXB0ZXIudHJhbnNsYXRlRm9ybUVycm9ycyhyb3cudmFsaWRhdG9yLCB7XG4gICAgICAuLi50aGlzLmVycm9yVHJhbnNsYXRvck9wdGlvbnMsXG4gICAgICAuLi5vcHRzXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0RXJyb3IodmFsdWU6IHN0cmluZywgb3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuO30pIHtcbiAgICBpZiAodGhpcy5lcnJvclN1YmplY3QudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLmVycm9yU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBkYXRhIGVxdWFsaXR5IChkZWZhdWx0IGJ5IGlkKVxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiB0byBhZGQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGNvbXBhcmVcbiAgICpcbiAgICogQHBhcmFtIGQxXG4gICAqIEBwYXJhbSBkMlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZXF1YWxzKGQxOiBULCBkMjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QXNEaXJ0eShyb3c/OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEVWZW50PzogYm9vbGVhbjsgfSkge1xuICAgIHJvdyA9IHJvdyB8fCB0aGlzLmVkaXRlZFJvdztcbiAgICBpZiAocm93KSByb3cudmFsaWRhdG9yPy5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2QgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIGxpc3RlblNvcnRBbmRQYWdpbmF0aW9uRXZlbnRzKCkge1xuXG4gICAgaWYgKCF0aGlzLnRhYmxlKSB7XG5cbiAgICAgIC8vIERFQlVHIG9ubHkgLS0gYWxlcnQgdXNlciB0aGF0IHRhYmxlIG5vdCBmb3VuZCBpbiB0ZW1wbGF0ZVxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiAhdGhpcy50YWJsZSAmJiBjb25zb2xlLndhcm4oYFt0YWJsZV0gTWlzc2luZyA8bWF0LXRhYmxlPiBpbiB0aGUgSFRNTCB0ZW1wbGF0ZSAoYWZ0ZXIgd2FpdGluZyA1MDBtcykhIENvbXBvbmVudDogJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YCksIDUwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0byB3YWl0IHRoZSB0YWJsZVxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiAhIXRoaXMudGFibGUsIHtzdG9wOiB0aGlzLmRlc3Ryb3lTdWJqZWN0LCBzdG9wRXJyb3I6IGZhbHNlLyphdm9pZCBlcnJvciB3aGVuIGRlc3RvcnlpbmcgdGhlIHRhYmxlKi99KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIC8vIExpc3RlbiBzb3J0IGV2ZW50c1xuICAgICAgICB0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5zb3J0LmRpc2FibGVkKSxcbiAgICAgICAgICAgIG1lcmdlTWFwKGFzeW5jICgpID0+IHRoaXMuc2F2ZUJlZm9yZUFjdGlvbignc29ydCcpKSxcbiAgICAgICAgICAgIGZpbHRlcihyZXMgPT4gcmVzID09PSB0cnVlKSxcbiAgICAgICAgICAgIC8vIFNhdmUgc29ydCBpbiBzZXR0aW5nc1xuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBbdGhpcy5zb3J0LmFjdGl2ZSwgdGhpcy5zb3J0LmRpcmVjdGlvbiB8fCAnYXNjJ10uam9pbignOicpO1xuICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnNhdmVQYWdlU2V0dGluZyh0aGlzLnNldHRpbmdzSWQsIHZhbHVlLCBTRVRUSU5HU19TT1JURURfQ09MVU1OKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB8fCBFTVBUWSxcblxuICAgICAgICAvLyBMaXN0ZW4gcGFnaW5hdG9yIGV2ZW50c1xuICAgICAgICB0aGlzLnBhZ2luYXRvciAmJiB0aGlzLnBhZ2luYXRvci5wYWdlXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtZXJnZU1hcChhc3luYyAoZXZlbnQpID0+IHRoaXMuc2F2ZUJlZm9yZUFjdGlvbignc29ydCcpKSxcbiAgICAgICAgICAgIGZpbHRlcihyZXMgPT4gcmVzID09PSB0cnVlKSxcbiAgICAgICAgICAgIC8vIFNhdmUgcGFnZSBzaXplIGluIHNldHRpbmdzXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5zZXR0aW5ncy5zYXZlUGFnZVNldHRpbmcodGhpcy5zZXR0aW5nc0lkLCB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSwgU0VUVElOR1NfUEFHRV9TSVpFKSlcbiAgICAgICAgICApIHx8IEVNUFRZXG4gICAgICApXG4gICAgICAvLyBSZWZyZXNoIG9uIGFueSBzb3J0IG9yIHBhZ2luYXRvciBldmVudHNcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLm9uU29ydC5lbWl0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCh2YWx1ZSlcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHNvcnQgb3JkZXIsIHJlc2V0IGJhY2sgdG8gdGhlIGZpcnN0IHBhZ2UuXG4gICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnBhZ2luYXRvcikge1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2VcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5zb3J0LmRpc2FibGVkKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVkaXRSb3dCeUlkKGV2ZW50OiBFdmVudHx1bmRlZmluZWQsIGlkOiBudW1iZXIsIG9wdHM/OiB7Zm9jdXNDb2x1bW4/OiBzdHJpbmd9KSB7XG4gICAgaWYgKGlkIDwgMCkgcmV0dXJuO1xuICAgIGlmIChpZCA+PSB0aGlzLnZpc2libGVSb3dDb3VudCkge1xuICAgICAgdGhpcy5hZGRSb3coZXZlbnQsIHVuZGVmaW5lZCwgey4uLm9wdHMsIGVkaXRpbmc6IHRydWV9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UuZ2V0Um93KGlkKTtcbiAgICAgIHRoaXMuZWRpdFJvdyhldmVudCwgcm93LCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldExvYWRpbmcodmFsdWU6IGJvb2xlYW4sIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSAhPT0gdmFsdWUpICB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodmFsdWUpO1xuXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVOZXdSb3coZXZlbnQ6IEV2ZW50fHVuZGVmaW5lZCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4pIHsvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkICE9PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdSb3cgbXVzdCBoYXZlIGlkID0gLTEnKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMuZWRpdGVkUm93ID0gdW5kZWZpbmVkOyAvLyB1bnNlbGVjdCByb3dcbiAgICB0aGlzLl9kYXRhU291cmNlLmNhbmNlbE9yRGVsZXRlKHJvdyk7XG4gICAgdGhpcy5vbkNhbmNlbE9yRGVsZXRlUm93Lm5leHQocm93KTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICB0aGlzLnRvdGFsUm93Q291bnQtLTtcbiAgICB0aGlzLnZpc2libGVSb3dDb3VudC0tO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVFeGlzdGluZ1JvdyhldmVudDogRXZlbnR8bnVsbCwgcm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7aW50ZXJhY3RpdmU/OiBib29sZWFuO30pIHtcbiAgICAvLyBNYWtlIHN1cmUgcm93IHdpbGwgYmUgY2FuY2VsbGVkLCBhbmQgTk9UIGRlbGV0ZWRcbiAgICBpZiAocm93LmlkID09PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdSb3cgbXVzdCBoYXZlIGFuIGlkJyk7XG5cbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybiAwOyAvLyBTS2lwXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLmRlbGV0ZVJvdyhudWxsLCByb3csIG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxFeGlzdGluZ1JvdyhldmVudDogRXZlbnR8dW5kZWZpbmVkLCByb3c6IFRhYmxlRWxlbWVudDxUPiwgb3B0cz86IHtpbnRlcmFjdGl2ZT86IGJvb2xlYW47IGtlZXBFZGl0aW5nPzogYm9vbGVhbjt9KSB7XG4gICAgLy8gTWFrZSBzdXJlIHJvdyB3aWxsIGJlIGNhbmNlbGxlZCwgYW5kIE5PVCBkZWxldGVkXG4gICAgaWYgKHJvdy5pZCA9PT0gLTEgfHwgIXJvdy5lZGl0aW5nKSB0aHJvdyBuZXcgRXJyb3IoJ1JvdyBjYW5ub3QgYmUgY2FuY2VsaW5nLCBidXQgb25seSBkZWxldGluZycpO1xuXG4gICAgY29uc3QgY29uZmlybWVkID0gKCFvcHRzIHx8IG9wdHMuaW50ZXJhY3RpdmUgIT09IGZhbHNlKTtcblxuICAgIC8vIEFzayB1c2VyIGNvbmZpcm1hdGlvbiwgaWYgY2FuY2VsXG4gICAgaWYgKCFjb25maXJtZWQgJiYgcm93LnZhbGlkYXRvcj8uZGlydHkgJiYgKHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCB8fCB0aGlzLm9uQmVmb3JlQ2FuY2VsUm93cy5vYnNlcnZlcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jYW5DYW5jZWxSb3dzKFtyb3ddLCBvcHRzKVxuICAgICAgICAudGhlbihjb25maXJtID0+IHtcbiAgICAgICAgICAvLyBJZiBjb25maXJtZWQsIGxvb3BcbiAgICAgICAgICBpZiAoY29uZmlybSkgdGhpcy5jYW5jZWxFeGlzdGluZ1JvdyhldmVudCwgcm93LCB7aW50ZXJhY3RpdmU6IGZhbHNlfSk7XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtlZXBFZGl0aW5nID0gcm93LmVkaXRpbmcgJiYgKCFvcHRzIHx8IG9wdHMua2VlcEVkaXRpbmcgIT09IGZhbHNlKTtcbiAgICB0aGlzLmVkaXRlZFJvdyA9IHVuZGVmaW5lZDsgLy8gdW5zZWxlY3Qgcm93XG4gICAgdGhpcy5fZGF0YVNvdXJjZS5jYW5jZWxPckRlbGV0ZShyb3cpO1xuICAgIHRoaXMub25DYW5jZWxPckRlbGV0ZVJvdy5uZXh0KHJvdyk7XG5cbiAgICAvLyBNYXJrIHJvdyBhcyBwcmlzdGluZVxuICAgIHRoaXMuY2hlY2tJZlJvd1ByaXN0aW5lKHJvdyk7XG5cbiAgICAvLyBSZXN0b3JlIGVkaXRpbmcgc3RhdGVcbiAgICBpZiAoa2VlcEVkaXRpbmcpIHtcbiAgICAgIHRoaXMuZWRpdFJvdyh1bmRlZmluZWQsIHJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lmUm93UHJpc3RpbmUocm93OiBUYWJsZUVsZW1lbnQ8VD4sIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjsgb25seVNlbGY/OiBib29sZWFufSkge1xuICAgIC8vIE1hcmsgcm93IGFzIHByaXN0aW5lXG4gICAgY29uc3QgbWFya1Jvd0FzUHJpc3RpbmUgPSB0aGlzLmRhdGFTb3VyY2U/LmNvbmZpZy5yZXN0b3JlT3JpZ2luYWxEYXRhT25DYW5jZWwgPT09IHRydWU7XG4gICAgaWYgKG1hcmtSb3dBc1ByaXN0aW5lKSB7XG4gICAgICByb3cudmFsaWRhdG9yPy5tYXJrQXNQcmlzdGluZSgpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0YWJsZSBpcyBub3cgcHJpc3RpbmVcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLm9ubHlTZWxmICE9PSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZlByaXN0aW5lKG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJZlByaXN0aW5lKG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjt9KSB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSByZXR1cm47IC8vIEFscmVhZHkgcHJpc3RpbmVcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLl9kYXRhU291cmNlLmdldFJvd3MoKTtcbiAgICBjb25zdCBwcmlzdGluZSA9IChyb3dzIHx8IFtdKS5maW5kSW5kZXgocm93ID0+IHJvdy52YWxpZGF0b3I/LmRpcnR5KSA9PT0gLTE7XG4gICAgaWYgKHByaXN0aW5lKSB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcihmaWx0ZXI6IEYsIG9wdHM6IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgfSkge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbdGFibGVdIEFwcGx5aW5nIGZpbHRlcicsIGZpbHRlcik7XG4gICAgdGhpcy5fZmlsdGVyID0gZmlsdGVyO1xuICAgIGlmIChvcHRzICYmIG9wdHMuZW1pdEV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID4gMCkge1xuICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuRGF0YXNvdXJjZUxvYWRpbmcoZGF0YVNvdXJjZTogRW50aXRpZXNUYWJsZURhdGFTb3VyY2U8VCwgRiwgSUQ+KSB7XG4gICAgaWYgKCFkYXRhU291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ1t0YWJsZV0gZGF0YVNvdXJjZSBub3Qgc2V0ICEnKTtcblxuICAgIC8vIENsZWFuaW5nIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBvbiBkYXRhc291cmNlXG4gICAgaWYgKGlzTm90TmlsKHRoaXMuX2RhdGFTb3VyY2VMb2FkaW5nU3Vic2NyaXB0aW9uKSkge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1t0YWJsZV0gTWFueSBjYWxsIHRvIGxpc3RlbkRhdGFzb3VyY2UoKTogQ2xlYW5pbmcgcHJldmlvdXMgc3Vic2NyaXB0aW9ucy4uLicpO1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgLy8gUHJvcGFnZSBsb2FkaW5nIHRvIHRhYmxlXG4gICAgdGhpcy5fZGF0YVNvdXJjZUxvYWRpbmdTdWJzY3JpcHRpb24gPSB0aGlzLl9kYXRhU291cmNlLmxvYWRpbmdTdWJqZWN0XG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcblxuICAgICAgICAgICAgLy8gSWYgY2hhbmdlZCB0byBUcnVlOiBwcm9wYWdhdGUgYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgICAgICAgICAgdGFwKChsb2FkaW5nKSA9PiBsb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKSksXG5cbiAgICAgICAgICAgIC8vIElmIGNoYW5nZWQgdG8gRmFsc2U6IHdhaXQgMjUwbXMgYmVmb3JlIHByb3BhZ2F0ZSAodG8gbWFrZSBzdXJlIHRoZSBzcGlubmVyIGhhcyBiZWVuIGRpc3BsYXllZClcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgICAgdGFwKGxvYWRpbmcgPT4gIWxvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLl9kYXRhU291cmNlTG9hZGluZ1N1YnNjcmlwdGlvbik7XG4gIH1cblxuXG4gIHByaXZhdGUgc3RhcnRDZWxsVmFsdWVDaGFuZ2VzKG5hbWU6IHN0cmluZywgcm93OiBUYWJsZUVsZW1lbnQ8VD4pIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoIWRlZikge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFibGVdIExpc3RlbmVyIHdpdGggbmFtZSB7JyArIG5hbWUgKyAnfSBub3QgcmVnaXN0ZXJlZCEgUGxlYXNlIGNhbGwgcmVnaXN0ZXJDZWxsVmFsdWVDaGFuZ2VzKCkgYmVmb3JlOycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdG9wIHByZXZpb3VzIHN1YnNjcmlwdGlvblxuICAgIGlmIChkZWYuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt0YWJsZV0gU3RhcnQgdmFsdWVzIGNoYW5nZXMgb24gcm93IHBhdGggeyR7ZGVmLmZvcm1QYXRofX1gKTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdmFsdWUgY2hhbmdlcywgYW5kIHJlZGlyZWN0IHRvIGV2ZW50IGVtaXR0ZXJcbiAgICBjb25zdCBjb250cm9sID0gcm93LnZhbGlkYXRvciAmJiBBcHBGb3JtVXRpbHMuZ2V0Q29udHJvbEZyb21QYXRoKHJvdy52YWxpZGF0b3IsIGRlZi5mb3JtUGF0aCk7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWJsZV0gQ291bGQgbm90IGxpc3RlbiBjZWxsIGNoYW5nZXM6IG5vIHZhbGlkYXRvciBvciBpbnZhbGlkIGZvcm0gcGF0aCB7JHtkZWYuZm9ybVBhdGh9fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWYuc3Vic2NyaXB0aW9uID0gY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gZG9uJ3QgZW1pdCBpZiBjb250cm9sIGlzIGRpc2FibGVkXG4gICAgICAgICAgZmlsdGVyKCgpID0+IGNvbnRyb2wuZW5hYmxlZClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gZGVmLnN1YmplY3QubmV4dCh2YWx1ZSkpO1xuXG4gICAgICAvLyBFbWl0IHRoZSBhY3R1YWwgdmFsdWVcbiAgICAgIGlmIChkZWYuZW1pdEluaXRpYWxWYWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZGVmLnN1YmplY3QubmV4dChjb250cm9sLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BDZWxsVmFsdWVDaGFuZ2VzKG5hbWU6IHN0cmluZywgZGVzdHJveT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBkZWYgPSB0aGlzLl9jZWxsVmFsdWVDaGFuZ2VzRGVmc1tuYW1lXTtcbiAgICBpZiAoIWRlZikgcmV0dXJuO1xuICAgIGlmIChkZWYuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3RhYmxlXSBTdG9wIHZhbHVlIGNoYW5nZXMgb24gcm93IHBhdGggeycgKyBkZWYuZm9ybVBhdGggKyAnfScpO1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZGVmLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChkZXN0cm95ICYmIGRlZi5zdWJqZWN0KSB7XG4gICAgICBkZWYuc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgZGVmLnN1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cblxuIl19