@sumaris-net/ngx-components 18.14.0 → 18.14.1

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 (1416) hide show
  1. package/esm2022/public_api.mjs +390 -0
  2. package/esm2022/src/app/admin/admin-routing.module.mjs +34 -0
  3. package/esm2022/src/app/admin/admin.module.mjs +32 -0
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +76 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +184 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +379 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +56 -0
  9. package/esm2022/src/app/core/about/about.modal.mjs +86 -0
  10. package/esm2022/src/app/core/about/about.module.mjs +22 -0
  11. package/esm2022/src/app/core/account/account.module.mjs +75 -0
  12. package/esm2022/src/app/core/account/account.page.mjs +364 -0
  13. package/esm2022/src/app/core/account/new-token.form.mjs +106 -0
  14. package/esm2022/src/app/core/account/new-token.modal.mjs +66 -0
  15. package/esm2022/src/app/core/account/password/change-password.form.mjs +63 -0
  16. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  17. package/esm2022/src/app/core/account/password/change-password.page.mjs +150 -0
  18. package/esm2022/src/app/core/account/token.table.mjs +157 -0
  19. package/esm2022/src/app/core/auth/auth.form.mjs +159 -0
  20. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  21. package/esm2022/src/app/core/auth/auth.module.mjs +56 -0
  22. package/esm2022/src/app/core/auth/reset-password.modal.mjs +89 -0
  23. package/esm2022/src/app/core/core.module.mjs +151 -0
  24. package/esm2022/src/app/core/core.testing.module.mjs +107 -0
  25. package/esm2022/src/app/core/form/array/form-array.mjs +328 -0
  26. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +23 -0
  27. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +94 -0
  28. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +108 -0
  29. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +31 -0
  30. package/esm2022/src/app/core/form/entity/editor.class.mjs +268 -0
  31. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +420 -0
  32. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +741 -0
  33. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  34. package/esm2022/src/app/core/form/entity/entity.module.mjs +32 -0
  35. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +190 -0
  36. package/esm2022/src/app/core/form/form-container.class.mjs +341 -0
  37. package/esm2022/src/app/core/form/form.class.mjs +337 -0
  38. package/esm2022/src/app/core/form/form.module.mjs +70 -0
  39. package/esm2022/src/app/core/form/form.utils.mjs +232 -0
  40. package/esm2022/src/app/core/form/list/list.form.mjs +235 -0
  41. package/esm2022/src/app/core/form/list/list.module.mjs +31 -0
  42. package/esm2022/src/app/core/form/properties/properties.form.mjs +317 -0
  43. package/esm2022/src/app/core/form/properties/properties.module.mjs +37 -0
  44. package/esm2022/src/app/core/form/properties/properties.table.mjs +264 -0
  45. package/esm2022/src/app/core/form/properties/properties.utils.mjs +304 -0
  46. package/esm2022/src/app/core/form/properties/property.validator.mjs +70 -0
  47. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +104 -0
  48. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +23 -0
  49. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  50. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +30 -0
  51. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +161 -0
  52. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +31 -0
  53. package/esm2022/src/app/core/form/username/username.form.mjs +55 -0
  54. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  55. package/esm2022/src/app/core/graphql/graphql.module.mjs +14 -0
  56. package/esm2022/src/app/core/graphql/graphql.service.mjs +781 -0
  57. package/esm2022/src/app/core/graphql/graphql.utils.mjs +119 -0
  58. package/esm2022/src/app/core/home/home.mjs +403 -0
  59. package/esm2022/src/app/core/home/home.module.mjs +54 -0
  60. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  61. package/esm2022/src/app/core/icon/icon.module.mjs +20 -0
  62. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +394 -0
  63. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +31 -0
  64. package/esm2022/src/app/core/menu/menu.component.mjs +258 -0
  65. package/esm2022/src/app/core/menu/menu.model.mjs +272 -0
  66. package/esm2022/src/app/core/menu/menu.module.mjs +47 -0
  67. package/esm2022/src/app/core/menu/menu.service.mjs +666 -0
  68. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  69. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +50 -0
  70. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +158 -0
  71. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +60 -0
  72. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +28 -0
  73. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +31 -0
  74. package/esm2022/src/app/core/peer/select-peer.modal.mjs +344 -0
  75. package/esm2022/src/app/core/peer/select-peer.module.mjs +36 -0
  76. package/esm2022/src/app/core/register/register-confirm.page.mjs +90 -0
  77. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  78. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  79. package/esm2022/src/app/core/register/register.module.mjs +23 -0
  80. package/esm2022/src/app/core/services/account.service.mjs +1358 -0
  81. package/esm2022/src/app/core/services/auth-guard.service.mjs +74 -0
  82. package/esm2022/src/app/core/services/base-entity-service.class.mjs +485 -0
  83. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +230 -0
  84. package/esm2022/src/app/core/services/base58.mjs +83 -0
  85. package/esm2022/src/app/core/services/config/core.config.mjs +258 -0
  86. package/esm2022/src/app/core/services/config.service.mjs +384 -0
  87. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  88. package/esm2022/src/app/core/services/errors.mjs +54 -0
  89. package/esm2022/src/app/core/services/local-settings.service.mjs +517 -0
  90. package/esm2022/src/app/core/services/model/account.model.mjs +178 -0
  91. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  92. package/esm2022/src/app/core/services/model/department.model.mjs +35 -0
  93. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  94. package/esm2022/src/app/core/services/model/entity.model.mjs +338 -0
  95. package/esm2022/src/app/core/services/model/filter.model.mjs +93 -0
  96. package/esm2022/src/app/core/services/model/history.model.mjs +2 -0
  97. package/esm2022/src/app/core/services/model/model.enum.mjs +11 -0
  98. package/esm2022/src/app/core/services/model/node-feature.model.mjs +31 -0
  99. package/esm2022/src/app/core/services/model/peer.model.mjs +113 -0
  100. package/esm2022/src/app/core/services/model/person.model.mjs +114 -0
  101. package/esm2022/src/app/core/services/model/referential.model.mjs +205 -0
  102. package/esm2022/src/app/core/services/model/settings.model.mjs +6 -0
  103. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  104. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +220 -0
  105. package/esm2022/src/app/core/services/network.service.mjs +649 -0
  106. package/esm2022/src/app/core/services/network.types.mjs +2 -0
  107. package/esm2022/src/app/core/services/network.utils.mjs +35 -0
  108. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +38 -0
  109. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  110. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  111. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
  112. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
  113. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  114. package/esm2022/src/app/core/services/platform.service.mjs +627 -0
  115. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +427 -0
  116. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +450 -0
  117. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  118. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  119. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  120. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  121. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +57 -0
  122. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +27 -0
  123. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +55 -0
  124. package/esm2022/src/app/core/settings/settings.module.mjs +23 -0
  125. package/esm2022/src/app/core/settings/settings.page.mjs +403 -0
  126. package/esm2022/src/app/core/table/async-table.class.mjs +1813 -0
  127. package/esm2022/src/app/core/table/column/actions-column.component.mjs +130 -0
  128. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +117 -0
  129. package/esm2022/src/app/core/table/column/row-field.component.mjs +116 -0
  130. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +415 -0
  131. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +407 -0
  132. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  133. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  134. package/esm2022/src/app/core/table/table.class.mjs +1869 -0
  135. package/esm2022/src/app/core/table/table.model.mjs +21 -0
  136. package/esm2022/src/app/core/table/table.module.mjs +51 -0
  137. package/esm2022/src/app/core/table/table.pipes.mjs +77 -0
  138. package/esm2022/src/app/core/table/table.utils.mjs +34 -0
  139. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +32 -0
  140. package/esm2022/src/app/core/table/testing/table.testing.mjs +329 -0
  141. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +25 -0
  142. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  143. package/esm2022/src/app/core/table/testing/table2.testing.mjs +273 -0
  144. package/esm2022/src/app/shared/alerts.mjs +243 -0
  145. package/esm2022/src/app/shared/audio/audio.mjs +255 -0
  146. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  147. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +30 -0
  148. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  149. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  150. package/esm2022/src/app/shared/constants.mjs +16 -0
  151. package/esm2022/src/app/shared/dates.mjs +180 -0
  152. package/esm2022/src/app/shared/debug/debug-service.class.mjs +3 -0
  153. package/esm2022/src/app/shared/debug/debug.component.mjs +44 -0
  154. package/esm2022/src/app/shared/debug/debug.module.mjs +23 -0
  155. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +91 -0
  156. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +75 -0
  157. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +30 -0
  158. package/esm2022/src/app/shared/directives/directives.module.mjs +24 -0
  159. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  160. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  161. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  162. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  163. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  164. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +43 -0
  165. package/esm2022/src/app/shared/events.mjs +64 -0
  166. package/esm2022/src/app/shared/file/csv.utils.mjs +97 -0
  167. package/esm2022/src/app/shared/file/file.service.mjs +118 -0
  168. package/esm2022/src/app/shared/file/file.utils.mjs +117 -0
  169. package/esm2022/src/app/shared/file/images.utils.mjs +186 -0
  170. package/esm2022/src/app/shared/file/json.utils.mjs +58 -0
  171. package/esm2022/src/app/shared/file/uri.utils.mjs +29 -0
  172. package/esm2022/src/app/shared/file/url.utils.mjs +195 -0
  173. package/esm2022/src/app/shared/focusable.mjs +6 -0
  174. package/esm2022/src/app/shared/form/field.component.mjs +393 -0
  175. package/esm2022/src/app/shared/form/field.model.mjs +82 -0
  176. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  177. package/esm2022/src/app/shared/forms.mjs +573 -0
  178. package/esm2022/src/app/shared/functions.mjs +672 -0
  179. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +86 -0
  180. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  181. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +2 -0
  182. package/esm2022/src/app/shared/graph/colors.utils.mjs +60 -0
  183. package/esm2022/src/app/shared/graph/graph-colors.mjs +214 -0
  184. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +65 -0
  185. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  186. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +147 -0
  187. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +24 -0
  188. package/esm2022/src/app/shared/http/http.utils.mjs +56 -0
  189. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +443 -0
  190. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +62 -0
  191. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  192. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +87 -0
  193. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +37 -0
  194. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +59 -0
  195. package/esm2022/src/app/shared/image/image.model.mjs +2 -0
  196. package/esm2022/src/app/shared/image/image.module.mjs +24 -0
  197. package/esm2022/src/app/shared/image/image.service.mjs +109 -0
  198. package/esm2022/src/app/shared/inputs.mjs +279 -0
  199. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
  200. package/esm2022/src/app/shared/logging/log-level.model.mjs +48 -0
  201. package/esm2022/src/app/shared/logging/logger.model.mjs +47 -0
  202. package/esm2022/src/app/shared/logging/logging-service.class.mjs +125 -0
  203. package/esm2022/src/app/shared/logging/logging-service.config.mjs +2 -0
  204. package/esm2022/src/app/shared/logging/logging-service.module.mjs +30 -0
  205. package/esm2022/src/app/shared/markdown/markdown.component.mjs +321 -0
  206. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +34 -0
  207. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +99 -0
  208. package/esm2022/src/app/shared/markdown/markdown.module.mjs +87 -0
  209. package/esm2022/src/app/shared/markdown/markdown.service.mjs +204 -0
  210. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +87 -0
  211. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +55 -0
  212. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +30 -0
  213. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +46 -0
  214. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +1313 -0
  215. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +79 -0
  216. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +18 -0
  217. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +242 -0
  218. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +251 -0
  219. package/esm2022/src/app/shared/material/badge/badge.module.mjs +20 -0
  220. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  221. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +67 -0
  222. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +371 -0
  223. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +72 -0
  224. package/esm2022/src/app/shared/material/chips/chips.module.mjs +71 -0
  225. package/esm2022/src/app/shared/material/chips/material.chips.mjs +836 -0
  226. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +151 -0
  227. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +76 -0
  228. package/esm2022/src/app/shared/material/datetime/material.date.mjs +471 -0
  229. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +457 -0
  230. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +693 -0
  231. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +136 -0
  232. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +127 -0
  233. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +118 -0
  234. package/esm2022/src/app/shared/material/duration/duration.module.mjs +61 -0
  235. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +16 -0
  236. package/esm2022/src/app/shared/material/duration/material.duration.mjs +283 -0
  237. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +85 -0
  238. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +319 -0
  239. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +432 -0
  240. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +231 -0
  241. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +68 -0
  242. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +137 -0
  243. package/esm2022/src/app/shared/material/material.animations.mjs +200 -0
  244. package/esm2022/src/app/shared/material/material.config.mjs +3 -0
  245. package/esm2022/src/app/shared/material/material.module.mjs +229 -0
  246. package/esm2022/src/app/shared/material/material.testing.module.mjs +245 -0
  247. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +51 -0
  248. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  249. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +379 -0
  250. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +52 -0
  251. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  252. package/esm2022/src/app/shared/material/test/test-component.mjs +264 -0
  253. package/esm2022/src/app/shared/material/testing/common.test.mjs +111 -0
  254. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +42 -0
  255. package/esm2022/src/app/shared/material/text/text-form.component.mjs +205 -0
  256. package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
  257. package/esm2022/src/app/shared/modules.mjs +12 -0
  258. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +303 -0
  259. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  260. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +24 -0
  261. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  262. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +74 -0
  263. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +28 -0
  264. package/esm2022/src/app/shared/observables.mjs +100 -0
  265. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +217 -0
  266. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +25 -0
  267. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +29 -0
  268. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +50 -0
  269. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  270. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  271. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +18 -0
  272. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +23 -0
  273. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +34 -0
  274. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +53 -0
  275. package/esm2022/src/app/shared/pipes/form.pipes.mjs +219 -0
  276. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +50 -0
  277. package/esm2022/src/app/shared/pipes/html.pipes.mjs +69 -0
  278. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  279. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +65 -0
  280. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +67 -0
  281. package/esm2022/src/app/shared/pipes/math.pipes.mjs +77 -0
  282. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  283. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +17 -0
  284. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +63 -0
  285. package/esm2022/src/app/shared/pipes/pipes.module.mjs +285 -0
  286. package/esm2022/src/app/shared/pipes/property.pipes.mjs +135 -0
  287. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +179 -0
  288. package/esm2022/src/app/shared/pipes/string.pipes.mjs +183 -0
  289. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  290. package/esm2022/src/app/shared/pipes/types.pipes.mjs +74 -0
  291. package/esm2022/src/app/shared/pipes/url.pipes.mjs +35 -0
  292. package/esm2022/src/app/shared/platforms.mjs +81 -0
  293. package/esm2022/src/app/shared/print/print.service.mjs +305 -0
  294. package/esm2022/src/app/shared/regexps.mjs +96 -0
  295. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +217 -0
  296. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +19 -0
  297. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +2 -0
  298. package/esm2022/src/app/shared/services/entity-service.class.mjs +10 -0
  299. package/esm2022/src/app/shared/services/job.utils.mjs +92 -0
  300. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +353 -0
  301. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  302. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +118 -0
  303. package/esm2022/src/app/shared/services/startable-service.class.mjs +107 -0
  304. package/esm2022/src/app/shared/services/translate-context.service.mjs +107 -0
  305. package/esm2022/src/app/shared/services/validator-service.class.mjs +2 -0
  306. package/esm2022/src/app/shared/services.mjs +85 -0
  307. package/esm2022/src/app/shared/shared-routing.module.mjs +72 -0
  308. package/esm2022/src/app/shared/shared.module.mjs +229 -0
  309. package/esm2022/src/app/shared/shared.testing.module.mjs +108 -0
  310. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +279 -0
  311. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +42 -0
  312. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +27 -0
  313. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +25 -0
  314. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  315. package/esm2022/src/app/shared/storage/storage.utils.mjs +13 -0
  316. package/esm2022/src/app/shared/testing/maskito.test.mjs +41 -0
  317. package/esm2022/src/app/shared/testing/observable.test.mjs +94 -0
  318. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  319. package/esm2022/src/app/shared/toast/toast.testing.mjs +54 -0
  320. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +31 -0
  321. package/esm2022/src/app/shared/toast/toasts.mjs +134 -0
  322. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +62 -0
  323. package/esm2022/src/app/shared/toolbar/toolbar.mjs +267 -0
  324. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +26 -0
  325. package/esm2022/src/app/shared/types.mjs +2 -0
  326. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  327. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +30 -0
  328. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +109 -0
  329. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +216 -0
  330. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +26 -0
  331. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +115 -0
  332. package/esm2022/src/app/shared/validator/validators.mjs +621 -0
  333. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  334. package/esm2022/src/app/social/config/social.config.mjs +9 -0
  335. package/esm2022/src/app/social/feed/discourse/discourse-feed.service.mjs +179 -0
  336. package/esm2022/src/app/social/feed/discourse/discourse.model.mjs +2 -0
  337. package/esm2022/src/app/social/feed/discourse/discourse.utils.mjs +168 -0
  338. package/esm2022/src/app/social/feed/feed.component.mjs +121 -0
  339. package/esm2022/src/app/social/feed/feed.directive.mjs +151 -0
  340. package/esm2022/src/app/social/feed/feed.model.mjs +68 -0
  341. package/esm2022/src/app/social/feed/feed.module.mjs +22 -0
  342. package/esm2022/src/app/social/feed/feed.service.mjs +3 -0
  343. package/esm2022/src/app/social/job/job.module.mjs +23 -0
  344. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  345. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +235 -0
  346. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +47 -0
  347. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  348. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +91 -0
  349. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +38 -0
  350. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +34 -0
  351. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +22 -0
  352. package/esm2022/src/app/social/message/message.form.mjs +141 -0
  353. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  354. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  355. package/esm2022/src/app/social/message/message.module.mjs +22 -0
  356. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  357. package/esm2022/src/app/social/social.errors.mjs +10 -0
  358. package/esm2022/src/app/social/social.module.mjs +22 -0
  359. package/esm2022/src/app/social/social.testing.module.mjs +40 -0
  360. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +187 -0
  361. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +277 -0
  362. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +81 -0
  363. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +273 -0
  364. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  365. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +22 -0
  366. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +128 -0
  367. package/esm2022/src/app/social/user-event/user-event.model.mjs +2 -0
  368. package/esm2022/src/app/social/user-event/user-event.module.mjs +24 -0
  369. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  370. package/esm2022/src/environments/environment.class.mjs +66 -0
  371. package/esm2022/src/environments/environment.loader.mjs +77 -0
  372. package/esm2022/src/environments/environment.mjs +118 -0
  373. package/esm2022/sumaris-net.ngx-components.mjs +5 -0
  374. package/fesm2022/sumaris-net.ngx-components.mjs +49764 -0
  375. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  376. package/index.d.ts +5 -0
  377. package/package.json +19 -133
  378. package/public_api.d.ts +354 -0
  379. package/src/app/admin/admin-routing.module.d.ts +9 -0
  380. package/src/app/admin/admin.module.d.ts +10 -0
  381. package/src/app/admin/services/filter/person.filter.d.ts +22 -0
  382. package/src/app/admin/services/person.service.d.ts +37 -0
  383. package/src/app/admin/services/validator/person.validator.d.ts +23 -0
  384. package/src/app/admin/users/users.d.ts +61 -0
  385. package/src/app/admin/users/users.module.d.ts +14 -0
  386. package/src/app/core/about/about.modal.d.ts +32 -0
  387. package/src/app/core/about/about.module.d.ts +11 -0
  388. package/src/app/core/account/account.module.d.ts +18 -0
  389. package/src/app/core/account/account.page.d.ts +83 -0
  390. package/src/app/core/account/new-token.form.d.ts +29 -0
  391. package/src/app/core/account/new-token.modal.d.ts +29 -0
  392. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  393. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  394. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  395. package/src/app/core/account/token.table.d.ts +27 -0
  396. package/src/app/core/auth/auth.form.d.ts +38 -0
  397. package/src/app/core/auth/auth.modal.d.ts +24 -0
  398. package/src/app/core/auth/auth.module.d.ts +13 -0
  399. package/src/app/core/auth/reset-password.modal.d.ts +29 -0
  400. package/src/app/core/core.module.d.ts +28 -0
  401. package/src/app/core/core.testing.module.d.ts +15 -0
  402. package/src/app/core/form/array/form-array.d.ts +137 -0
  403. package/src/app/core/form/array/testing/form-array-test.module.d.ts +12 -0
  404. package/src/app/core/form/array/testing/form-array.test.d.ts +26 -0
  405. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +37 -0
  406. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  407. package/src/app/core/form/entity/editor.class.d.ts +84 -0
  408. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +126 -0
  409. package/src/app/core/form/entity/entity-editor.class.d.ts +204 -0
  410. package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
  411. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  412. package/src/app/core/form/entity/tab-editor.class.d.ts +66 -0
  413. package/src/app/core/form/form-container.class.d.ts +127 -0
  414. package/src/app/core/form/form.class.d.ts +144 -0
  415. package/src/app/core/form/form.module.d.ts +14 -0
  416. package/src/app/core/form/form.utils.d.ts +287 -0
  417. package/src/app/core/form/list/list.form.d.ts +81 -0
  418. package/src/app/core/form/list/list.module.d.ts +9 -0
  419. package/src/app/core/form/properties/properties.form.d.ts +92 -0
  420. package/src/app/core/form/properties/properties.module.d.ts +11 -0
  421. package/src/app/core/form/properties/properties.table.d.ts +72 -0
  422. package/src/app/core/form/properties/properties.utils.d.ts +59 -0
  423. package/src/app/core/form/properties/property.validator.d.ts +27 -0
  424. package/src/app/core/form/properties/testing/properties-form.test.d.ts +22 -0
  425. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  426. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +16 -0
  427. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
  428. package/src/app/core/form/text-popover/text-popover.component.d.ts +80 -0
  429. package/src/app/core/form/text-popover/text-popover.module.d.ts +9 -0
  430. package/src/app/core/form/username/username.form.d.ts +19 -0
  431. package/src/app/core/form/username/username.module.d.ts +9 -0
  432. package/src/app/core/graphql/graphql.module.d.ts +7 -0
  433. package/src/app/core/graphql/graphql.service.d.ts +142 -0
  434. package/src/app/core/graphql/graphql.utils.d.ts +47 -0
  435. package/src/app/core/home/home.d.ts +117 -0
  436. package/src/app/core/home/home.module.d.ts +16 -0
  437. package/src/app/core/icon/icon.component.d.ts +13 -0
  438. package/src/app/core/icon/icon.module.d.ts +9 -0
  439. package/src/app/core/install/install-upgrade-card.component.d.ts +63 -0
  440. package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
  441. package/src/app/core/menu/menu.component.d.ts +66 -0
  442. package/src/app/core/menu/menu.model.d.ts +144 -0
  443. package/src/app/core/menu/menu.module.d.ts +12 -0
  444. package/src/app/core/menu/menu.service.d.ts +93 -0
  445. package/src/app/core/menu/sub-menu-tab.directive.d.ts +29 -0
  446. package/src/app/core/menu/testing/menu-other.testing.d.ts +15 -0
  447. package/src/app/core/menu/testing/menu.testing.d.ts +51 -0
  448. package/src/app/core/menu/testing/menu.testing.module.d.ts +12 -0
  449. package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
  450. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  451. package/src/app/core/peer/select-peer.modal.d.ts +101 -0
  452. package/src/app/core/peer/select-peer.module.d.ts +12 -0
  453. package/src/app/core/register/register-confirm.page.d.ts +24 -0
  454. package/src/app/core/register/register.form.d.ts +49 -0
  455. package/src/app/core/register/register.modal.d.ts +14 -0
  456. package/src/app/core/register/register.module.d.ts +12 -0
  457. package/src/app/core/services/account.service.d.ts +207 -0
  458. package/src/app/core/services/auth-guard.service.d.ts +17 -0
  459. package/src/app/core/services/base-entity-service.class.d.ts +135 -0
  460. package/src/app/core/services/base-graphql-service.class.d.ts +77 -0
  461. package/src/app/core/services/base58.d.ts +7 -0
  462. package/src/app/core/services/config/core.config.d.ts +46 -0
  463. package/src/app/core/services/config.service.d.ts +63 -0
  464. package/src/app/core/services/crypto.service.d.ts +44 -0
  465. package/src/app/core/services/errors.d.ts +65 -0
  466. package/src/app/core/services/local-settings.service.d.ts +100 -0
  467. package/src/app/core/services/model/account.model.d.ts +56 -0
  468. package/src/app/core/services/model/config.model.d.ts +36 -0
  469. package/src/app/core/services/model/department.model.d.ts +11 -0
  470. package/src/app/core/services/model/entity.decorators.d.ts +17 -0
  471. package/src/app/core/services/model/entity.model.d.ts +133 -0
  472. package/src/app/core/services/model/filter.model.d.ts +37 -0
  473. package/src/app/core/services/model/history.model.d.ts +20 -0
  474. package/src/app/core/services/model/model.enum.d.ts +7 -0
  475. package/src/app/core/services/model/node-feature.model.d.ts +14 -0
  476. package/src/app/core/services/model/peer.model.d.ts +35 -0
  477. package/src/app/core/services/model/person.model.d.ts +37 -0
  478. package/src/app/core/services/model/referential.model.d.ts +84 -0
  479. package/src/app/core/services/model/settings.model.d.ts +29 -0
  480. package/src/app/core/services/model/token.model.d.ts +22 -0
  481. package/src/app/core/services/model/tree-item-entity.model.d.ts +61 -0
  482. package/src/app/core/services/network.service.d.ts +160 -0
  483. package/src/app/core/services/network.types.d.ts +4 -0
  484. package/src/app/core/services/network.utils.d.ts +38 -0
  485. package/src/app/core/services/pipes/account.pipes.d.ts +15 -0
  486. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +9 -0
  487. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +11 -0
  488. package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
  489. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +13 -0
  490. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +15 -0
  491. package/src/app/core/services/platform.service.d.ts +110 -0
  492. package/src/app/core/services/storage/entities-storage.service.d.ts +108 -0
  493. package/src/app/core/services/storage/entity-store.class.d.ts +113 -0
  494. package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
  495. package/src/app/core/services/testing/referential.validator.d.ts +22 -0
  496. package/src/app/core/services/validator/account.validator.d.ts +24 -0
  497. package/src/app/core/services/validator/base.validator.class.d.ts +21 -0
  498. package/src/app/core/services/validator/local-settings.validator.d.ts +18 -0
  499. package/src/app/core/services/validator/user-settings.validator.d.ts +10 -0
  500. package/src/app/core/services/validator/user-token.validator.d.ts +13 -0
  501. package/src/app/core/settings/settings.module.d.ts +12 -0
  502. package/src/app/core/settings/settings.page.d.ts +88 -0
  503. package/src/app/core/table/async-table.class.d.ts +395 -0
  504. package/src/app/core/table/column/actions-column.component.d.ts +62 -0
  505. package/src/app/core/table/column/nav-actions-column.component.d.ts +46 -0
  506. package/src/app/core/table/column/row-field.component.d.ts +40 -0
  507. package/src/app/core/table/entities-async-table-datasource.class.d.ts +103 -0
  508. package/src/app/core/table/entities-table-datasource.class.d.ts +102 -0
  509. package/src/app/core/table/memory-table.class.d.ts +25 -0
  510. package/src/app/core/table/table-select-columns.component.d.ts +22 -0
  511. package/src/app/core/table/table.class.d.ts +400 -0
  512. package/src/app/core/table/table.model.d.ts +31 -0
  513. package/src/app/core/table/table.module.d.ts +14 -0
  514. package/src/app/core/table/table.pipes.d.ts +29 -0
  515. package/src/app/core/table/table.utils.d.ts +13 -0
  516. package/src/app/core/table/testing/table-validator.service.d.ts +17 -0
  517. package/src/app/core/table/testing/table.testing.d.ts +54 -0
  518. package/src/app/core/table/testing/table.testing.module.d.ts +14 -0
  519. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  520. package/src/app/core/table/testing/table2.testing.d.ts +48 -0
  521. package/src/app/shared/alerts.d.ts +55 -0
  522. package/src/app/shared/audio/audio.d.ts +45 -0
  523. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  524. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  525. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  526. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  527. package/src/app/shared/constants.d.ts +13 -0
  528. package/src/app/shared/dates.d.ts +61 -0
  529. package/src/app/shared/debug/debug-service.class.d.ts +5 -0
  530. package/src/app/shared/debug/debug.component.d.ts +14 -0
  531. package/src/app/shared/debug/debug.module.d.ts +12 -0
  532. package/src/app/shared/directives/autofocus.directive.d.ts +18 -0
  533. package/src/app/shared/directives/autoresize.directive.d.ts +20 -0
  534. package/src/app/shared/directives/autotitle.directive.d.ts +11 -0
  535. package/src/app/shared/directives/directives.module.d.ts +14 -0
  536. package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
  537. package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
  538. package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
  539. package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
  540. package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
  541. package/src/app/shared/directives/throttled-click.directive.d.ts +16 -0
  542. package/src/app/shared/events.d.ts +29 -0
  543. package/src/app/shared/file/csv.utils.d.ts +30 -0
  544. package/src/app/shared/file/file.service.d.ts +23 -0
  545. package/src/app/shared/file/file.utils.d.ts +20 -0
  546. package/src/app/shared/file/images.utils.d.ts +36 -0
  547. package/src/app/shared/file/json.utils.d.ts +19 -0
  548. package/src/app/shared/file/uri.utils.d.ts +8 -0
  549. package/src/app/shared/file/url.utils.d.ts +99 -0
  550. package/src/app/shared/focusable.d.ts +4 -0
  551. package/src/app/shared/form/field.component.d.ts +85 -0
  552. package/src/app/shared/form/field.model.d.ts +82 -0
  553. package/src/app/shared/form/loading-spinner.d.ts +8 -0
  554. package/src/app/shared/forms.d.ts +162 -0
  555. package/src/app/shared/functions.d.ts +206 -0
  556. package/src/app/shared/geolocation/geolocation.utils.d.ts +19 -0
  557. package/src/app/shared/gesture/gesture-config.d.ts +15 -0
  558. package/src/app/shared/gesture/hammer.utils.d.ts +16 -0
  559. package/src/app/shared/graph/colors.utils.d.ts +17 -0
  560. package/src/app/shared/graph/graph-colors.d.ts +63 -0
  561. package/src/app/shared/guard/component-dirty.guard.d.ts +14 -0
  562. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +8 -0
  563. package/src/app/shared/hotkeys/hotkeys.service.d.ts +48 -0
  564. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +11 -0
  565. package/src/app/shared/http/http.utils.d.ts +28 -0
  566. package/src/app/shared/image/gallery/image-gallery.component.d.ts +137 -0
  567. package/src/app/shared/image/gallery/image-gallery.module.d.ts +15 -0
  568. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  569. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  570. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
  571. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +13 -0
  572. package/src/app/shared/image/image.model.d.ts +7 -0
  573. package/src/app/shared/image/image.module.d.ts +8 -0
  574. package/src/app/shared/image/image.service.d.ts +36 -0
  575. package/src/app/shared/inputs.d.ts +36 -0
  576. package/src/app/shared/interceptors/progess.interceptor.d.ts +8 -0
  577. package/src/app/shared/logging/log-level.model.d.ts +38 -0
  578. package/src/app/shared/logging/logger.model.d.ts +68 -0
  579. package/src/app/shared/logging/logging-service.class.d.ts +39 -0
  580. package/src/app/shared/logging/logging-service.config.d.ts +25 -0
  581. package/src/app/shared/logging/logging-service.module.d.ts +9 -0
  582. package/src/app/shared/markdown/markdown.component.d.ts +86 -0
  583. package/src/app/shared/markdown/markdown.directive.d.ts +13 -0
  584. package/src/app/shared/markdown/markdown.modal.d.ts +49 -0
  585. package/src/app/shared/markdown/markdown.module.d.ts +17 -0
  586. package/src/app/shared/markdown/markdown.service.d.ts +37 -0
  587. package/src/app/shared/markdown/markdown.utils.d.ts +26 -0
  588. package/src/app/shared/markdown/testing/markdown.test.d.ts +18 -0
  589. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +12 -0
  590. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +74 -0
  591. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +211 -0
  592. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +22 -0
  593. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +5 -0
  594. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +48 -0
  595. package/src/app/shared/material/badge/badge.directive.d.ts +43 -0
  596. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  597. package/src/app/shared/material/badge/badge.test.d.ts +21 -0
  598. package/src/app/shared/material/boolean/boolean.module.d.ts +20 -0
  599. package/src/app/shared/material/boolean/material.boolean.d.ts +93 -0
  600. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +26 -0
  601. package/src/app/shared/material/chips/chips.module.d.ts +21 -0
  602. package/src/app/shared/material/chips/material.chips.d.ts +164 -0
  603. package/src/app/shared/material/chips/testing/chips.test.d.ts +32 -0
  604. package/src/app/shared/material/datetime/datetime.module.d.ts +24 -0
  605. package/src/app/shared/material/datetime/material.date.d.ts +90 -0
  606. package/src/app/shared/material/datetime/material.dateshort.d.ts +89 -0
  607. package/src/app/shared/material/datetime/material.datetime.d.ts +116 -0
  608. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +37 -0
  609. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +32 -0
  610. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +31 -0
  611. package/src/app/shared/material/duration/duration.module.d.ts +18 -0
  612. package/src/app/shared/material/duration/duration.utils.d.ts +2 -0
  613. package/src/app/shared/material/duration/material.duration.d.ts +64 -0
  614. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +23 -0
  615. package/src/app/shared/material/latlong/latlong.utils.d.ts +59 -0
  616. package/src/app/shared/material/latlong/material.latlong-input.d.ts +85 -0
  617. package/src/app/shared/material/latlong/material.latlong.d.ts +90 -0
  618. package/src/app/shared/material/latlong/material.latlong.module.d.ts +21 -0
  619. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +28 -0
  620. package/src/app/shared/material/material.animations.d.ts +8 -0
  621. package/src/app/shared/material/material.config.d.ts +3 -0
  622. package/src/app/shared/material/material.module.d.ts +45 -0
  623. package/src/app/shared/material/material.testing.module.d.ts +32 -0
  624. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +12 -0
  625. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +10 -0
  626. package/src/app/shared/material/swipe/material.swipe.d.ts +89 -0
  627. package/src/app/shared/material/swipe/swipe.module.d.ts +16 -0
  628. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +22 -0
  629. package/src/app/shared/material/test/test-component.d.ts +75 -0
  630. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  631. package/src/app/shared/material/text/testing/text-form.testing.d.ts +19 -0
  632. package/src/app/shared/material/text/text-form.component.d.ts +66 -0
  633. package/src/app/shared/material/text/text-form.module.d.ts +16 -0
  634. package/src/app/shared/modules.d.ts +9 -0
  635. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +62 -0
  636. package/src/app/shared/named-filter/named-filter.model.d.ts +32 -0
  637. package/src/app/shared/named-filter/named-filter.module.d.ts +13 -0
  638. package/src/app/shared/named-filter/named-filter.service.d.ts +32 -0
  639. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +34 -0
  640. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +10 -0
  641. package/src/app/shared/observables.d.ts +30 -0
  642. package/src/app/shared/pipes/arrays.pipe.d.ts +82 -0
  643. package/src/app/shared/pipes/badge.pipes.d.ts +7 -0
  644. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  645. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +25 -0
  646. package/src/app/shared/pipes/date-format.pipe.d.ts +35 -0
  647. package/src/app/shared/pipes/date-from-now.pipe.d.ts +12 -0
  648. package/src/app/shared/pipes/dates.pipe.d.ts +10 -0
  649. package/src/app/shared/pipes/display-with.pipe.d.ts +8 -0
  650. package/src/app/shared/pipes/duration.pipe.d.ts +23 -0
  651. package/src/app/shared/pipes/file-size.pipe.d.ts +30 -0
  652. package/src/app/shared/pipes/form.pipes.d.ts +69 -0
  653. package/src/app/shared/pipes/highlight.pipe.d.ts +11 -0
  654. package/src/app/shared/pipes/html.pipes.d.ts +22 -0
  655. package/src/app/shared/pipes/latlong-format.pipe.d.ts +20 -0
  656. package/src/app/shared/pipes/maps.pipe.d.ts +23 -0
  657. package/src/app/shared/pipes/maskito.pipe.d.ts +14 -0
  658. package/src/app/shared/pipes/math.pipes.d.ts +26 -0
  659. package/src/app/shared/pipes/ng-init.pipe.d.ts +8 -0
  660. package/src/app/shared/pipes/number-format.pipe.d.ts +9 -0
  661. package/src/app/shared/pipes/observable.pipes.d.ts +25 -0
  662. package/src/app/shared/pipes/pipes.module.d.ts +35 -0
  663. package/src/app/shared/pipes/property.pipes.d.ts +41 -0
  664. package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
  665. package/src/app/shared/pipes/string.pipes.d.ts +68 -0
  666. package/src/app/shared/pipes/translate-context.pipe.d.ts +17 -0
  667. package/src/app/shared/pipes/types.pipes.d.ts +30 -0
  668. package/src/app/shared/pipes/url.pipes.d.ts +27 -0
  669. package/src/app/shared/platforms.d.ts +16 -0
  670. package/src/app/shared/print/print.service.d.ts +94 -0
  671. package/src/app/shared/regexps.d.ts +32 -0
  672. package/src/app/shared/rx-state/rx-state.decorators.d.ts +43 -0
  673. package/src/app/shared/rx-state/rx-state.module.d.ts +10 -0
  674. package/src/app/shared/rx-state/rx-state.types.d.ts +4 -0
  675. package/src/app/shared/services/entity-service.class.d.ts +75 -0
  676. package/src/app/shared/services/job.utils.d.ts +20 -0
  677. package/src/app/shared/services/memory-entity-service.class.d.ts +79 -0
  678. package/src/app/shared/services/progress-bar.service.d.ts +20 -0
  679. package/src/app/shared/services/startable-observable-service.class.d.ts +36 -0
  680. package/src/app/shared/services/startable-service.class.d.ts +37 -0
  681. package/src/app/shared/services/translate-context.service.d.ts +29 -0
  682. package/src/app/shared/services/validator-service.class.d.ts +11 -0
  683. package/src/app/shared/services.d.ts +17 -0
  684. package/src/app/shared/shared-routing.module.d.ts +23 -0
  685. package/src/app/shared/shared.module.d.ts +33 -0
  686. package/src/app/shared/shared.testing.module.d.ts +20 -0
  687. package/src/app/shared/storage/storage-explorer.component.d.ts +59 -0
  688. package/src/app/shared/storage/storage-explorer.module.d.ts +13 -0
  689. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +9 -0
  690. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +10 -0
  691. package/src/app/shared/storage/storage.service.d.ts +22 -0
  692. package/src/app/shared/storage/storage.utils.d.ts +19 -0
  693. package/src/app/shared/testing/maskito.test.d.ts +10 -0
  694. package/src/app/shared/testing/observable.test.d.ts +25 -0
  695. package/src/app/shared/testing/tests.page.d.ts +20 -0
  696. package/src/app/shared/toast/toast.testing.d.ts +15 -0
  697. package/src/app/shared/toast/toast.testing.module.d.ts +12 -0
  698. package/src/app/shared/toast/toasts.d.ts +16 -0
  699. package/src/app/shared/toolbar/modal-toolbar.d.ts +21 -0
  700. package/src/app/shared/toolbar/toolbar.d.ts +70 -0
  701. package/src/app/shared/toolbar/toolbar.module.d.ts +16 -0
  702. package/src/app/shared/types.d.ts +36 -0
  703. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +21 -0
  704. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
  705. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +41 -0
  706. package/src/app/shared/upload-file/upload-file.component.d.ts +50 -0
  707. package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
  708. package/src/app/shared/validator/form-error-adapter.class.d.ts +33 -0
  709. package/src/app/shared/validator/validators.d.ts +139 -0
  710. package/src/app/shared/version/versions.d.ts +26 -0
  711. package/src/app/social/config/social.config.d.ts +4 -0
  712. package/src/app/social/feed/discourse/discourse-feed.service.d.ts +55 -0
  713. package/src/app/social/feed/discourse/discourse.model.d.ts +7 -0
  714. package/src/app/social/feed/discourse/discourse.utils.d.ts +44 -0
  715. package/src/app/social/feed/feed.component.d.ts +39 -0
  716. package/src/app/social/feed/feed.directive.d.ts +32 -0
  717. package/src/app/social/feed/feed.model.d.ts +69 -0
  718. package/src/app/social/feed/feed.module.d.ts +11 -0
  719. package/src/app/social/feed/feed.service.d.ts +13 -0
  720. package/src/app/social/job/job.module.d.ts +12 -0
  721. package/src/app/social/job/progression/job-progression.component.d.ts +23 -0
  722. package/src/app/social/job/progression/job-progression.icon.d.ts +62 -0
  723. package/src/app/social/job/progression/job-progression.list.d.ts +19 -0
  724. package/src/app/social/job/progression/job-progression.model.d.ts +10 -0
  725. package/src/app/social/job/progression/job-progression.service.d.ts +33 -0
  726. package/src/app/social/job/testing/job-progression.testing.d.ts +13 -0
  727. package/src/app/social/job/testing/job-progression.testing.service.d.ts +9 -0
  728. package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
  729. package/src/app/social/message/message.form.d.ts +36 -0
  730. package/src/app/social/message/message.modal.d.ts +43 -0
  731. package/src/app/social/message/message.model.d.ts +33 -0
  732. package/src/app/social/message/message.module.d.ts +12 -0
  733. package/src/app/social/message/message.service.d.ts +32 -0
  734. package/src/app/social/social.errors.d.ts +9 -0
  735. package/src/app/social/social.module.d.ts +20 -0
  736. package/src/app/social/social.testing.module.d.ts +13 -0
  737. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +46 -0
  738. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +75 -0
  739. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +36 -0
  740. package/src/app/social/user-event/testing/user-event.testing.d.ts +44 -0
  741. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +42 -0
  742. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
  743. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +42 -0
  744. package/src/app/social/user-event/user-event.model.d.ts +44 -0
  745. package/src/app/social/user-event/user-event.module.d.ts +14 -0
  746. package/src/app/social/user-event/user-event.service.d.ts +124 -0
  747. package/src/environments/environment.class.d.ts +83 -0
  748. package/src/environments/environment.d.ts +2 -0
  749. package/src/environments/environment.loader.d.ts +24 -0
  750. package/.editorconfig +0 -24
  751. package/.eslintrc.json +0 -95
  752. package/.gitattribute +0 -1
  753. package/.github/CONTRIBUTING.md +0 -10
  754. package/.github/ISSUE_TEMPLATE.md +0 -6
  755. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  756. package/.github/github_disclaimer.md +0 -14
  757. package/.gitlab-ci.yml +0 -46
  758. package/.graphqlconfig +0 -15
  759. package/.prettierignore +0 -9
  760. package/.prettierrc.json +0 -17
  761. package/angular.json +0 -239
  762. package/capacitor.config.ts +0 -49
  763. package/graphql.config.yml +0 -13
  764. package/ionic.config.json +0 -7
  765. package/karma.conf.js +0 -38
  766. package/ng-package.json +0 -21
  767. package/public_api.ts +0 -436
  768. package/resources/README.md +0 -7
  769. package/resources/icon/TODO.md +0 -11
  770. package/resources/icon.png +0 -0
  771. package/resources/icon.png.md5 +0 -1
  772. package/resources/icon.xcf +0 -0
  773. package/resources/ios/icon/icon-1024.png +0 -0
  774. package/resources/ios/icon/icon-108@2x.png +0 -0
  775. package/resources/ios/icon/icon-20.png +0 -0
  776. package/resources/ios/icon/icon-20@2x.png +0 -0
  777. package/resources/ios/icon/icon-20@3x.png +0 -0
  778. package/resources/ios/icon/icon-24@2x.png +0 -0
  779. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  780. package/resources/ios/icon/icon-29.png +0 -0
  781. package/resources/ios/icon/icon-29@2x.png +0 -0
  782. package/resources/ios/icon/icon-29@3x.png +0 -0
  783. package/resources/ios/icon/icon-40.png +0 -0
  784. package/resources/ios/icon/icon-40@2x.png +0 -0
  785. package/resources/ios/icon/icon-40@3x.png +0 -0
  786. package/resources/ios/icon/icon-44@2x.png +0 -0
  787. package/resources/ios/icon/icon-50.png +0 -0
  788. package/resources/ios/icon/icon-50@2x.png +0 -0
  789. package/resources/ios/icon/icon-60.png +0 -0
  790. package/resources/ios/icon/icon-60@2x.png +0 -0
  791. package/resources/ios/icon/icon-60@3x.png +0 -0
  792. package/resources/ios/icon/icon-72.png +0 -0
  793. package/resources/ios/icon/icon-72@2x.png +0 -0
  794. package/resources/ios/icon/icon-76.png +0 -0
  795. package/resources/ios/icon/icon-76@2x.png +0 -0
  796. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  797. package/resources/ios/icon/icon-86@2x.png +0 -0
  798. package/resources/ios/icon/icon-98@2x.png +0 -0
  799. package/resources/ios/icon/icon-small.png +0 -0
  800. package/resources/ios/icon/icon-small@2x.png +0 -0
  801. package/resources/ios/icon/icon-small@3x.png +0 -0
  802. package/resources/ios/icon/icon.png +0 -0
  803. package/resources/ios/icon/icon@2x.png +0 -0
  804. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  805. package/resources/ios/splash/Default-2436h.png +0 -0
  806. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  807. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  808. package/resources/ios/splash/Default-667h.png +0 -0
  809. package/resources/ios/splash/Default-736h.png +0 -0
  810. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  811. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  812. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  813. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  814. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  815. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  816. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  817. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  818. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  819. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  820. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  821. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  822. package/resources/ios/splash/Default~iphone.png +0 -0
  823. package/resources/splash.png +0 -0
  824. package/resources/splash.png.md5 +0 -1
  825. package/scripts/build-android.sh +0 -18
  826. package/scripts/docker-start.sh +0 -6
  827. package/scripts/emulate-android.sh +0 -17
  828. package/scripts/env-android.sh +0 -83
  829. package/scripts/env-clean.sh +0 -23
  830. package/scripts/env-global.sh +0 -154
  831. package/scripts/install-android-sdk-tools.sh +0 -73
  832. package/scripts/ionic-update.sh +0 -24
  833. package/scripts/node/build-i18n.js +0 -37
  834. package/scripts/node/playground.ts +0 -9
  835. package/scripts/node/resources.js +0 -108
  836. package/scripts/release.sh +0 -162
  837. package/scripts/run-android.sh +0 -59
  838. package/scripts/test.sh +0 -19
  839. package/src/app/admin/admin-routing.module.ts +0 -26
  840. package/src/app/admin/admin.module.ts +0 -20
  841. package/src/app/admin/services/filter/person.filter.ts +0 -86
  842. package/src/app/admin/services/person.service.ts +0 -244
  843. package/src/app/admin/services/validator/person.validator.ts +0 -86
  844. package/src/app/admin/users/users.html +0 -613
  845. package/src/app/admin/users/users.module.ts +0 -32
  846. package/src/app/admin/users/users.scss +0 -80
  847. package/src/app/admin/users/users.ts +0 -387
  848. package/src/app/app-routing.module.ts +0 -165
  849. package/src/app/app.component.html +0 -18
  850. package/src/app/app.component.scss +0 -4
  851. package/src/app/app.component.ts +0 -257
  852. package/src/app/app.module.ts +0 -366
  853. package/src/app/core/about/about.modal.html +0 -145
  854. package/src/app/core/about/about.modal.scss +0 -22
  855. package/src/app/core/about/about.modal.ts +0 -69
  856. package/src/app/core/about/about.module.ts +0 -14
  857. package/src/app/core/account/account.module.ts +0 -43
  858. package/src/app/core/account/account.page.html +0 -329
  859. package/src/app/core/account/account.page.scss +0 -20
  860. package/src/app/core/account/account.page.ts +0 -389
  861. package/src/app/core/account/new-token.form.html +0 -90
  862. package/src/app/core/account/new-token.form.ts +0 -99
  863. package/src/app/core/account/new-token.modal.html +0 -52
  864. package/src/app/core/account/new-token.modal.ts +0 -68
  865. package/src/app/core/account/password/change-password.form.html +0 -62
  866. package/src/app/core/account/password/change-password.form.scss +0 -0
  867. package/src/app/core/account/password/change-password.form.ts +0 -58
  868. package/src/app/core/account/password/change-password.module.ts +0 -14
  869. package/src/app/core/account/password/change-password.page.html +0 -41
  870. package/src/app/core/account/password/change-password.page.scss +0 -49
  871. package/src/app/core/account/password/change-password.page.ts +0 -158
  872. package/src/app/core/account/token.table.html +0 -160
  873. package/src/app/core/account/token.table.scss +0 -7
  874. package/src/app/core/account/token.table.ts +0 -160
  875. package/src/app/core/auth/auth.form.html +0 -108
  876. package/src/app/core/auth/auth.form.scss +0 -0
  877. package/src/app/core/auth/auth.form.ts +0 -165
  878. package/src/app/core/auth/auth.modal.html +0 -50
  879. package/src/app/core/auth/auth.modal.scss +0 -0
  880. package/src/app/core/auth/auth.modal.ts +0 -78
  881. package/src/app/core/auth/auth.module.ts +0 -35
  882. package/src/app/core/auth/reset-password.modal.html +0 -59
  883. package/src/app/core/auth/reset-password.modal.ts +0 -83
  884. package/src/app/core/core.module.ts +0 -72
  885. package/src/app/core/core.testing.module.ts +0 -80
  886. package/src/app/core/form/array/form-array.ts +0 -409
  887. package/src/app/core/form/array/testing/form-array-test.module.ts +0 -15
  888. package/src/app/core/form/array/testing/form-array.test.html +0 -196
  889. package/src/app/core/form/array/testing/form-array.test.ts +0 -119
  890. package/src/app/core/form/buttons/form-buttons-bar.component.html +0 -82
  891. package/src/app/core/form/buttons/form-buttons-bar.component.scss +0 -19
  892. package/src/app/core/form/buttons/form-buttons-bar.component.ts +0 -89
  893. package/src/app/core/form/buttons/form-buttons-bar.module.ts +0 -20
  894. package/src/app/core/form/entity/editor.class.ts +0 -295
  895. package/src/app/core/form/entity/entity-editor-modal.class.ts +0 -494
  896. package/src/app/core/form/entity/entity-editor.class.ts +0 -894
  897. package/src/app/core/form/entity/entity-metadata.component.html +0 -57
  898. package/src/app/core/form/entity/entity-metadata.component.scss +0 -40
  899. package/src/app/core/form/entity/entity-metadata.component.ts +0 -18
  900. package/src/app/core/form/entity/entity.module.ts +0 -20
  901. package/src/app/core/form/entity/tab-editor.class.ts +0 -224
  902. package/src/app/core/form/form-container.class.ts +0 -381
  903. package/src/app/core/form/form.class.ts +0 -377
  904. package/src/app/core/form/form.module.ts +0 -38
  905. package/src/app/core/form/form.utils.ts +0 -336
  906. package/src/app/core/form/list/list.form.html +0 -68
  907. package/src/app/core/form/list/list.form.scss +0 -40
  908. package/src/app/core/form/list/list.form.ts +0 -266
  909. package/src/app/core/form/list/list.module.ts +0 -20
  910. package/src/app/core/form/properties/properties.form.html +0 -160
  911. package/src/app/core/form/properties/properties.form.scss +0 -21
  912. package/src/app/core/form/properties/properties.form.ts +0 -331
  913. package/src/app/core/form/properties/properties.module.ts +0 -24
  914. package/src/app/core/form/properties/properties.table.html +0 -228
  915. package/src/app/core/form/properties/properties.table.scss +0 -0
  916. package/src/app/core/form/properties/properties.table.ts +0 -275
  917. package/src/app/core/form/properties/properties.utils.ts +0 -391
  918. package/src/app/core/form/properties/property.validator.ts +0 -82
  919. package/src/app/core/form/properties/testing/properties-form.test.html +0 -23
  920. package/src/app/core/form/properties/testing/properties-form.test.ts +0 -109
  921. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +0 -14
  922. package/src/app/core/form/text-popover/testing/text-popover.testing.html +0 -50
  923. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +0 -21
  924. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +0 -76
  925. package/src/app/core/form/text-popover/text-popover.component.html +0 -89
  926. package/src/app/core/form/text-popover/text-popover.component.scss +0 -7
  927. package/src/app/core/form/text-popover/text-popover.component.ts +0 -176
  928. package/src/app/core/form/text-popover/text-popover.module.ts +0 -19
  929. package/src/app/core/form/username/username.form.html +0 -27
  930. package/src/app/core/form/username/username.form.ts +0 -44
  931. package/src/app/core/form/username/username.module.ts +0 -12
  932. package/src/app/core/graphql/graphql.module.ts +0 -7
  933. package/src/app/core/graphql/graphql.service.ts +0 -962
  934. package/src/app/core/graphql/graphql.utils.ts +0 -166
  935. package/src/app/core/home/home.html +0 -327
  936. package/src/app/core/home/home.module.ts +0 -31
  937. package/src/app/core/home/home.scss +0 -300
  938. package/src/app/core/home/home.ts +0 -453
  939. package/src/app/core/icon/icon.component.html +0 -19
  940. package/src/app/core/icon/icon.component.ts +0 -22
  941. package/src/app/core/icon/icon.module.ts +0 -13
  942. package/src/app/core/install/install-upgrade-card.component.html +0 -144
  943. package/src/app/core/install/install-upgrade-card.component.scss +0 -3
  944. package/src/app/core/install/install-upgrade-card.component.ts +0 -445
  945. package/src/app/core/install/install-upgrade-card.module.ts +0 -18
  946. package/src/app/core/menu/menu.component.html +0 -219
  947. package/src/app/core/menu/menu.component.scss +0 -304
  948. package/src/app/core/menu/menu.component.ts +0 -251
  949. package/src/app/core/menu/menu.filter.ts +0 -28
  950. package/src/app/core/menu/menu.model.ts +0 -356
  951. package/src/app/core/menu/menu.module.ts +0 -27
  952. package/src/app/core/menu/menu.service.ts +0 -727
  953. package/src/app/core/menu/sub-menu-tab.directive.ts +0 -99
  954. package/src/app/core/menu/testing/menu-other.testing.ts +0 -57
  955. package/src/app/core/menu/testing/menu.testing.html +0 -143
  956. package/src/app/core/menu/testing/menu.testing.module.ts +0 -52
  957. package/src/app/core/menu/testing/menu.testing.scss +0 -5
  958. package/src/app/core/menu/testing/menu.testing.ts +0 -175
  959. package/src/app/core/offline/update-offline-mode-card.component.html +0 -39
  960. package/src/app/core/offline/update-offline-mode-card.component.scss +0 -3
  961. package/src/app/core/offline/update-offline-mode-card.component.ts +0 -23
  962. package/src/app/core/offline/update-offline-mode-card.module.ts +0 -20
  963. package/src/app/core/peer/select-peer.modal.html +0 -317
  964. package/src/app/core/peer/select-peer.modal.scss +0 -41
  965. package/src/app/core/peer/select-peer.modal.ts +0 -366
  966. package/src/app/core/peer/select-peer.module.ts +0 -23
  967. package/src/app/core/register/register-confirm.page.html +0 -51
  968. package/src/app/core/register/register-confirm.page.scss +0 -56
  969. package/src/app/core/register/register-confirm.page.ts +0 -90
  970. package/src/app/core/register/register.form.html +0 -143
  971. package/src/app/core/register/register.form.scss +0 -10
  972. package/src/app/core/register/register.form.ts +0 -218
  973. package/src/app/core/register/register.modal.html +0 -66
  974. package/src/app/core/register/register.modal.ts +0 -50
  975. package/src/app/core/register/register.module.ts +0 -15
  976. package/src/app/core/services/account.service.ts +0 -1567
  977. package/src/app/core/services/auth-guard.service.ts +0 -70
  978. package/src/app/core/services/base-entity-service.class.ts +0 -659
  979. package/src/app/core/services/base-graphql-service.class.ts +0 -319
  980. package/src/app/core/services/base58.ts +0 -90
  981. package/src/app/core/services/config/core.config.ts +0 -263
  982. package/src/app/core/services/config.service.ts +0 -425
  983. package/src/app/core/services/crypto.service.ts +0 -126
  984. package/src/app/core/services/errors.ts +0 -80
  985. package/src/app/core/services/local-settings.service.spec.ts +0 -39
  986. package/src/app/core/services/local-settings.service.ts +0 -610
  987. package/src/app/core/services/model/account.model.ts +0 -188
  988. package/src/app/core/services/model/config.model.ts +0 -116
  989. package/src/app/core/services/model/department.model.ts +0 -34
  990. package/src/app/core/services/model/entity.decorators.ts +0 -110
  991. package/src/app/core/services/model/entity.model.ts +0 -409
  992. package/src/app/core/services/model/filter.model.ts +0 -127
  993. package/src/app/core/services/model/history.model.ts +0 -25
  994. package/src/app/core/services/model/model.enum.ts +0 -10
  995. package/src/app/core/services/model/node-feature.model.ts +0 -31
  996. package/src/app/core/services/model/peer.model.ts +0 -119
  997. package/src/app/core/services/model/person.model.ts +0 -122
  998. package/src/app/core/services/model/referential.model.ts +0 -253
  999. package/src/app/core/services/model/settings.model.ts +0 -37
  1000. package/src/app/core/services/model/token.model.ts +0 -60
  1001. package/src/app/core/services/model/tree-item-entity.model.ts +0 -256
  1002. package/src/app/core/services/network.service.spec.ts +0 -47
  1003. package/src/app/core/services/network.service.ts +0 -771
  1004. package/src/app/core/services/network.types.ts +0 -7
  1005. package/src/app/core/services/network.utils.ts +0 -83
  1006. package/src/app/core/services/pipes/account.pipes.ts +0 -22
  1007. package/src/app/core/services/pipes/department-to-string.pipe.ts +0 -13
  1008. package/src/app/core/services/pipes/person-to-string.pipe.ts +0 -13
  1009. package/src/app/core/services/pipes/pipes.module.ts +0 -30
  1010. package/src/app/core/services/pipes/referential-to-string.pipe.ts +0 -18
  1011. package/src/app/core/services/pipes/usage-mode.pipes.ts +0 -23
  1012. package/src/app/core/services/platform.service.spec.ts +0 -50
  1013. package/src/app/core/services/platform.service.ts +0 -694
  1014. package/src/app/core/services/storage/entities-storage.service.ts +0 -557
  1015. package/src/app/core/services/storage/entity-store.class.ts +0 -589
  1016. package/src/app/core/services/testing/local-settings.config.ts +0 -35
  1017. package/src/app/core/services/testing/referential-filter.model.ts +0 -28
  1018. package/src/app/core/services/testing/referential.validator.ts +0 -58
  1019. package/src/app/core/services/testing/user-settings.config.ts +0 -77
  1020. package/src/app/core/services/validator/account.validator.ts +0 -50
  1021. package/src/app/core/services/validator/base.validator.class.ts +0 -51
  1022. package/src/app/core/services/validator/local-settings.validator.ts +0 -59
  1023. package/src/app/core/services/validator/user-settings.validator.ts +0 -22
  1024. package/src/app/core/services/validator/user-token.validator.ts +0 -54
  1025. package/src/app/core/settings/settings.module.ts +0 -15
  1026. package/src/app/core/settings/settings.page.html +0 -300
  1027. package/src/app/core/settings/settings.page.ts +0 -455
  1028. package/src/app/core/table/async-table.class.ts +0 -2021
  1029. package/src/app/core/table/column/actions-column.component.html +0 -219
  1030. package/src/app/core/table/column/actions-column.component.scss +0 -17
  1031. package/src/app/core/table/column/actions-column.component.ts +0 -83
  1032. package/src/app/core/table/column/nav-actions-column.component.html +0 -119
  1033. package/src/app/core/table/column/nav-actions-column.component.ts +0 -108
  1034. package/src/app/core/table/column/row-field.component.html +0 -43
  1035. package/src/app/core/table/column/row-field.component.scss +0 -0
  1036. package/src/app/core/table/column/row-field.component.ts +0 -63
  1037. package/src/app/core/table/entities-async-table-datasource.class.ts +0 -515
  1038. package/src/app/core/table/entities-table-datasource.class.ts +0 -503
  1039. package/src/app/core/table/memory-table.class.ts +0 -56
  1040. package/src/app/core/table/table-select-columns.component.html +0 -56
  1041. package/src/app/core/table/table-select-columns.component.ts +0 -49
  1042. package/src/app/core/table/table.class.ts +0 -2082
  1043. package/src/app/core/table/table.model.ts +0 -39
  1044. package/src/app/core/table/table.module.ts +0 -28
  1045. package/src/app/core/table/table.pipes.ts +0 -87
  1046. package/src/app/core/table/table.utils.ts +0 -42
  1047. package/src/app/core/table/testing/multi-table.testing.html +0 -456
  1048. package/src/app/core/table/testing/multi-table.testing.ts +0 -263
  1049. package/src/app/core/table/testing/table-validator.service.ts +0 -29
  1050. package/src/app/core/table/testing/table.testing.html +0 -556
  1051. package/src/app/core/table/testing/table.testing.module.ts +0 -16
  1052. package/src/app/core/table/testing/table.testing.scss +0 -32
  1053. package/src/app/core/table/testing/table.testing.ts +0 -329
  1054. package/src/app/core/table/testing/table2-validator.service.ts +0 -19
  1055. package/src/app/core/table/testing/table2.testing.html +0 -470
  1056. package/src/app/core/table/testing/table2.testing.scss +0 -25
  1057. package/src/app/core/table/testing/table2.testing.ts +0 -274
  1058. package/src/app/shared/alerts.ts +0 -296
  1059. package/src/app/shared/audio/audio.testing.html +0 -29
  1060. package/src/app/shared/audio/audio.testing.module.ts +0 -21
  1061. package/src/app/shared/audio/audio.testing.ts +0 -27
  1062. package/src/app/shared/audio/audio.ts +0 -273
  1063. package/src/app/shared/base64.utils.ts +0 -66
  1064. package/src/app/shared/capacitor/keyboard.ts +0 -38
  1065. package/src/app/shared/capacitor/plugins.ts +0 -12
  1066. package/src/app/shared/constants.ts +0 -19
  1067. package/src/app/shared/dates.ts +0 -206
  1068. package/src/app/shared/debug/debug-service.class.ts +0 -7
  1069. package/src/app/shared/debug/debug.component.html +0 -13
  1070. package/src/app/shared/debug/debug.component.scss +0 -21
  1071. package/src/app/shared/debug/debug.component.spec.ts +0 -24
  1072. package/src/app/shared/debug/debug.component.ts +0 -25
  1073. package/src/app/shared/debug/debug.module.ts +0 -14
  1074. package/src/app/shared/directives/autofocus.directive.ts +0 -93
  1075. package/src/app/shared/directives/autoresize.directive.ts +0 -67
  1076. package/src/app/shared/directives/autotitle.directive.ts +0 -17
  1077. package/src/app/shared/directives/directives.module.ts +0 -16
  1078. package/src/app/shared/directives/drag-and-drop.directive.ts +0 -46
  1079. package/src/app/shared/directives/ng-var.directive.ts +0 -31
  1080. package/src/app/shared/directives/resizable/resizable.component.ts +0 -48
  1081. package/src/app/shared/directives/resizable/resizable.directive.ts +0 -43
  1082. package/src/app/shared/directives/resizable/resizable.module.ts +0 -9
  1083. package/src/app/shared/directives/resizable/resizable.style.scss +0 -37
  1084. package/src/app/shared/directives/resizable/resizable.template.html +0 -6
  1085. package/src/app/shared/directives/throttled-click.directive.ts +0 -36
  1086. package/src/app/shared/events.ts +0 -93
  1087. package/src/app/shared/file/csv.utils.ts +0 -123
  1088. package/src/app/shared/file/file.service.ts +0 -129
  1089. package/src/app/shared/file/file.utils.ts +0 -142
  1090. package/src/app/shared/file/images.utils.ts +0 -214
  1091. package/src/app/shared/file/json.utils.ts +0 -82
  1092. package/src/app/shared/file/uri.utils.ts +0 -31
  1093. package/src/app/shared/file/url.utils.ts +0 -193
  1094. package/src/app/shared/focusable.ts +0 -8
  1095. package/src/app/shared/form/field.component.html +0 -380
  1096. package/src/app/shared/form/field.component.scss +0 -7
  1097. package/src/app/shared/form/field.component.ts +0 -344
  1098. package/src/app/shared/form/field.model.ts +0 -158
  1099. package/src/app/shared/form/loading-spinner.ts +0 -16
  1100. package/src/app/shared/forms.ts +0 -651
  1101. package/src/app/shared/functions.spec.ts +0 -197
  1102. package/src/app/shared/functions.ts +0 -694
  1103. package/src/app/shared/geolocation/geolocation.utils.ts +0 -105
  1104. package/src/app/shared/gesture/gesture-config.ts +0 -43
  1105. package/src/app/shared/gesture/hammer.utils.ts +0 -14
  1106. package/src/app/shared/graph/colors.utils.ts +0 -69
  1107. package/src/app/shared/graph/graph-colors.ts +0 -270
  1108. package/src/app/shared/guard/component-dirty.guard.ts +0 -67
  1109. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +0 -11
  1110. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +0 -37
  1111. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +0 -14
  1112. package/src/app/shared/hotkeys/hotkeys.service.ts +0 -165
  1113. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +0 -15
  1114. package/src/app/shared/http/http.utils.ts +0 -95
  1115. package/src/app/shared/image/gallery/image-gallery.component.html +0 -282
  1116. package/src/app/shared/image/gallery/image-gallery.component.scss +0 -218
  1117. package/src/app/shared/image/gallery/image-gallery.component.ts +0 -434
  1118. package/src/app/shared/image/gallery/image-gallery.module.ts +0 -35
  1119. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +0 -23
  1120. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +0 -99
  1121. package/src/app/shared/image/gallery/testing/gallery.testing.html +0 -27
  1122. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +0 -39
  1123. package/src/app/shared/image/gallery/testing/gallery.testing.ts +0 -34
  1124. package/src/app/shared/image/image.model.ts +0 -8
  1125. package/src/app/shared/image/image.module.ts +0 -12
  1126. package/src/app/shared/image/image.service.ts +0 -111
  1127. package/src/app/shared/image/image.testing.module.ts +0 -16
  1128. package/src/app/shared/inputs.ts +0 -330
  1129. package/src/app/shared/interceptors/progess.interceptor.ts +0 -24
  1130. package/src/app/shared/logging/log-level.model.ts +0 -53
  1131. package/src/app/shared/logging/logger.model.ts +0 -117
  1132. package/src/app/shared/logging/logging-service.class.ts +0 -131
  1133. package/src/app/shared/logging/logging-service.config.ts +0 -29
  1134. package/src/app/shared/logging/logging-service.module.ts +0 -19
  1135. package/src/app/shared/markdown/markdown.component.html +0 -55
  1136. package/src/app/shared/markdown/markdown.component.scss +0 -75
  1137. package/src/app/shared/markdown/markdown.component.ts +0 -350
  1138. package/src/app/shared/markdown/markdown.directive.ts +0 -28
  1139. package/src/app/shared/markdown/markdown.modal.html +0 -42
  1140. package/src/app/shared/markdown/markdown.modal.ts +0 -91
  1141. package/src/app/shared/markdown/markdown.module.ts +0 -65
  1142. package/src/app/shared/markdown/markdown.service.ts +0 -234
  1143. package/src/app/shared/markdown/markdown.utils.ts +0 -90
  1144. package/src/app/shared/markdown/testing/markdown.test.html +0 -50
  1145. package/src/app/shared/markdown/testing/markdown.test.ts +0 -49
  1146. package/src/app/shared/markdown/testing/markdown.testing.module.ts +0 -22
  1147. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +0 -127
  1148. package/src/app/shared/material/autocomplete/material.autocomplete.html +0 -400
  1149. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +0 -41
  1150. package/src/app/shared/material/autocomplete/material.autocomplete.scss +0 -54
  1151. package/src/app/shared/material/autocomplete/material.autocomplete.ts +0 -1375
  1152. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +0 -21
  1153. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +0 -1164
  1154. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +0 -33
  1155. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +0 -272
  1156. package/src/app/shared/material/badge/badge.directive.ts +0 -217
  1157. package/src/app/shared/material/badge/badge.module.ts +0 -12
  1158. package/src/app/shared/material/badge/badge.test.html +0 -275
  1159. package/src/app/shared/material/badge/badge.test.ts +0 -34
  1160. package/src/app/shared/material/boolean/boolean.module.ts +0 -36
  1161. package/src/app/shared/material/boolean/material.boolean.html +0 -271
  1162. package/src/app/shared/material/boolean/material.boolean.scss +0 -27
  1163. package/src/app/shared/material/boolean/material.boolean.ts +0 -343
  1164. package/src/app/shared/material/boolean/testing/boolean.test.page.html +0 -469
  1165. package/src/app/shared/material/boolean/testing/boolean.test.page.ts +0 -66
  1166. package/src/app/shared/material/chips/chips.module.ts +0 -38
  1167. package/src/app/shared/material/chips/material.chips.html +0 -233
  1168. package/src/app/shared/material/chips/material.chips.scss +0 -67
  1169. package/src/app/shared/material/chips/material.chips.ts +0 -834
  1170. package/src/app/shared/material/chips/testing/chips.test.html +0 -207
  1171. package/src/app/shared/material/chips/testing/chips.test.ts +0 -169
  1172. package/src/app/shared/material/datetime/datetime.module.ts +0 -42
  1173. package/src/app/shared/material/datetime/material.date.html +0 -186
  1174. package/src/app/shared/material/datetime/material.date.scss +0 -17
  1175. package/src/app/shared/material/datetime/material.date.ts +0 -512
  1176. package/src/app/shared/material/datetime/material.dateshort.html +0 -194
  1177. package/src/app/shared/material/datetime/material.dateshort.scss +0 -23
  1178. package/src/app/shared/material/datetime/material.dateshort.ts +0 -497
  1179. package/src/app/shared/material/datetime/material.datetime.html +0 -325
  1180. package/src/app/shared/material/datetime/material.datetime.scss +0 -87
  1181. package/src/app/shared/material/datetime/material.datetime.ts +0 -758
  1182. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +0 -794
  1183. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +0 -155
  1184. package/src/app/shared/material/datetime/testing/mat-date.test.html +0 -564
  1185. package/src/app/shared/material/datetime/testing/mat-date.test.ts +0 -145
  1186. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +0 -530
  1187. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +0 -133
  1188. package/src/app/shared/material/duration/duration.module.ts +0 -33
  1189. package/src/app/shared/material/duration/duration.utils.ts +0 -18
  1190. package/src/app/shared/material/duration/material.duration.html +0 -116
  1191. package/src/app/shared/material/duration/material.duration.scss +0 -28
  1192. package/src/app/shared/material/duration/material.duration.ts +0 -308
  1193. package/src/app/shared/material/duration/testing/mat-duration.test.html +0 -170
  1194. package/src/app/shared/material/duration/testing/mat-duration.test.ts +0 -88
  1195. package/src/app/shared/material/latlong/latlong.utils.ts +0 -376
  1196. package/src/app/shared/material/latlong/material.latlong-input.html +0 -95
  1197. package/src/app/shared/material/latlong/material.latlong-input.scss +0 -66
  1198. package/src/app/shared/material/latlong/material.latlong-input.ts +0 -445
  1199. package/src/app/shared/material/latlong/material.latlong.html +0 -90
  1200. package/src/app/shared/material/latlong/material.latlong.module.ts +0 -37
  1201. package/src/app/shared/material/latlong/material.latlong.scss +0 -0
  1202. package/src/app/shared/material/latlong/material.latlong.ts +0 -203
  1203. package/src/app/shared/material/latlong/testing/latlong.test.html +0 -1008
  1204. package/src/app/shared/material/latlong/testing/latlong.test.ts +0 -144
  1205. package/src/app/shared/material/material.animations.ts +0 -269
  1206. package/src/app/shared/material/material.config.ts +0 -5
  1207. package/src/app/shared/material/material.module.ts +0 -94
  1208. package/src/app/shared/material/material.testing.module.ts +0 -192
  1209. package/src/app/shared/material/memory/memory.utils.ts +0 -57
  1210. package/src/app/shared/material/numpad/numpad.animation.ts +0 -1
  1211. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +0 -110
  1212. package/src/app/shared/material/numpad/numpad.component.ts +0 -73
  1213. package/src/app/shared/material/numpad/numpad.container.html +0 -37
  1214. package/src/app/shared/material/numpad/numpad.container.scss +0 -55
  1215. package/src/app/shared/material/numpad/numpad.container.ts +0 -152
  1216. package/src/app/shared/material/numpad/numpad.content.html +0 -13
  1217. package/src/app/shared/material/numpad/numpad.content.ts +0 -10
  1218. package/src/app/shared/material/numpad/numpad.directive.ts +0 -159
  1219. package/src/app/shared/material/numpad/numpad.dom-service.ts +0 -35
  1220. package/src/app/shared/material/numpad/numpad.model.ts +0 -53
  1221. package/src/app/shared/material/numpad/numpad.module.ts +0 -18
  1222. package/src/app/shared/material/numpad/testing/numpad.test.html +0 -146
  1223. package/src/app/shared/material/numpad/testing/numpad.test.ts +0 -44
  1224. package/src/app/shared/material/paginator/material.paginator-i18n.ts +0 -47
  1225. package/src/app/shared/material/stepper/material.stepper-i18n.ts +0 -17
  1226. package/src/app/shared/material/swipe/material.swipe.html +0 -85
  1227. package/src/app/shared/material/swipe/material.swipe.scss +0 -55
  1228. package/src/app/shared/material/swipe/material.swipe.ts +0 -366
  1229. package/src/app/shared/material/swipe/swipe.module.ts +0 -29
  1230. package/src/app/shared/material/swipe/testing/swipe.test.html +0 -112
  1231. package/src/app/shared/material/swipe/testing/swipe.test.ts +0 -74
  1232. package/src/app/shared/material/test/test-component.css +0 -22
  1233. package/src/app/shared/material/test/test-component.html +0 -40
  1234. package/src/app/shared/material/test/test-component.ts +0 -295
  1235. package/src/app/shared/material/testing/common.test.html +0 -227
  1236. package/src/app/shared/material/testing/common.test.ts +0 -126
  1237. package/src/app/shared/material/text/testing/text-form.testing.html +0 -213
  1238. package/src/app/shared/material/text/testing/text-form.testing.ts +0 -30
  1239. package/src/app/shared/material/text/text-form.component.html +0 -63
  1240. package/src/app/shared/material/text/text-form.component.scss +0 -8
  1241. package/src/app/shared/material/text/text-form.component.ts +0 -177
  1242. package/src/app/shared/material/text/text-form.module.ts +0 -36
  1243. package/src/app/shared/modules.ts +0 -12
  1244. package/src/app/shared/named-filter/named-filter-selector.component.html +0 -77
  1245. package/src/app/shared/named-filter/named-filter-selector.component.scss +0 -3
  1246. package/src/app/shared/named-filter/named-filter-selector.component.ts +0 -287
  1247. package/src/app/shared/named-filter/named-filter.model.ts +0 -64
  1248. package/src/app/shared/named-filter/named-filter.module.ts +0 -15
  1249. package/src/app/shared/named-filter/named-filter.service.ts +0 -100
  1250. package/src/app/shared/named-filter/testing/named-filter-selector.testing.html +0 -61
  1251. package/src/app/shared/named-filter/testing/named-filter-selector.testing.ts +0 -80
  1252. package/src/app/shared/named-filter/testing/named-filter.testing.module.ts +0 -20
  1253. package/src/app/shared/named-filter/testing/named-filter.testing.service.ts +0 -83
  1254. package/src/app/shared/observables.ts +0 -139
  1255. package/src/app/shared/pipes/arrays.pipe.ts +0 -153
  1256. package/src/app/shared/pipes/badge.pipes.ts +0 -18
  1257. package/src/app/shared/pipes/colors.pipe.ts +0 -24
  1258. package/src/app/shared/pipes/date-diff-duration.pipe.ts +0 -53
  1259. package/src/app/shared/pipes/date-format.pipe.ts +0 -73
  1260. package/src/app/shared/pipes/date-from-now.pipe.ts +0 -17
  1261. package/src/app/shared/pipes/dates.pipe.ts +0 -13
  1262. package/src/app/shared/pipes/display-with.pipe.ts +0 -13
  1263. package/src/app/shared/pipes/duration.pipe.spec.ts +0 -41
  1264. package/src/app/shared/pipes/duration.pipe.ts +0 -28
  1265. package/src/app/shared/pipes/file-size.pipe.ts +0 -50
  1266. package/src/app/shared/pipes/form.pipes.ts +0 -209
  1267. package/src/app/shared/pipes/highlight.pipe.ts +0 -41
  1268. package/src/app/shared/pipes/html.pipes.ts +0 -49
  1269. package/src/app/shared/pipes/latlong-format.pipe.ts +0 -28
  1270. package/src/app/shared/pipes/maps.pipe.ts +0 -41
  1271. package/src/app/shared/pipes/maskito.pipe.ts +0 -68
  1272. package/src/app/shared/pipes/math.pipes.ts +0 -46
  1273. package/src/app/shared/pipes/ng-init.pipe.ts +0 -13
  1274. package/src/app/shared/pipes/number-format.pipe.ts +0 -11
  1275. package/src/app/shared/pipes/observable.pipes.ts +0 -46
  1276. package/src/app/shared/pipes/pipes.module.ts +0 -162
  1277. package/src/app/shared/pipes/property.pipes.ts +0 -115
  1278. package/src/app/shared/pipes/selection.pipes.ts +0 -165
  1279. package/src/app/shared/pipes/string.pipes.ts +0 -128
  1280. package/src/app/shared/pipes/translate-context.pipe.ts +0 -27
  1281. package/src/app/shared/pipes/types.pipes.ts +0 -52
  1282. package/src/app/shared/pipes/url.pipes.ts +0 -29
  1283. package/src/app/shared/platforms.ts +0 -99
  1284. package/src/app/shared/print/print.service.ts +0 -337
  1285. package/src/app/shared/regexps.ts +0 -112
  1286. package/src/app/shared/rx-state/rx-state.decorators.ts +0 -281
  1287. package/src/app/shared/rx-state/rx-state.module.ts +0 -11
  1288. package/src/app/shared/rx-state/rx-state.types.ts +0 -5
  1289. package/src/app/shared/services/entity-service.class.ts +0 -120
  1290. package/src/app/shared/services/job.utils.ts +0 -124
  1291. package/src/app/shared/services/memory-entity-service.class.ts +0 -435
  1292. package/src/app/shared/services/progress-bar.service.ts +0 -40
  1293. package/src/app/shared/services/startable-observable-service.class.ts +0 -129
  1294. package/src/app/shared/services/startable-service.class.ts +0 -120
  1295. package/src/app/shared/services/storage.utils.ts +0 -53
  1296. package/src/app/shared/services/translate-context.service.ts +0 -112
  1297. package/src/app/shared/services/validator-service.class.ts +0 -13
  1298. package/src/app/shared/services.ts +0 -134
  1299. package/src/app/shared/shared-routing.module.ts +0 -69
  1300. package/src/app/shared/shared.module.spec.ts +0 -13
  1301. package/src/app/shared/shared.module.ts +0 -168
  1302. package/src/app/shared/shared.testing.module.ts +0 -61
  1303. package/src/app/shared/storage/storage-explorer.component.html +0 -160
  1304. package/src/app/shared/storage/storage-explorer.component.scss +0 -37
  1305. package/src/app/shared/storage/storage-explorer.component.spec.ts +0 -24
  1306. package/src/app/shared/storage/storage-explorer.component.ts +0 -268
  1307. package/src/app/shared/storage/storage-explorer.module.ts +0 -24
  1308. package/src/app/shared/storage/storage-explorer.testing-routing.module.ts +0 -19
  1309. package/src/app/shared/storage/storage-explorer.testing.module.ts +0 -19
  1310. package/src/app/shared/storage/storage.service.ts +0 -131
  1311. package/src/app/shared/storage/storage.utils.ts +0 -25
  1312. package/src/app/shared/testing/maskito.test.html +0 -40
  1313. package/src/app/shared/testing/maskito.test.ts +0 -33
  1314. package/src/app/shared/testing/observable.test.html +0 -53
  1315. package/src/app/shared/testing/observable.test.scss +0 -3
  1316. package/src/app/shared/testing/observable.test.ts +0 -101
  1317. package/src/app/shared/testing/tests.page.html +0 -22
  1318. package/src/app/shared/testing/tests.page.ts +0 -32
  1319. package/src/app/shared/toast/toast.testing.html +0 -50
  1320. package/src/app/shared/toast/toast.testing.module.ts +0 -22
  1321. package/src/app/shared/toast/toast.testing.ts +0 -52
  1322. package/src/app/shared/toast/toasts.ts +0 -161
  1323. package/src/app/shared/toolbar/modal-toolbar.html +0 -30
  1324. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  1325. package/src/app/shared/toolbar/modal-toolbar.ts +0 -64
  1326. package/src/app/shared/toolbar/toolbar.html +0 -68
  1327. package/src/app/shared/toolbar/toolbar.module.ts +0 -18
  1328. package/src/app/shared/toolbar/toolbar.scss +0 -0
  1329. package/src/app/shared/toolbar/toolbar.ts +0 -262
  1330. package/src/app/shared/types.ts +0 -44
  1331. package/src/app/shared/upload-file/testing/upload-file.testing.html +0 -30
  1332. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +0 -21
  1333. package/src/app/shared/upload-file/testing/upload-file.testing.ts +0 -65
  1334. package/src/app/shared/upload-file/upload-file-popover.component.html +0 -46
  1335. package/src/app/shared/upload-file/upload-file-popover.component.scss +0 -6
  1336. package/src/app/shared/upload-file/upload-file-popover.component.ts +0 -115
  1337. package/src/app/shared/upload-file/upload-file.component.html +0 -57
  1338. package/src/app/shared/upload-file/upload-file.component.scss +0 -60
  1339. package/src/app/shared/upload-file/upload-file.component.ts +0 -222
  1340. package/src/app/shared/upload-file/upload-file.model.ts +0 -40
  1341. package/src/app/shared/validator/form-error-adapter.class.ts +0 -139
  1342. package/src/app/shared/validator/validators.ts +0 -725
  1343. package/src/app/shared/version/versions.ts +0 -89
  1344. package/src/app/social/config/social.config.ts +0 -10
  1345. package/src/app/social/feed/discourse/discourse-feed.service.ts +0 -216
  1346. package/src/app/social/feed/discourse/discourse.model.ts +0 -9
  1347. package/src/app/social/feed/discourse/discourse.utils.ts +0 -210
  1348. package/src/app/social/feed/feed.component.html +0 -85
  1349. package/src/app/social/feed/feed.component.scss +0 -59
  1350. package/src/app/social/feed/feed.component.spec.ts +0 -24
  1351. package/src/app/social/feed/feed.component.ts +0 -115
  1352. package/src/app/social/feed/feed.directive.ts +0 -164
  1353. package/src/app/social/feed/feed.model.ts +0 -139
  1354. package/src/app/social/feed/feed.module.ts +0 -13
  1355. package/src/app/social/feed/feed.service.ts +0 -14
  1356. package/src/app/social/job/job.module.ts +0 -14
  1357. package/src/app/social/job/progression/job-progression.component.html +0 -19
  1358. package/src/app/social/job/progression/job-progression.component.scss +0 -15
  1359. package/src/app/social/job/progression/job-progression.component.ts +0 -39
  1360. package/src/app/social/job/progression/job-progression.icon.html +0 -32
  1361. package/src/app/social/job/progression/job-progression.icon.scss +0 -7
  1362. package/src/app/social/job/progression/job-progression.icon.ts +0 -277
  1363. package/src/app/social/job/progression/job-progression.list.html +0 -25
  1364. package/src/app/social/job/progression/job-progression.list.scss +0 -17
  1365. package/src/app/social/job/progression/job-progression.list.ts +0 -40
  1366. package/src/app/social/job/progression/job-progression.model.ts +0 -26
  1367. package/src/app/social/job/progression/job-progression.service.ts +0 -97
  1368. package/src/app/social/job/testing/job-progression.testing.html +0 -11
  1369. package/src/app/social/job/testing/job-progression.testing.service.ts +0 -33
  1370. package/src/app/social/job/testing/job-progression.testing.ts +0 -28
  1371. package/src/app/social/job/testing/job.testing.module.ts +0 -13
  1372. package/src/app/social/message/message.form.html +0 -71
  1373. package/src/app/social/message/message.form.scss +0 -6
  1374. package/src/app/social/message/message.form.ts +0 -128
  1375. package/src/app/social/message/message.modal.html +0 -68
  1376. package/src/app/social/message/message.modal.ts +0 -117
  1377. package/src/app/social/message/message.model.ts +0 -78
  1378. package/src/app/social/message/message.module.ts +0 -14
  1379. package/src/app/social/message/message.service.ts +0 -104
  1380. package/src/app/social/social.errors.ts +0 -10
  1381. package/src/app/social/social.module.ts +0 -23
  1382. package/src/app/social/social.testing.module.ts +0 -33
  1383. package/src/app/social/user-event/notification/user-event-notification.icon.html +0 -49
  1384. package/src/app/social/user-event/notification/user-event-notification.icon.scss +0 -4
  1385. package/src/app/social/user-event/notification/user-event-notification.icon.ts +0 -176
  1386. package/src/app/social/user-event/notification/user-event-notification.list.html +0 -151
  1387. package/src/app/social/user-event/notification/user-event-notification.list.scss +0 -73
  1388. package/src/app/social/user-event/notification/user-event-notification.list.ts +0 -282
  1389. package/src/app/social/user-event/notification/user-event-notification.modal.html +0 -71
  1390. package/src/app/social/user-event/notification/user-event-notification.modal.ts +0 -60
  1391. package/src/app/social/user-event/testing/user-event.testing.html +0 -54
  1392. package/src/app/social/user-event/testing/user-event.testing.model.ts +0 -142
  1393. package/src/app/social/user-event/testing/user-event.testing.module.ts +0 -13
  1394. package/src/app/social/user-event/testing/user-event.testing.service.ts +0 -161
  1395. package/src/app/social/user-event/testing/user-event.testing.ts +0 -300
  1396. package/src/app/social/user-event/user-event.model.ts +0 -55
  1397. package/src/app/social/user-event/user-event.module.ts +0 -16
  1398. package/src/app/social/user-event/user-event.service.ts +0 -686
  1399. package/src/browserslist +0 -9
  1400. package/src/environments/environment.class.ts +0 -113
  1401. package/src/environments/environment.loader.ts +0 -90
  1402. package/src/environments/environment.prod.ts +0 -49
  1403. package/src/environments/environment.test.ts +0 -92
  1404. package/src/environments/environment.ts +0 -136
  1405. package/src/favicon.ico +0 -0
  1406. package/src/global.scss +0 -13
  1407. package/src/index.html +0 -76
  1408. package/src/main.ts +0 -19
  1409. package/src/polyfills.ts +0 -34
  1410. package/src/schema.graphql +0 -4381
  1411. package/src/service-worker.js +0 -31
  1412. package/src/test.ts +0 -30
  1413. package/tsconfig-cs.json +0 -57
  1414. package/tsconfig.app.json +0 -15
  1415. package/tsconfig.json +0 -48
  1416. package/tsconfig.spec.json +0 -18
@@ -0,0 +1,379 @@
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, Inject, Input, ViewChild } from '@angular/core';
2
+ import { Person, PRIORITIZED_AUTHORITIES } from '../../core/services/model/person.model';
3
+ import { StatusById, StatusList } from '../../core/services/model/referential.model';
4
+ import { PersonValidatorService } from '../services/validator/person.validator';
5
+ import { AppTable } from '../../core/table/table.class';
6
+ import { ValidatorService } from '@e-is/ngx-material-table';
7
+ import { FormFieldDefinitionUtils } from '../../shared/form/field.model';
8
+ import { debounceTime, distinctUntilKeyChanged, filter, tap } from 'rxjs/operators';
9
+ import { EntitiesTableDataSource } from '../../core/table/entities-table-datasource.class';
10
+ import { getPropertyByPath, isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
11
+ import { ENVIRONMENT } from '../../../environments/environment.class';
12
+ import { PersonFilter } from '../services/filter/person.filter';
13
+ import { CORE_CONFIG_OPTIONS } from '../../core/services/config/core.config';
14
+ import { MatExpansionPanel } from '@angular/material/expansion';
15
+ import { slideUpDownAnimation } from '../../shared/material/material.animations';
16
+ import { Message } from '../../social/message/message.model';
17
+ import { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, TABLE_SETTINGS_ENUM } from '../../core/table/table.model';
18
+ import { CsvUtils } from '../../shared/file/csv.utils';
19
+ import { fromDateISOString } from '../../shared/dates';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/forms";
22
+ import * as i2 from "../../core/services/account.service";
23
+ import * as i3 from "@e-is/ngx-material-table";
24
+ import * as i4 from "../../core/services/config.service";
25
+ import * as i5 from "../services/person.service";
26
+ import * as i6 from "../../social/message/message.service";
27
+ import * as i7 from "../../core/menu/menu.service";
28
+ import * as i8 from "ngx-jdenticon";
29
+ import * as i9 from "@ngx-translate/core";
30
+ import * as i10 from "@angular/common";
31
+ import * as i11 from "@ionic/angular";
32
+ import * as i12 from "@angular/material/table";
33
+ import * as i13 from "@angular/material/sort";
34
+ import * as i14 from "@angular/material/paginator";
35
+ import * as i15 from "@angular/material/form-field";
36
+ import * as i16 from "@angular/material/input";
37
+ import * as i17 from "@angular/material/checkbox";
38
+ import * as i18 from "@angular/material/expansion";
39
+ import * as i19 from "@angular/material/icon";
40
+ import * as i20 from "@angular/material/button";
41
+ import * as i21 from "@angular/material/menu";
42
+ import * as i22 from "@angular/material/select";
43
+ import * as i23 from "@angular/material/core";
44
+ import * as i24 from "@angular/material/divider";
45
+ import * as i25 from "@angular/material/badge";
46
+ import * as i26 from "@angular/cdk/a11y";
47
+ import * as i27 from "../../shared/directives/autofocus.directive";
48
+ import * as i28 from "../../shared/directives/autotitle.directive";
49
+ import * as i29 from "../../shared/toolbar/toolbar";
50
+ import * as i30 from "../../shared/form/field.component";
51
+ import * as i31 from "../../core/form/buttons/form-buttons-bar.component";
52
+ import * as i32 from "../../core/table/column/actions-column.component";
53
+ import * as i33 from "../../shared/debug/debug.component";
54
+ import * as i34 from "../../shared/pipes/date-format.pipe";
55
+ import * as i35 from "../../shared/pipes/number-format.pipe";
56
+ import * as i36 from "../../shared/pipes/form.pipes";
57
+ import * as i37 from "../../shared/pipes/selection.pipes";
58
+ import * as i38 from "../../core/table/table.pipes";
59
+ export class UsersPage extends AppTable {
60
+ accountService;
61
+ validatorService;
62
+ configService;
63
+ dataService;
64
+ messageService;
65
+ menuService;
66
+ canEdit;
67
+ canSendMessage;
68
+ filterForm;
69
+ profiles = [...PRIORITIZED_AUTHORITIES].reverse();
70
+ statusList = StatusList;
71
+ statusById = StatusById;
72
+ additionalFields;
73
+ filterCriteriaCount = 0;
74
+ defaultCompact = false;
75
+ set showUsernameColumn(value) {
76
+ this.setShowColumn('username', value);
77
+ }
78
+ get showUsernameColumn() {
79
+ return this.getShowColumn('username');
80
+ }
81
+ set showUsernameExtranetColumn(value) {
82
+ this.setShowColumn('usernameExtranet', value);
83
+ }
84
+ get showUsernameExtranetColumn() {
85
+ return this.getShowColumn('usernameExtranet');
86
+ }
87
+ compact = null;
88
+ usePageSettings = true;
89
+ sticky = false;
90
+ stickyEnd = false;
91
+ canDownload = true;
92
+ constructor(injector, formBuilder, accountService, validatorService, configService, dataService, messageService, menuService, environment) {
93
+ super(injector, RESERVED_START_COLUMNS.concat(['avatar', 'lastName', 'firstName', 'email', 'profile', 'status', 'username', 'usernameExtranet', 'pubkey'])
94
+ .concat(accountService.additionalFields.map((field) => field.key))
95
+ .concat(['creationDate', 'updateDate'])
96
+ .concat(RESERVED_END_COLUMNS), new EntitiesTableDataSource(Person, dataService, validatorService, {
97
+ prependNewElements: false,
98
+ suppressErrors: environment.production,
99
+ saveOnlyDirtyRows: true,
100
+ }), null);
101
+ this.accountService = accountService;
102
+ this.validatorService = validatorService;
103
+ this.configService = configService;
104
+ this.dataService = dataService;
105
+ this.messageService = messageService;
106
+ this.menuService = menuService;
107
+ this.canEdit = accountService.isAdmin();
108
+ this.canSendMessage = this.canEdit;
109
+ this.inlineEdition = this.canEdit;
110
+ this.confirmBeforeDelete = true;
111
+ this.autoLoad = false; // Wait config loading
112
+ this.i18nColumnPrefix = 'USER.';
113
+ this.defaultSortBy = 'lastName';
114
+ this.defaultSortDirection = 'asc';
115
+ this.filterForm = formBuilder.group({
116
+ searchText: [null],
117
+ statusId: [null],
118
+ });
119
+ this.additionalFields = (this.accountService.additionalFields || [])
120
+ .filter((field) => isNotNil(field.autocomplete))
121
+ .map((field) => {
122
+ // Make sure to get the final autocomplete config (e.g. with a suggestFn function)
123
+ field.autocomplete = this.registerAutocompleteField(field.key, {
124
+ ...field.autocomplete, // Copy, to be sure the original config is unchanged
125
+ });
126
+ return field;
127
+ });
128
+ // Listen page action (e.g. from sub menu item)
129
+ this.registerSubscription(this.route.queryParams.pipe(distinctUntilKeyChanged('action')).subscribe((queryParams) => {
130
+ const action = queryParams['action'] || 'none';
131
+ switch (action) {
132
+ case 'send':
133
+ this.openComposeMessageModal();
134
+ break;
135
+ case 'none':
136
+ break;
137
+ default:
138
+ console.warn('[users] Unknown action=' + action);
139
+ break;
140
+ }
141
+ // Mark as consumed
142
+ this.router.navigate(['.'], {
143
+ relativeTo: this.route,
144
+ queryParams: { ...queryParams, action: undefined },
145
+ replaceUrl: true,
146
+ state: { animated: false },
147
+ });
148
+ }));
149
+ // For DEV only --
150
+ this.debug = !environment.production;
151
+ }
152
+ filterExpansionPanel;
153
+ get firstUserColumn() {
154
+ const columnName = this.displayedColumns[RESERVED_START_COLUMNS.length];
155
+ // Skip avatar column, if present
156
+ return (columnName === 'avatar' && this.displayedColumns[RESERVED_START_COLUMNS.length + 1]) || columnName;
157
+ }
158
+ async ngOnInit() {
159
+ super.ngOnInit();
160
+ this.registerSubscription(this.configService.config.subscribe((config) => {
161
+ const authTokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
162
+ console.debug('[users] AuthTokenType=' + authTokenType);
163
+ switch (authTokenType) {
164
+ case 'basic':
165
+ this.setShowColumn('pubkey', false, { emitEvent: false });
166
+ this.setShowColumn('username', true, { emitEvent: false });
167
+ this.setShowColumn('usernameExtranet', true, { emitEvent: false });
168
+ break;
169
+ case 'basic-and-token':
170
+ this.setShowColumn('pubkey', true, { emitEvent: false });
171
+ this.setShowColumn('username', true, { emitEvent: false });
172
+ this.setShowColumn('usernameExtranet', true, { emitEvent: false });
173
+ break;
174
+ case 'token':
175
+ this.setShowColumn('pubkey', true, { emitEvent: false });
176
+ this.setShowColumn('username', false, { emitEvent: false });
177
+ this.setShowColumn('usernameExtranet', false, { emitEvent: false });
178
+ }
179
+ this.updateColumns();
180
+ this.emitRefresh();
181
+ }));
182
+ this.registerSubscription(this.onRefresh.subscribe(() => {
183
+ this.filterForm.markAsUntouched();
184
+ this.filterForm.markAsPristine();
185
+ }));
186
+ // Update filter when changes
187
+ this.registerSubscription(this.filterForm.valueChanges
188
+ .pipe(debounceTime(250), filter(() => this.filterForm.valid), tap((json) => {
189
+ const filter = PersonFilter.fromObject(json);
190
+ this.filterCriteriaCount = filter.countNotEmptyCriteria();
191
+ this.markForCheck();
192
+ // Update the filter, without reloading the content
193
+ this.setFilter(filter, { emitEvent: false });
194
+ }),
195
+ // Save filter in settings (after a debounce time)
196
+ debounceTime(500), filter(() => isNotNilOrBlank(this.settingsId) && this.usePageSettings), tap((json) => this.settings.savePageSetting(this.settingsId, json, TABLE_SETTINGS_ENUM.FILTER_KEY)))
197
+ .subscribe());
198
+ if (this.canSendMessage && this.debug) {
199
+ await this.menuService.addSubMenuItems([
200
+ {
201
+ parentPath: '/admin/users',
202
+ path: '/admin/users',
203
+ pathParams: { action: 'expand' },
204
+ matIcon: 'expand_more',
205
+ title: 'USER.LIST.BTN_ACTIONS',
206
+ action: 'expand',
207
+ },
208
+ {
209
+ parentPath: '/admin/users?action=expand',
210
+ path: '/admin/users?action=send',
211
+ icon: 'mail',
212
+ title: 'USER.LIST.BTN_SEND_MESSAGE',
213
+ action: () => this.openComposeMessageModal(),
214
+ },
215
+ ], { skipIfExists: false });
216
+ }
217
+ // Restore compact rows
218
+ this.restoreCompactMode();
219
+ // Restore filter from settings, or load all
220
+ this.restoreFilterOrLoad();
221
+ }
222
+ applyFilterAndClosePanel(event) {
223
+ this.emitRefresh(event);
224
+ this.filterExpansionPanel.close();
225
+ }
226
+ resetFilter(event) {
227
+ this.totalRowCount = undefined;
228
+ this.filterCriteriaCount = 0;
229
+ this.markAsLoading();
230
+ this.filterForm.reset();
231
+ this.setFilter(null);
232
+ }
233
+ async restoreFilterOrLoad() {
234
+ this.markAsLoading();
235
+ console.debug('[users] Restoring filter from settings...');
236
+ const json = this.settings.getPageSettings(this.settingsId, TABLE_SETTINGS_ENUM.FILTER_KEY) || {};
237
+ const filter = PersonFilter.fromObject(json);
238
+ this.filterForm.patchValue(json);
239
+ this.setFilter(filter, { emitEvent: true });
240
+ }
241
+ clearControlValue(event, formControl) {
242
+ if (event)
243
+ event.stopPropagation(); // Avoid to enter input the field
244
+ formControl.setValue(null);
245
+ return false;
246
+ }
247
+ async openComposeMessageModal(event) {
248
+ // Compute recipients
249
+ const recipients = (this.selection.selected || [])
250
+ .map((row) => row.currentData)
251
+ .map(Person.fromObject)
252
+ .map((p) => {
253
+ const target = p.asObject({ minify: true });
254
+ target.department = p.department?.asObject();
255
+ return target;
256
+ });
257
+ const recipientFilter = PersonFilter.fromObject(this.filter);
258
+ const canRecipientFilter = !recipientFilter.isEmpty() && (this.accountService.isAdmin() || this.accountService.isSupervisor());
259
+ return this.messageService.openComposeModal({
260
+ suggestFn: (value, filter, sortBy, sortDirection) => this.dataService.suggest(value, filter, sortBy, sortDirection),
261
+ canRecipientFilter,
262
+ recipientFilterCount: this.totalRowCount,
263
+ data: Message.fromObject({
264
+ recipients,
265
+ recipientFilter,
266
+ }),
267
+ });
268
+ }
269
+ async restoreCompactMode(opts) {
270
+ if (!this.usePageSettings || isNilOrBlank(this.settingsId) || isNotNil(this.compact))
271
+ return;
272
+ const compact = toBoolean(this.settings.getPageSettings(this.settingsId, TABLE_SETTINGS_ENUM.COMPACT_ROWS_KEY), toBoolean(this.compact, this.defaultCompact));
273
+ if (this.compact !== compact) {
274
+ this.compact = compact;
275
+ // Emit event
276
+ if (!opts || opts.emitEvent !== false) {
277
+ this.markForCheck();
278
+ }
279
+ }
280
+ }
281
+ async toggleCompactMode() {
282
+ this.compact = !this.compact;
283
+ // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis
284
+ this.markForCheck();
285
+ if (this.usePageSettings && isNotNilOrBlank(this.settingsId)) {
286
+ await this.savePageSettings(this.compact, TABLE_SETTINGS_ENUM.COMPACT_ROWS_KEY);
287
+ }
288
+ }
289
+ async exportToCsv(event) {
290
+ // Prepare CSV options
291
+ const separator = CsvUtils.getLocalizedSeparator(this.translate);
292
+ const encoding = CsvUtils.getLocalizedEncoding(this.translate);
293
+ const translations = this.translate.instant([
294
+ 'COMMON.DATE_TIME_PATTERN',
295
+ 'USER.LIST.TITLE',
296
+ 'USER.EMAIL',
297
+ 'USER.FIRST_NAME',
298
+ 'USER.LAST_NAME',
299
+ 'USER.USERNAME',
300
+ 'USER.USERNAME_EXTRANET',
301
+ 'USER.DEPARTMENT_LABEL',
302
+ 'USER.DEPARTMENT_NAME',
303
+ 'USER.PROFILE',
304
+ 'USER.STATUS',
305
+ 'USER.PUBKEY',
306
+ ...(this.additionalFields || []).map((field) => field.label),
307
+ 'USER.CREATION_DATE',
308
+ 'USER.UPDATE_DATE',
309
+ ...this.statusList.map((status) => status.label),
310
+ ]);
311
+ const dateTimePattern = translations['COMMON.DATE_TIME_PATTERN'];
312
+ const filename = translations['USER.LIST.TITLE'] + '.csv';
313
+ const headers = [
314
+ translations['USER.EMAIL'],
315
+ translations['USER.FIRST_NAME'],
316
+ translations['USER.LAST_NAME'],
317
+ ...(this.showUsernameColumn ? [translations['USER.USERNAME']] : []),
318
+ ...(this.showUsernameExtranetColumn ? [translations['USER.USERNAME_EXTRANET']] : []),
319
+ translations['USER.PROFILE'],
320
+ translations['USER.STATUS'],
321
+ translations['USER.PUBKEY'],
322
+ ...(this.additionalFields || []).map((field) => translations[field.label]),
323
+ translations['USER.CREATION_DATE'],
324
+ translations['USER.UPDATE_DATE'],
325
+ ];
326
+ const additionalFieldsFns = (this.additionalFields || []).map(FormFieldDefinitionUtils.getDisplayValueFn);
327
+ const rows = (this.selection.isEmpty() ? this.dataSource.getRows() : this.selection.selected)
328
+ .map((element) => element.currentData)
329
+ .map((person) => {
330
+ const status = this.statusById[person.statusId];
331
+ return [
332
+ person.lastName,
333
+ person.firstName,
334
+ person.email,
335
+ ...(this.showUsernameColumn ? [person.username] : []),
336
+ ...(this.showUsernameExtranetColumn ? [person.usernameExtranet] : []),
337
+ person.mainProfile,
338
+ status ? translations[status?.label] : null,
339
+ person.pubkey,
340
+ ...additionalFieldsFns.map((displayFn, index) => {
341
+ const value = getPropertyByPath(person, this.additionalFields[index].key);
342
+ console.debug('[users] Additional field displayFn', value);
343
+ return displayFn(value);
344
+ }),
345
+ fromDateISOString(person.creationDate).format(dateTimePattern),
346
+ fromDateISOString(person.updateDate).format(dateTimePattern),
347
+ ];
348
+ });
349
+ CsvUtils.exportToFile(rows, { filename, headers, separator, encoding });
350
+ }
351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UsersPage, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.AccountService }, { token: i3.ValidatorService }, { token: i4.ConfigService }, { token: i5.PersonService }, { token: i6.MessageService }, { token: i7.MenuService }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UsersPage, selector: "app-users-table", inputs: { compact: ["compact", "compact", booleanAttribute], usePageSettings: ["usePageSettings", "usePageSettings", booleanAttribute], sticky: ["sticky", "sticky", booleanAttribute], stickyEnd: ["stickyEnd", "stickyEnd", booleanAttribute], canDownload: ["canDownload", "canDownload", booleanAttribute] }, providers: [{ provide: ValidatorService, useExisting: PersonValidatorService }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar\n [title]=\"'USER.LIST.TITLE' | translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n (onValidate)=\"save()\"\n>\n <ion-buttons slot=\"end\">\n <!-- Compose message -->\n <button\n mat-icon-button\n *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE' | translate\"\n (click)=\"openComposeMessageModal($event)\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n @if (selection | isEmptySelection) {\n <!-- Add -->\n <button mat-icon-button *ngIf=\"canEdit && !mobile\" [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n } @else {\n <!-- delete -->\n <button\n mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n }\n\n @if (!mobile) {\n <button mat-icon-button [title]=\"'COMMON.BTN_OPTIONS' | translate\" [matMenuTriggerFor]=\"toolbarOptionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n }\n </ion-buttons>\n</app-toolbar>\n\n<!-- Toolbar option menu -->\n<mat-menu #toolbarOptionsMenu=\"matMenu\" xPosition=\"after\">\n <!-- export button -->\n <button mat-menu-item [disabled]=\"!canDownload\" (click)=\"exportToCsv($event)\">\n <mat-icon>download</mat-icon>\n <ion-label translate>FILE.CSV.BTN_DOWNLOAD_HELP</ion-label>\n </button>\n</mat-menu>\n\n<ion-content class=\"ion-no-padding\">\n <!-- error -->\n <ion-item\n *ngIf=\"errorSubject | async; let error\"\n lines=\"none\"\n class=\"hidden-sm hidden-xs hidden-mobile\"\n @slideUpDownAnimation\n >\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- debug -->\n <app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n focusColumn: {{ focusColumn }}\n <br />\n loadingSubject: {{ loading }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n </app-debug>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'USER.LIST.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-label>{{ 'USER.STATUS' | translate }}</mat-label>\n <mat-select formControlName=\"statusId\">\n <mat-option [value]=\"null\">\n <i><span translate>COMMON.EMPTY_OPTION</span></i>\n </mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label | translate }}\n </mat-option>\n </mat-select>\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) === true || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button\n mat-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && (errorSubject | async); let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n [class.compact]=\"compact\"\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"toggleSelectRow($event, row)\" [checked]=\"selection | isSelected: row\"></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <ion-label>{{ row.currentData.id }}</ion-label>\n </td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <ion-avatar [style.background-color]=\"'white'\">\n <ion-img *ngIf=\"row.currentData.avatar; let avatarUrl; else: generateIcon\" [src]=\"avatarUrl\"></ion-img>\n <ng-template #generateIcon>\n <svg width=\"39\" height=\"39\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </ng-template>\n </ion-avatar>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'lastName'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'lastName'\"\n />\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'lastName' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'firstName'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'firstName'\"\n />\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'firstName' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'email'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'email'\"\n />\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'email' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{ definition.label | translate }}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = definition.key\">\n <app-form-field\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn === definition.key\"\n ></app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'profile'\">\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE' | translate\"\n >\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ 'USER.PROFILE_ENUM.' + item | uppercase | translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'status'\">\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS' | translate\"\n >\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate }}\n </span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <mat-icon><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n {{ item.label | translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'username'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'username'\"\n />\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'username' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'usernameExtranet'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'usernameExtranet'\"\n />\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'usernameExtranet' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges | async\"\n (click)=\"focusColumn = 'pubkey'\"\n >\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['pubkey']\"\n [placeholder]=\"'USER.PUBKEY' | translate\"\n [readonly]=\"!row.editing\"\n autocomplete=\"off\"\n />\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'pubkey' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>USER.CREATION_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n {{ row.currentData.creationDate | dateFormat: { time: true } }}\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Update date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>USER.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n {{ row.currentData.updateDate | dateFormat: { time: true } }}\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"stickyEnd\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmEditCreateClick)=\"confirmEditCreate($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n >\n <!-- table options menu -->\n <button\n matHeader\n mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS' | translate\"\n [matMenuTriggerFor]=\"tableOptionsMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"!row.validator?.valid\"\n ></tr>\n </table>\n\n <!-- D\u00E9clencheur invisible pour le mat-menu -->\n\n @if (loadingSubject | async) {\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n } @else if (totalRowCount === 0) {\n <ion-item>\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n }\n </div>\n</ion-content>\n\n<!-- Table options menu -->\n<mat-menu #tableOptionsMenu=\"matMenu\" xPosition=\"after\">\n <!-- display columns -->\n <button mat-menu-item (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n @if (usePageSettings) {\n <mat-divider></mat-divider>\n\n <!-- Compact mode -->\n <button mat-menu-item (click)=\"toggleCompactMode()\">\n <mat-icon>{{ compact ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n <ion-label translate>COMMON.BTN_COMPACT_ROWS</ion-label>\n </button>\n }\n</mat-menu>\n\n<ion-footer>\n <mat-paginator\n [length]=\"totalRowCount\"\n [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n showFirstLastButtons\n ></mat-paginator>\n\n <app-form-buttons-bar\n *ngIf=\"!mobile && canEdit\"\n (onCancel)=\"cancel($event)\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject | async) === true || (dirtySubject | async) !== true\"\n >\n <!-- error -->\n <ion-item *ngIf=\"errorSubject | async; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-expansion-panel{margin-bottom:5px}.mat-expansion-panel .form-container mat-form-field{width:100%}.mat-expansion-panel mat-action-row ion-label{line-height:36px}.table-container{height:100%}.mat-mdc-table .mat-column-avatar{--avatar-width: 40px;--avatar-height: 40px;width:calc(var(--avatar-width) + 10px)}.mat-mdc-table .mat-column-avatar ion-avatar{--border-radius: 5px !important;--border-width: 1px !important;--border-color: rgba(var(--ion-color-secondary-rgb), .5) !important;height:var(--avatar-height);max-height:var(--avatar-height);width:var(--avatar-width);max-width:var(--avatar-width);border:solid var(--border-width) var(--border-color);margin:0 2px}.mat-mdc-table .mat-column-avatar ion-avatar svg{max-height:calc(var(--avatar-height) - 1px);max-width:calc(var(--avatar-width) - 1px)}.mat-mdc-table.compact{--mat-row-height: 33px}.mat-mdc-table.compact .mat-column-avatar{--avatar-width: calc(var(--mat-row-height, 33px) - 4px);--avatar-height: calc(var(--mat-row-height, 33px) - 4px)}.mat-mdc-table .mat-column-id{min-width:50px;max-width:120px;padding-right:var(--mat-cell-horizontal-padding, 4px)}.mat-mdc-table .mat-column-lastName,.mat-mdc-table .mat-column-firstName{min-width:80px}.mat-mdc-table .mat-column-email,.mat-mdc-table .mat-column-pubkey,.mat-mdc-table .mat-column-department{min-width:180px}.mat-mdc-table .mat-column-profile{min-width:110px}.mat-mdc-table .mat-column-status,.mat-mdc-table .mat-column-creationDate,.mat-mdc-table .mat-column-updateDate{min-width:130px}\n"], dependencies: [{ kind: "directive", type: i8.SvgJdenticonDirective, selector: "svg[data-jdenticon-hash],svg[data-jdenticon-value]", inputs: ["data-jdenticon-hash", "data-jdenticon-value", "width", "height"] }, { kind: "directive", type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i11.IonAvatar, selector: "ion-avatar" }, { kind: "component", type: i11.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i11.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i11.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i11.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i11.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i11.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i11.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i11.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i11.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i11.IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: i11.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i11.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i11.IonRow, selector: "ion-row" }, { kind: "component", type: i11.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i11.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i14.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i15.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i15.MatLabel, selector: "mat-label" }, { kind: "directive", type: i15.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i15.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i16.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i17.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i18.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i18.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i19.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i20.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i21.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i21.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i21.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i22.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i22.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i23.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i24.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i25.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i26.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i27.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "directive", type: i28.AutoTitleDirective, selector: "ion-label[appAutoTitle], mat-label[appAutoTitle]", inputs: ["appAutoTitle"] }, { kind: "component", type: i29.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "id", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i30.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug", "panelClass", "panelWidth"], outputs: ["keyup.enter"] }, { kind: "component", type: i31.FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "disabledEscape", "classList", "saveButtonColor", "backText", "cancelText", "nextText", "showBack", "showCancel", "showNext", "showSave"], outputs: ["onCancel", "onSave", "onNext", "onBack", "onSaveAndClose", "onSaveAndNext"] }, { kind: "component", type: i32.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplateStart", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i33.DebugComponent, selector: "app-debug", inputs: ["titlePrefix", "title", "enable", "expanded"] }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i34.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i35.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i36.FormGetValuePipe, name: "formGetValue" }, { kind: "pipe", type: i37.IsSelectedPipe, name: "isSelected" }, { kind: "pipe", type: i37.IsEmptySelectionPipe, name: "isEmptySelection" }, { kind: "pipe", type: i38.IsAllSelectedPipe, name: "isAllSelected" }, { kind: "pipe", type: i38.IsNotAllSelectedPipe, name: "isNotAllSelected" }], animations: [slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
353
+ }
354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UsersPage, decorators: [{
355
+ type: Component,
356
+ args: [{ selector: 'app-users-table', providers: [{ provide: ValidatorService, useExisting: PersonValidatorService }], animations: [slideUpDownAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar\n [title]=\"'USER.LIST.TITLE' | translate\"\n color=\"primary\"\n [canGoBack]=\"false\"\n [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n (onValidate)=\"save()\"\n>\n <ion-buttons slot=\"end\">\n <!-- Compose message -->\n <button\n mat-icon-button\n *ngIf=\"canSendMessage\"\n [title]=\"'USER.LIST.BTN_SEND_MESSAGE' | translate\"\n (click)=\"openComposeMessageModal($event)\"\n >\n <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n </button>\n\n @if (selection | isEmptySelection) {\n <!-- Add -->\n <button mat-icon-button *ngIf=\"canEdit && !mobile\" [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"addRow()\">\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n *ngIf=\"filterCriteriaCount; else emptyFilter\"\n [matBadge]=\"filterCriteriaCount\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n <ng-template #emptyFilter>\n <mat-icon>filter_list_alt</mat-icon>\n </ng-template>\n </button>\n } @else {\n <!-- delete -->\n <button\n mat-icon-button\n class=\"hidden-xs hidden-sm\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n }\n\n @if (!mobile) {\n <button mat-icon-button [title]=\"'COMMON.BTN_OPTIONS' | translate\" [matMenuTriggerFor]=\"toolbarOptionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n }\n </ion-buttons>\n</app-toolbar>\n\n<!-- Toolbar option menu -->\n<mat-menu #toolbarOptionsMenu=\"matMenu\" xPosition=\"after\">\n <!-- export button -->\n <button mat-menu-item [disabled]=\"!canDownload\" (click)=\"exportToCsv($event)\">\n <mat-icon>download</mat-icon>\n <ion-label translate>FILE.CSV.BTN_DOWNLOAD_HELP</ion-label>\n </button>\n</mat-menu>\n\n<ion-content class=\"ion-no-padding\">\n <!-- error -->\n <ion-item\n *ngIf=\"errorSubject | async; let error\"\n lines=\"none\"\n class=\"hidden-sm hidden-xs hidden-mobile\"\n @slideUpDownAnimation\n >\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- debug -->\n <app-debug *ngIf=\"debug\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n focusColumn: {{ focusColumn }}\n <br />\n loadingSubject: {{ loading }}\n <br />\n </ion-col>\n </ion-row>\n </ion-grid>\n </app-debug>\n\n <!-- search -->\n <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'USER.LIST.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <!-- status -->\n <mat-form-field>\n <mat-label>{{ 'USER.STATUS' | translate }}</mat-label>\n <mat-select formControlName=\"statusId\">\n <mat-option [value]=\"null\">\n <i><span translate>COMMON.EMPTY_OPTION</span></i>\n </mat-option>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <ion-icon [name]=\"item.icon\"></ion-icon>\n {{ item.label | translate }}\n </mat-option>\n </mat-select>\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n [hidden]=\"filterForm.controls.statusId.disabled || !filterForm.controls.statusId.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) === true || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Close panel -->\n <ion-button\n mat-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"filterExpansionPanel.close()\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <!-- error -->\n <ion-item *ngIf=\"mobile && (errorSubject | async); let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n [class.compact]=\"compact\"\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"toggleSelectRow($event, row)\" [checked]=\"selection | isSelected: row\"></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <ion-label>{{ row.currentData.id }}</ion-label>\n </td>\n </ng-container>\n\n <!-- avatar Column -->\n <ng-container matColumnDef=\"avatar\" [sticky]=\"sticky\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <ion-avatar [style.background-color]=\"'white'\">\n <ion-img *ngIf=\"row.currentData.avatar; let avatarUrl; else: generateIcon\" [src]=\"avatarUrl\"></ion-img>\n <ng-template #generateIcon>\n <svg width=\"39\" height=\"39\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n </ng-template>\n </ion-avatar>\n </td>\n </ng-container>\n\n <!-- lastName -->\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.LAST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'lastName'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['lastName']\"\n [placeholder]=\"'USER.LAST_NAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'lastName'\"\n />\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'lastName' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- firstname -->\n <ng-container matColumnDef=\"firstName\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.FIRST_NAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'firstName'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['firstName']\"\n [placeholder]=\"'USER.FIRST_NAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'firstName'\"\n />\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'firstName' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- email -->\n <ng-container matColumnDef=\"email\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.EMAIL</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'email'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['email']\"\n [placeholder]=\"'USER.EMAIL' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'email'\"\n />\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'email' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\" [matColumnDef]=\"definition.key\">\n <th mat-header-cell *matHeaderCellDef>\n <span>{{ definition.label | translate }}</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = definition.key\">\n <app-form-field\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"row.validator.controls[definition.key]\"\n [required]=\"definition.extra?.account?.required\"\n [autofocus]=\"row.editing && focusColumn === definition.key\"\n ></app-form-field>\n </td>\n </ng-container>\n\n <!-- profile column -->\n <ng-container matColumnDef=\"profile\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.PROFILE</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'profile'\">\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['mainProfile']\"\n [placeholder]=\"'USER.PROFILE' | translate\"\n >\n <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n {{ 'USER.PROFILE_ENUM.' + item | uppercase | translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- Status column -->\n <ng-container matColumnDef=\"status\">\n <th mat-header-cell *matHeaderCellDef>\n <span translate>USER.STATUS</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'status'\">\n <mat-form-field>\n <mat-select\n [formControl]=\"row.validator.controls['statusId']\"\n [placeholder]=\"'REFERENTIAL.STATUS' | translate\"\n >\n <mat-select-trigger>\n <span *ngIf=\"row.validator.controls['statusId'].value &gt;=0\">\n {{ statusById[row.validator.controls['statusId'].value]?.label | translate }}\n </span>\n </mat-select-trigger>\n <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n <mat-icon><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n {{ item.label | translate }}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </td>\n </ng-container>\n\n <!-- username -->\n <ng-container matColumnDef=\"username\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'username'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls.username\"\n [placeholder]=\"'USER.USERNAME' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'username'\"\n />\n <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'username' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- username extranet -->\n <ng-container matColumnDef=\"usernameExtranet\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.USERNAME_EXTRANET</span>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'usernameExtranet'\">\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls.usernameExtranet\"\n [placeholder]=\"'USER.USERNAME_EXTRANET' | translate\"\n [readonly]=\"!row.editing\"\n [appAutofocus]=\"row.editing && focusColumn === 'usernameExtranet'\"\n />\n <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'usernameExtranet' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- pubkey -->\n <ng-container matColumnDef=\"pubkey\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <span translate>USER.PUBKEY</span>\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n [title]=\"row.validator.controls.pubkey.valueChanges | async\"\n (click)=\"focusColumn = 'pubkey'\"\n >\n <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n <input\n matInput\n [formControl]=\"row.validator.controls['pubkey']\"\n [placeholder]=\"'USER.PUBKEY' | translate\"\n [readonly]=\"!row.editing\"\n autocomplete=\"off\"\n />\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n <ng-template #readonlyCell>\n <ion-label appAutoTitle>\n {{ row.validator | formGetValue: 'pubkey' }}\n </ion-label>\n </ng-template>\n </td>\n </ng-container>\n\n <!-- Creation date column -->\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>USER.CREATION_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n {{ row.currentData.creationDate | dateFormat: { time: true } }}\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Update date column -->\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>USER.UPDATE_DATE</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n {{ row.currentData.updateDate | dateFormat: { time: true } }}\n </ion-text>\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"stickyEnd\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmEditCreateClick)=\"confirmEditCreate($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n >\n <!-- table options menu -->\n <button\n matHeader\n mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS' | translate\"\n [matMenuTriggerFor]=\"tableOptionsMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator.invalid\"\n [class.mat-row-dirty]=\"row.currentData.dirty\"\n [class.mat-row-disabled]=\"!row.editing\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"!row.validator?.valid\"\n ></tr>\n </table>\n\n <!-- D\u00E9clencheur invisible pour le mat-menu -->\n\n @if (loadingSubject | async) {\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n } @else if (totalRowCount === 0) {\n <ion-item>\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n }\n </div>\n</ion-content>\n\n<!-- Table options menu -->\n<mat-menu #tableOptionsMenu=\"matMenu\" xPosition=\"after\">\n <!-- display columns -->\n <button mat-menu-item (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n @if (usePageSettings) {\n <mat-divider></mat-divider>\n\n <!-- Compact mode -->\n <button mat-menu-item (click)=\"toggleCompactMode()\">\n <mat-icon>{{ compact ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n <ion-label translate>COMMON.BTN_COMPACT_ROWS</ion-label>\n </button>\n }\n</mat-menu>\n\n<ion-footer>\n <mat-paginator\n [length]=\"totalRowCount\"\n [pageSize]=\"defaultPageSize\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n showFirstLastButtons\n ></mat-paginator>\n\n <app-form-buttons-bar\n *ngIf=\"!mobile && canEdit\"\n (onCancel)=\"cancel($event)\"\n (onSave)=\"save()\"\n [disabled]=\"(loadingSubject | async) === true || (dirtySubject | async) !== true\"\n >\n <!-- error -->\n <ion-item *ngIf=\"errorSubject | async; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-expansion-panel{margin-bottom:5px}.mat-expansion-panel .form-container mat-form-field{width:100%}.mat-expansion-panel mat-action-row ion-label{line-height:36px}.table-container{height:100%}.mat-mdc-table .mat-column-avatar{--avatar-width: 40px;--avatar-height: 40px;width:calc(var(--avatar-width) + 10px)}.mat-mdc-table .mat-column-avatar ion-avatar{--border-radius: 5px !important;--border-width: 1px !important;--border-color: rgba(var(--ion-color-secondary-rgb), .5) !important;height:var(--avatar-height);max-height:var(--avatar-height);width:var(--avatar-width);max-width:var(--avatar-width);border:solid var(--border-width) var(--border-color);margin:0 2px}.mat-mdc-table .mat-column-avatar ion-avatar svg{max-height:calc(var(--avatar-height) - 1px);max-width:calc(var(--avatar-width) - 1px)}.mat-mdc-table.compact{--mat-row-height: 33px}.mat-mdc-table.compact .mat-column-avatar{--avatar-width: calc(var(--mat-row-height, 33px) - 4px);--avatar-height: calc(var(--mat-row-height, 33px) - 4px)}.mat-mdc-table .mat-column-id{min-width:50px;max-width:120px;padding-right:var(--mat-cell-horizontal-padding, 4px)}.mat-mdc-table .mat-column-lastName,.mat-mdc-table .mat-column-firstName{min-width:80px}.mat-mdc-table .mat-column-email,.mat-mdc-table .mat-column-pubkey,.mat-mdc-table .mat-column-department{min-width:180px}.mat-mdc-table .mat-column-profile{min-width:110px}.mat-mdc-table .mat-column-status,.mat-mdc-table .mat-column-creationDate,.mat-mdc-table .mat-column-updateDate{min-width:130px}\n"] }]
357
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.AccountService }, { type: i3.ValidatorService }, { type: i4.ConfigService }, { type: i5.PersonService }, { type: i6.MessageService }, { type: i7.MenuService }, { type: undefined, decorators: [{
358
+ type: Inject,
359
+ args: [ENVIRONMENT]
360
+ }] }], propDecorators: { compact: [{
361
+ type: Input,
362
+ args: [{ transform: booleanAttribute }]
363
+ }], usePageSettings: [{
364
+ type: Input,
365
+ args: [{ transform: booleanAttribute }]
366
+ }], sticky: [{
367
+ type: Input,
368
+ args: [{ transform: booleanAttribute }]
369
+ }], stickyEnd: [{
370
+ type: Input,
371
+ args: [{ transform: booleanAttribute }]
372
+ }], canDownload: [{
373
+ type: Input,
374
+ args: [{ transform: booleanAttribute }]
375
+ }], filterExpansionPanel: [{
376
+ type: ViewChild,
377
+ args: [MatExpansionPanel, { static: true }]
378
+ }] } });
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2FkbWluL3VzZXJzL3VzZXJzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hZG1pbi91c2Vycy91c2Vycy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakksT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFckYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHaEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBdUIsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztB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K0NBQ2hCLGdCQUFnQixnQkFwQ3pCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLENBQUMsZ0ZBbUhwRSxpQkFBaUIscUZDbEo5Qix5c3VCQXFtQkEsMjlhRHJrQmMsQ0FBQyxvQkFBb0IsQ0FBQzs7NEZBR3ZCLFNBQVM7a0JBUnJCLFNBQVM7K0JBQ0UsaUJBQWlCLGFBR2hCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLENBQUMsY0FDbkUsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFDakIsdUJBQXVCLENBQUMsTUFBTTs7MEJBNkM1QyxNQUFNOzJCQUFDLFdBQVc7eUNBZm1CLE9BQU87c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxNQUFNO3NCQUE3QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsV0FBVztzQkFBbEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkErRVUsb0JBQW9CO3NCQUFuRSxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJvb2xlYW5BdHRyaWJ1dGUsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGVyc29uLCBQUklPUklUSVpFRF9BVVRIT1JJVElFUyB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvcGVyc29uLm1vZGVsJztcbmltcG9ydCB7IFN0YXR1c0J5SWQsIFN0YXR1c0xpc3QgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL3JlZmVyZW50aWFsLm1vZGVsJztcbmltcG9ydCB7IFBlcnNvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wZXJzb24uc2VydmljZSc7XG5pbXBvcnQgeyBQZXJzb25WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdG9yL3BlcnNvbi52YWxpZGF0b3InO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwcFRhYmxlIH0gZnJvbSAnLi4vLi4vY29yZS90YWJsZS90YWJsZS5jbGFzcyc7XG5pbXBvcnQgeyBWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IEZvcm1GaWVsZERlZmluaXRpb24sIEZvcm1GaWVsZERlZmluaXRpb25VdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbEtleUNoYW5nZWQsIGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRW50aXRpZXNUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9jb3JlL3RhYmxlL2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHsgZ2V0UHJvcGVydHlCeVBhdGgsIGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBQZXJzb25GaWx0ZXIgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWx0ZXIvcGVyc29uLmZpbHRlcic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25QYW5lbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQgeyBzbGlkZVVwRG93bkFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuLi8uLi9zb2NpYWwvbWVzc2FnZS9tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc29jaWFsL21lc3NhZ2UvbWVzc2FnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLCBUQUJMRV9TRVRUSU5HU19FTlVNIH0gZnJvbSAnLi4vLi4vY29yZS90YWJsZS90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbWVudS9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3N2VXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9jc3YudXRpbHMnO1xuaW1wb3J0IHsgZnJvbURhdGVJU09TdHJpbmcgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlcnMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJ3VzZXJzLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2Vycy5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVmFsaWRhdG9yU2VydmljZSwgdXNlRXhpc3Rpbmc6IFBlcnNvblZhbGlkYXRvclNlcnZpY2UgfV0sXG4gIGFuaW1hdGlvbnM6IFtzbGlkZVVwRG93bkFuaW1hdGlvbl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2Vyc1BhZ2UgZXh0ZW5kcyBBcHBUYWJsZTxQZXJzb24sIFBlcnNvbkZpbHRlcj4gaW1wbGVtZW50cyBPbkluaXQge1xuICByZWFkb25seSBjYW5FZGl0OiBib29sZWFuO1xuICByZWFkb25seSBjYW5TZW5kTWVzc2FnZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZmlsdGVyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgcmVhZG9ubHkgcHJvZmlsZXMgPSBbLi4uUFJJT1JJVElaRURfQVVUSE9SSVRJRVNdLnJldmVyc2UoKTtcbiAgcmVhZG9ubHkgc3RhdHVzTGlzdCA9IFN0YXR1c0xpc3Q7XG4gIHJlYWRvbmx5IHN0YXR1c0J5SWQgPSBTdGF0dXNCeUlkO1xuXG4gIHByb3RlY3RlZCBhZGRpdGlvbmFsRmllbGRzOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIHByb3RlY3RlZCBmaWx0ZXJDcml0ZXJpYUNvdW50ID0gMDtcbiAgcHJvdGVjdGVkIGRlZmF1bHRDb21wYWN0ID0gZmFsc2U7XG5cbiAgc2V0IHNob3dVc2VybmFtZUNvbHVtbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0U2hvd0NvbHVtbigndXNlcm5hbWUnLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd1VzZXJuYW1lQ29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFNob3dDb2x1bW4oJ3VzZXJuYW1lJyk7XG4gIH1cblxuICBzZXQgc2hvd1VzZXJuYW1lRXh0cmFuZXRDb2x1bW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3VzZXJuYW1lRXh0cmFuZXQnLCB2YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvd1VzZXJuYW1lRXh0cmFuZXRDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2hvd0NvbHVtbigndXNlcm5hbWVFeHRyYW5ldCcpO1xuICB9XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbXBhY3Q6IGJvb2xlYW4gPSBudWxsO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdXNlUGFnZVNldHRpbmdzID0gdHJ1ZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHN0aWNreSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc3RpY2t5RW5kID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjYW5Eb3dubG9hZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZGF0YVNlcnZpY2U6IFBlcnNvblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIGVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmNvbmNhdChbJ2F2YXRhcicsICdsYXN0TmFtZScsICdmaXJzdE5hbWUnLCAnZW1haWwnLCAncHJvZmlsZScsICdzdGF0dXMnLCAndXNlcm5hbWUnLCAndXNlcm5hbWVFeHRyYW5ldCcsICdwdWJrZXknXSlcbiAgICAgICAgLmNvbmNhdChhY2NvdW50U2VydmljZS5hZGRpdGlvbmFsRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLmtleSkpXG4gICAgICAgIC5jb25jYXQoWydjcmVhdGlvbkRhdGUnLCAndXBkYXRlRGF0ZSddKVxuICAgICAgICAuY29uY2F0KFJFU0VSVkVEX0VORF9DT0xVTU5TKSxcbiAgICAgIG5ldyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZShQZXJzb24sIGRhdGFTZXJ2aWNlLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICAgIHByZXBlbmROZXdFbGVtZW50czogZmFsc2UsXG4gICAgICAgIHN1cHByZXNzRXJyb3JzOiBlbnZpcm9ubWVudC5wcm9kdWN0aW9uLFxuICAgICAgICBzYXZlT25seURpcnR5Um93czogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgbnVsbFxuICAgICk7XG5cbiAgICB0aGlzLmNhbkVkaXQgPSBhY2NvdW50U2VydmljZS5pc0FkbWluKCk7XG4gICAgdGhpcy5jYW5TZW5kTWVzc2FnZSA9IHRoaXMuY2FuRWRpdDtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSB0aGlzLmNhbkVkaXQ7XG4gICAgdGhpcy5jb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgICB0aGlzLmF1dG9Mb2FkID0gZmFsc2U7IC8vIFdhaXQgY29uZmlnIGxvYWRpbmdcbiAgICB0aGlzLmkxOG5Db2x1bW5QcmVmaXggPSAnVVNFUi4nO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRCeSA9ICdsYXN0TmFtZSc7XG4gICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgc2VhcmNoVGV4dDogW251bGxdLFxuICAgICAgc3RhdHVzSWQ6IFtudWxsXSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9ICh0aGlzLmFjY291bnRTZXJ2aWNlLmFkZGl0aW9uYWxGaWVsZHMgfHwgW10pXG4gICAgICAuZmlsdGVyKChmaWVsZCkgPT4gaXNOb3ROaWwoZmllbGQuYXV0b2NvbXBsZXRlKSlcbiAgICAgIC5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBnZXQgdGhlIGZpbmFsIGF1dG9jb21wbGV0ZSBjb25maWcgKGUuZy4gd2l0aCBhIHN1Z2dlc3RGbiBmdW5jdGlvbilcbiAgICAgICAgZmllbGQuYXV0b2NvbXBsZXRlID0gdGhpcy5yZWdpc3RlckF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkLmtleSwge1xuICAgICAgICAgIC4uLmZpZWxkLmF1dG9jb21wbGV0ZSwgLy8gQ29weSwgdG8gYmUgc3VyZSB0aGUgb3JpZ2luYWwgY29uZmlnIGlzIHVuY2hhbmdlZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gcGFnZSBhY3Rpb24gKGUuZy4gZnJvbSBzdWIgbWVudSBpdGVtKVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZGlzdGluY3RVbnRpbEtleUNoYW5nZWQoJ2FjdGlvbicpKS5zdWJzY3JpYmUoKHF1ZXJ5UGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHF1ZXJ5UGFyYW1zWydhY3Rpb24nXSB8fCAnbm9uZSc7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgY2FzZSAnc2VuZCc6XG4gICAgICAgICAgICB0aGlzLm9wZW5Db21wb3NlTWVzc2FnZU1vZGFsKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1t1c2Vyc10gVW5rbm93biBhY3Rpb249JyArIGFjdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBNYXJrIGFzIGNvbnN1bWVkXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLiddLCB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICBxdWVyeVBhcmFtczogeyAuLi5xdWVyeVBhcmFtcywgYWN0aW9uOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiB7IGFuaW1hdGVkOiBmYWxzZSB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEZvciBERVYgb25seSAtLVxuICAgIHRoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoTWF0RXhwYW5zaW9uUGFuZWwsIHsgc3RhdGljOiB0cnVlIH0pIGZpbHRlckV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcblxuICBnZXQgZmlyc3RVc2VyQ29sdW1uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMuZGlzcGxheWVkQ29sdW1uc1tSRVNFUlZFRF9TVEFSVF9DT0xVTU5TLmxlbmd0aF07XG4gICAgLy8gU2tpcCBhdmF0YXIgY29sdW1uLCBpZiBwcmVzZW50XG4gICAgcmV0dXJuIChjb2x1bW5OYW1lID09PSAnYXZhdGFyJyAmJiB0aGlzLmRpc3BsYXllZENvbHVtbnNbUkVTRVJWRURfU1RBUlRfQ09MVU1OUy5sZW5ndGggKyAxXSkgfHwgY29sdW1uTmFtZTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoKGNvbmZpZykgPT4ge1xuICAgICAgICBjb25zdCBhdXRoVG9rZW5UeXBlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbdXNlcnNdIEF1dGhUb2tlblR5cGU9JyArIGF1dGhUb2tlblR5cGUpO1xuICAgICAgICBzd2l0Y2ggKGF1dGhUb2tlblR5cGUpIHtcbiAgICAgICAgICBjYXNlICdiYXNpYyc6XG4gICAgICAgICAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3B1YmtleScsIGZhbHNlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3VzZXJuYW1lJywgdHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93Q29sdW1uKCd1c2VybmFtZUV4dHJhbmV0JywgdHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYmFzaWMtYW5kLXRva2VuJzpcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigncHVia2V5JywgdHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93Q29sdW1uKCd1c2VybmFtZScsIHRydWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigndXNlcm5hbWVFeHRyYW5ldCcsIHRydWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Rva2VuJzpcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0NvbHVtbigncHVia2V5JywgdHJ1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93Q29sdW1uKCd1c2VybmFtZScsIGZhbHNlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3VzZXJuYW1lRXh0cmFuZXQnLCBmYWxzZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLmVtaXRSZWZyZXNoKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5vblJlZnJlc2guc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXIgd2hlbiBjaGFuZ2VzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyRm9ybS52YWxpZCksXG4gICAgICAgICAgdGFwKChqc29uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBQZXJzb25GaWx0ZXIuZnJvbU9iamVjdChqc29uKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ3JpdGVyaWFDb3VudCA9IGZpbHRlci5jb3VudE5vdEVtcHR5Q3JpdGVyaWEoKTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGZpbHRlciwgd2l0aG91dCByZWxvYWRpbmcgdGhlIGNvbnRlbnRcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFNhdmUgZmlsdGVyIGluIHNldHRpbmdzIChhZnRlciBhIGRlYm91bmNlIHRpbWUpXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IGlzTm90TmlsT3JCbGFuayh0aGlzLnNldHRpbmdzSWQpICYmIHRoaXMudXNlUGFnZVNldHRpbmdzKSxcbiAgICAgICAgICB0YXAoKGpzb24pID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgVEFCTEVfU0VUVElOR1NfRU5VTS5GSUxURVJfS0VZKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuY2FuU2VuZE1lc3NhZ2UgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgYXdhaXQgdGhpcy5tZW51U2VydmljZS5hZGRTdWJNZW51SXRlbXMoXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXJlbnRQYXRoOiAnL2FkbWluL3VzZXJzJyxcbiAgICAgICAgICAgIHBhdGg6ICcvYWRtaW4vdXNlcnMnLFxuICAgICAgICAgICAgcGF0aFBhcmFtczogeyBhY3Rpb246ICdleHBhbmQnIH0sXG4gICAgICAgICAgICBtYXRJY29uOiAnZXhwYW5kX21vcmUnLFxuICAgICAgICAgICAgdGl0bGU6ICdVU0VSLkxJU1QuQlROX0FDVElPTlMnLFxuICAgICAgICAgICAgYWN0aW9uOiAnZXhwYW5kJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhcmVudFBhdGg6ICcvYWRtaW4vdXNlcnM/YWN0aW9uPWV4cGFuZCcsXG4gICAgICAgICAgICBwYXRoOiAnL2FkbWluL3VzZXJzP2FjdGlvbj1zZW5kJyxcbiAgICAgICAgICAgIGljb246ICdtYWlsJyxcbiAgICAgICAgICAgIHRpdGxlOiAnVVNFUi5MSVNULkJUTl9TRU5EX01FU1NBR0UnLFxuICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm9wZW5Db21wb3NlTWVzc2FnZU1vZGFsKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBza2lwSWZFeGlzdHM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBjb21wYWN0IHJvd3NcbiAgICB0aGlzLnJlc3RvcmVDb21wYWN0TW9kZSgpO1xuXG4gICAgLy8gUmVzdG9yZSBmaWx0ZXIgZnJvbSBzZXR0aW5ncywgb3IgbG9hZCBhbGxcbiAgICB0aGlzLnJlc3RvcmVGaWx0ZXJPckxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IEV2ZW50KSB7XG4gICAgdGhpcy5lbWl0UmVmcmVzaChldmVudCk7XG4gICAgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMudG90YWxSb3dDb3VudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xuICAgIHRoaXMuc2V0RmlsdGVyKG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVGaWx0ZXJPckxvYWQoKSB7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbdXNlcnNdIFJlc3RvcmluZyBmaWx0ZXIgZnJvbSBzZXR0aW5ncy4uLicpO1xuXG4gICAgY29uc3QganNvbiA9IHRoaXMuc2V0dGluZ3MuZ2V0UGFnZVNldHRpbmdzKHRoaXMuc2V0dGluZ3NJZCwgVEFCTEVfU0VUVElOR1NfRU5VTS5GSUxURVJfS0VZKSB8fCB7fTtcbiAgICBjb25zdCBmaWx0ZXIgPSBQZXJzb25GaWx0ZXIuZnJvbU9iamVjdChqc29uKTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKGpzb24pO1xuICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuICBjbGVhckNvbnRyb2xWYWx1ZShldmVudDogRXZlbnQsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBBdm9pZCB0byBlbnRlciBpbnB1dCB0aGUgZmllbGRcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBvcGVuQ29tcG9zZU1lc3NhZ2VNb2RhbChldmVudD86IEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBDb21wdXRlIHJlY2lwaWVudHNcbiAgICBjb25zdCByZWNpcGllbnRzID0gKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkIHx8IFtdKVxuICAgICAgLm1hcCgocm93KSA9PiByb3cuY3VycmVudERhdGEpXG4gICAgICAubWFwKFBlcnNvbi5mcm9tT2JqZWN0KVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwLmFzT2JqZWN0KHsgbWluaWZ5OiB0cnVlIH0pO1xuICAgICAgICB0YXJnZXQuZGVwYXJ0bWVudCA9IHAuZGVwYXJ0bWVudD8uYXNPYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcmVjaXBpZW50RmlsdGVyID0gUGVyc29uRmlsdGVyLmZyb21PYmplY3QodGhpcy5maWx0ZXIpO1xuICAgIGNvbnN0IGNhblJlY2lwaWVudEZpbHRlciA9ICFyZWNpcGllbnRGaWx0ZXIuaXNFbXB0eSgpICYmICh0aGlzLmFjY291bnRTZXJ2aWNlLmlzQWRtaW4oKSB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmlzU3VwZXJ2aXNvcigpKTtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlU2VydmljZS5vcGVuQ29tcG9zZU1vZGFsKHtcbiAgICAgIHN1Z2dlc3RGbjogKHZhbHVlLCBmaWx0ZXIsIHNvcnRCeSwgc29ydERpcmVjdGlvbikgPT4gdGhpcy5kYXRhU2VydmljZS5zdWdnZXN0KHZhbHVlLCBmaWx0ZXIsIHNvcnRCeSwgc29ydERpcmVjdGlvbiksXG4gICAgICBjYW5SZWNpcGllbnRGaWx0ZXIsXG4gICAgICByZWNpcGllbnRGaWx0ZXJDb3VudDogdGhpcy50b3RhbFJvd0NvdW50LFxuICAgICAgZGF0YTogTWVzc2FnZS5mcm9tT2JqZWN0KHtcbiAgICAgICAgcmVjaXBpZW50cyxcbiAgICAgICAgcmVjaXBpZW50RmlsdGVyLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZXN0b3JlQ29tcGFjdE1vZGUob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLnVzZVBhZ2VTZXR0aW5ncyB8fCBpc05pbE9yQmxhbmsodGhpcy5zZXR0aW5nc0lkKSB8fCBpc05vdE5pbCh0aGlzLmNvbXBhY3QpKSByZXR1cm47XG5cbiAgICBjb25zdCBjb21wYWN0ID0gdG9Cb29sZWFuKFxuICAgICAgdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCBUQUJMRV9TRVRUSU5HU19FTlVNLkNPTVBBQ1RfUk9XU19LRVkpLFxuICAgICAgdG9Cb29sZWFuKHRoaXMuY29tcGFjdCwgdGhpcy5kZWZhdWx0Q29tcGFjdClcbiAgICApO1xuICAgIGlmICh0aGlzLmNvbXBhY3QgIT09IGNvbXBhY3QpIHtcbiAgICAgIHRoaXMuY29tcGFjdCA9IGNvbXBhY3Q7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB0b2dnbGVDb21wYWN0TW9kZSgpIHtcbiAgICB0aGlzLmNvbXBhY3QgPSAhdGhpcy5jb21wYWN0O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAcngtYW5ndWxhci9uby1leHBsaWNpdC1jaGFuZ2UtZGV0ZWN0aW9uLWFwaXNcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmICh0aGlzLnVzZVBhZ2VTZXR0aW5ncyAmJiBpc05vdE5pbE9yQmxhbmsodGhpcy5zZXR0aW5nc0lkKSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlUGFnZVNldHRpbmdzKHRoaXMuY29tcGFjdCwgVEFCTEVfU0VUVElOR1NfRU5VTS5DT01QQUNUX1JPV1NfS0VZKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleHBvcnRUb0NzdihldmVudDogRXZlbnQpIHtcbiAgICAvLyBQcmVwYXJlIENTViBvcHRpb25zXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gQ3N2VXRpbHMuZ2V0TG9jYWxpemVkU2VwYXJhdG9yKHRoaXMudHJhbnNsYXRlKTtcbiAgICBjb25zdCBlbmNvZGluZyA9IENzdlV0aWxzLmdldExvY2FsaXplZEVuY29kaW5nKHRoaXMudHJhbnNsYXRlKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFtcbiAgICAgICdDT01NT04uREFURV9USU1FX1BBVFRFUk4nLFxuICAgICAgJ1VTRVIuTElTVC5USVRMRScsXG4gICAgICAnVVNFUi5FTUFJTCcsXG4gICAgICAnVVNFUi5GSVJTVF9OQU1FJyxcbiAgICAgICdVU0VSLkxBU1RfTkFNRScsXG4gICAgICAnVVNFUi5VU0VSTkFNRScsXG4gICAgICAnVVNFUi5VU0VSTkFNRV9FWFRSQU5FVCcsXG4gICAgICAnVVNFUi5ERVBBUlRNRU5UX0xBQkVMJyxcbiAgICAgICdVU0VSLkRFUEFSVE1FTlRfTkFNRScsXG4gICAgICAnVVNFUi5QUk9GSUxFJyxcbiAgICAgICdVU0VSLlNUQVRVUycsXG4gICAgICAnVVNFUi5QVUJLRVknLFxuICAgICAgLi4uKHRoaXMuYWRkaXRpb25hbEZpZWxkcyB8fCBbXSkubWFwKChmaWVsZCkgPT4gZmllbGQubGFiZWwpLFxuICAgICAgJ1VTRVIuQ1JFQVRJT05fREFURScsXG4gICAgICAnVVNFUi5VUERBVEVfREFURScsXG4gICAgICAuLi50aGlzLnN0YXR1c0xpc3QubWFwKChzdGF0dXMpID0+IHN0YXR1cy5sYWJlbCksXG4gICAgXSk7XG4gICAgY29uc3QgZGF0ZVRpbWVQYXR0ZXJuID0gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9USU1FX1BBVFRFUk4nXTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRyYW5zbGF0aW9uc1snVVNFUi5MSVNULlRJVExFJ10gKyAnLmNzdic7XG4gICAgY29uc3QgaGVhZGVycyA9IFtcbiAgICAgIHRyYW5zbGF0aW9uc1snVVNFUi5FTUFJTCddLFxuICAgICAgdHJhbnNsYXRpb25zWydVU0VSLkZJUlNUX05BTUUnXSxcbiAgICAgIHRyYW5zbGF0aW9uc1snVVNFUi5MQVNUX05BTUUnXSxcbiAgICAgIC4uLih0aGlzLnNob3dVc2VybmFtZUNvbHVtbiA/IFt0cmFuc2xhdGlvbnNbJ1VTRVIuVVNFUk5BTUUnXV0gOiBbXSksXG4gICAgICAuLi4odGhpcy5zaG93VXNlcm5hbWVFeHRyYW5ldENvbHVtbiA/IFt0cmFuc2xhdGlvbnNbJ1VTRVIuVVNFUk5BTUVfRVhUUkFORVQnXV0gOiBbXSksXG4gICAgICB0cmFuc2xhdGlvbnNbJ1VTRVIuUFJPRklMRSddLFxuICAgICAgdHJhbnNsYXRpb25zWydVU0VSLlNUQVRVUyddLFxuICAgICAgdHJhbnNsYXRpb25zWydVU0VSLlBVQktFWSddLFxuICAgICAgLi4uKHRoaXMuYWRkaXRpb25hbEZpZWxkcyB8fCBbXSkubWFwKChmaWVsZCkgPT4gdHJhbnNsYXRpb25zW2ZpZWxkLmxhYmVsXSksXG4gICAgICB0cmFuc2xhdGlvbnNbJ1VTRVIuQ1JFQVRJT05fREFURSddLFxuICAgICAgdHJhbnNsYXRpb25zWydVU0VSLlVQREFURV9EQVRFJ10sXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHNGbnMgPSAodGhpcy5hZGRpdGlvbmFsRmllbGRzIHx8IFtdKS5tYXAoRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLmdldERpc3BsYXlWYWx1ZUZuKTtcblxuICAgIGNvbnN0IHJvd3MgPSAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpID8gdGhpcy5kYXRhU291cmNlLmdldFJvd3MoKSA6IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKVxuICAgICAgLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5jdXJyZW50RGF0YSlcbiAgICAgIC5tYXAoKHBlcnNvbikgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnN0YXR1c0J5SWRbcGVyc29uLnN0YXR1c0lkXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBwZXJzb24ubGFzdE5hbWUsXG4gICAgICAgICAgcGVyc29uLmZpcnN0TmFtZSxcbiAgICAgICAgICBwZXJzb24uZW1haWwsXG4gICAgICAgICAgLi4uKHRoaXMuc2hvd1VzZXJuYW1lQ29sdW1uID8gW3BlcnNvbi51c2VybmFtZV0gOiBbXSksXG4gICAgICAgICAgLi4uKHRoaXMuc2hvd1VzZXJuYW1lRXh0cmFuZXRDb2x1bW4gPyBbcGVyc29uLnVzZXJuYW1lRXh0cmFuZXRdIDogW10pLFxuICAgICAgICAgIHBlcnNvbi5tYWluUHJvZmlsZSxcbiAgICAgICAgICBzdGF0dXMgPyB0cmFuc2xhdGlvbnNbc3RhdHVzPy5sYWJlbF0gOiBudWxsLFxuICAgICAgICAgIHBlcnNvbi5wdWJrZXksXG4gICAgICAgICAgLi4uYWRkaXRpb25hbEZpZWxkc0Zucy5tYXAoKGRpc3BsYXlGbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0UHJvcGVydHlCeVBhdGgocGVyc29uLCB0aGlzLmFkZGl0aW9uYWxGaWVsZHNbaW5kZXhdLmtleSk7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbdXNlcnNdIEFkZGl0aW9uYWwgZmllbGQgZGlzcGxheUZuJywgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXlGbih2YWx1ZSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgZnJvbURhdGVJU09TdHJpbmcocGVyc29uLmNyZWF0aW9uRGF0ZSkuZm9ybWF0KGRhdGVUaW1lUGF0dGVybiksXG4gICAgICAgICAgZnJvbURhdGVJU09TdHJpbmcocGVyc29uLnVwZGF0ZURhdGUpLmZvcm1hdChkYXRlVGltZVBhdHRlcm4pLFxuICAgICAgICBdO1xuICAgICAgfSk7XG5cbiAgICBDc3ZVdGlscy5leHBvcnRUb0ZpbGUocm93cywgeyBmaWxlbmFtZSwgaGVhZGVycywgc2VwYXJhdG9yLCBlbmNvZGluZyB9KTtcbiAgfVxufVxuIiwiPGFwcC10b29sYmFyXG4gIFt0aXRsZV09XCInVVNFUi5MSVNULlRJVExFJyB8IHRyYW5zbGF0ZVwiXG4gIGNvbG9yPVwicHJpbWFyeVwiXG4gIFtjYW5Hb0JhY2tdPVwiZmFsc2VcIlxuICBbaGFzVmFsaWRhdGVdPVwiKGxvYWRpbmdTdWJqZWN0IHwgYXN5bmMpICE9PSB0cnVlICYmIChkaXJ0eVN1YmplY3QgfCBhc3luYykgPT09IHRydWVcIlxuICAob25WYWxpZGF0ZSk9XCJzYXZlKClcIlxuPlxuICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgIDwhLS0gQ29tcG9zZSBtZXNzYWdlIC0tPlxuICAgIDxidXR0b25cbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJjYW5TZW5kTWVzc2FnZVwiXG4gICAgICBbdGl0bGVdPVwiJ1VTRVIuTElTVC5CVE5fU0VORF9NRVNTQUdFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAoY2xpY2spPVwib3BlbkNvbXBvc2VNZXNzYWdlTW9kYWwoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJtYWlsXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgICBAaWYgKHNlbGVjdGlvbiB8IGlzRW1wdHlTZWxlY3Rpb24pIHtcbiAgICAgIDwhLS0gQWRkIC0tPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJjYW5FZGl0ICYmICFtb2JpbGVcIiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIFJlZnJlc2ggLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAqbmdJZj1cIiFtb2JpbGVcIiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fUkVGUkVTSCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiZW1pdFJlZnJlc2goKVwiPlxuICAgICAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSByZXNldCBmaWx0ZXIgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiICpuZ0lmPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiPlxuICAgICAgICA8bWF0LWljb24gY29sb3I9XCJhY2NlbnRcIj5maWx0ZXJfbGlzdF9hbHQ8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMTZweDsgdG9wOiA1cHg7IGZvbnQtd2VpZ2h0OiBib2xkXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwhLS0gc2hvdyBmaWx0ZXIgLS0+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZmlsdGVyRXhwYW5zaW9uUGFuZWwudG9nZ2xlKClcIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJmaWx0ZXJDcml0ZXJpYUNvdW50OyBlbHNlIGVtcHR5RmlsdGVyXCJcbiAgICAgICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiXG4gICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgbWF0QmFkZ2VTaXplPVwic21hbGxcIlxuICAgICAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJmYWxzZVwiXG4gICAgICAgID5cbiAgICAgICAgICBmaWx0ZXJfbGlzdF9hbHRcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpbHRlcj5cbiAgICAgICAgICA8bWF0LWljb24+ZmlsdGVyX2xpc3RfYWx0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPCEtLSBkZWxldGUgLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBjbGFzcz1cImhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmICghbW9iaWxlKSB7XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fT1BUSU9OUycgfCB0cmFuc2xhdGVcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidG9vbGJhck9wdGlvbnNNZW51XCI+XG4gICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2lvbi1idXR0b25zPlxuPC9hcHAtdG9vbGJhcj5cblxuPCEtLSBUb29sYmFyIG9wdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN0b29sYmFyT3B0aW9uc01lbnU9XCJtYXRNZW51XCIgeFBvc2l0aW9uPVwiYWZ0ZXJcIj5cbiAgPCEtLSBleHBvcnQgYnV0dG9uIC0tPlxuICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIiFjYW5Eb3dubG9hZFwiIChjbGljayk9XCJleHBvcnRUb0NzdigkZXZlbnQpXCI+XG4gICAgPG1hdC1pY29uPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5GSUxFLkNTVi5CVE5fRE9XTkxPQURfSEVMUDwvaW9uLWxhYmVsPlxuICA8L2J1dHRvbj5cbjwvbWF0LW1lbnU+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbVxuICAgICpuZ0lmPVwiZXJyb3JTdWJqZWN0IHwgYXN5bmM7IGxldCBlcnJvclwiXG4gICAgbGluZXM9XCJub25lXCJcbiAgICBjbGFzcz1cImhpZGRlbi1zbSBoaWRkZW4teHMgaGlkZGVuLW1vYmlsZVwiXG4gICAgQHNsaWRlVXBEb3duQW5pbWF0aW9uXG4gID5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3IgfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgPC9pb24taXRlbT5cblxuICA8IS0tIGRlYnVnIC0tPlxuICA8YXBwLWRlYnVnICpuZ0lmPVwiZGVidWdcIj5cbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIGZvY3VzQ29sdW1uOiB7eyBmb2N1c0NvbHVtbiB9fVxuICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIGxvYWRpbmdTdWJqZWN0OiB7eyBsb2FkaW5nIH19XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuICA8L2FwcC1kZWJ1Zz5cblxuICA8IS0tIHNlYXJjaCAtLT5cbiAgPG1hdC1leHBhbnNpb24tcGFuZWwgI2ZpbHRlckV4cGFuc2lvblBhbmVsIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgZmlsdGVyLXBhbmVsIGZpbHRlci1wYW5lbC1mbG9hdGluZ1wiPlxuICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1jb250YWluZXIgaW9uLXBhZGRpbmdcIiBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiAobmdTdWJtaXQpPVwiZW1pdFJlZnJlc2goKVwiPlxuICAgICAgPGlvbi1ncmlkPlxuICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgIDwhLS0gc2VhcmNoIC0tPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdVU0VSLkxJU1QuRklMVEVSLlNFQVJDSCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFRleHRcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQ29udHJvbFZhbHVlKCRldmVudCwgZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0KVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQuZGlzYWJsZWQgfHwgIWZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dC52YWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8IS0tIHN0YXR1cyAtLT5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnVVNFUi5TVEFUVVMnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInN0YXR1c0lkXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm51bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxpPjxzcGFuIHRyYW5zbGF0ZT5DT01NT04uRU1QVFlfT1BUSU9OPC9zcGFuPjwvaT5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3RhdHVzTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmlkXCI+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQ29udHJvbFZhbHVlKCRldmVudCwgZmlsdGVyRm9ybS5jb250cm9scy5zdGF0dXNJZClcIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZmlsdGVyRm9ybS5jb250cm9scy5zdGF0dXNJZC5kaXNhYmxlZCB8fCAhZmlsdGVyRm9ybS5jb250cm9scy5zdGF0dXNJZC52YWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi1ncmlkPlxuICAgIDwvZm9ybT5cblxuICAgIDxtYXQtYWN0aW9uLXJvdz5cbiAgICAgIDwhLS0gQ291bnRlciAgLS0+XG4gICAgICA8aW9uLWxhYmVsXG4gICAgICAgIFtoaWRkZW5dPVwiKGxvYWRpbmdTdWJqZWN0IHwgYXN5bmMpID09PSB0cnVlIHx8IGZpbHRlckZvcm0uZGlydHlcIlxuICAgICAgICBbY29sb3JdPVwiZW1wdHkgJiYgJ2RhbmdlcidcIlxuICAgICAgICBjbGFzcz1cImlvbi1wYWRkaW5nXCJcbiAgICAgID5cbiAgICAgICAge3tcbiAgICAgICAgICAodG90YWxSb3dDb3VudCA/ICdDT01NT04uUkVTVUxUX0NPVU5UJyA6ICdDT01NT04uTk9fUkVTVUxUJylcbiAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgY291bnQ6ICh0b3RhbFJvd0NvdW50IHwgbnVtYmVyRm9ybWF0KSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICA8L2lvbi1sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItc3BhY2VyXCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgcGFuZWwgLS0+XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgIChjbGljayk9XCJmaWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmNcIlxuICAgICAgPlxuICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ0xPU0U8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICA8IS0tIFNlYXJjaCBidXR0b24gLS0+XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIFtjb2xvcl09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3RlcnRpYXJ5JyA6ICdkYXJrJ1wiXG4gICAgICAgIFtmaWxsXT1cImZpbHRlckZvcm0uZGlydHkgPyAnc29saWQnIDogJ2NsZWFyJ1wiXG4gICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlckFuZENsb3NlUGFuZWwoJGV2ZW50KVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nU3ViamVjdCB8IGFzeW5jXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi10ZXh0IHRyYW5zbGF0ZT5DT01NT04uQlROX0FQUExZPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L21hdC1hY3Rpb24tcm93PlxuICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG5cbiAgPCEtLSBlcnJvciAtLT5cbiAgPGlvbi1pdGVtICpuZ0lmPVwibW9iaWxlICYmIChlcnJvclN1YmplY3QgfCBhc3luYyk7IGxldCBlcnJvclwiIGxpbmVzPVwibm9uZVwiPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICA8dGFibGVcbiAgICAgICN0YWJsZVxuICAgICAgbWF0LXRhYmxlXG4gICAgICBtYXRTb3J0XG4gICAgICBbY2xhc3MuY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgW21hdFNvcnRBY3RpdmVdPVwiZGVmYXVsdFNvcnRCeVwiXG4gICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJkZWZhdWx0U29ydERpcmVjdGlvblwiXG4gICAgICBtYXRTb3J0RGlzYWJsZUNsZWFyXG4gICAgICBbdHJhY2tCeV09XCJ0cmFja0J5Rm5cIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCIgW3N0aWNreV09XCJzdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhaW5saW5lRWRpdGlvblwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInRoaXMgfCBpc0FsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInRoaXMgfCBpc05vdEFsbFNlbGVjdGVkXCJcbiAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhaW5saW5lRWRpdGlvblwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cInRvZ2dsZVNlbGVjdFJvdygkZXZlbnQsIHJvdylcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24gfCBpc1NlbGVjdGVkOiByb3dcIj48L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIElkIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIiBbc3RpY2t5XT1cInN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPiM8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgcm93LmN1cnJlbnREYXRhLmlkIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBhdmF0YXIgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhdmF0YXJcIiBbc3RpY2t5XT1cInN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICA8aW9uLWF2YXRhciBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCInd2hpdGUnXCI+XG4gICAgICAgICAgICA8aW9uLWltZyAqbmdJZj1cInJvdy5jdXJyZW50RGF0YS5hdmF0YXI7IGxldCBhdmF0YXJVcmw7IGVsc2U6IGdlbmVyYXRlSWNvblwiIFtzcmNdPVwiYXZhdGFyVXJsXCI+PC9pb24taW1nPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNnZW5lcmF0ZUljb24+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgW2RhdGEtamRlbnRpY29uLXZhbHVlXT1cInJvdy5jdXJyZW50RGF0YS5pZFwiPjwvc3ZnPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2lvbi1hdmF0YXI+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBsYXN0TmFtZSAgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3ROYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLkxBU1RfTkFNRTwvc3Bhbj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJmb2N1c0NvbHVtbiA9ICdsYXN0TmFtZSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSByZWFkb25seUNlbGxcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snbGFzdE5hbWUnXVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVVNFUi5MQVNUX05BTUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwicm93LmVkaXRpbmcgJiYgZm9jdXNDb2x1bW4gPT09ICdsYXN0TmFtZSdcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydsYXN0TmFtZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICBFUlJPUi5GSUVMRF9SRVFVSVJFRFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snbGFzdE5hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgJ0VSUk9SLkZJRUxEX01JTl9MRU5HVEgnIHwgdHJhbnNsYXRlOiB7IHJlcXVpcmVkTGVuZ3RoOiAyIH0gfX08L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhZG9ubHlDZWxsPlxuICAgICAgICAgICAgPGlvbi1sYWJlbCBhcHBBdXRvVGl0bGU+XG4gICAgICAgICAgICAgIHt7IHJvdy52YWxpZGF0b3IgfCBmb3JtR2V0VmFsdWU6ICdsYXN0TmFtZScgfX1cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBmaXJzdG5hbWUgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImZpcnN0TmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+VVNFUi5GSVJTVF9OQU1FPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uID0gJ2ZpcnN0TmFtZSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSByZWFkb25seUNlbGxcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snZmlyc3ROYW1lJ11cIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuRklSU1RfTkFNRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiIXJvdy5lZGl0aW5nXCJcbiAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJyb3cuZWRpdGluZyAmJiBmb2N1c0NvbHVtbiA9PT0gJ2ZpcnN0TmFtZSdcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ2ZpcnN0TmFtZSddLmhhc0Vycm9yKCdtaW5sZW5ndGgnKVwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyAnRVJST1IuRklFTERfTUlOX0xFTkdUSCcgfCB0cmFuc2xhdGU6IHsgcmVxdWlyZWRMZW5ndGg6IDIgfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkb25seUNlbGw+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGFwcEF1dG9UaXRsZT5cbiAgICAgICAgICAgICAge3sgcm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ2ZpcnN0TmFtZScgfX1cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBlbWFpbCAgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImVtYWlsXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLkVNQUlMPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uID0gJ2VtYWlsJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInJvdy5lZGl0aW5nOyBlbHNlIHJlYWRvbmx5Q2VsbFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydlbWFpbCddXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLkVNQUlMJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cInJvdy5lZGl0aW5nICYmIGZvY3VzQ29sdW1uID09PSAnZW1haWwnXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9sc1snZW1haWwnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ2VtYWlsJylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9FTUFJTDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkb25seUNlbGw+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGFwcEF1dG9UaXRsZT5cbiAgICAgICAgICAgICAge3sgcm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ2VtYWlsJyB9fVxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGFkZGl0aW9uYWwgZmllbGRzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBhZGRpdGlvbmFsRmllbGRzXCIgW21hdENvbHVtbkRlZl09XCJkZWZpbml0aW9uLmtleVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgIDxzcGFuPnt7IGRlZmluaXRpb24ubGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwiZm9jdXNDb2x1bW4gPSBkZWZpbml0aW9uLmtleVwiPlxuICAgICAgICAgIDxhcHAtZm9ybS1maWVsZFxuICAgICAgICAgICAgZmxvYXRMYWJlbD1cIm5ldmVyXCJcbiAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRlZmluaXRpb25cIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbZGVmaW5pdGlvbi5rZXldXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJkZWZpbml0aW9uLmV4dHJhPy5hY2NvdW50Py5yZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInJvdy5lZGl0aW5nICYmIGZvY3VzQ29sdW1uID09PSBkZWZpbml0aW9uLmtleVwiXG4gICAgICAgICAgPjwvYXBwLWZvcm0tZmllbGQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBwcm9maWxlIGNvbHVtbiAgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2ZpbGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+VVNFUi5QUk9GSUxFPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uID0gJ3Byb2ZpbGUnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ21haW5Qcm9maWxlJ11cIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuUFJPRklMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcm9maWxlc1wiIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAge3sgJ1VTRVIuUFJPRklMRV9FTlVNLicgKyBpdGVtIHwgdXBwZXJjYXNlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydtYWluUHJvZmlsZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICBFUlJPUi5GSUVMRF9SRVFVSVJFRFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFN0YXR1cyBjb2x1bW4gIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdGF0dXNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+VVNFUi5TVEFUVVM8L3NwYW4+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwiZm9jdXNDb2x1bW4gPSAnc3RhdHVzJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzWydzdGF0dXNJZCddXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidSRUZFUkVOVElBTC5TVEFUVVMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWUgJmd0Oz0wXCI+XG4gICAgICAgICAgICAgICAgICB7eyBzdGF0dXNCeUlkW3Jvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10udmFsdWVdPy5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN0YXR1c0xpc3RcIiBbdmFsdWVdPVwiaXRlbS5pZFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj48aW9uLWljb24gW25hbWVdPVwiaXRlbS5pY29uXCI+PC9pb24taWNvbj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHNbJ3N0YXR1c0lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgIEVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gdXNlcm5hbWUgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJuYW1lXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLlVTRVJOQU1FPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uID0gJ3VzZXJuYW1lJ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInJvdy5lZGl0aW5nOyBlbHNlIHJlYWRvbmx5Q2VsbFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidVU0VSLlVTRVJOQU1FJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cInJvdy5lZGl0aW5nICYmIGZvY3VzQ29sdW1uID09PSAndXNlcm5hbWUnXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9scy51c2VybmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkb25seUNlbGw+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGFwcEF1dG9UaXRsZT5cbiAgICAgICAgICAgICAge3sgcm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ3VzZXJuYW1lJyB9fVxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIHVzZXJuYW1lIGV4dHJhbmV0IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VybmFtZUV4dHJhbmV0XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5VU0VSLlVTRVJOQU1FX0VYVFJBTkVUPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cImZvY3VzQ29sdW1uID0gJ3VzZXJuYW1lRXh0cmFuZXQnXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicm93LmVkaXRpbmc7IGVsc2UgcmVhZG9ubHlDZWxsXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHMudXNlcm5hbWVFeHRyYW5ldFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInVVNFUi5VU0VSTkFNRV9FWFRSQU5FVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiIXJvdy5lZGl0aW5nXCJcbiAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJyb3cuZWRpdGluZyAmJiBmb2N1c0NvbHVtbiA9PT0gJ3VzZXJuYW1lRXh0cmFuZXQnXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicm93LnZhbGlkYXRvci5jb250cm9scy51c2VybmFtZUV4dHJhbmV0Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICBFUlJPUi5GSUVMRF9SRVFVSVJFRFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3JlYWRvbmx5Q2VsbD5cbiAgICAgICAgICAgIDxpb24tbGFiZWwgYXBwQXV0b1RpdGxlPlxuICAgICAgICAgICAgICB7eyByb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlOiAndXNlcm5hbWVFeHRyYW5ldCcgfX1cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBwdWJrZXkgIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwdWJrZXlcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlVTRVIuUFVCS0VZPC9zcGFuPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGRcbiAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgW3RpdGxlXT1cInJvdy52YWxpZGF0b3IuY29udHJvbHMucHVia2V5LnZhbHVlQ2hhbmdlcyB8IGFzeW5jXCJcbiAgICAgICAgICAoY2xpY2spPVwiZm9jdXNDb2x1bW4gPSAncHVia2V5J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSByZWFkb25seUNlbGxcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicm93LnZhbGlkYXRvci5jb250cm9sc1sncHVia2V5J11cIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuUFVCS0VZJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCIhcm93LmVkaXRpbmdcIlxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJyb3cudmFsaWRhdG9yLmNvbnRyb2xzLnB1YmtleS5oYXNFcnJvcigncmVxdWlyZWQnKVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInJvdy52YWxpZGF0b3IuY29udHJvbHMucHVia2V5Lmhhc0Vycm9yKCdwdWJrZXknKVwiPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX1BVQktFWTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkb25seUNlbGw+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGFwcEF1dG9UaXRsZT5cbiAgICAgICAgICAgICAge3sgcm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ3B1YmtleScgfX1cbiAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDcmVhdGlvbiBkYXRlIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRpb25EYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPlVTRVIuQ1JFQVRJT05fREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZFwiPlxuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi10ZXh0LWVuZFwiIGNvbG9yPVwibWVkaXVtXCIgKm5nSWY9XCJyb3cuaWQgIT09IC0xXCI+XG4gICAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEuY3JlYXRpb25EYXRlIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0gfX1cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gVXBkYXRlIGRhdGUgY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1cGRhdGVEYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPlVTRVIuVVBEQVRFX0RBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIj5cbiAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tdGV4dC1lbmRcIiBjb2xvcj1cIm1lZGl1bVwiICpuZ0lmPVwicm93LmlkICE9PSAtMVwiPlxuICAgICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhLnVwZGF0ZURhdGUgfCBkYXRlRm9ybWF0OiB7IHRpbWU6IHRydWUgfSB9fVxuICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtblxuICAgICAgICBbc3RpY2t5RW5kXT1cInN0aWNreUVuZFwiXG4gICAgICAgIChjYW5jZWxPckRlbGV0ZUNsaWNrKT1cImNhbmNlbE9yRGVsZXRlKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoY29uZmlybUVkaXRDcmVhdGVDbGljayk9XCJjb25maXJtRWRpdENyZWF0ZSgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgKGNvbmZpcm1BbmRBZGRDbGljayk9XCJjb25maXJtQW5kQWRkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoYmFja3dhcmQpPVwiY29uZmlybUFuZEJhY2t3YXJkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoZm9yd2FyZCk9XCJjb25maXJtQW5kRm9yd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgW2NhbkNhbmNlbF09XCJmYWxzZVwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gdGFibGUgb3B0aW9ucyBtZW51IC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0SGVhZGVyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX09QVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwidGFibGVPcHRpb25zTWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2FwcC1hY3Rpb25zLWNvbHVtbj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgPHRyXG4gICAgICAgIG1hdC1yb3dcbiAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIlxuICAgICAgICBbY2xhc3MubWF0LXJvdy1zZWxlY3RlZF09XCJyb3cuZWRpdGluZ1wiXG4gICAgICAgIFtjbGFzcy5tYXQtcm93LWVycm9yXT1cInJvdy52YWxpZGF0b3IuaW52YWxpZFwiXG4gICAgICAgIFtjbGFzcy5tYXQtcm93LWRpcnR5XT1cInJvdy5jdXJyZW50RGF0YS5kaXJ0eVwiXG4gICAgICAgIFtjbGFzcy5tYXQtcm93LWRpc2FibGVkXT1cIiFyb3cuZWRpdGluZ1wiXG4gICAgICAgIChjbGljayk9XCJjbGlja1JvdygkZXZlbnQsIHJvdylcIlxuICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwiZXNjYXBlRWRpdGluZ1JvdygkZXZlbnQpXCJcbiAgICAgICAgW2Nka1RyYXBGb2N1c109XCIhcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgPjwvdHI+XG4gICAgPC90YWJsZT5cblxuICAgIDwhLS0gRMOpY2xlbmNoZXVyIGludmlzaWJsZSBwb3VyIGxlIG1hdC1tZW51IC0tPlxuXG4gICAgQGlmIChsb2FkaW5nU3ViamVjdCB8IGFzeW5jKSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBhbmltYXRlZD48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICB9IEBlbHNlIGlmICh0b3RhbFJvd0NvdW50ID09PSAwKSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwidGV4dC1pdGFsaWNcIiB0cmFuc2xhdGU+Q09NTU9OLk5PX1JFU1VMVDwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIH1cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuXG48IS0tIFRhYmxlIG9wdGlvbnMgbWVudSAtLT5cbjxtYXQtbWVudSAjdGFibGVPcHRpb25zTWVudT1cIm1hdE1lbnVcIiB4UG9zaXRpb249XCJhZnRlclwiPlxuICA8IS0tIGRpc3BsYXkgY29sdW1ucyAtLT5cbiAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvcGVuU2VsZWN0Q29sdW1uc01vZGFsKCRldmVudClcIj5cbiAgICA8bWF0LWljb24+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5ESVNQTEFZRURfQ09MVU1OU19ET1RTPC9pb24tbGFiZWw+XG4gIDwvYnV0dG9uPlxuXG4gIEBpZiAodXNlUGFnZVNldHRpbmdzKSB7XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG5cbiAgICA8IS0tIENvbXBhY3QgbW9kZSAtLT5cbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInRvZ2dsZUNvbXBhY3RNb2RlKClcIj5cbiAgICAgIDxtYXQtaWNvbj57eyBjb21wYWN0ID8gJ2NoZWNrX2JveCcgOiAnY2hlY2tfYm94X291dGxpbmVfYmxhbmsnIH19PC9tYXQtaWNvbj5cbiAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQ09NUEFDVF9ST1dTPC9pb24tbGFiZWw+XG4gICAgPC9idXR0b24+XG4gIH1cbjwvbWF0LW1lbnU+XG5cbjxpb24tZm9vdGVyPlxuICA8bWF0LXBhZ2luYXRvclxuICAgIFtsZW5ndGhdPVwidG90YWxSb3dDb3VudFwiXG4gICAgW3BhZ2VTaXplXT1cImRlZmF1bHRQYWdlU2l6ZVwiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJkZWZhdWx0UGFnZVNpemVPcHRpb25zXCJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+PC9tYXQtcGFnaW5hdG9yPlxuXG4gIDxhcHAtZm9ybS1idXR0b25zLWJhclxuICAgICpuZ0lmPVwiIW1vYmlsZSAmJiBjYW5FZGl0XCJcbiAgICAob25DYW5jZWwpPVwiY2FuY2VsKCRldmVudClcIlxuICAgIChvblNhdmUpPVwic2F2ZSgpXCJcbiAgICBbZGlzYWJsZWRdPVwiKGxvYWRpbmdTdWJqZWN0IHwgYXN5bmMpID09PSB0cnVlIHx8IChkaXJ0eVN1YmplY3QgfCBhc3luYykgIT09IHRydWVcIlxuICA+XG4gICAgPCEtLSBlcnJvciAtLT5cbiAgICA8aW9uLWl0ZW0gKm5nSWY9XCJlcnJvclN1YmplY3QgfCBhc3luYzsgbGV0IGVycm9yXCIgbGluZXM9XCJub25lXCI+XG4gICAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gICAgPC9pb24taXRlbT5cbiAgPC9hcHAtZm9ybS1idXR0b25zLWJhcj5cbjwvaW9uLWZvb3Rlcj5cblxuPGlvbi1mYWIgc2xvdD1cImZpeGVkXCIgdmVydGljYWw9XCJib3R0b21cIiBob3Jpem9udGFsPVwiZW5kXCIgKm5nSWY9XCJtb2JpbGVcIj5cbiAgPGlvbi1mYWItYnV0dG9uIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiYWRkUm93KClcIj5cbiAgICA8aW9uLWljb24gbmFtZT1cImFkZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2lvbi1mYWI+XG4iXX0=