@kalisio/kdk 2.4.1 → 2.5.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 (647) hide show
  1. package/core/api/application.js +12 -12
  2. package/core/api/authentication.js +51 -7
  3. package/core/api/hooks/hooks.authentication.js +1 -59
  4. package/core/api/hooks/hooks.authorisations.js +8 -102
  5. package/core/api/hooks/hooks.model.js +4 -0
  6. package/core/api/hooks/hooks.push.js +18 -14
  7. package/core/api/hooks/hooks.users.js +0 -91
  8. package/core/api/hooks/index.js +0 -2
  9. package/core/api/services/account/account.service.js +1 -1
  10. package/core/api/services/authorisations/authorisations.service.js +28 -29
  11. package/core/api/services/index.js +38 -50
  12. package/core/api/services/messages/messages.hooks.js +4 -3
  13. package/core/api/services/users/users.service.js +5 -0
  14. package/core/client/api.js +182 -71
  15. package/core/client/broadcaster.js +20 -0
  16. package/core/client/capabilities.js +17 -7
  17. package/core/client/components/KActivity.vue +29 -34
  18. package/core/client/components/KAvatar.vue +0 -6
  19. package/core/client/components/KChip.vue +142 -39
  20. package/core/client/components/KContent.vue +13 -32
  21. package/core/client/components/KDialog.vue +29 -8
  22. package/core/client/components/KEditor.vue +120 -0
  23. package/core/client/components/KFollower.vue +75 -0
  24. package/core/client/components/KLogo.vue +2 -3
  25. package/core/client/components/KModal.vue +30 -10
  26. package/core/client/components/KSponsor.vue +1 -1
  27. package/core/client/components/KTextArea.vue +2 -5
  28. package/core/client/components/account/KDeleteAccountManager.vue +1 -1
  29. package/core/client/components/account/KProfile.vue +52 -14
  30. package/core/client/components/account/KSubscription.vue +19 -9
  31. package/core/client/components/account/KSubscriptionsManager.vue +10 -11
  32. package/core/client/components/action/KAction.vue +44 -24
  33. package/core/client/components/action/KBugReportAction.vue +4 -5
  34. package/core/client/components/action/KToggleStickyVisibility.vue +41 -0
  35. package/core/client/components/action/KToggleWidgetVisibility.vue +41 -0
  36. package/core/client/components/app/KPlatform.vue +122 -35
  37. package/core/client/components/app/KRequestProgressBar.vue +59 -0
  38. package/core/client/components/app/KSettings.vue +13 -2
  39. package/core/client/components/app/KTour.vue +2 -2
  40. package/core/client/components/chart/KTimeSeriesChart.vue +11 -3
  41. package/core/client/components/collection/KCard.vue +27 -33
  42. package/core/client/components/collection/KCardSection.vue +3 -23
  43. package/core/client/components/collection/KColumn.vue +0 -5
  44. package/core/client/components/collection/KDescriptionCardSection.vue +10 -5
  45. package/core/client/components/collection/KFilterView.vue +15 -0
  46. package/core/client/components/collection/KGrid.vue +4 -9
  47. package/core/client/components/collection/KHistory.vue +0 -5
  48. package/core/client/components/collection/KHistoryEntry.vue +0 -2
  49. package/core/client/components/collection/KItem.vue +1 -2
  50. package/core/client/components/collection/KSearchFilterControl.vue +139 -0
  51. package/core/client/components/collection/KTable.vue +1 -4
  52. package/core/client/components/collection/KTagsFilterControl.vue +70 -0
  53. package/core/client/components/collection/KTagsFilterView.vue +61 -0
  54. package/core/client/components/collection/KTimeFilterControl.vue +40 -0
  55. package/core/client/components/collection/KTimeFilterView.vue +106 -0
  56. package/core/client/components/collection/KTimeLine.vue +18 -11
  57. package/core/client/components/document/KBrowser.vue +283 -0
  58. package/core/client/components/document/KCsv.vue +52 -0
  59. package/core/client/components/document/KDocument.vue +19 -5
  60. package/core/client/components/document/KImage.vue +50 -19
  61. package/core/client/components/document/KMarkdown.vue +10 -2
  62. package/core/client/components/document/KUploader.vue +126 -0
  63. package/core/client/components/document/KVideo.vue +39 -0
  64. package/core/client/components/form/KDateField.vue +70 -0
  65. package/core/client/components/form/KDateTimeRangeField.vue +6 -17
  66. package/core/client/components/form/KDatetimeField.vue +6 -13
  67. package/core/client/components/form/KForm.vue +8 -8
  68. package/core/client/components/form/KOptionsField.vue +2 -0
  69. package/core/client/components/form/KResolutionField.vue +54 -52
  70. package/core/client/components/form/KSelectField.vue +27 -13
  71. package/core/client/components/form/KTextareaField.vue +23 -5
  72. package/core/client/components/graphics/KIcon.vue +64 -0
  73. package/core/client/components/index.js +1 -3
  74. package/core/client/components/input/KColorPicker.vue +70 -0
  75. package/core/client/components/input/KIconPicker.vue +188 -0
  76. package/core/client/components/input/KShapePicker.vue +81 -0
  77. package/core/client/components/input/index.js +7 -1
  78. package/core/client/components/layout/KFab.vue +1 -1
  79. package/core/client/components/layout/KLayout.vue +14 -2
  80. package/core/client/components/layout/KOpener.vue +9 -11
  81. package/core/client/components/layout/KPage.vue +31 -17
  82. package/core/client/components/layout/KWindow.vue +34 -18
  83. package/core/client/components/menu/KMenu.vue +52 -36
  84. package/core/client/components/menu/KSubMenu.vue +105 -0
  85. package/core/client/components/messages/KMessageCard.vue +207 -0
  86. package/core/client/components/messages/KMessageComposer.vue +199 -0
  87. package/core/client/components/messages/KMessagesTimeLine.vue +137 -0
  88. package/core/client/components/messages/index.js +7 -0
  89. package/core/client/components/screen/KErrorScreen.vue +2 -3
  90. package/core/client/components/screen/KLogoutScreen.vue +3 -1
  91. package/core/client/components/screen/KOAuthLoginScreen.vue +15 -0
  92. package/core/client/components/screen/KOAuthLogoutScreen.vue +33 -0
  93. package/core/client/components/screen/KUnauthorizedScreen.vue +16 -0
  94. package/core/client/components/time/KAbsoluteTimeRange.vue +7 -14
  95. package/core/client/components/time/KDate.vue +55 -28
  96. package/core/client/components/time/KDateTime.vue +93 -37
  97. package/core/client/components/time/KDateTimeRange.vue +197 -52
  98. package/core/client/components/time/KTime.vue +55 -27
  99. package/core/client/composables/activity.js +40 -30
  100. package/core/client/composables/{counter.js → collection-counter.js} +2 -4
  101. package/core/client/composables/collection-filter.js +111 -0
  102. package/core/client/composables/collection-timerange.js +56 -0
  103. package/core/client/composables/collection.js +13 -11
  104. package/core/client/composables/context.js +92 -0
  105. package/core/client/composables/errors.js +83 -0
  106. package/core/client/composables/index.js +5 -1
  107. package/core/client/composables/layout.js +14 -11
  108. package/core/client/composables/messages.js +4 -4
  109. package/core/client/composables/pwa.js +20 -27
  110. package/core/client/composables/schema.js +1 -1
  111. package/core/client/composables/screen.js +21 -9
  112. package/core/client/composables/selection.js +16 -4
  113. package/core/client/composables/session.js +13 -7
  114. package/core/client/composables/store.js +2 -1
  115. package/core/client/context.js +38 -0
  116. package/core/client/directives/v-hover.js +7 -4
  117. package/core/client/document.js +43 -15
  118. package/core/client/events.js +2 -2
  119. package/core/client/exporter.js +5 -4
  120. package/core/client/filter.js +1 -8
  121. package/core/client/guards.js +3 -3
  122. package/core/client/hooks/hooks.logger.js +1 -1
  123. package/core/client/hooks/hooks.offline.js +32 -0
  124. package/core/client/hooks/index.js +2 -1
  125. package/core/client/i18n/core_en.json +95 -268
  126. package/core/client/i18n/core_fr.json +181 -353
  127. package/core/client/index.js +22 -8
  128. package/core/client/layout.js +64 -25
  129. package/core/client/local-cache.js +67 -0
  130. package/core/client/local-storage.js +6 -2
  131. package/core/client/mixins/index.js +0 -1
  132. package/core/client/mixins/mixin.base-activity.js +22 -10
  133. package/core/client/mixins/mixin.base-editor.js +1 -1
  134. package/core/client/mixins/mixin.base-field.js +10 -1
  135. package/core/client/mixins/mixin.base-item.js +14 -11
  136. package/core/client/mixins/mixin.service.js +1 -5
  137. package/core/client/platform.js +44 -0
  138. package/core/client/readers/reader.blob.js +3 -3
  139. package/core/client/readers/reader.csv.js +2 -2
  140. package/core/client/readers/reader.json.js +2 -2
  141. package/core/client/services/index.js +7 -11
  142. package/core/client/storage.js +43 -8
  143. package/core/client/template-context.js +14 -14
  144. package/core/client/time.js +2 -2
  145. package/core/client/units.js +7 -4
  146. package/core/client/utils/index.js +6 -5
  147. package/core/client/utils/utils.collection.js +71 -0
  148. package/core/client/utils/utils.colors.js +29 -8
  149. package/core/client/utils/utils.content.js +14 -14
  150. package/core/client/utils/utils.files.js +17 -0
  151. package/core/client/utils/utils.items.js +4 -0
  152. package/core/client/utils/utils.math.js +18 -1
  153. package/core/client/utils/utils.push.js +22 -13
  154. package/core/client/utils/utils.screen.js +6 -2
  155. package/core/client/utils/utils.services.js +42 -0
  156. package/core/client/utils/utils.session.js +48 -12
  157. package/core/client/utils/utils.shapes.js +15 -11
  158. package/core/common/permissions.js +3 -108
  159. package/core/common/schemas/messages.update.json +16 -0
  160. package/core/common/schemas/settings.update.json +27 -8
  161. package/core/common/utils.js +2 -0
  162. package/core/common/utils.offline.js +38 -0
  163. package/coverage/core/api/application.js.html +296 -296
  164. package/coverage/core/api/authentication.js.html +206 -74
  165. package/coverage/core/api/db.js.html +61 -61
  166. package/coverage/core/api/hooks/hooks.authentication.js.html +15 -189
  167. package/coverage/core/api/hooks/hooks.authorisations.js.html +180 -462
  168. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  169. package/coverage/core/api/hooks/hooks.logger.js.html +16 -16
  170. package/coverage/core/api/hooks/hooks.model.js.html +69 -57
  171. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  172. package/coverage/core/api/hooks/hooks.push.js.html +58 -46
  173. package/coverage/core/api/hooks/hooks.query.js.html +142 -142
  174. package/coverage/core/api/hooks/hooks.schemas.js.html +1 -1
  175. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  176. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  177. package/coverage/core/api/hooks/hooks.users.js.html +54 -327
  178. package/coverage/core/api/hooks/index.html +64 -94
  179. package/coverage/core/api/hooks/index.js.html +4 -10
  180. package/coverage/core/api/index.html +41 -56
  181. package/coverage/core/api/index.js.html +1 -1
  182. package/coverage/core/api/marshall.js.html +9 -9
  183. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  184. package/coverage/core/api/models/index.html +13 -58
  185. package/coverage/core/api/models/messages.model.mongodb.js.html +35 -35
  186. package/coverage/core/api/models/organisations.model.mongodb.js.html +3 -3
  187. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  188. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  189. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  190. package/coverage/core/api/services/account/account.service.js.html +67 -67
  191. package/coverage/core/api/services/account/index.html +16 -16
  192. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  193. package/coverage/core/api/services/authorisations/authorisations.service.js.html +141 -144
  194. package/coverage/core/api/services/authorisations/index.html +19 -19
  195. package/coverage/core/api/services/databases/databases.hooks.js.html +82 -82
  196. package/coverage/core/api/services/databases/databases.service.js.html +20 -20
  197. package/coverage/core/api/services/databases/index.html +32 -32
  198. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  199. package/coverage/core/api/services/groups/index.html +1 -1
  200. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  201. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  202. package/coverage/core/api/services/import-export/index.html +1 -1
  203. package/coverage/core/api/services/index.html +21 -21
  204. package/coverage/core/api/services/index.js.html +118 -154
  205. package/coverage/core/api/services/mailer/index.html +1 -1
  206. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  207. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  208. package/coverage/core/api/services/messages/index.html +21 -21
  209. package/coverage/core/api/services/messages/messages.hooks.js.html +89 -86
  210. package/coverage/core/api/services/organisations/index.html +1 -1
  211. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  212. package/coverage/core/api/services/organisations/organisations.service.js.html +23 -23
  213. package/coverage/core/api/services/push/index.html +1 -1
  214. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  215. package/coverage/core/api/services/push/push.service.js.html +1 -1
  216. package/coverage/core/api/services/storage/index.html +5 -5
  217. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  218. package/coverage/core/api/services/storage/storage.service.js.html +27 -27
  219. package/coverage/core/api/services/tags/index.html +1 -1
  220. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  221. package/coverage/core/api/services/users/index.html +23 -8
  222. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  223. package/coverage/core/api/services/users/users.service.js.html +100 -0
  224. package/coverage/core/api/utils.js.html +1 -1
  225. package/coverage/core/common/errors.js.html +1 -1
  226. package/coverage/core/common/index.html +42 -27
  227. package/coverage/core/common/index.js.html +1 -1
  228. package/coverage/core/common/permissions.js.html +195 -510
  229. package/coverage/core/common/schema.js.html +1 -1
  230. package/coverage/core/common/utils.js.html +12 -6
  231. package/coverage/core/common/utils.offline.js.html +199 -0
  232. package/coverage/index.html +142 -172
  233. package/coverage/lcov-report/core/api/application.js.html +296 -296
  234. package/coverage/lcov-report/core/api/authentication.js.html +206 -74
  235. package/coverage/lcov-report/core/api/db.js.html +61 -61
  236. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +15 -189
  237. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +180 -462
  238. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  239. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +16 -16
  240. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +69 -57
  241. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  242. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +58 -46
  243. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +142 -142
  244. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +1 -1
  245. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  246. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  247. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +54 -327
  248. package/coverage/lcov-report/core/api/hooks/index.html +64 -94
  249. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  250. package/coverage/lcov-report/core/api/index.html +41 -56
  251. package/coverage/lcov-report/core/api/index.js.html +1 -1
  252. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  253. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  254. package/coverage/lcov-report/core/api/models/index.html +13 -58
  255. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +35 -35
  256. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +3 -3
  257. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  258. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  259. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  260. package/coverage/lcov-report/core/api/services/account/account.service.js.html +67 -67
  261. package/coverage/lcov-report/core/api/services/account/index.html +16 -16
  262. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  263. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +141 -144
  264. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  265. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +82 -82
  266. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +20 -20
  267. package/coverage/lcov-report/core/api/services/databases/index.html +32 -32
  268. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  269. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  270. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  271. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  272. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  273. package/coverage/lcov-report/core/api/services/index.html +21 -21
  274. package/coverage/lcov-report/core/api/services/index.js.html +118 -154
  275. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  276. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  277. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  278. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  279. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +89 -86
  280. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  281. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  282. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +23 -23
  283. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  284. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  285. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  286. package/coverage/lcov-report/core/api/services/storage/index.html +5 -5
  287. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  288. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +27 -27
  289. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  290. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  291. package/coverage/lcov-report/core/api/services/users/index.html +23 -8
  292. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  293. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  294. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  295. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  296. package/coverage/lcov-report/core/common/index.html +42 -27
  297. package/coverage/lcov-report/core/common/index.js.html +1 -1
  298. package/coverage/lcov-report/core/common/permissions.js.html +195 -510
  299. package/coverage/lcov-report/core/common/schema.js.html +1 -1
  300. package/coverage/lcov-report/core/common/utils.js.html +12 -6
  301. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  302. package/coverage/lcov-report/index.html +142 -172
  303. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +125 -29
  304. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  305. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +20 -44
  306. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  307. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  308. package/coverage/lcov-report/map/api/index.html +1 -1
  309. package/coverage/lcov-report/map/api/index.js.html +1 -1
  310. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  311. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  312. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +49 -7
  313. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  314. package/coverage/lcov-report/map/api/models/index.html +22 -7
  315. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  316. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  317. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  318. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  319. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  320. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +29 -11
  321. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  322. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  323. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  324. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +78 -9
  325. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  326. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  327. package/coverage/lcov-report/map/api/services/index.html +5 -5
  328. package/coverage/lcov-report/map/api/services/index.js.html +287 -50
  329. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  330. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  331. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  332. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  333. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  334. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  335. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +8 -5
  336. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  337. package/coverage/lcov-report/map/common/index.html +7 -7
  338. package/coverage/lcov-report/map/common/index.js.html +1 -1
  339. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  340. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  341. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  342. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  343. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  344. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  345. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  346. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  347. package/coverage/lcov-report/map/common/wcs-utils.js.html +9 -9
  348. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  349. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  350. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  351. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  352. package/coverage/lcov.info +2581 -3278
  353. package/coverage/map/api/hooks/hooks.catalog.js.html +125 -29
  354. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  355. package/coverage/map/api/hooks/hooks.query.js.html +20 -44
  356. package/coverage/map/api/hooks/index.html +7 -7
  357. package/coverage/map/api/hooks/index.js.html +1 -1
  358. package/coverage/map/api/index.html +1 -1
  359. package/coverage/map/api/index.js.html +1 -1
  360. package/coverage/map/api/marshall.js.html +1 -1
  361. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  362. package/coverage/map/api/models/catalog.model.mongodb.js.html +49 -7
  363. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  364. package/coverage/map/api/models/index.html +22 -7
  365. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  366. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  367. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  368. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  369. package/coverage/map/api/services/alerts/index.html +1 -1
  370. package/coverage/map/api/services/catalog/catalog.hooks.js.html +29 -11
  371. package/coverage/map/api/services/catalog/index.html +5 -5
  372. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  373. package/coverage/map/api/services/daptiles/index.html +1 -1
  374. package/coverage/map/api/services/features/features.hooks.js.html +78 -9
  375. package/coverage/map/api/services/features/features.service.js.html +307 -4
  376. package/coverage/map/api/services/features/index.html +7 -7
  377. package/coverage/map/api/services/index.html +5 -5
  378. package/coverage/map/api/services/index.js.html +287 -50
  379. package/coverage/map/api/services/projects/index.html +1 -1
  380. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  381. package/coverage/map/api/services/styles/index.html +116 -0
  382. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  383. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  384. package/coverage/map/common/errors.js.html +1 -1
  385. package/coverage/map/common/geotiff-grid-source.js.html +8 -5
  386. package/coverage/map/common/grid.js.html +1 -1
  387. package/coverage/map/common/index.html +7 -7
  388. package/coverage/map/common/index.js.html +1 -1
  389. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  390. package/coverage/map/common/moment-utils.js.html +1 -1
  391. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  392. package/coverage/map/common/opendap-utils.js.html +1 -1
  393. package/coverage/map/common/permissions.js.html +10 -4
  394. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  395. package/coverage/map/common/tms-utils.js.html +6 -6
  396. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  397. package/coverage/map/common/wcs-utils.js.html +9 -9
  398. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  399. package/coverage/map/common/wfs-utils.js.html +11 -11
  400. package/coverage/map/common/wms-utils.js.html +8 -8
  401. package/coverage/map/common/wmts-utils.js.html +7 -7
  402. package/coverage/tmp/coverage-323534-1747828879483-0.json +1 -0
  403. package/coverage/tmp/coverage-323546-1747828879453-0.json +1 -0
  404. package/coverage/tmp/coverage-323557-1747828879439-0.json +1 -0
  405. package/coverage/tmp/coverage-323569-1747828879416-0.json +1 -0
  406. package/coverage/tmp/coverage-323576-1747828879390-0.json +1 -0
  407. package/extras/configs/helpers.js +78 -0
  408. package/extras/configs/panes.left.js +118 -0
  409. package/extras/configs/panes.top.js +222 -0
  410. package/extras/configs/stickies.js +57 -0
  411. package/extras/configs/widgets.left.js +23 -0
  412. package/extras/configs/widgets.top.js +73 -0
  413. package/extras/css/core.variables.scss +8 -0
  414. package/extras/images/north.svg +3 -0
  415. package/extras/tours/map/side-nav.js +3 -3
  416. package/map/api/hooks/hooks.catalog.js +56 -23
  417. package/map/api/hooks/hooks.query.js +16 -24
  418. package/map/api/models/catalog.model.mongodb.js +16 -2
  419. package/{core/api/models/groups.model.mongodb.js → map/api/models/styles.model.mongodb.js} +2 -1
  420. package/map/api/services/catalog/catalog.hooks.js +13 -7
  421. package/map/api/services/features/features.hooks.js +28 -5
  422. package/map/api/services/features/features.service.js +101 -0
  423. package/map/api/services/index.js +125 -46
  424. package/map/api/services/styles/styles.hooks.js +37 -0
  425. package/map/client/cesium/utils/index.js +1 -0
  426. package/map/client/cesium/utils/utils.cesium.js +397 -0
  427. package/map/client/cesium/utils/utils.features.js +8 -0
  428. package/map/client/cesium/utils/utils.geojson.js +59 -0
  429. package/map/client/cesium/utils/utils.style.js +134 -17
  430. package/map/client/components/KEditLayerData.vue +17 -79
  431. package/map/client/components/KFeatureEditor.vue +2 -7
  432. package/map/client/components/KFeaturesChart.vue +2 -6
  433. package/map/client/components/KFeaturesFilterEditor.vue +300 -0
  434. package/map/client/components/KFeaturesFilterManager.vue +196 -0
  435. package/map/client/components/KFeaturesTable.vue +0 -5
  436. package/map/client/components/KFilterCondition.vue +303 -0
  437. package/map/client/components/KLayerEditionToolbar.vue +4 -3
  438. package/map/client/components/KLayerEditor.vue +451 -36
  439. package/map/client/components/KMeasureTool.vue +36 -9
  440. package/map/client/components/KProjectMenu.vue +14 -8
  441. package/map/client/components/catalog/KAddLayer.vue +0 -4
  442. package/map/client/components/catalog/KBaseLayersSelector.vue +42 -46
  443. package/map/client/components/catalog/KConnectLayer.vue +295 -291
  444. package/map/client/components/catalog/KCreateLayer.vue +141 -146
  445. package/map/client/components/catalog/KCreateOfflineView.vue +100 -0
  446. package/map/client/components/catalog/KCreateView.vue +2 -8
  447. package/map/client/components/catalog/KFilteredLayerItem.vue +72 -25
  448. package/map/client/components/catalog/KImportLayer.vue +121 -129
  449. package/map/client/components/catalog/KLayerItem.vue +44 -32
  450. package/map/client/components/catalog/KLayersPanel.vue +45 -17
  451. package/map/client/components/catalog/KLayersSelector.vue +51 -50
  452. package/map/client/components/catalog/KProjectManager.vue +4 -8
  453. package/map/client/components/catalog/KProjectSelector.vue +33 -2
  454. package/map/client/components/catalog/KProjectsPanel.vue +84 -106
  455. package/map/client/components/catalog/KSelectLayers.vue +56 -69
  456. package/map/client/components/catalog/KSelectViews.vue +56 -69
  457. package/map/client/components/catalog/KViewSelector.vue +32 -2
  458. package/map/client/components/catalog/KViewsPanel.vue +178 -110
  459. package/map/client/components/catalog/KWeatherLayersSelector.vue +77 -85
  460. package/map/client/components/form/KLocationField.vue +21 -2
  461. package/map/client/components/form/KOwsLayerField.vue +1 -1
  462. package/map/client/components/form/KOwsServiceField.vue +102 -63
  463. package/map/client/components/form/KSelectLayersField.vue +1 -1
  464. package/map/client/components/form/KSelectViewsField.vue +1 -1
  465. package/map/client/components/form/KTimezoneField.vue +0 -1
  466. package/map/client/components/legend/KLegend.vue +4 -4
  467. package/map/client/components/location/KLocationCardSection.vue +16 -0
  468. package/map/client/components/location/KLocationMap.vue +3 -2
  469. package/map/client/components/location/KLocationSearch.vue +46 -8
  470. package/map/client/components/location/KLocationTimeLineCard.vue +25 -3
  471. package/map/client/components/location/KLocationTip.vue +57 -10
  472. package/map/client/components/selection/KFeaturesSelection.vue +71 -0
  473. package/map/client/components/selection/KSelectedLayerFeatures.vue +343 -0
  474. package/map/client/components/{KAttribution.vue → stickies/KAttribution.vue} +39 -33
  475. package/map/client/components/stickies/KLevelSlider.vue +114 -0
  476. package/map/client/components/stickies/KNorthArrow.vue +26 -0
  477. package/map/client/components/stickies/KPosition.vue +103 -0
  478. package/map/client/components/stickies/KTarget.vue +34 -0
  479. package/map/client/components/styles/KLayerStyleAction.vue +58 -0
  480. package/map/client/components/styles/KStyleEditor.vue +273 -0
  481. package/map/client/components/styles/KStyleEditorSection.vue +79 -0
  482. package/map/client/components/styles/KStyleManager.vue +183 -0
  483. package/map/client/components/styles/KStylePreview.vue +64 -0
  484. package/map/client/components/styles/KStylePreviewItem.vue +68 -0
  485. package/map/client/components/styles/KStylePropertiesGroup.vue +76 -0
  486. package/map/client/components/styles/KStyleProperty.vue +136 -0
  487. package/map/client/components/styles/KStyleTip.vue +118 -0
  488. package/map/client/components/tools/KGeolocateTool.vue +3 -2
  489. package/map/client/components/tools/KSearchTool.vue +34 -6
  490. package/map/client/components/widget/KMapillaryViewer.vue +1 -1
  491. package/map/client/components/widget/KStackableTimeSeries.vue +8 -5
  492. package/map/client/composables/activity.js +29 -43
  493. package/map/client/composables/catalog.js +1 -1
  494. package/map/client/composables/highlight.js +117 -57
  495. package/map/client/composables/location.js +33 -14
  496. package/map/client/composables/project.js +9 -10
  497. package/map/client/composables/selection.js +136 -23
  498. package/map/client/geocoder.js +104 -0
  499. package/map/client/geolocation.js +1 -1
  500. package/map/client/globe.js +3 -0
  501. package/map/client/hooks/hooks.offline.js +95 -0
  502. package/map/client/hooks/index.js +1 -0
  503. package/map/client/i18n/map_en.json +159 -94
  504. package/map/client/i18n/map_fr.json +186 -127
  505. package/map/client/index.js +3 -0
  506. package/map/client/init.js +44 -8
  507. package/map/client/leaflet/BoxSelection.js +2 -2
  508. package/map/client/leaflet/GradientPath.js +84 -4
  509. package/map/client/leaflet/WindBarb.js +323 -0
  510. package/map/client/leaflet/utils/index.js +1 -0
  511. package/map/client/leaflet/utils/utils.events.js +8 -3
  512. package/map/client/leaflet/utils/utils.geojson.js +221 -0
  513. package/map/client/leaflet/utils/utils.style.js +10 -9
  514. package/map/client/map.js +3 -0
  515. package/map/client/mixins/globe/mixin.base-globe.js +151 -19
  516. package/map/client/mixins/globe/mixin.geojson-layers.js +208 -86
  517. package/map/client/mixins/globe/mixin.popup.js +3 -2
  518. package/map/client/mixins/globe/mixin.style.js +3 -1
  519. package/map/client/mixins/globe/mixin.tooltip.js +3 -2
  520. package/map/client/mixins/map/index.js +1 -3
  521. package/map/client/mixins/map/mixin.base-map.js +267 -79
  522. package/map/client/mixins/map/mixin.canvas-layers.js +44 -10
  523. package/map/client/mixins/map/mixin.edit-layers.js +142 -57
  524. package/map/client/mixins/map/mixin.geojson-layers.js +127 -204
  525. package/map/client/mixins/map/mixin.pmtiles-layers.js +24 -11
  526. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +1 -2
  527. package/map/client/mixins/map/mixin.tiled-wind-layers.js +2 -1
  528. package/map/client/mixins/mixin.activity.js +61 -41
  529. package/map/client/mixins/mixin.context.js +19 -14
  530. package/map/client/mixins/mixin.feature-selection.js +0 -1
  531. package/map/client/mixins/mixin.feature-service.js +41 -59
  532. package/map/client/mixins/mixin.weacast.js +1 -1
  533. package/map/client/navigator.js +38 -0
  534. package/map/client/pixi-utils.js +1 -1
  535. package/map/client/planets.js +1 -1
  536. package/map/client/readers/reader.kml.js +57 -1
  537. package/map/client/utils/index.js +1 -0
  538. package/map/client/utils/utils.capture.js +10 -7
  539. package/map/client/utils/utils.catalog.js +2 -2
  540. package/map/client/utils/utils.features.js +193 -39
  541. package/map/client/utils/utils.js +0 -21
  542. package/map/client/utils/utils.layers.js +381 -4
  543. package/map/client/utils/utils.location.js +39 -74
  544. package/map/client/utils/utils.offline.js +89 -0
  545. package/map/client/utils/utils.style.js +133 -80
  546. package/map/common/geotiff-grid-source.js +2 -1
  547. package/map/common/permissions.js +2 -0
  548. package/map/common/schemas/capture.create.json +4 -4
  549. package/map/common/schemas/catalog.update.json +18 -2
  550. package/map/common/schemas/projects.create.json +2 -2
  551. package/map/common/schemas/projects.update.json +2 -2
  552. package/map/common/tms-utils.js +5 -5
  553. package/map/common/wcs-grid-source.js +2 -2
  554. package/map/common/wcs-utils.js +8 -8
  555. package/map/common/wfs-utils.js +10 -10
  556. package/map/common/wms-utils.js +7 -7
  557. package/map/common/wmts-utils.js +6 -6
  558. package/package.json +7 -4
  559. package/test/api/core/account.test.js +0 -72
  560. package/test/api/core/authentication.test.js +184 -0
  561. package/test/api/core/config/default.cjs +1 -3
  562. package/test/api/core/index.test.js +33 -96
  563. package/test/api/core/offline.test.js +55 -0
  564. package/test/api/core/push.test.js +3 -3
  565. package/test/api/core/{test-log-2024-06-06.log → test-log-2025-02-05.log} +3 -3
  566. package/test/api/core/{test-log-2024-11-15.log → test-log-2025-05-21.log} +1 -9
  567. package/test/api/map/alerts.test.js +1 -1
  568. package/test/api/map/config/default.cjs +2 -1
  569. package/test/api/map/data/vigicrues.observations.Q.json +47042 -0
  570. package/test/api/map/index.test.js +113 -9
  571. package/test/api/map/style.test.js +62 -0
  572. package/test/client/core/layout.js +2 -2
  573. package/test/client/core/runner.js +1 -1
  574. package/test/client/core/utils.js +52 -0
  575. package/test/client/map/catalog.js +1 -0
  576. package/core/api/hooks/hooks.groups.js +0 -48
  577. package/core/api/hooks/hooks.organisations.js +0 -152
  578. package/core/api/models/organisations.model.mongodb.js +0 -3
  579. package/core/api/models/tags.model.mongodb.js +0 -10
  580. package/core/api/services/groups/groups.hooks.js +0 -31
  581. package/core/api/services/organisations/organisations.hooks.js +0 -31
  582. package/core/api/services/organisations/organisations.service.js +0 -86
  583. package/core/api/services/tags/tags.hooks.js +0 -31
  584. package/core/api/utils.js +0 -11
  585. package/core/client/components/KChipsPane.vue +0 -103
  586. package/core/client/components/document/index.js +0 -9
  587. package/core/client/components/team/KAddMember.vue +0 -378
  588. package/core/client/components/team/KAddTag.vue +0 -121
  589. package/core/client/components/team/KChangeRole.vue +0 -118
  590. package/core/client/components/team/KGroupCard.vue +0 -110
  591. package/core/client/components/team/KGroupsActivity.vue +0 -78
  592. package/core/client/components/team/KJoinGroup.vue +0 -132
  593. package/core/client/components/team/KMemberCard.vue +0 -328
  594. package/core/client/components/team/KMemberFilter.vue +0 -49
  595. package/core/client/components/team/KMembersActivity.vue +0 -136
  596. package/core/client/components/team/KOrganisationsActivity.vue +0 -51
  597. package/core/client/components/team/KTagCard.vue +0 -72
  598. package/core/client/components/team/KTagsActivity.vue +0 -73
  599. package/core/client/components/team/index.js +0 -9
  600. package/core/client/mixins/mixin.base-context.js +0 -54
  601. package/core/client/utils/utils.platform.js +0 -12
  602. package/core/common/schemas/groups.create.json +0 -28
  603. package/core/common/schemas/groups.update.json +0 -28
  604. package/core/common/schemas/organisations.create.json +0 -28
  605. package/core/common/schemas/organisations.update.json +0 -49
  606. package/core/common/schemas/tags.create.json +0 -35
  607. package/core/common/schemas/tags.update.json +0 -35
  608. package/coverage/tmp/coverage-280506-1731704745613-0.json +0 -1
  609. package/coverage/tmp/coverage-280518-1731704745599-0.json +0 -1
  610. package/coverage/tmp/coverage-280529-1731704745588-0.json +0 -1
  611. package/coverage/tmp/coverage-280541-1731704745574-0.json +0 -1
  612. package/coverage/tmp/coverage-280548-1731704745545-0.json +0 -1
  613. package/map/client/components/KFeaturesFilter.vue +0 -259
  614. package/map/client/components/KLayerStyleEditor.vue +0 -118
  615. package/map/client/components/KLayerStyleForm.vue +0 -740
  616. package/map/client/components/KLevelSlider.vue +0 -100
  617. package/map/client/components/KNorth.vue +0 -31
  618. package/map/client/components/KPositionIndicator.vue +0 -83
  619. package/map/client/components/catalog/KCreateProject.vue +0 -100
  620. package/map/client/mixins/map/mixin.forecast-layers.js +0 -81
  621. package/map/client/mixins/map/mixin.georaster-layers.js +0 -107
  622. package/test/api/core/team.test.js +0 -670
  623. package/test/api/core/test-log-2023-12-19.log +0 -7
  624. package/test/api/core/test-log-2024-01-04.log +0 -14
  625. package/test/api/core/test-log-2024-05-14.log +0 -6
  626. package/test/api/core/test-log-2024-06-26.log +0 -25
  627. package/test/api/core/test-log-2024-06-28.log +0 -2
  628. package/test/api/core/test-log-2024-07-09.log +0 -0
  629. package/test/api/core/test-log-2024-08-13.log +0 -69
  630. package/test/api/core/test-log-2024-10-28.log +0 -53
  631. package/test/api/core/test-log-2024-11-05.log +0 -30
  632. package/test/api/core/test-log-2024-11-18.log +0 -0
  633. package/test/api/core/test-log-2024-12-03.log +0 -30
  634. package/test/api/map/test-log-2023-11-24.log +0 -121
  635. package/test/api/map/test-log-2023-12-12.log +0 -29
  636. package/test/api/map/test-log-2023-12-13.log +0 -5
  637. package/test/api/map/test-log-2024-01-04.log +0 -2
  638. package/test/api/map/test-log-2024-01-11.log +0 -1
  639. package/test/api/map/test-log-2024-01-25.log +0 -19
  640. package/test/api/map/test-log-2024-06-06.log +0 -39
  641. package/test/api/map/test-log-2024-08-13.log +0 -13
  642. package/test/api/map/test-log-2024-08-20.log +0 -55
  643. package/test/api/map/test-log-2024-09-09.log +0 -92
  644. package/test/api/map/test-log-2024-10-28.log +0 -11
  645. /package/extras/{logos → images}/kalisio.png +0 -0
  646. /package/extras/{icons → images}/target.svg +0 -0
  647. /package/test/api/map/data/{vigicrues.observations.json → vigicrues.observations.H.json} +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">82.12% </span>
26
+ <span class="strong">80.75% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>317/386</span>
28
+ <span class='fraction'>235/291</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">74.54% </span>
33
+ <span class="strong">66.23% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>82/110</span>
35
+ <span class='fraction'>51/77</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">72.72% </span>
40
+ <span class="strong">75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>8/11</span>
42
+ <span class='fraction'>6/8</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">82.12% </span>
47
+ <span class="strong">80.75% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>317/386</span>
49
+ <span class='fraction'>235/291</span>
50
50
  </div>
51
51
 
52
52
 
@@ -355,102 +355,7 @@
355
355
  <a name='L290'></a><a href='#L290'>290</a>
356
356
  <a name='L291'></a><a href='#L291'>291</a>
357
357
  <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
453
- <span class="cline-any cline-yes">1x</span>
358
+ <a name='L293'></a><a href='#L293'>293</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
454
359
  <span class="cline-any cline-yes">1x</span>
455
360
  <span class="cline-any cline-yes">1x</span>
456
361
  <span class="cline-any cline-yes">1x</span>
@@ -488,12 +393,12 @@
488
393
  <span class="cline-any cline-yes">2x</span>
489
394
  <span class="cline-any cline-yes">1x</span>
490
395
  <span class="cline-any cline-yes">1x</span>
491
- <span class="cline-any cline-yes">23x</span>
396
+ <span class="cline-any cline-yes">4x</span>
492
397
  <span class="cline-any cline-no">&nbsp;</span>
493
398
  <span class="cline-any cline-no">&nbsp;</span>
494
- <span class="cline-any cline-yes">23x</span>
495
- <span class="cline-any cline-yes">23x</span>
496
- <span class="cline-any cline-yes">23x</span>
399
+ <span class="cline-any cline-yes">4x</span>
400
+ <span class="cline-any cline-yes">4x</span>
401
+ <span class="cline-any cline-yes">4x</span>
497
402
  <span class="cline-any cline-yes">1x</span>
498
403
  <span class="cline-any cline-yes">1x</span>
499
404
  <span class="cline-any cline-no">&nbsp;</span>
@@ -504,12 +409,12 @@
504
409
  <span class="cline-any cline-no">&nbsp;</span>
505
410
  <span class="cline-any cline-yes">1x</span>
506
411
  <span class="cline-any cline-yes">1x</span>
507
- <span class="cline-any cline-yes">23x</span>
412
+ <span class="cline-any cline-yes">4x</span>
508
413
  <span class="cline-any cline-no">&nbsp;</span>
509
414
  <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-yes">23x</span>
511
- <span class="cline-any cline-yes">23x</span>
512
- <span class="cline-any cline-yes">23x</span>
415
+ <span class="cline-any cline-yes">4x</span>
416
+ <span class="cline-any cline-yes">4x</span>
417
+ <span class="cline-any cline-yes">4x</span>
513
418
  <span class="cline-any cline-yes">1x</span>
514
419
  <span class="cline-any cline-yes">1x</span>
515
420
  <span class="cline-any cline-no">&nbsp;</span>
@@ -520,26 +425,9 @@
520
425
  <span class="cline-any cline-no">&nbsp;</span>
521
426
  <span class="cline-any cline-yes">1x</span>
522
427
  <span class="cline-any cline-yes">1x</span>
523
- <span class="cline-any cline-yes">6x</span>
428
+ <span class="cline-any cline-yes">4x</span>
524
429
  <span class="cline-any cline-no">&nbsp;</span>
525
430
  <span class="cline-any cline-no">&nbsp;</span>
526
- <span class="cline-any cline-yes">6x</span>
527
- <span class="cline-any cline-yes">6x</span>
528
- <span class="cline-any cline-yes">6x</span>
529
- <span class="cline-any cline-yes">6x</span>
530
- <span class="cline-any cline-yes">6x</span>
531
- <span class="cline-any cline-yes">6x</span>
532
- <span class="cline-any cline-yes">6x</span>
533
- <span class="cline-any cline-yes">4x</span>
534
- <span class="cline-any cline-yes">4x</span>
535
- <span class="cline-any cline-yes">4x</span>
536
- <span class="cline-any cline-yes">6x</span>
537
- <span class="cline-any cline-yes">6x</span>
538
- <span class="cline-any cline-yes">4x</span>
539
- <span class="cline-any cline-yes">4x</span>
540
- <span class="cline-any cline-yes">4x</span>
541
- <span class="cline-any cline-yes">4x</span>
542
- <span class="cline-any cline-yes">4x</span>
543
431
  <span class="cline-any cline-yes">4x</span>
544
432
  <span class="cline-any cline-yes">4x</span>
545
433
  <span class="cline-any cline-yes">4x</span>
@@ -547,272 +435,149 @@
547
435
  <span class="cline-any cline-yes">4x</span>
548
436
  <span class="cline-any cline-yes">4x</span>
549
437
  <span class="cline-any cline-yes">4x</span>
438
+ <span class="cline-any cline-yes">3x</span>
439
+ <span class="cline-any cline-yes">3x</span>
440
+ <span class="cline-any cline-yes">3x</span>
550
441
  <span class="cline-any cline-yes">4x</span>
551
442
  <span class="cline-any cline-yes">4x</span>
443
+ <span class="cline-any cline-yes">3x</span>
444
+ <span class="cline-any cline-yes">3x</span>
445
+ <span class="cline-any cline-yes">3x</span>
446
+ <span class="cline-any cline-yes">3x</span>
447
+ <span class="cline-any cline-yes">3x</span>
448
+ <span class="cline-any cline-yes">3x</span>
449
+ <span class="cline-any cline-yes">3x</span>
450
+ <span class="cline-any cline-yes">3x</span>
451
+ <span class="cline-any cline-yes">3x</span>
452
+ <span class="cline-any cline-yes">3x</span>
453
+ <span class="cline-any cline-yes">3x</span>
454
+ <span class="cline-any cline-yes">3x</span>
455
+ <span class="cline-any cline-yes">3x</span>
456
+ <span class="cline-any cline-yes">3x</span>
552
457
  <span class="cline-any cline-no">&nbsp;</span>
553
458
  <span class="cline-any cline-no">&nbsp;</span>
554
459
  <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-yes">4x</span>
556
- <span class="cline-any cline-yes">4x</span>
557
- <span class="cline-any cline-yes">4x</span>
558
- <span class="cline-any cline-yes">4x</span>
559
- <span class="cline-any cline-yes">4x</span>
560
- <span class="cline-any cline-yes">4x</span>
561
- <span class="cline-any cline-yes">4x</span>
562
- <span class="cline-any cline-yes">4x</span>
563
- <span class="cline-any cline-yes">4x</span>
564
- <span class="cline-any cline-yes">4x</span>
565
- <span class="cline-any cline-yes">4x</span>
566
- <span class="cline-any cline-yes">4x</span>
567
- <span class="cline-any cline-yes">4x</span>
568
- <span class="cline-any cline-yes">4x</span>
569
- <span class="cline-any cline-yes">4x</span>
570
- <span class="cline-any cline-yes">1x</span>
571
- <span class="cline-any cline-yes">4x</span>
572
460
  <span class="cline-any cline-yes">3x</span>
573
461
  <span class="cline-any cline-yes">3x</span>
574
- <span class="cline-any cline-yes">4x</span>
575
- <span class="cline-any cline-yes">4x</span>
576
- <span class="cline-any cline-yes">1x</span>
577
- <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">3x</span>
463
+ <span class="cline-any cline-yes">3x</span>
464
+ <span class="cline-any cline-yes">3x</span>
465
+ <span class="cline-any cline-yes">3x</span>
466
+ <span class="cline-any cline-yes">3x</span>
467
+ <span class="cline-any cline-yes">3x</span>
468
+ <span class="cline-any cline-yes">3x</span>
469
+ <span class="cline-any cline-yes">3x</span>
470
+ <span class="cline-any cline-yes">3x</span>
471
+ <span class="cline-any cline-yes">3x</span>
472
+ <span class="cline-any cline-yes">3x</span>
473
+ <span class="cline-any cline-yes">3x</span>
474
+ <span class="cline-any cline-yes">3x</span>
578
475
  <span class="cline-any cline-yes">1x</span>
579
476
  <span class="cline-any cline-yes">3x</span>
477
+ <span class="cline-any cline-yes">2x</span>
478
+ <span class="cline-any cline-yes">2x</span>
580
479
  <span class="cline-any cline-yes">3x</span>
581
480
  <span class="cline-any cline-yes">3x</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-yes">1x</span>
484
+ <span class="cline-any cline-yes">2x</span>
485
+ <span class="cline-any cline-yes">2x</span>
486
+ <span class="cline-any cline-yes">2x</span>
487
+ <span class="cline-any cline-yes">2x</span>
582
488
  <span class="cline-any cline-yes">3x</span>
583
- <span class="cline-any cline-yes">4x</span>
584
489
  <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-yes">4x</span>
490
+ <span class="cline-any cline-yes">1x</span>
586
491
  <span class="cline-any cline-no">&nbsp;</span>
587
492
  <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-yes">4x</span>
493
+ <span class="cline-any cline-yes">3x</span>
589
494
  <span class="cline-any cline-yes">1x</span>
590
495
  <span class="cline-any cline-yes">1x</span>
591
496
  <span class="cline-any cline-yes">1x</span>
592
497
  <span class="cline-any cline-yes">1x</span>
593
498
  <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">3x</span>
500
+ <span class="cline-any cline-yes">2x</span>
501
+ <span class="cline-any cline-yes">2x</span>
594
502
  <span class="cline-any cline-yes">4x</span>
595
- <span class="cline-any cline-yes">4x</span>
596
- <span class="cline-any cline-yes">4x</span>
597
- <span class="cline-any cline-yes">6x</span>
598
503
  <span class="cline-any cline-yes">1x</span>
599
504
  <span class="cline-any cline-yes">1x</span>
600
- <span class="cline-any cline-yes">278x</span>
505
+ <span class="cline-any cline-yes">105x</span>
601
506
  <span class="cline-any cline-no">&nbsp;</span>
602
507
  <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-yes">278x</span>
604
- <span class="cline-any cline-yes">278x</span>
605
- <span class="cline-any cline-yes">278x</span>
606
- <span class="cline-any cline-yes">278x</span>
607
- <span class="cline-any cline-yes">278x</span>
608
- <span class="cline-any cline-yes">278x</span>
609
- <span class="cline-any cline-yes">278x</span>
610
- <span class="cline-any cline-yes">278x</span>
611
- <span class="cline-any cline-yes">278x</span>
612
- <span class="cline-any cline-yes">278x</span>
613
- <span class="cline-any cline-yes">278x</span>
614
- <span class="cline-any cline-yes">278x</span>
615
- <span class="cline-any cline-yes">23x</span>
616
- <span class="cline-any cline-yes">23x</span>
617
- <span class="cline-any cline-yes">23x</span>
618
- <span class="cline-any cline-yes">278x</span>
619
- <span class="cline-any cline-yes">278x</span>
620
- <span class="cline-any cline-yes">6x</span>
621
- <span class="cline-any cline-yes">6x</span>
622
- <span class="cline-any cline-yes">6x</span>
623
- <span class="cline-any cline-yes">278x</span>
624
- <span class="cline-any cline-yes">278x</span>
508
+ <span class="cline-any cline-yes">105x</span>
509
+ <span class="cline-any cline-yes">105x</span>
510
+ <span class="cline-any cline-yes">105x</span>
511
+ <span class="cline-any cline-yes">105x</span>
512
+ <span class="cline-any cline-yes">105x</span>
513
+ <span class="cline-any cline-yes">105x</span>
514
+ <span class="cline-any cline-yes">105x</span>
515
+ <span class="cline-any cline-yes">105x</span>
516
+ <span class="cline-any cline-yes">105x</span>
517
+ <span class="cline-any cline-yes">105x</span>
518
+ <span class="cline-any cline-yes">105x</span>
519
+ <span class="cline-any cline-yes">105x</span>
520
+ <span class="cline-any cline-yes">10x</span>
521
+ <span class="cline-any cline-yes">10x</span>
522
+ <span class="cline-any cline-yes">10x</span>
523
+ <span class="cline-any cline-yes">105x</span>
524
+ <span class="cline-any cline-yes">105x</span>
525
+ <span class="cline-any cline-yes">5x</span>
526
+ <span class="cline-any cline-yes">5x</span>
527
+ <span class="cline-any cline-yes">5x</span>
528
+ <span class="cline-any cline-yes">105x</span>
529
+ <span class="cline-any cline-yes">105x</span>
625
530
  <span class="cline-any cline-no">&nbsp;</span>
626
531
  <span class="cline-any cline-no">&nbsp;</span>
627
532
  <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-yes">278x</span>
629
- <span class="cline-any cline-yes">278x</span>
630
- <span class="cline-any cline-yes">77x</span>
631
- <span class="cline-any cline-yes">77x</span>
632
- <span class="cline-any cline-yes">77x</span>
633
- <span class="cline-any cline-yes">77x</span>
634
- <span class="cline-any cline-yes">77x</span>
635
- <span class="cline-any cline-yes">278x</span>
636
- <span class="cline-any cline-yes">278x</span>
637
- <span class="cline-any cline-yes">278x</span>
638
- <span class="cline-any cline-yes">63x</span>
639
- <span class="cline-any cline-yes">63x</span>
640
- <span class="cline-any cline-yes">63x</span>
641
- <span class="cline-any cline-yes">63x</span>
642
- <span class="cline-any cline-yes">63x</span>
533
+ <span class="cline-any cline-yes">105x</span>
534
+ <span class="cline-any cline-yes">105x</span>
643
535
  <span class="cline-any cline-yes">6x</span>
644
536
  <span class="cline-any cline-yes">6x</span>
645
537
  <span class="cline-any cline-yes">6x</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
538
  <span class="cline-any cline-yes">6x</span>
649
- <span class="cline-any cline-yes">63x</span>
650
- <span class="cline-any cline-yes">63x</span>
651
- <span class="cline-any cline-yes">63x</span>
652
539
  <span class="cline-any cline-yes">6x</span>
653
- <span class="cline-any cline-yes">63x</span>
654
- <span class="cline-any cline-yes">63x</span>
655
- <span class="cline-any cline-yes">63x</span>
656
- <span class="cline-any cline-yes">3x</span>
657
- <span class="cline-any cline-yes">3x</span>
658
- <span class="cline-any cline-yes">3x</span>
659
- <span class="cline-any cline-yes">60x</span>
660
- <span class="cline-any cline-yes">63x</span>
661
- <span class="cline-any cline-yes">44x</span>
662
- <span class="cline-any cline-yes">44x</span>
663
- <span class="cline-any cline-yes">44x</span>
664
- <span class="cline-any cline-yes">44x</span>
665
- <span class="cline-any cline-yes">44x</span>
666
- <span class="cline-any cline-yes">19x</span>
667
- <span class="cline-any cline-yes">19x</span>
668
- <span class="cline-any cline-yes">19x</span>
540
+ <span class="cline-any cline-yes">105x</span>
541
+ <span class="cline-any cline-yes">105x</span>
542
+ <span class="cline-any cline-yes">105x</span>
543
+ <span class="cline-any cline-yes">4x</span>
544
+ <span class="cline-any cline-yes">4x</span>
669
545
  <span class="cline-any cline-yes">4x</span>
670
546
  <span class="cline-any cline-yes">4x</span>
671
547
  <span class="cline-any cline-yes">4x</span>
672
- <span class="cline-any cline-yes">44x</span>
673
- <span class="cline-any cline-yes">25x</span>
674
- <span class="cline-any cline-yes">25x</span>
675
- <span class="cline-any cline-yes">25x</span>
676
- <span class="cline-any cline-yes">25x</span>
677
- <span class="cline-any cline-yes">25x</span>
678
- <span class="cline-any cline-yes">24x</span>
679
- <span class="cline-any cline-yes">23x</span>
680
- <span class="cline-any cline-yes">23x</span>
681
- <span class="cline-any cline-yes">24x</span>
682
- <span class="cline-any cline-yes">24x</span>
683
- <span class="cline-any cline-yes">25x</span>
684
- <span class="cline-any cline-yes">1x</span>
685
548
  <span class="cline-any cline-yes">1x</span>
686
549
  <span class="cline-any cline-yes">1x</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
550
  <span class="cline-any cline-yes">1x</span>
691
- <span class="cline-any cline-yes">25x</span>
692
- <span class="cline-any cline-yes">40x</span>
693
- <span class="cline-any cline-yes">40x</span>
694
- <span class="cline-any cline-yes">40x</span>
695
- <span class="cline-any cline-yes">63x</span>
696
- <span class="cline-any cline-yes">14x</span>
697
- <span class="cline-any cline-yes">14x</span>
698
- <span class="cline-any cline-yes">14x</span>
699
- <span class="cline-any cline-yes">14x</span>
700
- <span class="cline-any cline-yes">14x</span>
701
- <span class="cline-any cline-yes">14x</span>
702
- <span class="cline-any cline-yes">14x</span>
703
- <span class="cline-any cline-yes">14x</span>
704
- <span class="cline-any cline-yes">14x</span>
705
- <span class="cline-any cline-yes">1x</span>
706
- <span class="cline-any cline-yes">1x</span>
707
- <span class="cline-any cline-yes">1x</span>
708
- <span class="cline-any cline-yes">13x</span>
709
- <span class="cline-any cline-yes">14x</span>
710
- <span class="cline-any cline-yes">2x</span>
711
- <span class="cline-any cline-yes">2x</span>
712
- <span class="cline-any cline-yes">13x</span>
713
- <span class="cline-any cline-yes">13x</span>
714
- <span class="cline-any cline-yes">13x</span>
715
- <span class="cline-any cline-yes">13x</span>
716
- <span class="cline-any cline-yes">278x</span>
717
- <span class="cline-any cline-yes">215x</span>
718
- <span class="cline-any cline-yes">215x</span>
719
- <span class="cline-any cline-yes">257x</span>
720
- <span class="cline-any cline-yes">257x</span>
721
- <span class="cline-any cline-yes">257x</span>
722
- <span class="cline-any cline-yes">278x</span>
723
- <span class="cline-any cline-yes">1x</span>
724
- <span class="cline-any cline-yes">1x</span>
725
- <span class="cline-any cline-yes">1x</span>
726
- <span class="cline-any cline-yes">8x</span>
727
- <span class="cline-any cline-yes">8x</span>
728
- <span class="cline-any cline-yes">8x</span>
729
- <span class="cline-any cline-yes">8x</span>
730
- <span class="cline-any cline-yes">8x</span>
731
- <span class="cline-any cline-yes">8x</span>
732
- <span class="cline-any cline-yes">8x</span>
733
- <span class="cline-any cline-yes">8x</span>
734
- <span class="cline-any cline-yes">8x</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
551
  <span class="cline-any cline-no">&nbsp;</span>
737
- <span class="cline-any cline-yes">8x</span>
738
- <span class="cline-any cline-yes">8x</span>
739
- <span class="cline-any cline-yes">8x</span>
740
- <span class="cline-any cline-yes">8x</span>
741
552
  <span class="cline-any cline-yes">1x</span>
742
553
  <span class="cline-any cline-yes">1x</span>
743
554
  <span class="cline-any cline-yes">1x</span>
744
- <span class="cline-any cline-yes">2x</span>
745
- <span class="cline-any cline-yes">13x</span>
746
- <span class="cline-any cline-yes">13x</span>
747
- <span class="cline-any cline-yes">13x</span>
748
- <span class="cline-any cline-yes">13x</span>
749
- <span class="cline-any cline-yes">13x</span>
750
- <span class="cline-any cline-yes">13x</span>
751
- <span class="cline-any cline-yes">13x</span>
752
- <span class="cline-any cline-yes">13x</span>
753
- <span class="cline-any cline-yes">13x</span>
754
- <span class="cline-any cline-yes">13x</span>
755
- <span class="cline-any cline-yes">13x</span>
756
- <span class="cline-any cline-yes">13x</span>
757
- <span class="cline-any cline-yes">13x</span>
758
- <span class="cline-any cline-yes">11x</span>
759
- <span class="cline-any cline-yes">13x</span>
760
- <span class="cline-any cline-yes">5x</span>
761
- <span class="cline-any cline-yes">5x</span>
762
- <span class="cline-any cline-yes">5x</span>
763
- <span class="cline-any cline-yes">5x</span>
764
- <span class="cline-any cline-yes">5x</span>
765
- <span class="cline-any cline-yes">5x</span>
766
- <span class="cline-any cline-yes">5x</span>
767
- <span class="cline-any cline-yes">5x</span>
768
- <span class="cline-any cline-yes">5x</span>
769
- <span class="cline-any cline-yes">5x</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-no">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</span>
779
- <span class="cline-any cline-yes">5x</span>
780
- <span class="cline-any cline-yes">11x</span>
781
- <span class="cline-any cline-yes">13x</span>
782
- <span class="cline-any cline-yes">2x</span>
783
- <span class="cline-any cline-yes">1x</span>
784
555
  <span class="cline-any cline-yes">1x</span>
785
556
  <span class="cline-any cline-yes">4x</span>
786
557
  <span class="cline-any cline-yes">4x</span>
787
558
  <span class="cline-any cline-yes">4x</span>
559
+ <span class="cline-any cline-yes">2x</span>
788
560
  <span class="cline-any cline-yes">4x</span>
789
561
  <span class="cline-any cline-yes">4x</span>
790
562
  <span class="cline-any cline-yes">4x</span>
791
- <span class="cline-any cline-yes">4x</span>
792
- <span class="cline-any cline-yes">4x</span>
793
- <span class="cline-any cline-yes">1x</span>
794
- <span class="cline-any cline-yes">1x</span>
795
- <span class="cline-any cline-yes">1x</span>
796
- <span class="cline-any cline-yes">1x</span>
797
- <span class="cline-any cline-yes">1x</span>
798
563
  <span class="cline-any cline-yes">1x</span>
799
564
  <span class="cline-any cline-yes">1x</span>
800
565
  <span class="cline-any cline-yes">1x</span>
566
+ <span class="cline-any cline-yes">3x</span>
567
+ <span class="cline-any cline-yes">4x</span>
801
568
  <span class="cline-any cline-yes">1x</span>
802
569
  <span class="cline-any cline-yes">1x</span>
803
570
  <span class="cline-any cline-yes">1x</span>
804
571
  <span class="cline-any cline-yes">1x</span>
805
572
  <span class="cline-any cline-yes">1x</span>
806
573
  <span class="cline-any cline-yes">1x</span>
807
- <span class="cline-any cline-yes">4x</span>
808
- <span class="cline-any cline-yes">4x</span>
809
- <span class="cline-any cline-yes">4x</span>
810
- <span class="cline-any cline-yes">4x</span>
811
574
  <span class="cline-any cline-yes">1x</span>
812
575
  <span class="cline-any cline-yes">1x</span>
813
576
  <span class="cline-any cline-no">&nbsp;</span>
814
577
  <span class="cline-any cline-no">&nbsp;</span>
815
578
  <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
816
581
  <span class="cline-any cline-no">&nbsp;</span>
817
582
  <span class="cline-any cline-no">&nbsp;</span>
818
583
  <span class="cline-any cline-no">&nbsp;</span>
@@ -831,10 +596,57 @@
831
596
  <span class="cline-any cline-no">&nbsp;</span>
832
597
  <span class="cline-any cline-no">&nbsp;</span>
833
598
  <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-yes">1x</span>
600
+ <span class="cline-any cline-yes">1x</span>
601
+ <span class="cline-any cline-yes">1x</span>
602
+ <span class="cline-any cline-yes">4x</span>
603
+ <span class="cline-any cline-yes">2x</span>
604
+ <span class="cline-any cline-yes">2x</span>
605
+ <span class="cline-any cline-yes">2x</span>
606
+ <span class="cline-any cline-yes">2x</span>
607
+ <span class="cline-any cline-yes">2x</span>
608
+ <span class="cline-any cline-yes">2x</span>
609
+ <span class="cline-any cline-yes">2x</span>
610
+ <span class="cline-any cline-yes">2x</span>
611
+ <span class="cline-any cline-yes">2x</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
834
613
  <span class="cline-any cline-no">&nbsp;</span>
835
614
  <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-yes">2x</span>
616
+ <span class="cline-any cline-yes">2x</span>
617
+ <span class="cline-any cline-yes">1x</span>
618
+ <span class="cline-any cline-yes">1x</span>
619
+ <span class="cline-any cline-yes">2x</span>
620
+ <span class="cline-any cline-yes">2x</span>
621
+ <span class="cline-any cline-yes">2x</span>
622
+ <span class="cline-any cline-yes">2x</span>
623
+ <span class="cline-any cline-yes">105x</span>
624
+ <span class="cline-any cline-yes">101x</span>
625
+ <span class="cline-any cline-yes">101x</span>
626
+ <span class="cline-any cline-yes">102x</span>
627
+ <span class="cline-any cline-yes">102x</span>
628
+ <span class="cline-any cline-yes">102x</span>
629
+ <span class="cline-any cline-yes">105x</span>
630
+ <span class="cline-any cline-yes">1x</span>
631
+ <span class="cline-any cline-yes">1x</span>
632
+ <span class="cline-any cline-yes">1x</span>
633
+ <span class="cline-any cline-yes">5x</span>
634
+ <span class="cline-any cline-yes">5x</span>
635
+ <span class="cline-any cline-yes">5x</span>
636
+ <span class="cline-any cline-yes">5x</span>
637
+ <span class="cline-any cline-yes">5x</span>
638
+ <span class="cline-any cline-yes">5x</span>
639
+ <span class="cline-any cline-yes">5x</span>
640
+ <span class="cline-any cline-yes">5x</span>
641
+ <span class="cline-any cline-yes">5x</span>
836
642
  <span class="cline-any cline-no">&nbsp;</span>
837
643
  <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-yes">5x</span>
645
+ <span class="cline-any cline-yes">5x</span>
646
+ <span class="cline-any cline-yes">5x</span>
647
+ <span class="cline-any cline-yes">5x</span>
648
+ <span class="cline-any cline-yes">1x</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
650
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
839
651
  import makeDebug from 'debug'
840
652
  import common from 'feathers-hooks-common'
@@ -845,7 +657,6 @@ import {
845
657
  hasServiceAbilities, hasResourceAbilities, getQueryForAbilities,
846
658
  Roles, RoleNames, countSubjectsForResource
847
659
  } from '../../common/permissions.js'
848
- import { isTagEqual } from '../utils.js'
849
660
  &nbsp;
850
661
  const { getItems, replaceItems } = common
851
662
  const { Forbidden } = errors
@@ -862,7 +673,7 @@ export function createJWT (options = {}) {
862
673
  const accessTokens = await Promise.all(items.map(item =&gt; hook.app.getService('authentication').createAccessToken(
863
674
  // Provided function can be used to pick or omit properties in JWT payload
864
675
  (typeof options.payload === 'function' ? options.payload(user) : {}),
865
- // Provided function can be used for custom options cdepending on the user,
676
+ // Provided function can be used for custom options depending on the user,
866
677
  // then we merge with default auth options for global properties like aud, iss, etc.
867
678
  _.merge({}, defaults, (typeof options.jwt === 'function' ? options.jwt(user) : options)))
868
679
  ))
@@ -1023,14 +834,16 @@ export async function authorise (hook) {
1023
834
  if (checkAuthorisation) {
1024
835
  // Build ability for user
1025
836
  const authorisationService = hook.app.getService('authorisations')
1026
- // If no user we allow for a stateless token with permissions inside
1027
837
  let subject = hook.params.user
1028
- if (!subject) {
1029
- const payload = _.get(hook.params, 'authentication.payload')
1030
- // Token targeting API gateway (sub = keyId) or app used through iframe (appId = keyId)
1031
- if (payload <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; (payload.sub || payload.appId))</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
838
+ const payload = _.get(hook.params, 'authentication.payload')
839
+ if (payload) {
840
+ // If no user we allow for a stateless token with permissions inside, e.g.
841
+ // token targeting API gateway (sub = keyId) or app used through iframe (appId = keyId)
842
+ if (!subject <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; (payload.sub || payload.appId))</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1032
843
  <span class="cstat-no" title="statement not covered" > subject = Object.assign({ _id: (payload.sub || payload.appId) }, payload)</span>
1033
- <span class="cstat-no" title="statement not covered" > }</span>
844
+ } else if (subject) { // Otherwise we allow to "extend" user abilities by providing additional information in the token
845
+ subject = Object.assign(subject, _.omit(payload, ['aud', 'iss', 'exp', 'sub', 'iat', 'jti', 'nbf']))
846
+ }
1034
847
  }
1035
848
  const abilities = await authorisationService.getAbilities(subject)
1036
849
  hook.params.abilities = abilities
@@ -1048,33 +861,33 @@ export async function authorise (hook) {
1048
861
  // simply check against the object we'd like to create
1049
862
  // Support custom methods as create operation as they have similar signature
1050
863
  const DEFAULT_METHODS = ['find', 'get', 'create', 'update', 'patch', 'remove']
1051
- if ((operation === 'create') || !DEFAULT_METHODS.includes(operation)) {
864
+ if ((operation === 'create') <span class="branch-0 cbranch-no" title="branch not covered" >|| !DEFAULT_METHODS.includes(operation))</span> {
1052
865
  const resource = hook.data
1053
866
  debug('Target resource is ', resource)
1054
- if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {
1055
- debug('Resource access not granted')
1056
- throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)
1057
- }
1058
- } else {
1059
- // When we find/update/patch/remove multiple items this ensures that
1060
- // only the ones authorised by constraints on the resources will be fetched
1061
- // This avoid fetching all first then check it one by one
1062
- const dbQuery = objectifyIDs(getQueryForAbilities(abilities, operation, resourceType))
1063
- if (dbQuery) {
1064
- hook.params.query = _.transform(hook.params.query, (result, value, key) =&gt; {
1065
- if (key === '$or') <span class="branch-0 cbranch-no" title="branch not covered" >result.$and = [{ $or: value }]</span>
1066
- else result[key] = value
1067
- }, {})
1068
- _.merge(hook.params.query, dbQuery)
1069
- } else {
1070
- if (operation === 'find') { // You don't have right to read any items but you have access to the service so the result is empty
1071
- hook.result = (!_.get(hook, 'params.paginate', true) <span class="branch-0 cbranch-no" title="branch not covered" >? [] </span>: { total: 0, skip: 0, data: [] })
1072
- }<span class="branch-0 cbranch-no" title="branch not covered" > else { // You don't have the right to update/patch/remove any items so any tentative should throw</span>
867
+ if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
868
+ <span class="cstat-no" title="statement not covered" > debug('Resource access not granted')</span>
869
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)</span>
870
+ <span class="cstat-no" title="statement not covered" > }</span>
871
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
872
+ <span class="cstat-no" title="statement not covered" > // When we find/update/patch/remove multiple items this ensures that</span>
873
+ <span class="cstat-no" title="statement not covered" > // only the ones authorised by constraints on the resources will be fetched</span>
874
+ <span class="cstat-no" title="statement not covered" > // This avoid fetching all first then check it one by one</span>
875
+ <span class="cstat-no" title="statement not covered" > const dbQuery = objectifyIDs(getQueryForAbilities(abilities, operation, resourceType))</span>
876
+ <span class="cstat-no" title="statement not covered" > if (dbQuery) {</span>
877
+ <span class="cstat-no" title="statement not covered" > hook.params.query = _.transform(hook.params.query, (result, value, key) =&gt; {</span>
878
+ <span class="cstat-no" title="statement not covered" > if (key === '$or') result.$and = [{ $or: value }]</span>
879
+ <span class="cstat-no" title="statement not covered" > else result[key] = value</span>
880
+ <span class="cstat-no" title="statement not covered" > }, {})</span>
881
+ <span class="cstat-no" title="statement not covered" > _.merge(hook.params.query, dbQuery)</span>
882
+ <span class="cstat-no" title="statement not covered" > } else {</span>
883
+ <span class="cstat-no" title="statement not covered" > if (operation === 'find') { // You don't have right to read any items but you have access to the service so the result is empty</span>
884
+ <span class="cstat-no" title="statement not covered" > hook.result = (!_.get(hook, 'params.paginate', true) ? [] : { total: 0, skip: 0, data: [] })</span>
885
+ <span class="cstat-no" title="statement not covered" > } else { // You don't have the right to update/patch/remove any items so any tentative should throw</span>
1073
886
  <span class="cstat-no" title="statement not covered" > debug('Resource access not granted')</span>
1074
887
  <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)</span>
1075
888
  <span class="cstat-no" title="statement not covered" > }</span>
1076
- }
1077
- }
889
+ <span class="cstat-no" title="statement not covered" > }</span>
890
+ <span class="cstat-no" title="statement not covered" > }</span>
1078
891
  debug('Resource access granted')
1079
892
  // Some specific services might not expose a get function, in this case we cannot check for authorisation
1080
893
  // this has to be implemented by the service itself
@@ -1087,10 +900,10 @@ export async function authorise (hook) {
1087
900
  const resource = await hook.service.get(hook.id, params)
1088
901
  debug('Target resource is', resource)
1089
902
  // Then check against the object we'd like to manage
1090
- if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {
1091
- debug('Resource access not granted')
1092
- throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)
1093
- }
903
+ if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
904
+ <span class="cstat-no" title="statement not covered" > debug('Resource access not granted')</span>
905
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)</span>
906
+ <span class="cstat-no" title="statement not covered" > }</span>
1094
907
  // Avoid fetching again the object in this case
1095
908
  if (operation === 'get') {
1096
909
  hook.result = resource
@@ -1126,101 +939,6 @@ export function updateAbilities (options = {}) {
1126
939
  }
1127
940
  }
1128
941
  &nbsp;
1129
- export function preventRemovingLastOwner (resourceScope) {
1130
- return async function (hook) {
1131
- // By pass check ?
1132
- if (hook.params.force) <span class="branch-0 cbranch-no" title="branch not covered" >return hook</span>
1133
- const params = hook.params
1134
- const data = hook.data || {}
1135
- const query = params.query || {}
1136
- const scope = data.scope || query.scope
1137
- const grantedPermissions = data.permissions || query.permissions
1138
- const grantedRole = (grantedPermissions ? Roles[grantedPermissions] : undefined)
1139
- const resource = hook.params.resource
1140
- const subjects = hook.params.subjects
1141
- const subjectService = hook.params.subjectsService
1142
- // On create check if we try to downgrade permissions otherwise let pass through
1143
- if (!_.isUndefined(grantedRole) &amp;&amp; (grantedRole === Roles.owner)) return hook
1144
- &nbsp;
1145
- if ((scope === resourceScope) &amp;&amp; resource &amp;&amp; resource._id) {
1146
- // Count existing owners
1147
- const owners = await countSubjectsForResource(subjectService, resourceScope, resource._id, Roles.owner)
1148
- // Now count owners we change/remove permissions on
1149
- const removedOwners = subjects.reduce((count, subject) =&gt; {
1150
- const resources = _.get(subject, resourceScope, [])
1151
- const ownedResource = _.find(resources, { _id: resource._id, permissions: RoleNames[Roles.owner] })
1152
- return (ownedResource <span class="branch-0 cbranch-no" title="branch not covered" >? count + 1 </span>: count)
1153
- }, 0)
1154
- // If none remains stop
1155
- if (removedOwners &gt;= owners.total) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1156
- <span class="cstat-no" title="statement not covered" > debug('Cannot remove the last owner of resource ', resource)</span>
1157
- <span class="cstat-no" title="statement not covered" > const resourceName = resource.name ? resource.name : resource._id.toString()</span>
1158
- <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to remove the last owner of resource ' + resourceName, {</span>
1159
- <span class="cstat-no" title="statement not covered" > translation: {</span>
1160
- <span class="cstat-no" title="statement not covered" > key: 'CANNOT_REMOVE_LAST_OWNER',</span>
1161
- <span class="cstat-no" title="statement not covered" > params: { resource: resourceName }</span>
1162
- <span class="cstat-no" title="statement not covered" > }</span>
1163
- <span class="cstat-no" title="statement not covered" > })</span>
1164
- <span class="cstat-no" title="statement not covered" > }</span>
1165
- }
1166
- return hook
1167
- }
1168
- }
1169
- &nbsp;
1170
- export async function removeOrganisationGroupsAuthorisations (hook) {
1171
- const app = hook.app
1172
- const authorisationService = app.getService('authorisations')
1173
- const org = hook.params.resource
1174
- const user = hook.params.user
1175
- // Unset membership for the all org groups
1176
- const orgGroupService = app.getService('groups', org)
1177
- const groups = await orgGroupService.find({ paginate: false })
1178
- await Promise.all(groups.map(group =&gt; {
1179
- // Unset membership on group for the all org users
1180
- return authorisationService.remove(group._id.toString(), {
1181
- query: {
1182
- scope: 'groups'
1183
- },
1184
- user,
1185
- force: hook.params.force,
1186
- // Because we already have resource set it as objects to avoid populating
1187
- // Moreover used as an after hook the resource might not already exist anymore
1188
- subjects: hook.params.subjects,
1189
- subjectsService: hook.params.subjectsService,
1190
- resource: group,
1191
- resourcesService: orgGroupService
1192
- })
1193
- }))
1194
- debug('Authorisations unset on groups for organisation ' + org._id)
1195
- return hook
1196
- }
1197
- &nbsp;
1198
- export <span class="fstat-no" title="function not covered" >async function removeOrganisationTagsAuthorisations (hook) {</span>
1199
- <span class="cstat-no" title="statement not covered" > const app = hook.app</span>
1200
- <span class="cstat-no" title="statement not covered" > const org = hook.params.resource</span>
1201
- <span class="cstat-no" title="statement not covered" > const subjectService = hook.params.subjectsService</span>
1202
- <span class="cstat-no" title="statement not covered" > const orgTagsService = app.getService('tags', org)</span>
1203
- <span class="cstat-no" title="statement not covered" > const subjects = hook.params.subjects || []</span>
1204
- <span class="cstat-no" title="statement not covered" > if (subjects.length === 0) return hook</span>
1205
- <span class="cstat-no" title="statement not covered" > // Retrieve org tags</span>
1206
- <span class="cstat-no" title="statement not covered" > const orgTags = await orgTagsService.find({ paginate: false })</span>
1207
- <span class="cstat-no" title="statement not covered" > const promises = []</span>
1208
- <span class="cstat-no" title="statement not covered" > subjects.forEach(subject =&gt; {</span>
1209
- <span class="cstat-no" title="statement not covered" > const tags = subject.tags || []</span>
1210
- <span class="cstat-no" title="statement not covered" > // Find tags from org</span>
1211
- <span class="cstat-no" title="statement not covered" > const fromOrg = _.intersectionWith(tags, orgTags, isTagEqual)</span>
1212
- <span class="cstat-no" title="statement not covered" > // Clear removed tags</span>
1213
- <span class="cstat-no" title="statement not covered" > const notFromOrg = _.differenceWith(tags, orgTags, isTagEqual)</span>
1214
- <span class="cstat-no" title="statement not covered" > // Update subject if required</span>
1215
- <span class="cstat-no" title="statement not covered" > if (fromOrg.length &gt; 0) {</span>
1216
- <span class="cstat-no" title="statement not covered" > promises.push(subjectService.patch(subject._id.toString(), { tags: notFromOrg }))</span>
1217
- <span class="cstat-no" title="statement not covered" > }</span>
1218
- <span class="cstat-no" title="statement not covered" > })</span>
1219
- <span class="cstat-no" title="statement not covered" > // Perform subject updates in parallel</span>
1220
- <span class="cstat-no" title="statement not covered" > await Promise.all(promises)</span>
1221
- <span class="cstat-no" title="statement not covered" > debug(`Tags unset on ${promises.length} subjects for organisation ` + org._id)</span>
1222
- <span class="cstat-no" title="statement not covered" > return hook</span>
1223
- <span class="cstat-no" title="statement not covered" >}</span>
1224
942
  &nbsp;</pre></td></tr></table></pre>
1225
943
 
1226
944
  <div class='push'></div><!-- for sticky footer -->
@@ -1228,7 +946,7 @@ export <span class="fstat-no" title="function not covered" >async function remov
1228
946
  <div class='footer quiet pad2 space-top1 center small'>
1229
947
  Code coverage generated by
1230
948
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1231
- at 2024-11-15T21:05:45.936Z
949
+ at 2025-05-21T12:01:19.833Z
1232
950
  </div>
1233
951
  <script src="../../../prettify.js"></script>
1234
952
  <script>