@sumaris-net/ngx-components 3.0.0-rc1 → 4.0.0-rc10

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 (677) hide show
  1. package/esm2022/public_api.mjs +340 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +12 -12
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +69 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +264 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/esm2022/src/app/core/about/about.modal.mjs +84 -0
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +337 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +130 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +146 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/{esm2020 → esm2022}/src/app/core/core.testing.module.mjs +23 -23
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +718 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +730 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/{esm2020 → esm2022}/src/app/core/form/form.utils.mjs +69 -60
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +152 -0
  41. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +35 -0
  42. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +6 -6
  43. package/esm2022/src/app/core/graphql/graphql.service.mjs +788 -0
  44. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  45. package/esm2022/src/app/core/home/home.mjs +282 -0
  46. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  47. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  49. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  50. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  51. package/esm2022/src/app/core/menu/menu.component.mjs +264 -0
  52. package/esm2022/src/app/core/menu/menu.model.mjs +269 -0
  53. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  54. package/esm2022/src/app/core/menu/menu.service.mjs +671 -0
  55. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  56. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
  57. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  58. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  59. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  60. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  61. package/esm2022/src/app/core/peer/select-peer.modal.mjs +193 -0
  62. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  63. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  64. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  65. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  66. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  67. package/esm2022/src/app/core/services/account.service.mjs +1243 -0
  68. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  69. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  70. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  71. package/esm2022/src/app/core/services/base58.mjs +79 -0
  72. package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +7 -7
  73. package/esm2022/src/app/core/services/config.service.mjs +367 -0
  74. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  75. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  76. package/esm2022/src/app/core/services/model/account.model.mjs +155 -0
  77. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  78. package/esm2022/src/app/core/services/model/department.model.mjs +34 -0
  79. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  80. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  81. package/esm2022/src/app/core/services/model/peer.model.mjs +83 -0
  82. package/esm2022/src/app/core/services/model/person.model.mjs +110 -0
  83. package/esm2022/src/app/core/services/model/referential.model.mjs +189 -0
  84. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  85. package/esm2022/src/app/core/services/network.service.mjs +626 -0
  86. package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +1 -1
  87. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  88. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  89. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  90. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  91. package/esm2022/src/app/core/services/platform.service.mjs +557 -0
  92. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  93. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  94. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  95. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  96. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  97. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  98. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  99. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  100. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +5 -5
  101. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  102. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  103. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  104. package/esm2022/src/app/core/table/async-table.class.mjs +1735 -0
  105. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  106. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  107. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  108. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  109. package/esm2022/src/app/core/table/table.class.mjs +1775 -0
  110. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  111. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  112. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  113. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  114. package/{esm2020 → esm2022}/src/app/core/table/testing/table.testing.module.mjs +16 -16
  115. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  116. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  117. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  118. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  119. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  120. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  121. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  122. package/esm2022/src/app/shared/dates.mjs +149 -0
  123. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  124. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  125. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  126. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  127. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  128. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  129. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  130. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  131. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  132. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  133. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  134. package/{esm2020 → esm2022}/src/app/shared/file/file.utils.mjs +2 -2
  135. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  136. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  137. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +2 -2
  138. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  139. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  140. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  141. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  142. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  143. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  144. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  145. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +12 -12
  146. package/esm2022/src/app/shared/http/http.utils.mjs +56 -0
  147. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  148. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  149. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  150. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  151. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  152. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  153. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  154. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  155. package/esm2022/src/app/shared/inputs.mjs +231 -0
  156. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  157. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  158. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  159. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  160. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +961 -0
  161. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  162. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  163. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  164. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  165. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  166. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +72 -0
  167. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +266 -0
  168. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +271 -0
  169. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +54 -0
  170. package/{esm2020 → esm2022}/src/app/shared/material/chips/chips.module.mjs +30 -30
  171. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  172. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  173. package/{esm2020 → esm2022}/src/app/shared/material/datetime/datetime.module.mjs +38 -38
  174. package/esm2022/src/app/shared/material/datetime/material.date.mjs +396 -0
  175. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +406 -0
  176. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +549 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +132 -0
  178. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +123 -0
  179. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  180. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  181. package/{esm2020 → esm2022}/src/app/shared/material/duration/duration.utils.mjs +2 -2
  182. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  183. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  184. package/{esm2020 → esm2022}/src/app/shared/material/latlong/latlong.utils.mjs +3 -3
  185. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +440 -0
  186. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  187. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  188. package/esm2022/src/app/shared/material/material.module.mjs +229 -0
  189. package/esm2022/src/app/shared/material/material.testing.module.mjs +221 -0
  190. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  191. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +83 -0
  192. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  193. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  194. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  195. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  196. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  197. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +20 -20
  198. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  199. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  200. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  201. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  202. package/{esm2020 → esm2022}/src/app/shared/material/swipe/swipe.module.mjs +19 -19
  203. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  204. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  205. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +31 -0
  206. package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
  207. package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
  208. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +236 -0
  209. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  210. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  211. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  212. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  213. package/{esm2020 → esm2022}/src/app/shared/pipes/colors.pipe.mjs +4 -4
  214. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  215. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  216. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  217. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  218. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  219. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  220. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  221. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  222. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  223. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  224. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  225. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  226. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  227. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  228. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  229. package/{esm2020 → esm2022}/src/app/shared/pipes/string.pipes.mjs +31 -31
  230. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  231. package/{esm2020 → esm2022}/src/app/shared/pipes/types.pipes.mjs +14 -14
  232. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  233. package/esm2022/src/app/shared/services/entity-service.class.mjs +7 -0
  234. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  235. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  236. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  237. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  238. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  239. package/esm2022/src/app/shared/services.mjs +62 -0
  240. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +12 -12
  241. package/esm2022/src/app/shared/shared.module.mjs +231 -0
  242. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  243. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  244. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  245. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  246. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  247. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  248. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  249. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  250. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  251. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  252. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  253. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  254. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  255. package/esm2022/src/app/shared/toolbar/toolbar.mjs +264 -0
  256. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  257. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  258. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  259. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  260. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  261. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  262. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  263. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  264. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  265. package/{esm2020 → esm2022}/src/app/social/job/job.module.mjs +12 -12
  266. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  267. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  268. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  269. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  270. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  271. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  272. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  273. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  274. package/esm2022/src/app/social/message/message.form.mjs +140 -0
  275. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  276. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  277. package/esm2022/src/app/social/message/message.module.mjs +22 -0
  278. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  279. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  280. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  281. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  282. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  283. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  284. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  285. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  286. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  287. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  288. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  289. package/esm2022/src/environments/environment.class.mjs +50 -0
  290. package/esm2022/src/environments/environment.loader.mjs +83 -0
  291. package/esm2022/src/environments/environment.mjs +97 -0
  292. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +11115 -9134
  293. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  294. package/package.json +38 -19
  295. package/public_api.d.ts +5 -1
  296. package/src/app/admin/users/users.d.ts +1 -1
  297. package/src/app/admin/users/users.module.d.ts +2 -1
  298. package/src/app/core/account/account.page.d.ts +3 -2
  299. package/src/app/core/account/new-token.modal.d.ts +2 -4
  300. package/src/app/core/account/token.table.d.ts +6 -4
  301. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -2
  302. package/src/app/core/form/entity/editor.class.d.ts +2 -2
  303. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  304. package/src/app/core/form/entity/entity-editor.class.d.ts +10 -6
  305. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  306. package/src/app/core/form/form.class.d.ts +1 -1
  307. package/src/app/core/form/list/list.form.d.ts +1 -1
  308. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  309. package/src/app/core/form/properties/properties.table.d.ts +1 -1
  310. package/src/app/core/form/text-popover/text-popover.component.d.ts +2 -2
  311. package/src/app/core/form/text-popover/text-popover.module.d.ts +4 -5
  312. package/src/app/core/graphql/graphql.service.d.ts +2 -4
  313. package/src/app/core/graphql/graphql.utils.d.ts +1 -1
  314. package/src/app/core/home/home.module.d.ts +4 -3
  315. package/src/app/core/icon/icon.component.d.ts +1 -1
  316. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  317. package/src/app/core/menu/menu.component.d.ts +7 -3
  318. package/src/app/core/menu/menu.module.d.ts +3 -5
  319. package/src/app/core/menu/menu.service.d.ts +3 -1
  320. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  321. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  322. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  323. package/src/app/core/services/account.service.d.ts +4 -0
  324. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  325. package/src/app/core/services/config/core.config.d.ts +2 -2
  326. package/src/app/core/services/model/person.model.d.ts +1 -1
  327. package/src/app/core/services/model/referential.model.d.ts +2 -1
  328. package/src/app/core/services/model/settings.model.d.ts +1 -1
  329. package/src/app/core/services/model/token.model.d.ts +1 -0
  330. package/src/app/core/services/network.service.d.ts +11 -7
  331. package/src/app/core/services/network.types.d.ts +2 -2
  332. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  333. package/src/app/core/table/actions-column.component.d.ts +1 -1
  334. package/src/app/core/table/async-table.class.d.ts +1 -1
  335. package/src/app/core/table/memory-table.class.d.ts +1 -1
  336. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  337. package/src/app/core/table/table.class.d.ts +2 -1
  338. package/src/app/core/table/table.model.d.ts +1 -1
  339. package/src/app/core/table/testing/table.testing.d.ts +1 -1
  340. package/src/app/shared/audio/audio.d.ts +1 -1
  341. package/src/app/shared/debug/debug.component.d.ts +1 -1
  342. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  343. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  344. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  345. package/src/app/shared/events.d.ts +1 -1
  346. package/src/app/shared/form/field.component.d.ts +1 -1
  347. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  348. package/src/app/shared/help/help.modal.d.ts +1 -1
  349. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +2 -4
  350. package/src/app/shared/http/http.utils.d.ts +1 -0
  351. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -1
  352. package/src/app/shared/inputs.d.ts +1 -1
  353. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +2 -2
  354. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  355. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  356. package/src/app/shared/material/boolean/boolean.module.d.ts +4 -5
  357. package/src/app/shared/material/boolean/material-boolean2.d.ts +1 -1
  358. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -1
  359. package/src/app/shared/material/chips/material.chips.d.ts +1 -1
  360. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  361. package/src/app/shared/material/datetime/material.date.d.ts +2 -2
  362. package/src/app/shared/material/datetime/material.dateshort.d.ts +3 -3
  363. package/src/app/shared/material/datetime/material.datetime.d.ts +14 -7
  364. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  365. package/src/app/shared/material/duration/material.duration.d.ts +2 -2
  366. package/src/app/shared/material/latlong/material.latlong.d.ts +14 -8
  367. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  368. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +2 -0
  369. package/src/app/shared/material/material.module.d.ts +2 -1
  370. package/src/app/shared/material/material.testing.module.d.ts +14 -13
  371. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  372. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  373. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  374. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  375. package/src/app/shared/material/swipe/material.swipe.d.ts +1 -1
  376. package/src/app/shared/material/testing/common.test.d.ts +4 -2
  377. package/src/app/shared/material/text/testing/text-form.testing.d.ts +13 -0
  378. package/src/app/{core/form/text-popover → shared/material/text}/text-form.component.d.ts +2 -2
  379. package/src/app/shared/material/text/text-form.module.d.ts +16 -0
  380. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +9 -3
  381. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  382. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  383. package/src/app/shared/pipes/types.pipes.d.ts +3 -3
  384. package/src/app/shared/rx-state.module.d.ts +1 -1
  385. package/src/app/shared/services/entity-service.class.d.ts +1 -1
  386. package/src/app/shared/services/job.utils.d.ts +1 -1
  387. package/src/app/shared/services/memory-entity-service.class.d.ts +7 -3
  388. package/src/app/shared/services.d.ts +1 -0
  389. package/src/app/shared/shared.module.d.ts +16 -15
  390. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  391. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  392. package/src/app/shared/storage/storage.service.d.ts +1 -1
  393. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  394. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  395. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  396. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  397. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  398. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  399. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  400. package/src/app/social/job/progression/job-progression.component.d.ts +1 -1
  401. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -1
  402. package/src/app/social/job/progression/job-progression.list.d.ts +1 -1
  403. package/src/app/social/message/message.form.d.ts +8 -2
  404. package/src/app/social/message/message.modal.d.ts +5 -1
  405. package/src/app/social/message/message.model.d.ts +2 -0
  406. package/src/app/social/message/message.module.d.ts +2 -1
  407. package/src/app/social/message/message.service.d.ts +8 -3
  408. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  409. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  410. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  411. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  412. package/src/app/social/user-event/user-event.service.d.ts +5 -0
  413. package/src/assets/environments/environment-test.json +6 -0
  414. package/src/assets/i18n/en-US.json +25 -23
  415. package/src/assets/i18n/en.json +25 -23
  416. package/src/assets/i18n/fr.json +10 -7
  417. package/src/assets/manifest.json +1 -1
  418. package/src/environments/environment.class.d.ts +2 -0
  419. package/src/environments/environment.loader.d.ts +26 -0
  420. package/src/theme/_material.globals.scss +2 -2
  421. package/src/theme/_material.scss +34 -5
  422. package/src/theme/_mixins.scss +2 -2
  423. package/src/theme/_ngx-components.globals.scss +2 -2
  424. package/src/theme/_ngx-components.scss +8 -9
  425. package/src/theme/_ngx-components.table.scss +20 -8
  426. package/esm2020/public_api.mjs +0 -336
  427. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  428. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  429. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  430. package/esm2020/src/app/admin/users/users.mjs +0 -259
  431. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  432. package/esm2020/src/app/core/about/about.modal.mjs +0 -71
  433. package/esm2020/src/app/core/account/account.page.mjs +0 -317
  434. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  435. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  436. package/esm2020/src/app/core/auth/auth.form.mjs +0 -132
  437. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  438. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  439. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -679
  440. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  441. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -690
  442. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  443. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  444. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  445. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  446. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -265
  447. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  448. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  449. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  450. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  451. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  452. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +0 -40
  453. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -774
  454. package/esm2020/src/app/core/home/home.mjs +0 -258
  455. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  456. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  457. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  458. package/esm2020/src/app/core/menu/menu.component.mjs +0 -239
  459. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  460. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  461. package/esm2020/src/app/core/menu/menu.service.mjs +0 -654
  462. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  463. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  464. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  465. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  466. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  467. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  468. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  469. package/esm2020/src/app/core/services/account.service.mjs +0 -1206
  470. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  471. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  472. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  473. package/esm2020/src/app/core/services/base58.mjs +0 -78
  474. package/esm2020/src/app/core/services/config.service.mjs +0 -355
  475. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  476. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  477. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  478. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  479. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  480. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  481. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  482. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  483. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  484. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -164
  485. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  486. package/esm2020/src/app/core/services/network.service.mjs +0 -590
  487. package/esm2020/src/app/core/services/platform.service.mjs +0 -524
  488. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  489. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  490. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  491. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  492. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  493. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  494. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  495. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  496. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  497. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  498. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  499. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  500. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  501. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  502. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  503. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  504. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  505. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  506. package/esm2020/src/app/core/table/testing/table2-validator.service.mjs +0 -24
  507. package/esm2020/src/app/core/table/testing/table2.testing.mjs +0 -242
  508. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  509. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  510. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  511. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  512. package/esm2020/src/app/shared/dates.mjs +0 -149
  513. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  514. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  515. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  516. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  517. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  518. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -60
  519. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  520. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  521. package/esm2020/src/app/shared/form/field.component.mjs +0 -334
  522. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  523. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  524. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  525. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  526. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  527. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  528. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  529. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -81
  530. package/esm2020/src/app/shared/http/http.utils.mjs +0 -52
  531. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  532. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  533. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  534. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  535. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  536. package/esm2020/src/app/shared/inputs.mjs +0 -231
  537. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  538. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  539. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  540. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -925
  541. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  542. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  543. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  544. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  545. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -76
  546. package/esm2020/src/app/shared/material/boolean/material-boolean2.mjs +0 -248
  547. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -254
  548. package/esm2020/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -51
  549. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -688
  550. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  551. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -378
  552. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -387
  553. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -501
  554. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -120
  555. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -118
  556. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -111
  557. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  558. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -258
  559. package/esm2020/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -76
  560. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -383
  561. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  562. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  563. package/esm2020/src/app/shared/material/material.module.mjs +0 -224
  564. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -210
  565. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  566. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  567. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  568. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  569. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  570. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -32
  571. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  572. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  573. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  574. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  575. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -345
  576. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  577. package/esm2020/src/app/shared/material/testing/common.test.mjs +0 -95
  578. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -202
  579. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  580. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  581. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  582. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  583. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  584. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  585. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  586. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  587. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  588. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  589. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -247
  590. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  591. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  592. package/esm2020/src/app/shared/rx-state.module.mjs +0 -23
  593. package/esm2020/src/app/shared/services/entity-service.class.mjs +0 -7
  594. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  595. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  596. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -121
  597. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -113
  598. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  599. package/esm2020/src/app/shared/services.mjs +0 -62
  600. package/esm2020/src/app/shared/shared.module.mjs +0 -224
  601. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  602. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  603. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  604. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  605. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  606. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  607. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  608. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  609. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  610. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  611. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  612. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  613. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  614. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  615. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  616. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  617. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  618. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -34
  619. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -223
  620. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -46
  621. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  622. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  623. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -41
  624. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  625. package/esm2020/src/app/social/message/message.form.mjs +0 -84
  626. package/esm2020/src/app/social/message/message.modal.mjs +0 -93
  627. package/esm2020/src/app/social/message/message.model.mjs +0 -64
  628. package/esm2020/src/app/social/message/message.module.mjs +0 -35
  629. package/esm2020/src/app/social/message/message.service.mjs +0 -84
  630. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  631. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  632. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  633. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  634. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  635. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  636. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -488
  637. package/esm2020/src/environments/environment.class.mjs +0 -5
  638. package/esm2020/src/environments/environment.mjs +0 -94
  639. package/fesm2015/sumaris-net.ngx-components.mjs +0 -41541
  640. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  641. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  642. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  643. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  644. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  645. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  646. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  647. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  648. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  649. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  650. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  651. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  652. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  653. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  654. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  655. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  656. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  657. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  658. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  659. /package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +0 -0
  660. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  661. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  662. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  663. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  664. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  665. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  666. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  667. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  668. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  669. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  670. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  671. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  672. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  673. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  674. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  675. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  676. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  677. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -1,524 +0,0 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
2
- import { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
3
- import { Toasts } from '../../shared/toast/toasts';
4
- import { from, of, timer } from 'rxjs';
5
- import { catchError, distinctUntilChanged, filter, map, skip, tap } from 'rxjs/operators';
6
- import { ENVIRONMENT } from '../../../environments/environment.class';
7
- import { CORE_CONFIG_OPTIONS } from './config/core.config';
8
- import { NotificationVisibility } from '@ionic-native/downloader/ngx';
9
- import { StartableService } from '../../shared/services/startable-service.class';
10
- import { isMobile, isWindows } from '../../shared/platforms';
11
- import { VersionUtils } from '../../shared/version/versions';
12
- import { FilesUtils, MimeTypes } from '../../shared/file/file.utils';
13
- import { UriUtils } from '../../shared/file/uri.utils';
14
- import { SplashScreen } from '@capacitor/splash-screen';
15
- import { StatusBar } from '@capacitor/status-bar';
16
- import { Browser } from '@capacitor/browser';
17
- import { Keyboard } from '@capacitor/keyboard';
18
- import { CapacitorPlugins } from '../../shared/capacitor/plugins';
19
- import { locale as momentLocale } from 'moment';
20
- import { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "@ionic/angular";
23
- import * as i2 from "@angular/cdk/platform";
24
- import * as i3 from "@ngx-translate/core";
25
- import * as i4 from "@angular/material-moment-adapter";
26
- import * as i5 from "./storage/entities-storage.service";
27
- import * as i6 from "./local-settings.service";
28
- import * as i7 from "./network.service";
29
- import * as i8 from "./account.service";
30
- import * as i9 from "./config.service";
31
- import * as i10 from "ionic-cache";
32
- import * as i11 from "../../shared/audio/audio";
33
- import * as i12 from "@ionic-native/downloader/ngx";
34
- import * as i13 from "../../../environments/environment.class";
35
- export const AndroidOsEnvironment = Object.freeze({
36
- DIRECTORY_DOWNLOADS: 'Download',
37
- DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
38
- // TODO: find value for this. See https://developer.android.com/reference/android/os/Environment#getExternalStorageState(java.io.File)
39
- // DIRECTORY_MUSIC,
40
- // DIRECTORY_PODCASTS,
41
- // DIRECTORY_RINGTONES,
42
- // DIRECTORY_ALARMS,
43
- // DIRECTORY_NOTIFICATIONS,
44
- // DIRECTORY_PICTURES,
45
- // DIRECTORY_MOVIES,
46
- // DIRECTORY_DCIM,
47
- // DIRECTORY_DOCUMENTS,
48
- // DIRECTORY_AUDIOBOOKS,
49
- });
50
- export class PlatformService extends StartableService {
51
- constructor(ionicPlatform, cdkPlatform, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
52
- super(ionicPlatform);
53
- this.ionicPlatform = ionicPlatform;
54
- this.cdkPlatform = cdkPlatform;
55
- this.toastController = toastController;
56
- this.translate = translate;
57
- this.dateAdapter = dateAdapter;
58
- this.entitiesStorage = entitiesStorage;
59
- this.settings = settings;
60
- this.networkService = networkService;
61
- this.accountService = accountService;
62
- this.configService = configService;
63
- this.cache = cache;
64
- this.audioProvider = audioProvider;
65
- this.environment = environment;
66
- this.loggingService = loggingService;
67
- this.downloader = downloader;
68
- this._downloadingJobs = new Map();
69
- this._logger = loggingService?.getLogger('platform');
70
- this._debug = !environment.production;
71
- if (this._debug)
72
- console.debug('[platform] Creating service');
73
- if (this._logger) {
74
- this._logger.debug('ctor', 'Creating service');
75
- ionicPlatform.pause.subscribe(() => {
76
- this._logger.info('ctor', 'Pause app');
77
- });
78
- ionicPlatform.resume.subscribe(() => {
79
- this._logger.info('ctor', 'Resume app');
80
- });
81
- }
82
- }
83
- is(platformName) {
84
- switch (platformName) {
85
- case 'mobile':
86
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
87
- return isMobile(window);
88
- case 'mobileweb':
89
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
90
- return this.ionicPlatform.is(platformName) && !isWindows(window);
91
- default:
92
- return this.ionicPlatform.is(platformName);
93
- }
94
- }
95
- get mobile() {
96
- return isNotNil(this._mobile) ? this._mobile : this.is('mobile');
97
- }
98
- /**
99
- * Say if opened has been opened inside an Android or iOs App.
100
- * This is used to known if there is cordova features
101
- */
102
- isCapacitor() {
103
- return this._capacitor;
104
- }
105
- /**
106
- * Say if opened has been opened inside an Android or iOs App.
107
- * This is used to known if there is cordova features
108
- */
109
- isCordova() {
110
- return this._cordova;
111
- }
112
- isAndroidCordova() {
113
- return this._android && this._cordova || false;
114
- }
115
- isIOSCordova() {
116
- return this._ios && this._cordova || false;
117
- }
118
- isIOS() {
119
- return this._ios || false;
120
- }
121
- /**
122
- * Is a native App (and NOT a mobile web)
123
- */
124
- isApp() {
125
- return this.isAndroidCordova() || this.isIOSCordova();
126
- }
127
- isWeb() {
128
- return !this.isApp();
129
- }
130
- isMobileWeb() {
131
- return this.mobile && this.isWeb();
132
- }
133
- get canDownload() {
134
- return this.downloader && this.isAndroidCordova();
135
- }
136
- get canOpenFile() {
137
- return false; // TODO: fixme using @capacitor/filesystem ?
138
- }
139
- width() {
140
- return this.ionicPlatform.width();
141
- }
142
- height() {
143
- return this.ionicPlatform.height();
144
- }
145
- async ngOnStart() {
146
- const now = Date.now();
147
- this.accountService.tokenType = undefined;
148
- console.info('[platform] Starting platform...');
149
- this._logger?.info('ngOnStart', 'Starting platform...');
150
- try {
151
- this._mobile = this.is('mobile');
152
- this._cordova = this.is('cordova');
153
- this._capacitor = this.is('capacitor');
154
- this._android = this.is('android');
155
- this._ios = this.is('ios');
156
- const logMessage = `Detected {mobile: ${this._mobile}, cordova: ${this._cordova}, capacitor: ${this._capacitor}, android: ${this._android}, ios: ${this._ios}}`;
157
- console.info('[platform] ' + logMessage);
158
- this._logger?.info('ngOnStart', logMessage);
159
- // Configure CSS class
160
- this.configureGlobalCssClass(this._mobile);
161
- // Configure Capacitor plugins
162
- await this.configureCapacitorPlugins();
163
- // Configure translation
164
- this.configureTranslate();
165
- // Configure cache
166
- this.configureCache();
167
- // Start root services
168
- await Promise.all([
169
- this.entitiesStorage.ready(),
170
- this.settings.ready(),
171
- this.networkService.ready(),
172
- this.audioProvider.ready()
173
- ]);
174
- // Check if web app has update, and reload page if need
175
- if (this.isWeb() && this.environment.production) {
176
- await this.checkAppVersion({ canReload: true });
177
- }
178
- // Update cache configuration when network changed
179
- this.registerSubscription(this.networkService.onNetworkStatusChanges
180
- .pipe(skip(1) // Already done once, so we skip the first event
181
- )
182
- .subscribe(type => this.configureCache(type !== 'none')));
183
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, capacitor: ${this._capacitor}, web: ${this.isWeb()}, downloader: ${this.canDownload}} in ${Date.now() - now}ms`);
184
- // Update authentication type
185
- this.registerSubscription(this.configService.config
186
- .pipe(map(config => config?.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE)), filter(isNotNilOrBlank), distinctUntilChanged())
187
- .subscribe(tokenType => {
188
- console.info(`[platform] Using auth token type {${tokenType}}`);
189
- this.accountService.tokenType = tokenType;
190
- }));
191
- if (this._mobile) {
192
- // Hide the splashscreen (if mobile) - after 1s - and play start sound
193
- setTimeout(async () => {
194
- await SplashScreen.hide();
195
- // Play startup sound
196
- this.audioProvider.playStartupSound();
197
- }, 1000);
198
- }
199
- // Check if new version, every 1 min
200
- const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
201
- if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
202
- this.checkAppVersionTimer?.unsubscribe();
203
- const subscription = timer(checkIntervalMs, checkIntervalMs)
204
- .subscribe(_ => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
205
- this.checkAppVersionTimer = subscription;
206
- this.registerSubscription(subscription);
207
- subscription.add(() => this.unregisterSubscription(subscription));
208
- }
209
- }
210
- catch (err) {
211
- // Manage startup error
212
- return this.onStartupError(err);
213
- }
214
- }
215
- async open(url, opts) {
216
- console.info(`[platform] Opening link: ${url}`);
217
- if (this._mobile && this._capacitor) {
218
- await Browser.open({ url, ...opts });
219
- }
220
- else {
221
- window.open(url, opts?.windowName);
222
- }
223
- }
224
- getDownloadingJob(uri) {
225
- return this._downloadingJobs.get(uri);
226
- }
227
- download(request) {
228
- if (!request || !request.uri)
229
- throw new Error('Missing argument \'request\' or \'request.uri\'');
230
- if (this.canDownload) {
231
- // Check if not already downloading file
232
- let job$ = this._downloadingJobs.get(request.uri);
233
- if (job$)
234
- return job$;
235
- // Compute subPath (final filename)
236
- let subPath = request.destinationInExternalPublicDir?.subPath
237
- || request.destinationInExternalFilesDir?.subPath
238
- || request.filename || UriUtils.getFilename(request.uri)
239
- || request.title || 'download';
240
- subPath = subPath.toLowerCase()
241
- // Remove spaces
242
- .replace(/\s+/g, '-');
243
- // Force APK to finish with '.apk'
244
- if (request.mimeType === MimeTypes.ANDROID_APK && !subPath.toLowerCase().endsWith('.apk')) {
245
- subPath += '.apk';
246
- }
247
- const downloadRequest = {
248
- visibleInDownloadsUi: true,
249
- notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,
250
- ...request,
251
- filename: undefined,
252
- destinationInExternalPublicDir: !request.destinationInExternalFilesDir
253
- ? {
254
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
255
- ...request.destinationInExternalPublicDir,
256
- subPath
257
- }
258
- : undefined,
259
- destinationInExternalFilesDir: request.destinationInExternalFilesDir
260
- ? {
261
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
262
- ...request.destinationInExternalFilesDir,
263
- subPath
264
- }
265
- : undefined
266
- };
267
- // Start download
268
- console.debug('[platform] Downloading, using request: ' + JSON.stringify(downloadRequest));
269
- job$ = from(this.downloader.download(downloadRequest));
270
- // Remember this request uri
271
- this._downloadingJobs.set(downloadRequest.uri, job$);
272
- return job$
273
- .pipe(tap(location => {
274
- console.info('[platform] File successfully downloaded at:' + location);
275
- // Forget job
276
- this._downloadingJobs.delete(downloadRequest.uri);
277
- return location;
278
- }), catchError(err => {
279
- console.error('[platform] Unable to download: ' + (err && err.message || err));
280
- // Forget the request
281
- this._downloadingJobs.delete(downloadRequest.uri);
282
- // Retry with another location - issue in older Android version
283
- if (downloadRequest.destinationInExternalPublicDir?.dirType === AndroidOsEnvironment.DIRECTORY_DOWNLOADS) {
284
- downloadRequest.destinationInExternalPublicDir.dirType = AndroidOsEnvironment.DIRECTORY_DOWNLOADS_OLD;
285
- return this.download(downloadRequest);
286
- }
287
- throw err;
288
- }));
289
- }
290
- // Fallback (if not Android and Capacitor): opening the URI
291
- // TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
292
- else {
293
- FilesUtils.downloadUri(request.uri, request.filename);
294
- return of(undefined);
295
- }
296
- }
297
- /* -- protected methods -- */
298
- configureGlobalCssClass(mobile, win = window) {
299
- if (mobile)
300
- return; // Nothing to do
301
- // Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)
302
- if (!mobile && (win.document.documentElement?.classList.contains('plt-mobile')
303
- || win.document.documentElement.classList?.contains('plt-mobileweb'))) {
304
- console.warn('[platform] Force class list to: <html class="plt-desktop">. Workaround for Windows touch screen.');
305
- win.document.documentElement.classList.remove('plt-mobile', 'plt-mobileweb');
306
- win.document.documentElement.classList.add('plt-desktop');
307
- }
308
- }
309
- async configureCapacitorPlugins() {
310
- if (!this._capacitor)
311
- return; // Skip
312
- console.info('[platform] Configuring Capacitor plugins...');
313
- let plugin;
314
- try {
315
- plugin = CapacitorPlugins.StatusBar;
316
- if (this.isApp()) {
317
- await StatusBar.setOverlaysWebView({ overlay: false });
318
- }
319
- // Hide accessory bar (iOS only)
320
- if (this.isIOS()) {
321
- plugin = CapacitorPlugins.Keyboard;
322
- await Keyboard.setAccessoryBarVisible({ isVisible: false });
323
- }
324
- }
325
- catch (err) {
326
- const logMessage = `Error while configuring ${plugin} plugin: ${err.message || err}\n${err?.originalStack || JSON.stringify(err)}`;
327
- console.error('[platform] ' + logMessage);
328
- this._logger?.error('configureCapacitorPlugins', logMessage);
329
- }
330
- }
331
- configureTranslate() {
332
- console.info('[platform] Configuring i18n ...');
333
- // this language will be used as a fallback when a translation isn't found in the current language
334
- this.translate.setDefaultLang(this.environment.defaultLocale);
335
- // apply locale immediately
336
- this.applyLocale(this.environment.defaultLocale);
337
- // When locale changes, apply to date adapter
338
- this.registerSubscription(this.translate.onLangChange.subscribe(event => {
339
- if (event && event.lang) {
340
- this.applyLocale(event.lang);
341
- }
342
- }));
343
- this.registerSubscription(this.settings.onChange.subscribe(data => {
344
- if (data) {
345
- if (data.locale) {
346
- if (data.locale !== this.translate.currentLang) {
347
- this.translate.use(data.locale);
348
- }
349
- }
350
- else {
351
- // Applying default, when settings has no locale property (hotfix - ludovic.pecquot@e-is.pro - 14/11/2021 - since v1.20.42)
352
- console.warn('[platform] No locale found in settings: applying defaultLocale: ', this.environment.defaultLocale);
353
- this.translate.use(this.environment.defaultLocale);
354
- }
355
- }
356
- }));
357
- // Use account's settings, (like locale), when account inheritance enabled
358
- this.registerSubscription(this.accountService.onLogin.subscribe(account => {
359
- if (account.settings && this.settings.settings.accountInheritance) {
360
- const accountSettings = account.settings.asLocalSettings();
361
- this.settings.apply(accountSettings);
362
- }
363
- }));
364
- }
365
- applyLocale(locale) {
366
- // force 'en' as 'en_GB'
367
- if (locale === 'en') {
368
- locale = 'en_GB';
369
- }
370
- // config moment lib
371
- try {
372
- momentLocale(locale);
373
- console.debug('[platform] Use locale {' + locale + '}');
374
- }
375
- // If error, fallback to en
376
- catch (err) {
377
- momentLocale('en');
378
- console.warn('[platform] Unknown locale for moment lib. Using default [en]');
379
- }
380
- // Config date adapter
381
- this.dateAdapter.setLocale(momentLocale());
382
- }
383
- configureCache(online) {
384
- online = toBoolean(online, this.cache.isOnline());
385
- const cacheTTL = online ? 3600 /* 1h */ : 3600 * 24 * 30; /* 1 month */
386
- console.info(`[platform] Configuring cache [OK] {online: ${online}, timeToLive: ${cacheTTL / 3600}h, offlineInvalidate: false}`);
387
- this.cache.setDefaultTTL(cacheTTL);
388
- this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
389
- }
390
- async checkAppVersion(opts) {
391
- if (this.networkService.offline || !this.isWeb())
392
- return; // Skip
393
- const silent = opts?.silent === true;
394
- const production = this.environment.production;
395
- const canAutoReload = !opts || opts.canReload !== false;
396
- if (!silent)
397
- console.info('[platform] Checking remote app version...');
398
- const actualVersion = this.environment.version;
399
- if (isNilOrBlank(actualVersion)) {
400
- console.error('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
401
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
402
- return; // Skip
403
- }
404
- const remoteVersion = await this.networkService.getAppVersion();
405
- if (isNilOrBlank(remoteVersion)) {
406
- if (production && !silent)
407
- console.error('[platform] Cannot load remote app version. Skipping version check');
408
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
409
- return;
410
- }
411
- if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
412
- if (!silent)
413
- console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
414
- return;
415
- }
416
- // If newer version exists
417
- let reloadPath = location.href.replace(/[&]?version=[0-9.]+/gi, ''); // Remove old version in query params
418
- reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
419
- reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
420
- // Already try to reload, but version still bad
421
- if (reloadPath === location.href) {
422
- if (canAutoReload)
423
- console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
424
- // Stop timer, to avoid infinite loop
425
- this.checkAppVersionTimer?.unsubscribe();
426
- return;
427
- }
428
- console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
429
- // Auto reload
430
- if (canAutoReload) {
431
- console.info('[platform] Will reloading at ' + reloadPath);
432
- location.href = reloadPath;
433
- // App stop
434
- }
435
- // Ask user to reload
436
- else {
437
- // Stop timer, to avoid infinite loop
438
- this.checkAppVersionTimer?.unsubscribe();
439
- // Display a reload toast
440
- await this.showToast({
441
- message: 'CONFIRM.RELOAD_APP',
442
- messageParams: { version: remoteVersion, name: this.environment.name },
443
- type: 'info',
444
- duration: -1,
445
- showCloseButton: true,
446
- buttons: [
447
- // Reload button
448
- { text: this.translate.instant('COMMON.BTN_UPDATE'),
449
- side: 'end',
450
- handler: () => {
451
- location.href = reloadPath;
452
- return true;
453
- }
454
- }
455
- ]
456
- });
457
- }
458
- }
459
- showToast(opts) {
460
- if (!this.toastController)
461
- throw new Error('Missing toastController in component\'s constructor');
462
- return new Promise(resolve => Toasts.show(this.toastController, this.translate, {
463
- ...opts,
464
- onWillPresent: (t) => resolve(t)
465
- }));
466
- }
467
- async onStartupError(err) {
468
- console.error('[platform] Failed starting the platform! ' + JSON.stringify(err));
469
- let message = err && err.message || err;
470
- const detailsMessage = err && (err.details && err.details.message || err.details);
471
- // Set specific error when Firefox is in private mode or history never remembered (see Mantis Ifremer #56441)
472
- if (err.code === 11 && this.cdkPlatform.FIREFOX) {
473
- message = 'ERROR.FIREFOX_NO_STORAGE';
474
- }
475
- if (this.translate) {
476
- message = await this.translate.instant(message);
477
- if (err && err.code) {
478
- message += ` {code: ${err.code}}`;
479
- }
480
- }
481
- else {
482
- message = `Fatal error: Please contact your administrator.\n\n{code: ${err && err.code || 'null'}, message: "${message}"}`;
483
- }
484
- if (this.toastController) {
485
- if (detailsMessage) {
486
- message += `<br/><small>${detailsMessage}</small>`;
487
- }
488
- await this.showToast({
489
- type: 'error',
490
- duration: -1,
491
- showCloseButton: true,
492
- message
493
- });
494
- }
495
- else if (window) {
496
- if (detailsMessage) {
497
- message += `\n\n{cause: "${detailsMessage}"}`;
498
- }
499
- window.alert(message);
500
- }
501
- else {
502
- console.error(message);
503
- if (err && err.details)
504
- console.error('cause', err.details);
505
- }
506
- }
507
- }
508
- PlatformService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i1.ToastController }, { token: i3.TranslateService }, { token: i4.MomentDateAdapter }, { token: i5.EntitiesStorage }, { token: i6.LocalSettingsService }, { token: i7.NetworkService }, { token: i8.AccountService }, { token: i9.ConfigService }, { token: i10.CacheService }, { token: i11.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i12.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
509
- PlatformService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PlatformService, providedIn: 'root' });
510
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PlatformService, decorators: [{
511
- type: Injectable,
512
- args: [{ providedIn: 'root' }]
513
- }], ctorParameters: function () { return [{ type: i1.Platform }, { type: i2.Platform }, { type: i1.ToastController }, { type: i3.TranslateService }, { type: i4.MomentDateAdapter }, { type: i5.EntitiesStorage }, { type: i6.LocalSettingsService }, { type: i7.NetworkService }, { type: i8.AccountService }, { type: i9.ConfigService }, { type: i10.CacheService }, { type: i11.AudioProvider }, { type: i13.Environment, decorators: [{
514
- type: Inject,
515
- args: [ENVIRONMENT]
516
- }] }, { type: undefined, decorators: [{
517
- type: Optional
518
- }, {
519
- type: Inject,
520
- args: [APP_LOGGING_SERVICE]
521
- }] }, { type: i12.Downloader, decorators: [{
522
- type: Optional
523
- }] }]; } });
524
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTNELE9BQU8sRUFBK0Isc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENB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LENBQUMsQ0FBQztnQkFDWixlQUFlLEVBQUUsSUFBSTtnQkFDckIsT0FBTzthQUNSLENBQUMsQ0FBQztTQUNKO2FBQ0ksSUFBSSxNQUFNLEVBQUU7WUFDZixJQUFJLGNBQWMsRUFBRTtnQkFDbEIsT0FBTyxJQUFJLGdCQUFnQixjQUFjLElBQUksQ0FBQzthQUMvQztZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkI7YUFDSTtZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU87Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQzs7NkdBbmlCVSxlQUFlLHlYQXFCaEIsV0FBVyxhQUNDLG1CQUFtQjtpSEF0QjlCLGVBQWUsY0FESCxNQUFNOzRGQUNsQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBc0IzQixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7IFBsYXRmb3JtcyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7IEF1ZGlvUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvYXVkaW8vYXVkaW8nO1xuaW1wb3J0IHsgUGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuXG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRW50aXRpZXNTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc2tpcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IERvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eSB9IGZyb20gJ0Bpb25pYy1uYXRpdmUvZG93bmxvYWRlci9uZ3gnO1xuaW1wb3J0IHsgU3RhcnRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBpc01vYmlsZSwgaXNXaW5kb3dzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBWZXJzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdmVyc2lvbi92ZXJzaW9ucyc7XG5pbXBvcnQgeyBGaWxlc1V0aWxzLCBNaW1lVHlwZXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9maWxlLnV0aWxzJztcbmltcG9ydCB7IFVyaVV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvdXJpLnV0aWxzJztcbmltcG9ydCB7IFNwbGFzaFNjcmVlbiB9IGZyb20gJ0BjYXBhY2l0b3Ivc3BsYXNoLXNjcmVlbic7XG5pbXBvcnQgeyBTdGF0dXNCYXIgfSBmcm9tICdAY2FwYWNpdG9yL3N0YXR1cy1iYXInO1xuaW1wb3J0IHsgQnJvd3NlciwgT3Blbk9wdGlvbnMgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2tleWJvYXJkJztcbmltcG9ydCB7IENhcGFjaXRvclBsdWdpbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY2FwYWNpdG9yL3BsdWdpbnMnO1xuaW1wb3J0IHsgbG9jYWxlIGFzIG1vbWVudExvY2FsZSB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJTG9nZ2VyLCBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2luZy9sb2dnZXIubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPR0dJTkdfU0VSVklDRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dpbmctc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBBbmRyb2lkT3NFbnZpcm9ubWVudCA9IE9iamVjdC5mcmVlemUoe1xuICBESVJFQ1RPUllfRE9XTkxPQURTOiAnRG93bmxvYWQnLFxuICBESVJFQ1RPUllfRE9XTkxPQURTX09MRDogJ0Rvd25sb2FkcycsIC8vIE9sZCBuYW1lLCBmb3Igb2xkZXIgQW5kcm9pZCB2ZXJzaW9uXG4gIC8vIFRPRE86IGZpbmQgdmFsdWUgZm9yIHRoaXMuIFNlZSBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9FbnZpcm9ubWVudCNnZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZShqYXZhLmlvLkZpbGUpXG4gIC8vIERJUkVDVE9SWV9NVVNJQyxcbiAgLy8gRElSRUNUT1JZX1BPRENBU1RTLFxuICAvLyBESVJFQ1RPUllfUklOR1RPTkVTLFxuICAvLyBESVJFQ1RPUllfQUxBUk1TLFxuICAvLyBESVJFQ1RPUllfTk9USUZJQ0FUSU9OUyxcbiAgLy8gRElSRUNUT1JZX1BJQ1RVUkVTLFxuICAvLyBESVJFQ1RPUllfTU9WSUVTLFxuICAvLyBESVJFQ1RPUllfRENJTSxcbiAgLy8gRElSRUNUT1JZX0RPQ1VNRU5UUyxcbiAgLy8gRElSRUNUT1JZX0FVRElPQk9PS1MsXG59KTtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1TZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIF9tb2JpbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvcmRvdmE6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NhcGFjaXRvcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYW5kcm9pZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaW9zOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlvbmljUGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbnRpdGllc1N0b3JhZ2U6IEVudGl0aWVzU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXVkaW9Qcm92aWRlcjogQXVkaW9Qcm92aWRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0xPR0dJTkdfU0VSVklDRSkgcHJpdmF0ZSBsb2dnaW5nU2VydmljZTogSUxvZ2dpbmdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlclxuICApIHtcbiAgICBzdXBlcihpb25pY1BsYXRmb3JtKTtcblxuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dpbmdTZXJ2aWNlPy5nZXRMb2dnZXIoJ3BsYXRmb3JtJyk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgaWYgKHRoaXMuX2xvZ2dlcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdjdG9yJywgJ0NyZWF0aW5nIHNlcnZpY2UnKTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucGF1c2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ2N0b3InLCAnUGF1c2UgYXBwJyk7XG4gICAgICB9KTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucmVzdW1lLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdjdG9yJywgJ1Jlc3VtZSBhcHAnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kb3dubG9hZGluZ0pvYnM6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBjaGVja0FwcFZlcnNpb25UaW1lcjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybU5hbWUpIHtcbiAgICAgIGNhc2UgJ21vYmlsZSc6XG4gICAgICAgIC8vIEV4Y2x1ZGUgV2luZG93cyB0b3VjaCBzY3JlZW5zIC0gc2VlIHN1bWFyaXMtYXBwIGlzc3VlcyAjMzIzIGFuZCAjMzQ2XG4gICAgICAgIHJldHVybiBpc01vYmlsZSh3aW5kb3cpO1xuICAgICAgY2FzZSAnbW9iaWxld2ViJzpcbiAgICAgICAgLy8gRXhjbHVkZSBXaW5kb3dzIHRvdWNoIHNjcmVlbnMgLSBzZWUgc3VtYXJpcy1hcHAgaXNzdWVzICMzMjMgYW5kICMzNDZcbiAgICAgICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpICYmICFpc1dpbmRvd3Mod2luZG93KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5pcygnbW9iaWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ2FwYWNpdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYXBhY2l0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YTtcbiAgfVxuXG4gIGlzQW5kcm9pZENvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5fY29yZG92YSB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzSU9TQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW9zICYmIHRoaXMuX2NvcmRvdmEgfHwgZmFsc2U7XG4gIH1cblxuICBpc0lPUygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW9zIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIElzIGEgbmF0aXZlIEFwcCAoYW5kIE5PVCBhIG1vYmlsZSB3ZWIpXG4gICAqL1xuICBpc0FwcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCkgfHwgdGhpcy5pc0lPU0NvcmRvdmEoKTtcbiAgfVxuXG4gIGlzV2ViKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0FwcCgpO1xuICB9XG5cbiAgaXNNb2JpbGVXZWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9iaWxlICYmIHRoaXMuaXNXZWIoKTtcbiAgfVxuXG4gIGdldCBjYW5Eb3dubG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kb3dubG9hZGVyICYmIHRoaXMuaXNBbmRyb2lkQ29yZG92YSgpO1xuICB9XG5cbiAgZ2V0IGNhbk9wZW5GaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTsgLy8gVE9ETzogZml4bWUgdXNpbmcgQGNhcGFjaXRvci9maWxlc3lzdGVtID9cbiAgfVxuXG4gIHdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS53aWR0aCgpO1xuICB9XG5cbiAgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5oZWlnaHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuICAgIHRoaXMuX2xvZ2dlcj8uaW5mbygnbmdPblN0YXJ0JywgJ1N0YXJ0aW5nIHBsYXRmb3JtLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fbW9iaWxlID0gdGhpcy5pcygnbW9iaWxlJyk7XG4gICAgICB0aGlzLl9jb3Jkb3ZhID0gdGhpcy5pcygnY29yZG92YScpO1xuICAgICAgdGhpcy5fY2FwYWNpdG9yID0gdGhpcy5pcygnY2FwYWNpdG9yJyk7XG4gICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5pcygnYW5kcm9pZCcpO1xuICAgICAgdGhpcy5faW9zID0gdGhpcy5pcygnaW9zJyk7XG5cbiAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgRGV0ZWN0ZWQge21vYmlsZTogJHt0aGlzLl9tb2JpbGV9LCBjb3Jkb3ZhOiAke3RoaXMuX2NvcmRvdmF9LCBjYXBhY2l0b3I6ICR7dGhpcy5fY2FwYWNpdG9yfSwgYW5kcm9pZDogJHt0aGlzLl9hbmRyb2lkfSwgaW9zOiAke3RoaXMuX2lvc319YDtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSAnICsgbG9nTWVzc2FnZSk7XG4gICAgICB0aGlzLl9sb2dnZXI/LmluZm8oJ25nT25TdGFydCcsIGxvZ01lc3NhZ2UpO1xuXG4gICAgICAvLyBDb25maWd1cmUgQ1NTIGNsYXNzXG4gICAgICB0aGlzLmNvbmZpZ3VyZUdsb2JhbENzc0NsYXNzKHRoaXMuX21vYmlsZSk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBDYXBhY2l0b3IgcGx1Z2luc1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVDYXBhY2l0b3JQbHVnaW5zKCk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSB0cmFuc2xhdGlvblxuICAgICAgdGhpcy5jb25maWd1cmVUcmFuc2xhdGUoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIGNhY2hlXG4gICAgICB0aGlzLmNvbmZpZ3VyZUNhY2hlKCk7XG5cbiAgICAgIC8vIFN0YXJ0IHJvb3Qgc2VydmljZXNcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N0b3JhZ2UucmVhZHkoKSxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLFxuICAgICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLnJlYWR5KCksXG4gICAgICAgIHRoaXMuYXVkaW9Qcm92aWRlci5yZWFkeSgpXG4gICAgICBdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2ViIGFwcCBoYXMgdXBkYXRlLCBhbmQgcmVsb2FkIHBhZ2UgaWYgbmVlZFxuICAgICAgaWYgKHRoaXMuaXNXZWIoKSAmJiB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcFZlcnNpb24oe2NhblJlbG9hZDogdHJ1ZX0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY2FjaGUgY29uZmlndXJhdGlvbiB3aGVuIG5ldHdvcmsgY2hhbmdlZFxuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBza2lwKDEpIC8vIEFscmVhZHkgZG9uZSBvbmNlLCBzbyB3ZSBza2lwIHRoZSBmaXJzdCBldmVudFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKHR5cGUgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHBsYXRmb3JtIFtPS10ge21vYmlsZTogJHt0aGlzLl9tb2JpbGV9LCBjYXBhY2l0b3I6ICR7dGhpcy5fY2FwYWNpdG9yfSwgd2ViOiAke3RoaXMuaXNXZWIoKX0sIGRvd25sb2FkZXI6ICR7dGhpcy5jYW5Eb3dubG9hZH19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZ1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKGNvbmZpZyA9PiBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlKSxcbiAgICAgICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKHRva2VuVHlwZSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gVXNpbmcgYXV0aCB0b2tlbiB0eXBlIHske3Rva2VuVHlwZX19YCk7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHRva2VuVHlwZTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX21vYmlsZSkge1xuICAgICAgICAvLyBIaWRlIHRoZSBzcGxhc2hzY3JlZW4gKGlmIG1vYmlsZSkgLSBhZnRlciAxcyAtIGFuZCBwbGF5IHN0YXJ0IHNvdW5kXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IFNwbGFzaFNjcmVlbi5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgbmV3IHZlcnNpb24sIGV2ZXJ5IDEgbWluXG4gICAgICBjb25zdCBjaGVja0ludGVydmFsTXMgPSAodGhpcy5lbnZpcm9ubWVudC5jaGVja0FwcFZlcnNpb25JbnRlcnZhbEluU2Vjb25kcyB8fCAwKSAqIDEwMDA7XG4gICAgICBpZiAodGhpcy5pc1dlYigpICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiAmJiBjaGVja0ludGVydmFsTXMgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRpbWVyKGNoZWNrSW50ZXJ2YWxNcywgY2hlY2tJbnRlcnZhbE1zKVxuICAgICAgICAgIC5zdWJzY3JpYmUoXyA9PiB0aGlzLmNoZWNrQXBwVmVyc2lvbih7c2lsZW50OiB0cnVlLCBjYW5SZWxvYWQ6IGZhbHNlIC8qZG8gTk9UIGF1dG8gcmVsb2FkLCB3aGVuIGFwcCBpcyBzdGFydGVkKi99KSk7XG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXIgPSBzdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB0aGlzLnVucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE1hbmFnZSBzdGFydHVwIGVycm9yXG4gICAgICByZXR1cm4gdGhpcy5vblN0YXJ0dXBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW4odXJsOiBzdHJpbmcsIG9wdHM/OiBPcGVuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBPcGVuaW5nIGxpbms6ICR7dXJsfWApO1xuICAgIGlmICh0aGlzLl9tb2JpbGUgJiYgdGhpcy5fY2FwYWNpdG9yKSB7XG4gICAgICBhd2FpdCBCcm93c2VyLm9wZW4oe3VybCwgLi4ub3B0c30pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgb3B0cz8ud2luZG93TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RG93bmxvYWRpbmdKb2IodXJpOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHVyaSk7XG4gIH1cblxuICBkb3dubG9hZChyZXF1ZXN0OiB7dXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4pOiBPYnNlcnZhYmxlPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXFwncmVxdWVzdFxcJyBvciBcXCdyZXF1ZXN0LnVyaVxcJycpO1xuXG4gICAgaWYgKHRoaXMuY2FuRG93bmxvYWQpIHtcblxuICAgICAgLy8gQ2hlY2sgaWYgbm90IGFscmVhZHkgZG93bmxvYWRpbmcgZmlsZVxuICAgICAgbGV0IGpvYiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChqb2IkKSByZXR1cm4gam9iJDtcblxuICAgICAgLy8gQ29tcHV0ZSBzdWJQYXRoIChmaW5hbCBmaWxlbmFtZSlcbiAgICAgIGxldCBzdWJQYXRoID0gcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI/LnN1YlBhdGhcbiAgICAgICAgfHwgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0Rpcj8uc3ViUGF0aFxuICAgICAgICB8fCByZXF1ZXN0LmZpbGVuYW1lIHx8IFVyaVV0aWxzLmdldEZpbGVuYW1lKHJlcXVlc3QudXJpKVxuICAgICAgICB8fCByZXF1ZXN0LnRpdGxlIHx8ICdkb3dubG9hZCc7XG5cbiAgICAgIHN1YlBhdGggPSBzdWJQYXRoLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLy8gUmVtb3ZlIHNwYWNlc1xuICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuXG4gICAgICAvLyBGb3JjZSBBUEsgdG8gZmluaXNoIHdpdGggJy5hcGsnXG4gICAgICBpZiAocmVxdWVzdC5taW1lVHlwZSA9PT0gTWltZVR5cGVzLkFORFJPSURfQVBLICYmICFzdWJQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5hcGsnKSkge1xuICAgICAgICBzdWJQYXRoICs9ICcuYXBrJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG93bmxvYWRSZXF1ZXN0ID0gPERvd25sb2FkUmVxdWVzdD57XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIGZpbGVuYW1lOiB1bmRlZmluZWQsIC8vIEZvcmNlIHVuc2V0XG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpcjogIXJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGRpclR5cGU6IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMsXG4gICAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpcixcbiAgICAgICAgICAgIHN1YlBhdGhcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyOiByZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBkaXJUeXBlOiBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTLFxuICAgICAgICAgICAgLi4ucmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpcixcbiAgICAgICAgICAgIHN1YlBhdGhcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0YXJ0IGRvd25sb2FkXG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIERvd25sb2FkaW5nLCB1c2luZyByZXF1ZXN0OiAnICsgSlNPTi5zdHJpbmdpZnkoZG93bmxvYWRSZXF1ZXN0KSk7XG4gICAgICBqb2IkID0gZnJvbSh0aGlzLmRvd25sb2FkZXIuZG93bmxvYWQoZG93bmxvYWRSZXF1ZXN0KSk7XG5cbiAgICAgIC8vIFJlbWVtYmVyIHRoaXMgcmVxdWVzdCB1cmlcbiAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5zZXQoZG93bmxvYWRSZXF1ZXN0LnVyaSwgam9iJCk7XG4gICAgICByZXR1cm4gam9iJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAobG9jYXRpb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIEZvcmdldCBqb2JcbiAgICAgICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5kZWxldGUoZG93bmxvYWRSZXF1ZXN0LnVyaSk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gZG93bmxvYWQ6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycikpO1xuICAgICAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXF1ZXN0XG4gICAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKGRvd25sb2FkUmVxdWVzdC51cmkpO1xuXG4gICAgICAgICAgICAvLyBSZXRyeSB3aXRoIGFub3RoZXIgbG9jYXRpb24gLSBpc3N1ZSBpbiBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgICAgICAgICAgIGlmIChkb3dubG9hZFJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyPy5kaXJUeXBlID09PSBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTKSB7XG4gICAgICAgICAgICAgIGRvd25sb2FkUmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXIuZGlyVHlwZSA9IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFNfT0xEO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKGlmIG5vdCBBbmRyb2lkIGFuZCBDYXBhY2l0b3IpOiBvcGVuaW5nIHRoZSBVUklcbiAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGRvd25sb2FkIHVuZGVyIGlPUyAoc2VlIGh0dHBzOi8vd3d3LmMtc2hhcnBjb3JuZXIuY29tL2FydGljbGUvaG93LXRvLWRvd25sb2FkLWEtZmlsZS11c2luZy1maWxlLXRyYW5zZmVyLXBsdWdpbi1pbi1pb25pYy0zLylcbiAgICBlbHNlIHtcbiAgICAgIEZpbGVzVXRpbHMuZG93bmxvYWRVcmkocmVxdWVzdC51cmksIHJlcXVlc3QuZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlR2xvYmFsQ3NzQ2xhc3MobW9iaWxlOiBib29sZWFuLCB3aW46IGFueSA9IHdpbmRvdykge1xuICAgIGlmIChtb2JpbGUpIHJldHVybjsgLy8gTm90aGluZyB0byBkb1xuXG4gICAgLy8gV29ya2Fyb3VuZCwgZm9yIE1TIFdpbmRvd3MgdG91Y2ggc2NyZWVuIChkZXRlY3RlZCBhcyBtb2JpbGUsIGJ1dCBmb3JjZWQgYXMgZGVza3RvcClcbiAgICBpZiAoIW1vYmlsZSAmJiAod2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwbHQtbW9iaWxlJylcbiAgICAgIHx8IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucygncGx0LW1vYmlsZXdlYicpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIEZvcmNlIGNsYXNzIGxpc3QgdG86IDxodG1sIGNsYXNzPVwicGx0LWRlc2t0b3BcIj4uIFdvcmthcm91bmQgZm9yIFdpbmRvd3MgdG91Y2ggc2NyZWVuLicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwbHQtbW9iaWxlJywncGx0LW1vYmlsZXdlYicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwbHQtZGVza3RvcCcpO1xuICAgIH1cblxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMoKSB7XG4gICAgaWYgKCF0aGlzLl9jYXBhY2l0b3IpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIENhcGFjaXRvciBwbHVnaW5zLi4uJyk7XG5cbiAgICBsZXQgcGx1Z2luOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHBsdWdpbiA9IENhcGFjaXRvclBsdWdpbnMuU3RhdHVzQmFyO1xuICAgICAgaWYgKHRoaXMuaXNBcHAoKSkge1xuICAgICAgICBhd2FpdCBTdGF0dXNCYXIuc2V0T3ZlcmxheXNXZWJWaWV3KHtvdmVybGF5OiBmYWxzZX0pO1xuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIGFjY2Vzc29yeSBiYXIgKGlPUyBvbmx5KVxuICAgICAgaWYgKHRoaXMuaXNJT1MoKSkge1xuICAgICAgICBwbHVnaW4gPSBDYXBhY2l0b3JQbHVnaW5zLktleWJvYXJkO1xuICAgICAgICBhd2FpdCBLZXlib2FyZC5zZXRBY2Nlc3NvcnlCYXJWaXNpYmxlKHtpc1Zpc2libGU6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGBFcnJvciB3aGlsZSBjb25maWd1cmluZyAke3BsdWdpbn0gcGx1Z2luOiAke2Vyci5tZXNzYWdlfHxlcnJ9XFxuJHtlcnI/Lm9yaWdpbmFsU3RhY2sgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKX1gO1xuICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSAnICsgbG9nTWVzc2FnZSk7XG4gICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKCdjb25maWd1cmVDYXBhY2l0b3JQbHVnaW5zJywgbG9nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJhbnNsYXRlKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBpMThuIC4uLicpO1xuXG4gICAgLy8gdGhpcyBsYW5ndWFnZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdHJhbnNsYXRpb24gaXNuJ3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZyh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgIC8vIGFwcGx5IGxvY2FsZSBpbW1lZGlhdGVseVxuICAgIHRoaXMuYXBwbHlMb2NhbGUodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIC8vIFdoZW4gbG9jYWxlIGNoYW5nZXMsIGFwcGx5IHRvIGRhdGUgYWRhcHRlclxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmxhbmcpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5TG9jYWxlKGV2ZW50LmxhbmcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKGRhdGEubG9jYWxlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUgIT09IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShkYXRhLmxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwbHlpbmcgZGVmYXVsdCwgd2hlbiBzZXR0aW5ncyBoYXMgbm8gbG9jYWxlIHByb3BlcnR5IChob3RmaXggLSBsdWRvdmljLnBlY3F1b3RAZS1pcy5wcm8gLSAxNC8xMS8yMDIxIC0gc2luY2UgdjEuMjAuNDIpXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gTm8gbG9jYWxlIGZvdW5kIGluIHNldHRpbmdzOiBhcHBseWluZyBkZWZhdWx0TG9jYWxlOiAnLCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBVc2UgYWNjb3VudCdzIHNldHRpbmdzLCAobGlrZSBsb2NhbGUpLCB3aGVuIGFjY291bnQgaW5oZXJpdGFuY2UgZW5hYmxlZFxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKGFjY291bnQgPT4ge1xuICAgICAgICBpZiAoYWNjb3VudC5zZXR0aW5ncyAmJiB0aGlzLnNldHRpbmdzLnNldHRpbmdzLmFjY291bnRJbmhlcml0YW5jZSkge1xuICAgICAgICAgIGNvbnN0IGFjY291bnRTZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MuYXNMb2NhbFNldHRpbmdzKCk7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5hcHBseShhY2NvdW50U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlMb2NhbGUobG9jYWxlOiBzdHJpbmcpIHtcbiAgICAvLyBmb3JjZSAnZW4nIGFzICdlbl9HQidcbiAgICBpZiAobG9jYWxlID09PSAnZW4nKSB7XG4gICAgICBsb2NhbGUgPSAnZW5fR0InO1xuICAgIH1cblxuICAgIC8vIGNvbmZpZyBtb21lbnQgbGliXG4gICAgdHJ5IHtcbiAgICAgIG1vbWVudExvY2FsZShsb2NhbGUpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgbG9jYWxlICsgJ30nKTtcbiAgICB9XG4gICAgICAgIC8vIElmIGVycm9yLCBmYWxsYmFjayB0byBlblxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIG1vbWVudExvY2FsZSgnZW4nKTtcbiAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBVbmtub3duIGxvY2FsZSBmb3IgbW9tZW50IGxpYi4gVXNpbmcgZGVmYXVsdCBbZW5dJyk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0TG9jYWxlKG1vbWVudExvY2FsZSgpKTtcblxuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNhY2hlKG9ubGluZT86IGJvb2xlYW4pIHtcbiAgICBvbmxpbmUgPSB0b0Jvb2xlYW4ob25saW5lLCB0aGlzLmNhY2hlLmlzT25saW5lKCkpO1xuICAgIGNvbnN0IGNhY2hlVFRMID0gb25saW5lID8gMzYwMCAvKiAxaCAqLyA6IDM2MDAgKiAyNCAqIDMwOyAvKiAxIG1vbnRoICovXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGNhY2hlIFtPS10ge29ubGluZTogJHtvbmxpbmV9LCB0aW1lVG9MaXZlOiAke2NhY2hlVFRMIC8gMzYwMH1oLCBvZmZsaW5lSW52YWxpZGF0ZTogZmFsc2V9YCk7XG4gICAgdGhpcy5jYWNoZS5zZXREZWZhdWx0VFRMKGNhY2hlVFRMKTtcbiAgICB0aGlzLmNhY2hlLnNldE9mZmxpbmVJbnZhbGlkYXRlKGZhbHNlKTsgLy8gRG8gbm90IGludmFsaWRhdGUgY2FjaGUgd2hlbiBvZmZsaW5lXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tBcHBWZXJzaW9uKG9wdHM/OiB7Y2FuUmVsb2FkPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbn0pIHtcbiAgICBpZiAodGhpcy5uZXR3b3JrU2VydmljZS5vZmZsaW5lIHx8ICF0aGlzLmlzV2ViKCkpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3Qgc2lsZW50ID0gb3B0cz8uc2lsZW50ID09PSB0cnVlO1xuICAgIGNvbnN0IHByb2R1Y3Rpb24gPSB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgY29uc3QgY2FuQXV0b1JlbG9hZCA9ICFvcHRzIHx8IG9wdHMuY2FuUmVsb2FkICE9PSBmYWxzZTtcblxuICAgIGlmICghc2lsZW50KSBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ2hlY2tpbmcgcmVtb3RlIGFwcCB2ZXJzaW9uLi4uJyk7XG5cbiAgICBjb25zdCBhY3R1YWxWZXJzaW9uID0gdGhpcy5lbnZpcm9ubWVudC52ZXJzaW9uO1xuICAgIGlmIChpc05pbE9yQmxhbmsoYWN0dWFsVmVyc2lvbikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgXFwnZW52aXJvbm1lbnQudmVyc2lvblxcJy4gQ2Fubm90IGNoZWNrIHJlbW90ZSBhcHAgdmVyc2lvbi4nKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47IC8vIFNraXBcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdGVWZXJzaW9uID0gYXdhaXQgdGhpcy5uZXR3b3JrU2VydmljZS5nZXRBcHBWZXJzaW9uKCk7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhyZW1vdGVWZXJzaW9uKSkge1xuICAgICAgaWYgKHByb2R1Y3Rpb24gJiYgIXNpbGVudCkgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBDYW5ub3QgbG9hZCByZW1vdGUgYXBwIHZlcnNpb24uIFNraXBwaW5nIHZlcnNpb24gY2hlY2snKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFZlcnNpb25VdGlscy5pc0NvbXBhdGlibGUocmVtb3RlVmVyc2lvbiwgYWN0dWFsVmVyc2lvbikpIHtcbiAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gQ2hlY2tpbmcgcmVtb3RlIGFwcCB2ZXJzaW9uIFtPS10ge3JlbW90ZTogJyR7cmVtb3RlVmVyc2lvbn0nLCBhY3R1YWw6ICcke2FjdHVhbFZlcnNpb259J31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBuZXdlciB2ZXJzaW9uIGV4aXN0c1xuICAgIGxldCByZWxvYWRQYXRoID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bJl0/dmVyc2lvbj1bMC05Ll0rL2dpLCAnJyk7IC8vIFJlbW92ZSBvbGQgdmVyc2lvbiBpbiBxdWVyeSBwYXJhbXNcbiAgICByZWxvYWRQYXRoICs9IChyZWxvYWRQYXRoLmluZGV4T2YoJz8nKSA9PT0gLTEpID8gJz8nIDogJyYnOyAvLyBBZGQgcXVlcnkgcGFyYW0gc2VwYXJhdG9yXG4gICAgcmVsb2FkUGF0aCArPSAndmVyc2lvbj0nICsgcmVtb3RlVmVyc2lvbjsgLy8gQWRkIHZlcnNpb24gKHRvIGF2b2lkIGEgcmVsb2FkIGluZmluaXRlIGxvb3ApXG5cbiAgICAvLyBBbHJlYWR5IHRyeSB0byByZWxvYWQsIGJ1dCB2ZXJzaW9uIHN0aWxsIGJhZFxuICAgIGlmIChyZWxvYWRQYXRoID09PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBpZiAoY2FuQXV0b1JlbG9hZCkgY29uc29sZS5lcnJvcihgW3BsYXRmb3JtXSBSZWxvYWRlZCBwYWdlIGZhaWxlZCwgYmVjYXVzZSB2ZXJzaW9uIHN0aWxsIG1pc21hdGNoISBQbGVhc2UgY2hlY2sgdmVyc2lvbi5hcHB1cCBmaWxlIChleHBlY3RlZCBhcHAgdmVyc2lvbjogJHthY3R1YWxWZXJzaW9ufSlgKTtcbiAgICAgIC8vIFN0b3AgdGltZXIsIHRvIGF2b2lkIGluZmluaXRlIGxvb3BcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBbcGxhdGZvcm1dIE1vcmUgcmVjZW50IHZlcnNpb24gZGV0ZWN0ZWQgKHJlbW90ZTogJHtyZW1vdGVWZXJzaW9ufSwgYWN0dWFsOiAke2FjdHVhbFZlcnNpb259YCk7XG5cbiAgICAvLyBBdXRvIHJlbG9hZFxuICAgIGlmIChjYW5BdXRvUmVsb2FkKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gV2lsbCByZWxvYWRpbmcgYXQgJyArIHJlbG9hZFBhdGgpO1xuICAgICAgbG9jYXRpb24uaHJlZiA9IHJlbG9hZFBhdGg7XG4gICAgICAvLyBBcHAgc3RvcFxuICAgIH1cbiAgICAvLyBBc2sgdXNlciB0byByZWxvYWRcbiAgICBlbHNlIHtcbiAgICAgIC8vIFN0b3AgdGltZXIsIHRvIGF2b2lkIGluZmluaXRlIGxvb3BcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgIC8vIERpc3BsYXkgYSByZWxvYWQgdG9hc3RcbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgbWVzc2FnZTogJ0NPTkZJUk0uUkVMT0FEX0FQUCcsXG4gICAgICAgIG1lc3NhZ2VQYXJhbXM6IHt2ZXJzaW9uOiByZW1vdGVWZXJzaW9uLCBuYW1lOiB0aGlzLmVudmlyb25tZW50Lm5hbWV9LFxuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgLy8gUmVsb2FkIGJ1dHRvblxuICAgICAgICAgIHt0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT01NT04uQlROX1VQREFURScpLFxuICAgICAgICAgICAgc2lkZTogJ2VuZCcsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF19KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPEhUTUxJb25Ub2FzdEVsZW1lbnQ+IHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgb25XaWxsUHJlc2VudDogKHQpID0+IHJlc29sdmUodClcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvblN0YXJ0dXBFcnJvcihlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEZhaWxlZCBzdGFydGluZyB0aGUgcGxhdGZvcm0hICcgKyBKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgY29uc3QgZGV0YWlsc01lc3NhZ2UgPSBlcnIgJiYgKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSkge1xuICAgICAgICBtZXNzYWdlICs9IGAge2NvZGU6ICR7ZXJyLmNvZGV9fWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbWVzc2FnZSA9IGBGYXRhbCBlcnJvcjogUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLlxcblxcbntjb2RlOiAke2VyciAmJiBlcnIuY29kZSB8fCAnbnVsbCd9LCBtZXNzYWdlOiBcIiR7bWVzc2FnZX1cIn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2FzdENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGA8YnIvPjxzbWFsbD4ke2RldGFpbHNNZXNzYWdlfTwvc21hbGw+YDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgZHVyYXRpb246IC0xLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG57Y2F1c2U6IFwiJHtkZXRhaWxzTWVzc2FnZX1cIn1gO1xuICAgICAgfVxuICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBpZiAoZXJyICYmIGVyci5kZXRhaWxzKSBjb25zb2xlLmVycm9yKCdjYXVzZScsIGVyci5kZXRhaWxzKTtcbiAgICB9XG4gIH1cbn1cblxuIl19