@nocios/crudify-components 2.0.81 → 2.0.88

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 (394) hide show
  1. package/README.md +21 -0
  2. package/dist/api-jcCTCqPD.d.mts +61 -0
  3. package/dist/api-jcCTCqPD.d.ts +61 -0
  4. package/dist/chunk-4I767MRM.mjs +142 -0
  5. package/dist/chunk-5V5ILPP3.js +1 -0
  6. package/dist/chunk-BJEDX2HU.js +142 -0
  7. package/dist/chunk-GZOB4JDB.js +1 -0
  8. package/dist/chunk-ODKXUEH5.js +1 -0
  9. package/dist/chunk-U335FNUD.mjs +1 -0
  10. package/dist/chunk-YRU7AXYV.mjs +1 -0
  11. package/dist/chunk-Z75DRSTN.mjs +1 -0
  12. package/dist/{errorTranslation-BEWwDbCH.d.ts → errorTranslation-BdqG-dXD.d.ts} +97 -26
  13. package/dist/{errorTranslation-DsGZon0M.d.mts → errorTranslation-BxJmBGx0.d.mts} +97 -26
  14. package/dist/hooks.d.mts +3 -4
  15. package/dist/hooks.d.ts +3 -4
  16. package/dist/hooks.js +1 -1
  17. package/dist/hooks.mjs +1 -1
  18. package/dist/{index-ZcF6nJt4.d.mts → index-Cx9P3ZCG.d.mts} +96 -27
  19. package/dist/{index-Dnmttf62.d.ts → index-rHtWMls-.d.ts} +96 -27
  20. package/dist/index.d.mts +366 -118
  21. package/dist/index.d.ts +366 -118
  22. package/dist/index.js +2 -2
  23. package/dist/index.mjs +2 -2
  24. package/dist/public-policies.d.mts +7 -0
  25. package/dist/public-policies.d.ts +7 -0
  26. package/dist/public-policies.js +1 -0
  27. package/dist/public-policies.mjs +1 -0
  28. package/dist/utils.d.mts +71 -3
  29. package/dist/utils.d.ts +71 -3
  30. package/dist/utils.js +1 -1
  31. package/dist/utils.mjs +1 -1
  32. package/package.json +44 -42
  33. package/.github/workflows/ci.yml +0 -70
  34. package/.husky/pre-commit +0 -26
  35. package/.husky/pre-push +0 -30
  36. package/.nvmrc +0 -1
  37. package/.prettierignore +0 -18
  38. package/.prettierrc +0 -9
  39. package/.scannerwork/.sonar_lock +0 -0
  40. package/.scannerwork/report-task.txt +0 -6
  41. package/README_DEPTH.md +0 -1237
  42. package/coverage/base.css +0 -224
  43. package/coverage/block-navigation.js +0 -87
  44. package/coverage/components/CrudiaAutoGenerate.tsx.html +0 -616
  45. package/coverage/components/CrudiaFileField/CrudiaFileField.tsx.html +0 -1312
  46. package/coverage/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +0 -355
  47. package/coverage/components/CrudiaFileField/components/DropZone.tsx.html +0 -523
  48. package/coverage/components/CrudiaFileField/components/FileItemRow.tsx.html +0 -835
  49. package/coverage/components/CrudiaFileField/components/FileThumbnail.tsx.html +0 -1585
  50. package/coverage/components/CrudiaFileField/components/index.html +0 -176
  51. package/coverage/components/CrudiaFileField/components/index.ts.html +0 -115
  52. package/coverage/components/CrudiaFileField/hooks/index.html +0 -146
  53. package/coverage/components/CrudiaFileField/hooks/index.ts.html +0 -112
  54. package/coverage/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +0 -433
  55. package/coverage/components/CrudiaFileField/hooks/useDragDrop.ts.html +0 -409
  56. package/coverage/components/CrudiaFileField/index.html +0 -131
  57. package/coverage/components/CrudiaFileField/index.ts.html +0 -112
  58. package/coverage/components/CrudiaFileField/utils/formatters.ts.html +0 -169
  59. package/coverage/components/CrudiaFileField/utils/icons.tsx.html +0 -253
  60. package/coverage/components/CrudiaFileField/utils/index.html +0 -146
  61. package/coverage/components/CrudiaFileField/utils/index.ts.html +0 -103
  62. package/coverage/components/CrudiaMarkdownField.tsx.html +0 -676
  63. package/coverage/components/CrudifyInitializer.tsx.html +0 -712
  64. package/coverage/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +0 -640
  65. package/coverage/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +0 -730
  66. package/coverage/components/CrudifyLogin/Forms/LoginForm.tsx.html +0 -892
  67. package/coverage/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +0 -1219
  68. package/coverage/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +0 -289
  69. package/coverage/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +0 -202
  70. package/coverage/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +0 -346
  71. package/coverage/components/CrudifyLogin/Forms/components/index.html +0 -161
  72. package/coverage/components/CrudifyLogin/Forms/components/index.ts.html +0 -106
  73. package/coverage/components/CrudifyLogin/Forms/index.html +0 -176
  74. package/coverage/components/CrudifyLogin/Forms/index.ts.html +0 -145
  75. package/coverage/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +0 -268
  76. package/coverage/components/CrudifyLogin/Forms/utils/index.html +0 -161
  77. package/coverage/components/CrudifyLogin/Forms/utils/index.ts.html +0 -121
  78. package/coverage/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +0 -496
  79. package/coverage/components/CrudifyLogin/Forms/utils/validation.ts.html +0 -307
  80. package/coverage/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +0 -268
  81. package/coverage/components/CrudifyLogin/components/index.html +0 -116
  82. package/coverage/components/CrudifyLogin/context/CrudifyProvider.tsx.html +0 -409
  83. package/coverage/components/CrudifyLogin/context/I18nProvider.tsx.html +0 -430
  84. package/coverage/components/CrudifyLogin/context/LoginStateProvider.tsx.html +0 -1261
  85. package/coverage/components/CrudifyLogin/context/index.html +0 -161
  86. package/coverage/components/CrudifyLogin/context/index.ts.html +0 -91
  87. package/coverage/components/CrudifyLogin/hooks/index.html +0 -131
  88. package/coverage/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +0 -463
  89. package/coverage/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +0 -391
  90. package/coverage/components/CrudifyLogin/index.html +0 -116
  91. package/coverage/components/CrudifyLogin/index.tsx.html +0 -466
  92. package/coverage/components/CrudifyLogin/utils/index.html +0 -116
  93. package/coverage/components/CrudifyLogin/utils/secureStorage.ts.html +0 -859
  94. package/coverage/components/GlobalNotificationProvider.tsx.html +0 -844
  95. package/coverage/components/LoginComponent.tsx.html +0 -676
  96. package/coverage/components/PasswordRequirements/index.html +0 -116
  97. package/coverage/components/PasswordRequirements/index.tsx.html +0 -232
  98. package/coverage/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +0 -1078
  99. package/coverage/components/PublicPolicies/FieldSelector/index.html +0 -131
  100. package/coverage/components/PublicPolicies/FieldSelector/index.ts.html +0 -88
  101. package/coverage/components/PublicPolicies/Policies.tsx.html +0 -625
  102. package/coverage/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +0 -886
  103. package/coverage/components/PublicPolicies/PolicyItem/index.html +0 -131
  104. package/coverage/components/PublicPolicies/PolicyItem/index.ts.html +0 -88
  105. package/coverage/components/PublicPolicies/constants.ts.html +0 -106
  106. package/coverage/components/PublicPolicies/index.html +0 -146
  107. package/coverage/components/PublicPolicies/index.ts.html +0 -88
  108. package/coverage/components/Routing/AuthRoute.tsx.html +0 -382
  109. package/coverage/components/Routing/GuestRoute.tsx.html +0 -352
  110. package/coverage/components/Routing/ProtectedRoute.tsx.html +0 -316
  111. package/coverage/components/Routing/index.html +0 -161
  112. package/coverage/components/Routing/index.ts.html +0 -109
  113. package/coverage/components/SessionLoadingScreen/index.html +0 -116
  114. package/coverage/components/SessionLoadingScreen/index.tsx.html +0 -379
  115. package/coverage/components/SessionTimeIndicator/index.html +0 -116
  116. package/coverage/components/SessionTimeIndicator/index.tsx.html +0 -523
  117. package/coverage/components/UserProfile/UserProfileDisplay.tsx.html +0 -931
  118. package/coverage/components/UserProfile/index.html +0 -131
  119. package/coverage/components/UserProfile/index.ts.html +0 -88
  120. package/coverage/components/index.html +0 -191
  121. package/coverage/components/index.ts.html +0 -178
  122. package/coverage/core/CrossTabSyncManager.ts.html +0 -853
  123. package/coverage/core/CrudifyInitializationManager.ts.html +0 -1279
  124. package/coverage/core/SessionManager.ts.html +0 -3064
  125. package/coverage/core/index.html +0 -146
  126. package/coverage/coverage-final.json +0 -117
  127. package/coverage/favicon.png +0 -0
  128. package/coverage/hooks/index.html +0 -191
  129. package/coverage/hooks/index.ts.html +0 -136
  130. package/coverage/hooks/useAuth.ts.html +0 -529
  131. package/coverage/hooks/useAutoGenerate.ts.html +0 -571
  132. package/coverage/hooks/useCrudifyWithNotifications/constants.ts.html +0 -247
  133. package/coverage/hooks/useCrudifyWithNotifications/hooks/index.html +0 -116
  134. package/coverage/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +0 -820
  135. package/coverage/hooks/useCrudifyWithNotifications/index.html +0 -146
  136. package/coverage/hooks/useCrudifyWithNotifications/index.ts.html +0 -118
  137. package/coverage/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +0 -565
  138. package/coverage/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +0 -847
  139. package/coverage/hooks/useCrudifyWithNotifications/utils/index.html +0 -146
  140. package/coverage/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +0 -313
  141. package/coverage/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +0 -265
  142. package/coverage/hooks/useData.ts.html +0 -829
  143. package/coverage/hooks/useFileUpload/index.html +0 -131
  144. package/coverage/hooks/useFileUpload/index.ts.html +0 -112
  145. package/coverage/hooks/useFileUpload/services/index.html +0 -131
  146. package/coverage/hooks/useFileUpload/services/index.ts.html +0 -106
  147. package/coverage/hooks/useFileUpload/services/uploadService.ts.html +0 -610
  148. package/coverage/hooks/useFileUpload/useFileUpload.ts.html +0 -2092
  149. package/coverage/hooks/useFileUpload/utils/fileUtils.ts.html +0 -271
  150. package/coverage/hooks/useFileUpload/utils/index.html +0 -161
  151. package/coverage/hooks/useFileUpload/utils/index.ts.html +0 -109
  152. package/coverage/hooks/useFileUpload/utils/mimeTypes.ts.html +0 -235
  153. package/coverage/hooks/useFileUpload/utils/validation.ts.html +0 -403
  154. package/coverage/hooks/useSession/constants.ts.html +0 -217
  155. package/coverage/hooks/useSession/hooks/index.html +0 -176
  156. package/coverage/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +0 -331
  157. package/coverage/hooks/useSession/hooks/useCrossTabSync.ts.html +0 -535
  158. package/coverage/hooks/useSession/hooks/useSessionActions.ts.html +0 -664
  159. package/coverage/hooks/useSession/hooks/useSessionState.ts.html +0 -295
  160. package/coverage/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +0 -535
  161. package/coverage/hooks/useSession/index.html +0 -161
  162. package/coverage/hooks/useSession/index.ts.html +0 -127
  163. package/coverage/hooks/useSession/types.ts.html +0 -427
  164. package/coverage/hooks/useSession/useSession.ts.html +0 -526
  165. package/coverage/hooks/useSession/utils/index.html +0 -131
  166. package/coverage/hooks/useSession/utils/initializeSession.ts.html +0 -424
  167. package/coverage/hooks/useSession/utils/tokenUtils.ts.html +0 -298
  168. package/coverage/hooks/useUserData.ts.html +0 -1210
  169. package/coverage/hooks/useUserProfile.ts.html +0 -820
  170. package/coverage/index.html +0 -656
  171. package/coverage/lcov-report/base.css +0 -224
  172. package/coverage/lcov-report/block-navigation.js +0 -87
  173. package/coverage/lcov-report/components/CrudiaAutoGenerate.tsx.html +0 -616
  174. package/coverage/lcov-report/components/CrudiaFileField/CrudiaFileField.tsx.html +0 -1312
  175. package/coverage/lcov-report/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +0 -355
  176. package/coverage/lcov-report/components/CrudiaFileField/components/DropZone.tsx.html +0 -523
  177. package/coverage/lcov-report/components/CrudiaFileField/components/FileItemRow.tsx.html +0 -835
  178. package/coverage/lcov-report/components/CrudiaFileField/components/FileThumbnail.tsx.html +0 -1585
  179. package/coverage/lcov-report/components/CrudiaFileField/components/index.html +0 -176
  180. package/coverage/lcov-report/components/CrudiaFileField/components/index.ts.html +0 -115
  181. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.html +0 -146
  182. package/coverage/lcov-report/components/CrudiaFileField/hooks/index.ts.html +0 -112
  183. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +0 -433
  184. package/coverage/lcov-report/components/CrudiaFileField/hooks/useDragDrop.ts.html +0 -409
  185. package/coverage/lcov-report/components/CrudiaFileField/index.html +0 -131
  186. package/coverage/lcov-report/components/CrudiaFileField/index.ts.html +0 -112
  187. package/coverage/lcov-report/components/CrudiaFileField/utils/formatters.ts.html +0 -169
  188. package/coverage/lcov-report/components/CrudiaFileField/utils/icons.tsx.html +0 -253
  189. package/coverage/lcov-report/components/CrudiaFileField/utils/index.html +0 -146
  190. package/coverage/lcov-report/components/CrudiaFileField/utils/index.ts.html +0 -103
  191. package/coverage/lcov-report/components/CrudiaMarkdownField.tsx.html +0 -676
  192. package/coverage/lcov-report/components/CrudifyInitializer.tsx.html +0 -712
  193. package/coverage/lcov-report/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +0 -640
  194. package/coverage/lcov-report/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +0 -730
  195. package/coverage/lcov-report/components/CrudifyLogin/Forms/LoginForm.tsx.html +0 -892
  196. package/coverage/lcov-report/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +0 -1219
  197. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +0 -289
  198. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +0 -202
  199. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +0 -346
  200. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.html +0 -161
  201. package/coverage/lcov-report/components/CrudifyLogin/Forms/components/index.ts.html +0 -106
  202. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.html +0 -176
  203. package/coverage/lcov-report/components/CrudifyLogin/Forms/index.ts.html +0 -145
  204. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +0 -268
  205. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.html +0 -161
  206. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/index.ts.html +0 -121
  207. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +0 -496
  208. package/coverage/lcov-report/components/CrudifyLogin/Forms/utils/validation.ts.html +0 -307
  209. package/coverage/lcov-report/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +0 -268
  210. package/coverage/lcov-report/components/CrudifyLogin/components/index.html +0 -116
  211. package/coverage/lcov-report/components/CrudifyLogin/context/CrudifyProvider.tsx.html +0 -409
  212. package/coverage/lcov-report/components/CrudifyLogin/context/I18nProvider.tsx.html +0 -430
  213. package/coverage/lcov-report/components/CrudifyLogin/context/LoginStateProvider.tsx.html +0 -1261
  214. package/coverage/lcov-report/components/CrudifyLogin/context/index.html +0 -161
  215. package/coverage/lcov-report/components/CrudifyLogin/context/index.ts.html +0 -91
  216. package/coverage/lcov-report/components/CrudifyLogin/hooks/index.html +0 -131
  217. package/coverage/lcov-report/components/CrudifyLogin/hooks/useCrudifyLogin.ts.html +0 -463
  218. package/coverage/lcov-report/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +0 -391
  219. package/coverage/lcov-report/components/CrudifyLogin/index.html +0 -116
  220. package/coverage/lcov-report/components/CrudifyLogin/index.tsx.html +0 -466
  221. package/coverage/lcov-report/components/CrudifyLogin/utils/index.html +0 -116
  222. package/coverage/lcov-report/components/CrudifyLogin/utils/secureStorage.ts.html +0 -859
  223. package/coverage/lcov-report/components/GlobalNotificationProvider.tsx.html +0 -844
  224. package/coverage/lcov-report/components/LoginComponent.tsx.html +0 -676
  225. package/coverage/lcov-report/components/PasswordRequirements/index.html +0 -116
  226. package/coverage/lcov-report/components/PasswordRequirements/index.tsx.html +0 -232
  227. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +0 -1078
  228. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.html +0 -131
  229. package/coverage/lcov-report/components/PublicPolicies/FieldSelector/index.ts.html +0 -88
  230. package/coverage/lcov-report/components/PublicPolicies/Policies.tsx.html +0 -625
  231. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +0 -886
  232. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.html +0 -131
  233. package/coverage/lcov-report/components/PublicPolicies/PolicyItem/index.ts.html +0 -88
  234. package/coverage/lcov-report/components/PublicPolicies/constants.ts.html +0 -106
  235. package/coverage/lcov-report/components/PublicPolicies/index.html +0 -146
  236. package/coverage/lcov-report/components/PublicPolicies/index.ts.html +0 -88
  237. package/coverage/lcov-report/components/Routing/AuthRoute.tsx.html +0 -382
  238. package/coverage/lcov-report/components/Routing/GuestRoute.tsx.html +0 -352
  239. package/coverage/lcov-report/components/Routing/ProtectedRoute.tsx.html +0 -316
  240. package/coverage/lcov-report/components/Routing/index.html +0 -161
  241. package/coverage/lcov-report/components/Routing/index.ts.html +0 -109
  242. package/coverage/lcov-report/components/SessionLoadingScreen/index.html +0 -116
  243. package/coverage/lcov-report/components/SessionLoadingScreen/index.tsx.html +0 -379
  244. package/coverage/lcov-report/components/SessionTimeIndicator/index.html +0 -116
  245. package/coverage/lcov-report/components/SessionTimeIndicator/index.tsx.html +0 -523
  246. package/coverage/lcov-report/components/UserProfile/UserProfileDisplay.tsx.html +0 -931
  247. package/coverage/lcov-report/components/UserProfile/index.html +0 -131
  248. package/coverage/lcov-report/components/UserProfile/index.ts.html +0 -88
  249. package/coverage/lcov-report/components/index.html +0 -191
  250. package/coverage/lcov-report/components/index.ts.html +0 -178
  251. package/coverage/lcov-report/core/CrossTabSyncManager.ts.html +0 -853
  252. package/coverage/lcov-report/core/CrudifyInitializationManager.ts.html +0 -1279
  253. package/coverage/lcov-report/core/SessionManager.ts.html +0 -3064
  254. package/coverage/lcov-report/core/index.html +0 -146
  255. package/coverage/lcov-report/favicon.png +0 -0
  256. package/coverage/lcov-report/hooks/index.html +0 -191
  257. package/coverage/lcov-report/hooks/index.ts.html +0 -136
  258. package/coverage/lcov-report/hooks/useAuth.ts.html +0 -529
  259. package/coverage/lcov-report/hooks/useAutoGenerate.ts.html +0 -571
  260. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/constants.ts.html +0 -247
  261. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/index.html +0 -116
  262. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/hooks/useCrudOperations.ts.html +0 -820
  263. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.html +0 -146
  264. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/index.ts.html +0 -118
  265. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/useCrudifyWithNotifications.ts.html +0 -565
  266. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/errorMessageResolver.ts.html +0 -847
  267. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/index.html +0 -146
  268. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/notificationFilters.ts.html +0 -313
  269. package/coverage/lcov-report/hooks/useCrudifyWithNotifications/utils/successMessageResolver.ts.html +0 -265
  270. package/coverage/lcov-report/hooks/useData.ts.html +0 -829
  271. package/coverage/lcov-report/hooks/useFileUpload/index.html +0 -131
  272. package/coverage/lcov-report/hooks/useFileUpload/index.ts.html +0 -112
  273. package/coverage/lcov-report/hooks/useFileUpload/services/index.html +0 -131
  274. package/coverage/lcov-report/hooks/useFileUpload/services/index.ts.html +0 -106
  275. package/coverage/lcov-report/hooks/useFileUpload/services/uploadService.ts.html +0 -610
  276. package/coverage/lcov-report/hooks/useFileUpload/useFileUpload.ts.html +0 -2092
  277. package/coverage/lcov-report/hooks/useFileUpload/utils/fileUtils.ts.html +0 -271
  278. package/coverage/lcov-report/hooks/useFileUpload/utils/index.html +0 -161
  279. package/coverage/lcov-report/hooks/useFileUpload/utils/index.ts.html +0 -109
  280. package/coverage/lcov-report/hooks/useFileUpload/utils/mimeTypes.ts.html +0 -235
  281. package/coverage/lcov-report/hooks/useFileUpload/utils/validation.ts.html +0 -403
  282. package/coverage/lcov-report/hooks/useSession/constants.ts.html +0 -217
  283. package/coverage/lcov-report/hooks/useSession/hooks/index.html +0 -176
  284. package/coverage/lcov-report/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +0 -331
  285. package/coverage/lcov-report/hooks/useSession/hooks/useCrossTabSync.ts.html +0 -535
  286. package/coverage/lcov-report/hooks/useSession/hooks/useSessionActions.ts.html +0 -664
  287. package/coverage/lcov-report/hooks/useSession/hooks/useSessionState.ts.html +0 -295
  288. package/coverage/lcov-report/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +0 -535
  289. package/coverage/lcov-report/hooks/useSession/index.html +0 -161
  290. package/coverage/lcov-report/hooks/useSession/index.ts.html +0 -127
  291. package/coverage/lcov-report/hooks/useSession/types.ts.html +0 -427
  292. package/coverage/lcov-report/hooks/useSession/useSession.ts.html +0 -526
  293. package/coverage/lcov-report/hooks/useSession/utils/index.html +0 -131
  294. package/coverage/lcov-report/hooks/useSession/utils/initializeSession.ts.html +0 -424
  295. package/coverage/lcov-report/hooks/useSession/utils/tokenUtils.ts.html +0 -298
  296. package/coverage/lcov-report/hooks/useUserData.ts.html +0 -1210
  297. package/coverage/lcov-report/hooks/useUserProfile.ts.html +0 -820
  298. package/coverage/lcov-report/index.html +0 -656
  299. package/coverage/lcov-report/prettify.css +0 -1
  300. package/coverage/lcov-report/prettify.js +0 -2
  301. package/coverage/lcov-report/providers/CrudifyThemeProvider.tsx.html +0 -316
  302. package/coverage/lcov-report/providers/SessionProvider.tsx.html +0 -1120
  303. package/coverage/lcov-report/providers/TranslationsProvider.tsx.html +0 -1756
  304. package/coverage/lcov-report/providers/index.html +0 -146
  305. package/coverage/lcov-report/services/credentialsEventBus.ts.html +0 -319
  306. package/coverage/lcov-report/services/crudifyAdminWrapper.ts.html +0 -754
  307. package/coverage/lcov-report/services/index.html +0 -146
  308. package/coverage/lcov-report/services/translationService.ts.html +0 -1558
  309. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  310. package/coverage/lcov-report/sorter.js +0 -210
  311. package/coverage/lcov-report/translations/critical.ts.html +0 -1216
  312. package/coverage/lcov-report/translations/index.html +0 -116
  313. package/coverage/lcov-report/types/index.html +0 -116
  314. package/coverage/lcov-report/types/password.ts.html +0 -178
  315. package/coverage/lcov-report/utils/authErrorDetector.ts.html +0 -793
  316. package/coverage/lcov-report/utils/authEventBus.ts.html +0 -454
  317. package/coverage/lcov-report/utils/configResolver.ts.html +0 -460
  318. package/coverage/lcov-report/utils/cookieSync.ts.html +0 -595
  319. package/coverage/lcov-report/utils/errorHandler.ts.html +0 -1480
  320. package/coverage/lcov-report/utils/errorTranslation.ts.html +0 -868
  321. package/coverage/lcov-report/utils/index.html +0 -341
  322. package/coverage/lcov-report/utils/index.ts.html +0 -193
  323. package/coverage/lcov-report/utils/jwtUtils.ts.html +0 -325
  324. package/coverage/lcov-report/utils/logger.ts.html +0 -952
  325. package/coverage/lcov-report/utils/navigationTracker.ts.html +0 -562
  326. package/coverage/lcov-report/utils/passwordValidation.ts.html +0 -259
  327. package/coverage/lcov-report/utils/preAuthCheck.ts.html +0 -442
  328. package/coverage/lcov-report/utils/redirectSecurity.ts.html +0 -733
  329. package/coverage/lcov-report/utils/tenantConfig.ts.html +0 -712
  330. package/coverage/lcov-report/utils/tokenStorage.ts.html +0 -1825
  331. package/coverage/lcov-report/utils/webCrypto.ts.html +0 -490
  332. package/coverage/lcov.info +0 -23367
  333. package/coverage/prettify.css +0 -1
  334. package/coverage/prettify.js +0 -2
  335. package/coverage/providers/CrudifyThemeProvider.tsx.html +0 -316
  336. package/coverage/providers/SessionProvider.tsx.html +0 -1120
  337. package/coverage/providers/TranslationsProvider.tsx.html +0 -1756
  338. package/coverage/providers/index.html +0 -146
  339. package/coverage/services/credentialsEventBus.ts.html +0 -319
  340. package/coverage/services/crudifyAdminWrapper.ts.html +0 -754
  341. package/coverage/services/index.html +0 -146
  342. package/coverage/services/translationService.ts.html +0 -1558
  343. package/coverage/sort-arrow-sprite.png +0 -0
  344. package/coverage/sorter.js +0 -210
  345. package/coverage/translations/critical.ts.html +0 -1216
  346. package/coverage/translations/index.html +0 -116
  347. package/coverage/types/index.html +0 -116
  348. package/coverage/types/password.ts.html +0 -178
  349. package/coverage/utils/authErrorDetector.ts.html +0 -793
  350. package/coverage/utils/authEventBus.ts.html +0 -454
  351. package/coverage/utils/configResolver.ts.html +0 -460
  352. package/coverage/utils/cookieSync.ts.html +0 -595
  353. package/coverage/utils/errorHandler.ts.html +0 -1480
  354. package/coverage/utils/errorTranslation.ts.html +0 -868
  355. package/coverage/utils/index.html +0 -341
  356. package/coverage/utils/index.ts.html +0 -193
  357. package/coverage/utils/jwtUtils.ts.html +0 -325
  358. package/coverage/utils/logger.ts.html +0 -952
  359. package/coverage/utils/navigationTracker.ts.html +0 -562
  360. package/coverage/utils/passwordValidation.ts.html +0 -259
  361. package/coverage/utils/preAuthCheck.ts.html +0 -442
  362. package/coverage/utils/redirectSecurity.ts.html +0 -733
  363. package/coverage/utils/tenantConfig.ts.html +0 -712
  364. package/coverage/utils/tokenStorage.ts.html +0 -1825
  365. package/coverage/utils/webCrypto.ts.html +0 -490
  366. package/dist/CrudiaMarkdownField-DM6NR8zw.d.mts +0 -343
  367. package/dist/CrudiaMarkdownField-UJaiSq9_.d.ts +0 -343
  368. package/dist/GlobalNotificationProvider-Cx540WKg.d.mts +0 -96
  369. package/dist/GlobalNotificationProvider-Cx540WKg.d.ts +0 -96
  370. package/dist/chunk-2DXLCBOT.mjs +0 -1
  371. package/dist/chunk-DYRZIARH.js +0 -1
  372. package/dist/chunk-GCSJXEGT.mjs +0 -1
  373. package/dist/chunk-GJUZD5ZN.js +0 -1
  374. package/dist/chunk-K47I475N.js +0 -1
  375. package/dist/chunk-OCYZGEM5.mjs +0 -1
  376. package/dist/chunk-PI7HPRDB.js +0 -1
  377. package/dist/chunk-QVEUGJBY.mjs +0 -1
  378. package/dist/chunk-UROR7G7N.mjs +0 -1
  379. package/dist/chunk-XFT47DEL.js +0 -1
  380. package/dist/components.d.mts +0 -24
  381. package/dist/components.d.ts +0 -24
  382. package/dist/components.js +0 -1
  383. package/dist/components.mjs +0 -1
  384. package/dist/tenantConfig-DxpfrAof.d.mts +0 -318
  385. package/dist/tenantConfig-DxpfrAof.d.ts +0 -318
  386. package/eslint.config.mjs +0 -140
  387. package/scripts/bump-version.cjs +0 -23
  388. package/sonar-project.properties +0 -23
  389. package/tests/helpers/mockFactories.ts +0 -218
  390. package/tests/helpers/testUtils.tsx +0 -154
  391. package/tests/hooks/useSession/testUtils.tsx +0 -212
  392. package/tests/setup.ts +0 -139
  393. package/tests/vitest.d.ts +0 -1
  394. package/vitest.config.ts +0 -40
@@ -1,1756 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for providers/TranslationsProvider.tsx</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">providers</a> TranslationsProvider.tsx</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">82.94% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>462/557</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">69.73% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>53/76</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">80% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>8/10</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">82.94% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>462/557</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
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>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a>
607
- <a name='L542'></a><a href='#L542'>542</a>
608
- <a name='L543'></a><a href='#L543'>543</a>
609
- <a name='L544'></a><a href='#L544'>544</a>
610
- <a name='L545'></a><a href='#L545'>545</a>
611
- <a name='L546'></a><a href='#L546'>546</a>
612
- <a name='L547'></a><a href='#L547'>547</a>
613
- <a name='L548'></a><a href='#L548'>548</a>
614
- <a name='L549'></a><a href='#L549'>549</a>
615
- <a name='L550'></a><a href='#L550'>550</a>
616
- <a name='L551'></a><a href='#L551'>551</a>
617
- <a name='L552'></a><a href='#L552'>552</a>
618
- <a name='L553'></a><a href='#L553'>553</a>
619
- <a name='L554'></a><a href='#L554'>554</a>
620
- <a name='L555'></a><a href='#L555'>555</a>
621
- <a name='L556'></a><a href='#L556'>556</a>
622
- <a name='L557'></a><a href='#L557'>557</a>
623
- <a name='L558'></a><a href='#L558'>558</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
624
- <span class="cline-any cline-yes">1x</span>
625
- <span class="cline-any cline-yes">1x</span>
626
- <span class="cline-any cline-yes">1x</span>
627
- <span class="cline-any cline-yes">1x</span>
628
- <span class="cline-any cline-yes">1x</span>
629
- <span class="cline-any cline-yes">1x</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">1x</span>
634
- <span class="cline-any cline-yes">1x</span>
635
- <span class="cline-any cline-yes">1x</span>
636
- <span class="cline-any cline-yes">1x</span>
637
- <span class="cline-any cline-yes">1x</span>
638
- <span class="cline-any cline-yes">1x</span>
639
- <span class="cline-any cline-yes">1x</span>
640
- <span class="cline-any cline-yes">1x</span>
641
- <span class="cline-any cline-yes">1x</span>
642
- <span class="cline-any cline-yes">1x</span>
643
- <span class="cline-any cline-yes">1x</span>
644
- <span class="cline-any cline-yes">1x</span>
645
- <span class="cline-any cline-yes">1x</span>
646
- <span class="cline-any cline-yes">1x</span>
647
- <span class="cline-any cline-yes">1x</span>
648
- <span class="cline-any cline-yes">1x</span>
649
- <span class="cline-any cline-yes">1x</span>
650
- <span class="cline-any cline-yes">1x</span>
651
- <span class="cline-any cline-yes">1x</span>
652
- <span class="cline-any cline-yes">1x</span>
653
- <span class="cline-any cline-yes">1x</span>
654
- <span class="cline-any cline-yes">1x</span>
655
- <span class="cline-any cline-yes">1x</span>
656
- <span class="cline-any cline-yes">1x</span>
657
- <span class="cline-any cline-yes">1x</span>
658
- <span class="cline-any cline-yes">1x</span>
659
- <span class="cline-any cline-yes">1x</span>
660
- <span class="cline-any cline-yes">1x</span>
661
- <span class="cline-any cline-yes">1x</span>
662
- <span class="cline-any cline-yes">1x</span>
663
- <span class="cline-any cline-yes">1x</span>
664
- <span class="cline-any cline-yes">1x</span>
665
- <span class="cline-any cline-yes">1x</span>
666
- <span class="cline-any cline-yes">1x</span>
667
- <span class="cline-any cline-yes">1x</span>
668
- <span class="cline-any cline-yes">1x</span>
669
- <span class="cline-any cline-yes">1x</span>
670
- <span class="cline-any cline-yes">1x</span>
671
- <span class="cline-any cline-yes">1x</span>
672
- <span class="cline-any cline-yes">1x</span>
673
- <span class="cline-any cline-yes">1x</span>
674
- <span class="cline-any cline-yes">1x</span>
675
- <span class="cline-any cline-yes">1x</span>
676
- <span class="cline-any cline-yes">1x</span>
677
- <span class="cline-any cline-yes">1x</span>
678
- <span class="cline-any cline-yes">1x</span>
679
- <span class="cline-any cline-yes">1x</span>
680
- <span class="cline-any cline-yes">1x</span>
681
- <span class="cline-any cline-yes">46x</span>
682
- <span class="cline-any cline-yes">46x</span>
683
- <span class="cline-any cline-yes">46x</span>
684
- <span class="cline-any cline-yes">46x</span>
685
- <span class="cline-any cline-yes">46x</span>
686
- <span class="cline-any cline-yes">46x</span>
687
- <span class="cline-any cline-yes">46x</span>
688
- <span class="cline-any cline-yes">46x</span>
689
- <span class="cline-any cline-yes">46x</span>
690
- <span class="cline-any cline-yes">46x</span>
691
- <span class="cline-any cline-yes">46x</span>
692
- <span class="cline-any cline-yes">1x</span>
693
- <span class="cline-any cline-yes">1x</span>
694
- <span class="cline-any cline-yes">1x</span>
695
- <span class="cline-any cline-yes">1x</span>
696
- <span class="cline-any cline-yes">1x</span>
697
- <span class="cline-any cline-yes">46x</span>
698
- <span class="cline-any cline-yes">46x</span>
699
- <span class="cline-any cline-yes">46x</span>
700
- <span class="cline-any cline-yes">46x</span>
701
- <span class="cline-any cline-yes">46x</span>
702
- <span class="cline-any cline-yes">46x</span>
703
- <span class="cline-any cline-yes">46x</span>
704
- <span class="cline-any cline-yes">46x</span>
705
- <span class="cline-any cline-yes">46x</span>
706
- <span class="cline-any cline-yes">2x</span>
707
- <span class="cline-any cline-yes">2x</span>
708
- <span class="cline-any cline-yes">44x</span>
709
- <span class="cline-any cline-yes">44x</span>
710
- <span class="cline-any cline-yes">46x</span>
711
- <span class="cline-any cline-yes">46x</span>
712
- <span class="cline-any cline-yes">46x</span>
713
- <span class="cline-any cline-yes">34x</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-yes">34x</span>
717
- <span class="cline-any cline-yes">34x</span>
718
- <span class="cline-any cline-yes">10x</span>
719
- <span class="cline-any cline-yes">24x</span>
720
- <span class="cline-any cline-yes">2x</span>
721
- <span class="cline-any cline-yes">2x</span>
722
- <span class="cline-any cline-yes">2x</span>
723
- <span class="cline-any cline-yes">2x</span>
724
- <span class="cline-any cline-yes">2x</span>
725
- <span class="cline-any cline-yes">10x</span>
726
- <span class="cline-any cline-yes">10x</span>
727
- <span class="cline-any cline-yes">10x</span>
728
- <span class="cline-any cline-yes">10x</span>
729
- <span class="cline-any cline-yes">10x</span>
730
- <span class="cline-any cline-yes">10x</span>
731
- <span class="cline-any cline-yes">10x</span>
732
- <span class="cline-any cline-yes">2x</span>
733
- <span class="cline-any cline-yes">2x</span>
734
- <span class="cline-any cline-yes">2x</span>
735
- <span class="cline-any cline-yes">2x</span>
736
- <span class="cline-any cline-yes">10x</span>
737
- <span class="cline-any cline-yes">10x</span>
738
- <span class="cline-any cline-yes">10x</span>
739
- <span class="cline-any cline-yes">10x</span>
740
- <span class="cline-any cline-yes">46x</span>
741
- <span class="cline-any cline-yes">2x</span>
742
- <span class="cline-any cline-yes">2x</span>
743
- <span class="cline-any cline-yes">2x</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-yes">2x</span>
747
- <span class="cline-any cline-yes">46x</span>
748
- <span class="cline-any cline-yes">46x</span>
749
- <span class="cline-any cline-yes">1x</span>
750
- <span class="cline-any cline-yes">1x</span>
751
- <span class="cline-any cline-yes">1x</span>
752
- <span class="cline-any cline-yes">1x</span>
753
- <span class="cline-any cline-yes">1x</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-no">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-yes">1x</span>
786
- <span class="cline-any cline-yes">1x</span>
787
- <span class="cline-any cline-yes">1x</span>
788
- <span class="cline-any cline-yes">1x</span>
789
- <span class="cline-any cline-yes">23x</span>
790
- <span class="cline-any cline-yes">23x</span>
791
- <span class="cline-any cline-yes">23x</span>
792
- <span class="cline-any cline-yes">23x</span>
793
- <span class="cline-any cline-yes">23x</span>
794
- <span class="cline-any cline-yes">23x</span>
795
- <span class="cline-any cline-yes">23x</span>
796
- <span class="cline-any cline-yes">23x</span>
797
- <span class="cline-any cline-yes">23x</span>
798
- <span class="cline-any cline-yes">23x</span>
799
- <span class="cline-any cline-yes">23x</span>
800
- <span class="cline-any cline-yes">23x</span>
801
- <span class="cline-any cline-yes">23x</span>
802
- <span class="cline-any cline-yes">23x</span>
803
- <span class="cline-any cline-yes">23x</span>
804
- <span class="cline-any cline-yes">23x</span>
805
- <span class="cline-any cline-yes">23x</span>
806
- <span class="cline-any cline-yes">20x</span>
807
- <span class="cline-any cline-yes">20x</span>
808
- <span class="cline-any cline-yes">20x</span>
809
- <span class="cline-any cline-yes">20x</span>
810
- <span class="cline-any cline-yes">40x</span>
811
- <span class="cline-any cline-yes">40x</span>
812
- <span class="cline-any cline-yes">40x</span>
813
- <span class="cline-any cline-yes">40x</span>
814
- <span class="cline-any cline-yes">20x</span>
815
- <span class="cline-any cline-yes">20x</span>
816
- <span class="cline-any cline-yes">23x</span>
817
- <span class="cline-any cline-yes">1x</span>
818
- <span class="cline-any cline-yes">1x</span>
819
- <span class="cline-any cline-yes">1x</span>
820
- <span class="cline-any cline-yes">1x</span>
821
- <span class="cline-any cline-yes">1x</span>
822
- <span class="cline-any cline-yes">20x</span>
823
- <span class="cline-any cline-yes">20x</span>
824
- <span class="cline-any cline-yes">20x</span>
825
- <span class="cline-any cline-yes">1x</span>
826
- <span class="cline-any cline-yes">1x</span>
827
- <span class="cline-any cline-yes">1x</span>
828
- <span class="cline-any cline-yes">1x</span>
829
- <span class="cline-any cline-yes">3x</span>
830
- <span class="cline-any cline-yes">3x</span>
831
- <span class="cline-any cline-yes">3x</span>
832
- <span class="cline-any cline-yes">3x</span>
833
- <span class="cline-any cline-yes">3x</span>
834
- <span class="cline-any cline-yes">3x</span>
835
- <span class="cline-any cline-yes">3x</span>
836
- <span class="cline-any cline-yes">3x</span>
837
- <span class="cline-any cline-yes">3x</span>
838
- <span class="cline-any cline-yes">6x</span>
839
- <span class="cline-any cline-yes">6x</span>
840
- <span class="cline-any cline-yes">6x</span>
841
- <span class="cline-any cline-yes">3x</span>
842
- <span class="cline-any cline-yes">3x</span>
843
- <span class="cline-any cline-yes">3x</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
- <span class="cline-any cline-no">&nbsp;</span>
846
- <span class="cline-any cline-yes">3x</span>
847
- <span class="cline-any cline-yes">3x</span>
848
- <span class="cline-any cline-yes">3x</span>
849
- <span class="cline-any cline-yes">1x</span>
850
- <span class="cline-any cline-yes">1x</span>
851
- <span class="cline-any cline-yes">1x</span>
852
- <span class="cline-any cline-yes">1x</span>
853
- <span class="cline-any cline-yes">1x</span>
854
- <span class="cline-any cline-no">&nbsp;</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-no">&nbsp;</span>
861
- <span class="cline-any cline-no">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-yes">1x</span>
868
- <span class="cline-any cline-yes">1x</span>
869
- <span class="cline-any cline-yes">1x</span>
870
- <span class="cline-any cline-yes">1x</span>
871
- <span class="cline-any cline-yes">1x</span>
872
- <span class="cline-any cline-yes">23x</span>
873
- <span class="cline-any cline-yes">23x</span>
874
- <span class="cline-any cline-yes">23x</span>
875
- <span class="cline-any cline-yes">23x</span>
876
- <span class="cline-any cline-yes">23x</span>
877
- <span class="cline-any cline-yes">23x</span>
878
- <span class="cline-any cline-yes">23x</span>
879
- <span class="cline-any cline-yes">23x</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-yes">23x</span>
882
- <span class="cline-any cline-yes">23x</span>
883
- <span class="cline-any cline-yes">23x</span>
884
- <span class="cline-any cline-yes">1x</span>
885
- <span class="cline-any cline-yes">1x</span>
886
- <span class="cline-any cline-yes">1x</span>
887
- <span class="cline-any cline-yes">1x</span>
888
- <span class="cline-any cline-yes">1x</span>
889
- <span class="cline-any cline-yes">1x</span>
890
- <span class="cline-any cline-yes">23x</span>
891
- <span class="cline-any cline-yes">23x</span>
892
- <span class="cline-any cline-yes">23x</span>
893
- <span class="cline-any cline-yes">23x</span>
894
- <span class="cline-any cline-yes">23x</span>
895
- <span class="cline-any cline-yes">23x</span>
896
- <span class="cline-any cline-yes">23x</span>
897
- <span class="cline-any cline-yes">23x</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-no">&nbsp;</span>
900
- <span class="cline-any cline-no">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-no">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-no">&nbsp;</span>
906
- <span class="cline-any cline-yes">1x</span>
907
- <span class="cline-any cline-yes">1x</span>
908
- <span class="cline-any cline-yes">1x</span>
909
- <span class="cline-any cline-yes">1x</span>
910
- <span class="cline-any cline-yes">1x</span>
911
- <span class="cline-any cline-yes">1x</span>
912
- <span class="cline-any cline-yes">1x</span>
913
- <span class="cline-any cline-yes">1x</span>
914
- <span class="cline-any cline-yes">1x</span>
915
- <span class="cline-any cline-yes">1x</span>
916
- <span class="cline-any cline-yes">1x</span>
917
- <span class="cline-any cline-yes">1x</span>
918
- <span class="cline-any cline-yes">1x</span>
919
- <span class="cline-any cline-yes">1x</span>
920
- <span class="cline-any cline-yes">1x</span>
921
- <span class="cline-any cline-yes">1x</span>
922
- <span class="cline-any cline-yes">1x</span>
923
- <span class="cline-any cline-yes">1x</span>
924
- <span class="cline-any cline-yes">1x</span>
925
- <span class="cline-any cline-yes">1x</span>
926
- <span class="cline-any cline-yes">1x</span>
927
- <span class="cline-any cline-yes">1x</span>
928
- <span class="cline-any cline-yes">1x</span>
929
- <span class="cline-any cline-yes">1x</span>
930
- <span class="cline-any cline-yes">1x</span>
931
- <span class="cline-any cline-yes">1x</span>
932
- <span class="cline-any cline-yes">1x</span>
933
- <span class="cline-any cline-yes">1x</span>
934
- <span class="cline-any cline-yes">1x</span>
935
- <span class="cline-any cline-yes">1x</span>
936
- <span class="cline-any cline-yes">1x</span>
937
- <span class="cline-any cline-yes">1x</span>
938
- <span class="cline-any cline-yes">1x</span>
939
- <span class="cline-any cline-yes">1x</span>
940
- <span class="cline-any cline-yes">1x</span>
941
- <span class="cline-any cline-yes">1x</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-yes">1x</span>
944
- <span class="cline-any cline-yes">1x</span>
945
- <span class="cline-any cline-yes">1x</span>
946
- <span class="cline-any cline-yes">1x</span>
947
- <span class="cline-any cline-yes">1x</span>
948
- <span class="cline-any cline-yes">1x</span>
949
- <span class="cline-any cline-yes">1x</span>
950
- <span class="cline-any cline-yes">1x</span>
951
- <span class="cline-any cline-yes">1x</span>
952
- <span class="cline-any cline-yes">1x</span>
953
- <span class="cline-any cline-yes">1x</span>
954
- <span class="cline-any cline-yes">1x</span>
955
- <span class="cline-any cline-yes">1x</span>
956
- <span class="cline-any cline-yes">1x</span>
957
- <span class="cline-any cline-yes">46x</span>
958
- <span class="cline-any cline-yes">46x</span>
959
- <span class="cline-any cline-yes">46x</span>
960
- <span class="cline-any cline-yes">46x</span>
961
- <span class="cline-any cline-yes">46x</span>
962
- <span class="cline-any cline-yes">46x</span>
963
- <span class="cline-any cline-yes">46x</span>
964
- <span class="cline-any cline-yes">46x</span>
965
- <span class="cline-any cline-yes">46x</span>
966
- <span class="cline-any cline-yes">46x</span>
967
- <span class="cline-any cline-yes">46x</span>
968
- <span class="cline-any cline-yes">46x</span>
969
- <span class="cline-any cline-yes">46x</span>
970
- <span class="cline-any cline-yes">46x</span>
971
- <span class="cline-any cline-yes">46x</span>
972
- <span class="cline-any cline-yes">46x</span>
973
- <span class="cline-any cline-yes">46x</span>
974
- <span class="cline-any cline-yes">22x</span>
975
- <span class="cline-any cline-yes">22x</span>
976
- <span class="cline-any cline-yes">22x</span>
977
- <span class="cline-any cline-yes">22x</span>
978
- <span class="cline-any cline-yes">22x</span>
979
- <span class="cline-any cline-yes">22x</span>
980
- <span class="cline-any cline-yes">46x</span>
981
- <span class="cline-any cline-yes">46x</span>
982
- <span class="cline-any cline-yes">46x</span>
983
- <span class="cline-any cline-yes">46x</span>
984
- <span class="cline-any cline-yes">46x</span>
985
- <span class="cline-any cline-yes">46x</span>
986
- <span class="cline-any cline-yes">46x</span>
987
- <span class="cline-any cline-yes">46x</span>
988
- <span class="cline-any cline-yes">46x</span>
989
- <span class="cline-any cline-yes">46x</span>
990
- <span class="cline-any cline-yes">46x</span>
991
- <span class="cline-any cline-yes">46x</span>
992
- <span class="cline-any cline-yes">46x</span>
993
- <span class="cline-any cline-yes">46x</span>
994
- <span class="cline-any cline-yes">46x</span>
995
- <span class="cline-any cline-yes">26x</span>
996
- <span class="cline-any cline-yes">26x</span>
997
- <span class="cline-any cline-no">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-no">&nbsp;</span>
1000
- <span class="cline-any cline-no">&nbsp;</span>
1001
- <span class="cline-any cline-no">&nbsp;</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-yes">26x</span>
1005
- <span class="cline-any cline-yes">26x</span>
1006
- <span class="cline-any cline-yes">26x</span>
1007
- <span class="cline-any cline-yes">3x</span>
1008
- <span class="cline-any cline-no">&nbsp;</span>
1009
- <span class="cline-any cline-no">&nbsp;</span>
1010
- <span class="cline-any cline-yes">3x</span>
1011
- <span class="cline-any cline-yes">3x</span>
1012
- <span class="cline-any cline-yes">23x</span>
1013
- <span class="cline-any cline-yes">23x</span>
1014
- <span class="cline-any cline-yes">23x</span>
1015
- <span class="cline-any cline-yes">26x</span>
1016
- <span class="cline-any cline-no">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-no">&nbsp;</span>
1019
- <span class="cline-any cline-no">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</span>
1021
- <span class="cline-any cline-yes">23x</span>
1022
- <span class="cline-any cline-yes">23x</span>
1023
- <span class="cline-any cline-yes">23x</span>
1024
- <span class="cline-any cline-yes">26x</span>
1025
- <span class="cline-any cline-no">&nbsp;</span>
1026
- <span class="cline-any cline-no">&nbsp;</span>
1027
- <span class="cline-any cline-yes">23x</span>
1028
- <span class="cline-any cline-yes">23x</span>
1029
- <span class="cline-any cline-yes">23x</span>
1030
- <span class="cline-any cline-yes">23x</span>
1031
- <span class="cline-any cline-yes">23x</span>
1032
- <span class="cline-any cline-yes">23x</span>
1033
- <span class="cline-any cline-yes">23x</span>
1034
- <span class="cline-any cline-yes">23x</span>
1035
- <span class="cline-any cline-yes">23x</span>
1036
- <span class="cline-any cline-yes">23x</span>
1037
- <span class="cline-any cline-yes">23x</span>
1038
- <span class="cline-any cline-yes">23x</span>
1039
- <span class="cline-any cline-yes">23x</span>
1040
- <span class="cline-any cline-yes">23x</span>
1041
- <span class="cline-any cline-yes">23x</span>
1042
- <span class="cline-any cline-yes">23x</span>
1043
- <span class="cline-any cline-yes">23x</span>
1044
- <span class="cline-any cline-yes">23x</span>
1045
- <span class="cline-any cline-yes">23x</span>
1046
- <span class="cline-any cline-yes">23x</span>
1047
- <span class="cline-any cline-yes">23x</span>
1048
- <span class="cline-any cline-yes">23x</span>
1049
- <span class="cline-any cline-yes">23x</span>
1050
- <span class="cline-any cline-yes">3x</span>
1051
- <span class="cline-any cline-yes">3x</span>
1052
- <span class="cline-any cline-yes">3x</span>
1053
- <span class="cline-any cline-yes">3x</span>
1054
- <span class="cline-any cline-yes">3x</span>
1055
- <span class="cline-any cline-yes">3x</span>
1056
- <span class="cline-any cline-yes">23x</span>
1057
- <span class="cline-any cline-yes">23x</span>
1058
- <span class="cline-any cline-yes">23x</span>
1059
- <span class="cline-any cline-yes">23x</span>
1060
- <span class="cline-any cline-yes">23x</span>
1061
- <span class="cline-any cline-yes">23x</span>
1062
- <span class="cline-any cline-yes">23x</span>
1063
- <span class="cline-any cline-yes">23x</span>
1064
- <span class="cline-any cline-yes">23x</span>
1065
- <span class="cline-any cline-yes">23x</span>
1066
- <span class="cline-any cline-yes">23x</span>
1067
- <span class="cline-any cline-yes">23x</span>
1068
- <span class="cline-any cline-yes">23x</span>
1069
- <span class="cline-any cline-yes">23x</span>
1070
- <span class="cline-any cline-yes">23x</span>
1071
- <span class="cline-any cline-yes">23x</span>
1072
- <span class="cline-any cline-yes">26x</span>
1073
- <span class="cline-any cline-yes">46x</span>
1074
- <span class="cline-any cline-yes">46x</span>
1075
- <span class="cline-any cline-yes">46x</span>
1076
- <span class="cline-any cline-yes">26x</span>
1077
- <span class="cline-any cline-yes">26x</span>
1078
- <span class="cline-any cline-yes">26x</span>
1079
- <span class="cline-any cline-yes">26x</span>
1080
- <span class="cline-any cline-yes">26x</span>
1081
- <span class="cline-any cline-yes">26x</span>
1082
- <span class="cline-any cline-yes">46x</span>
1083
- <span class="cline-any cline-yes">46x</span>
1084
- <span class="cline-any cline-yes">46x</span>
1085
- <span class="cline-any cline-yes">46x</span>
1086
- <span class="cline-any cline-yes">46x</span>
1087
- <span class="cline-any cline-yes">11x</span>
1088
- <span class="cline-any cline-yes">11x</span>
1089
- <span class="cline-any cline-yes">11x</span>
1090
- <span class="cline-any cline-yes">11x</span>
1091
- <span class="cline-any cline-yes">11x</span>
1092
- <span class="cline-any cline-no">&nbsp;</span>
1093
- <span class="cline-any cline-no">&nbsp;</span>
1094
- <span class="cline-any cline-no">&nbsp;</span>
1095
- <span class="cline-any cline-no">&nbsp;</span>
1096
- <span class="cline-any cline-no">&nbsp;</span>
1097
- <span class="cline-any cline-no">&nbsp;</span>
1098
- <span class="cline-any cline-no">&nbsp;</span>
1099
- <span class="cline-any cline-no">&nbsp;</span>
1100
- <span class="cline-any cline-yes">11x</span>
1101
- <span class="cline-any cline-yes">11x</span>
1102
- <span class="cline-any cline-yes">11x</span>
1103
- <span class="cline-any cline-no">&nbsp;</span>
1104
- <span class="cline-any cline-no">&nbsp;</span>
1105
- <span class="cline-any cline-no">&nbsp;</span>
1106
- <span class="cline-any cline-no">&nbsp;</span>
1107
- <span class="cline-any cline-no">&nbsp;</span>
1108
- <span class="cline-any cline-yes">11x</span>
1109
- <span class="cline-any cline-yes">11x</span>
1110
- <span class="cline-any cline-yes">11x</span>
1111
- <span class="cline-any cline-yes">1x</span>
1112
- <span class="cline-any cline-yes">1x</span>
1113
- <span class="cline-any cline-yes">1x</span>
1114
- <span class="cline-any cline-yes">1x</span>
1115
- <span class="cline-any cline-yes">1x</span>
1116
- <span class="cline-any cline-yes">11x</span>
1117
- <span class="cline-any cline-yes">11x</span>
1118
- <span class="cline-any cline-yes">11x</span>
1119
- <span class="cline-any cline-yes">46x</span>
1120
- <span class="cline-any cline-yes">46x</span>
1121
- <span class="cline-any cline-yes">46x</span>
1122
- <span class="cline-any cline-yes">46x</span>
1123
- <span class="cline-any cline-yes">46x</span>
1124
- <span class="cline-any cline-yes">46x</span>
1125
- <span class="cline-any cline-yes">46x</span>
1126
- <span class="cline-any cline-yes">46x</span>
1127
- <span class="cline-any cline-yes">46x</span>
1128
- <span class="cline-any cline-yes">46x</span>
1129
- <span class="cline-any cline-yes">46x</span>
1130
- <span class="cline-any cline-yes">46x</span>
1131
- <span class="cline-any cline-yes">46x</span>
1132
- <span class="cline-any cline-yes">46x</span>
1133
- <span class="cline-any cline-yes">46x</span>
1134
- <span class="cline-any cline-yes">46x</span>
1135
- <span class="cline-any cline-yes">46x</span>
1136
- <span class="cline-any cline-yes">46x</span>
1137
- <span class="cline-any cline-yes">46x</span>
1138
- <span class="cline-any cline-yes">46x</span>
1139
- <span class="cline-any cline-no">&nbsp;</span>
1140
- <span class="cline-any cline-no">&nbsp;</span>
1141
- <span class="cline-any cline-no">&nbsp;</span>
1142
- <span class="cline-any cline-no">&nbsp;</span>
1143
- <span class="cline-any cline-no">&nbsp;</span>
1144
- <span class="cline-any cline-no">&nbsp;</span>
1145
- <span class="cline-any cline-no">&nbsp;</span>
1146
- <span class="cline-any cline-yes">46x</span>
1147
- <span class="cline-any cline-yes">46x</span>
1148
- <span class="cline-any cline-yes">46x</span>
1149
- <span class="cline-any cline-yes">46x</span>
1150
- <span class="cline-any cline-yes">22x</span>
1151
- <span class="cline-any cline-yes">22x</span>
1152
- <span class="cline-any cline-yes">22x</span>
1153
- <span class="cline-any cline-yes">22x</span>
1154
- <span class="cline-any cline-yes">22x</span>
1155
- <span class="cline-any cline-yes">22x</span>
1156
- <span class="cline-any cline-yes">22x</span>
1157
- <span class="cline-any cline-yes">22x</span>
1158
- <span class="cline-any cline-yes">24x</span>
1159
- <span class="cline-any cline-yes">24x</span>
1160
- <span class="cline-any cline-yes">24x</span>
1161
- <span class="cline-any cline-yes">1x</span>
1162
- <span class="cline-any cline-yes">1x</span>
1163
- <span class="cline-any cline-yes">1x</span>
1164
- <span class="cline-any cline-yes">1x</span>
1165
- <span class="cline-any cline-yes">1x</span>
1166
- <span class="cline-any cline-yes">1x</span>
1167
- <span class="cline-any cline-yes">1x</span>
1168
- <span class="cline-any cline-yes">1x</span>
1169
- <span class="cline-any cline-yes">1x</span>
1170
- <span class="cline-any cline-yes">1x</span>
1171
- <span class="cline-any cline-yes">1x</span>
1172
- <span class="cline-any cline-yes">1x</span>
1173
- <span class="cline-any cline-yes">1x</span>
1174
- <span class="cline-any cline-yes">25x</span>
1175
- <span class="cline-any cline-yes">25x</span>
1176
- <span class="cline-any cline-yes">1x</span>
1177
- <span class="cline-any cline-yes">1x</span>
1178
- <span class="cline-any cline-yes">24x</span>
1179
- <span class="cline-any cline-yes">24x</span>
1180
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import React, { createContext, useContext, useEffect, useState, useMemo, useCallback } from 'react';
1181
- import { translationService } from '../services/translationService';
1182
- import { CRITICAL_TRANSLATIONS } from '../translations/critical';
1183
- import { resolveConfig } from '../utils/configResolver';
1184
- import { logger } from '../utils/logger';
1185
- &nbsp;
1186
- // Global flag to prevent duplicate fetch calls across multiple provider instances
1187
- let globalFetchPromise: Promise&lt;Record&lt;string, Record&lt;string, string&gt;&gt;&gt; | null = null;
1188
- let globalFetchInProgress = false;
1189
- &nbsp;
1190
- /** i18next instance interface for auto-syncing translations */
1191
- export interface I18nInstance {
1192
- addResourceBundle: (
1193
- lang: string,
1194
- ns: string,
1195
- resources: Record&lt;string, string&gt;,
1196
- deep?: boolean,
1197
- overwrite?: boolean
1198
- ) =&gt; void;
1199
- language?: string;
1200
- changeLanguage?: (lang: string) =&gt; void;
1201
- }
1202
- &nbsp;
1203
- export interface TranslationsProviderProps {
1204
- children: React.ReactNode;
1205
- apiKey?: string;
1206
- crudifyEnv?: 'dev' | 'stg' | 'api' | 'prod';
1207
- featureKeys?: string[];
1208
- language?: string; // Current language (for i18next integration)
1209
- devTranslations?: Record&lt;string, string&gt;; // Props override (dev/testing)
1210
- translationUrl?: string; // URL to fetch translation overrides
1211
- enableDebug?: boolean;
1212
- skipAutoInit?: boolean; // Skip automatic crudify initialization (app is responsible for init)
1213
- autoSyncI18n?: boolean; // Auto-sync translations with i18next (default: true)
1214
- i18nInstance?: I18nInstance; // i18next instance for auto-syncing translations
1215
- loadingFallback?: React.ReactNode; // Optional loading component for initial load
1216
- waitForInitialLoad?: boolean; // Wait for translations on first load (default: true)
1217
- }
1218
- &nbsp;
1219
- export interface TranslationsContextValue {
1220
- t: (key: string, variables?: Record&lt;string, string | number&gt;) =&gt; string;
1221
- language: string;
1222
- availableLanguages: string[];
1223
- translations: Record&lt;string, Record&lt;string, string&gt;&gt;;
1224
- isLoading: boolean;
1225
- error: string | null;
1226
- refreshTranslations: () =&gt; Promise&lt;void&gt;;
1227
- }
1228
- &nbsp;
1229
- const TranslationsContext = createContext&lt;TranslationsContextValue | null&gt;(null);
1230
- &nbsp;
1231
- /**
1232
- * Merge translations with prioritization
1233
- * Priority (lowest to highest):
1234
- * 1. Critical bundle (fallback)
1235
- * 2. API translations (system + subscriber merged by backend, then merged with URL translations by service)
1236
- * 3. Dev translations (props - only for development/testing)
1237
- */
1238
- function mergeTranslations(
1239
- critical: Record&lt;string, string&gt;,
1240
- api: Record&lt;string, string&gt;,
1241
- dev?: Record&lt;string, string&gt;
1242
- ): Record&lt;string, string&gt; {
1243
- return {
1244
- ...critical,
1245
- ...api,
1246
- ...dev,
1247
- };
1248
- }
1249
- &nbsp;
1250
- /**
1251
- * Hook for auto-syncing translations with i18next
1252
- * Automatically detects and syncs with i18next instance
1253
- */
1254
- function useI18nAutoSync(
1255
- translations: Record&lt;string, Record&lt;string, string&gt;&gt;,
1256
- language: string,
1257
- i18nInstance: I18nInstance | undefined,
1258
- enabled: boolean,
1259
- enableDebug: boolean
1260
- ) {
1261
- useEffect(() =&gt; {
1262
- if (!enabled || !translations || !language) {
1263
- return;
1264
- }
1265
- &nbsp;
1266
- // Try to detect i18next instance
1267
- const i18n = i18nInstance || globalThis.window?.i18next || globalThis.window?.i18n;
1268
- &nbsp;
1269
- if (!i18n?.addResourceBundle) {
1270
- if (enableDebug) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1271
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] i18next not found, skipping auto-sync');</span>
1272
- <span class="cstat-no" title="statement not covered" > }</span>
1273
- return;
1274
- }
1275
- &nbsp;
1276
- if (enableDebug) {
1277
- logger.debug('[TranslationsProvider] Auto-syncing translations with i18next', {
1278
- languages: Object.keys(translations),
1279
- currentLanguage: language,
1280
- });
1281
- }
1282
- &nbsp;
1283
- // Add translations to i18next for all available languages
1284
- Object.keys(translations).forEach((lang) =&gt; {
1285
- if (translations[lang] &amp;&amp; Object.keys(translations[lang]).length &gt; 0) {
1286
- i18n.addResourceBundle(lang, 'translation', translations[lang], true, true);
1287
- &nbsp;
1288
- if (enableDebug) {
1289
- logger.debug(
1290
- `[TranslationsProvider] Synced ${Object.keys(translations[lang]).length} keys for language: ${lang}`
1291
- );
1292
- }
1293
- }
1294
- });
1295
- &nbsp;
1296
- // Change language if necessary
1297
- if (i18n.language !== language &amp;&amp; i18n.changeLanguage) {
1298
- i18n.changeLanguage(language);
1299
- &nbsp;
1300
- if (enableDebug) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1301
- <span class="cstat-no" title="statement not covered" > logger.debug(`[TranslationsProvider] Changed i18next language to: ${language}`);</span>
1302
- <span class="cstat-no" title="statement not covered" > }</span>
1303
- }
1304
- }, [translations, language, i18nInstance, enabled, enableDebug]);
1305
- }
1306
- &nbsp;
1307
- /**
1308
- * Fetch translations from a URL endpoint
1309
- * Returns the parsed JSON or undefined on failure
1310
- */
1311
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function fetchUrlTranslations(</span></span>
1312
- <span class="cstat-no" title="statement not covered" > translationUrl: string,</span>
1313
- <span class="cstat-no" title="statement not covered" > enableDebug: boolean</span>
1314
- <span class="cstat-no" title="statement not covered" >): Promise&lt;Record&lt;string, string&gt; | undefined&gt; {</span>
1315
- <span class="cstat-no" title="statement not covered" > try {</span>
1316
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1317
- <span class="cstat-no" title="statement not covered" > logger.debug(`[TranslationsProvider] Fetching translations from URL: ${translationUrl}`);</span>
1318
- <span class="cstat-no" title="statement not covered" > }</span>
1319
- <span class="cstat-no" title="statement not covered" ></span>
1320
- <span class="cstat-no" title="statement not covered" > const response = await fetch(translationUrl);</span>
1321
- <span class="cstat-no" title="statement not covered" > if (!response.ok) {</span>
1322
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to fetch translations: ${response.statusText}`);</span>
1323
- <span class="cstat-no" title="statement not covered" > }</span>
1324
- <span class="cstat-no" title="statement not covered" ></span>
1325
- <span class="cstat-no" title="statement not covered" > const result = await response.json();</span>
1326
- <span class="cstat-no" title="statement not covered" ></span>
1327
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1328
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] URL translations loaded:', {</span>
1329
- <span class="cstat-no" title="statement not covered" > keysCount: result ? Object.keys(result).length : 0,</span>
1330
- <span class="cstat-no" title="statement not covered" > });</span>
1331
- <span class="cstat-no" title="statement not covered" > }</span>
1332
- <span class="cstat-no" title="statement not covered" ></span>
1333
- <span class="cstat-no" title="statement not covered" > return result;</span>
1334
- <span class="cstat-no" title="statement not covered" > } catch (err: unknown) {</span>
1335
- <span class="cstat-no" title="statement not covered" > logger.error(</span>
1336
- <span class="cstat-no" title="statement not covered" > '[TranslationsProvider] Failed to load URL translations',</span>
1337
- <span class="cstat-no" title="statement not covered" > err instanceof Error ? err : { message: String(err) }</span>
1338
- <span class="cstat-no" title="statement not covered" > );</span>
1339
- <span class="cstat-no" title="statement not covered" > return undefined;</span>
1340
- <span class="cstat-no" title="statement not covered" > }</span>
1341
- <span class="cstat-no" title="statement not covered" >}</span>
1342
- &nbsp;
1343
- /**
1344
- * Fetch main translations from the API and merge with critical + dev translations
1345
- */
1346
- async function fetchMainTranslations(
1347
- apiKey: string,
1348
- crudifyEnv: 'dev' | 'stg' | 'api' | 'prod',
1349
- featureKeys: string[] | undefined,
1350
- fetchedUrlTranslations: Record&lt;string, string&gt; | undefined,
1351
- devTranslations: Record&lt;string, string&gt; | undefined,
1352
- language: string,
1353
- enableDebug: boolean
1354
- ): Promise&lt;Record&lt;string, Record&lt;string, string&gt;&gt;&gt; {
1355
- translationService.setDebug(enableDebug);
1356
- &nbsp;
1357
- const dynamicTranslations = await translationService.fetchTranslations({
1358
- apiKey,
1359
- crudifyEnv,
1360
- featureKeys,
1361
- urlTranslations: fetchedUrlTranslations,
1362
- });
1363
- &nbsp;
1364
- const merged: Record&lt;string, Record&lt;string, string&gt;&gt; = {};
1365
- &nbsp;
1366
- Object.keys(dynamicTranslations).forEach((lang) =&gt; {
1367
- const critical =
1368
- (CRITICAL_TRANSLATIONS[lang as keyof typeof CRITICAL_TRANSLATIONS<span class="branch-0 cbranch-no" title="branch not covered" >] as Record&lt;string, string&gt;) || {};</span>
1369
- const fromAPI = dynamicTranslations[lang<span class="branch-0 cbranch-no" title="branch not covered" >] || {};</span>
1370
- merged[lang] = mergeTranslations(critical, fromAPI, devTranslations);
1371
- });
1372
- &nbsp;
1373
- if (enableDebug) {
1374
- logger.debug('[TranslationsProvider] Loaded translations:', {
1375
- languages: Object.keys(merged),
1376
- keysCount: Object.keys(merged[language<span class="branch-0 cbranch-no" title="branch not covered" >] || {})</span>.length,
1377
- });
1378
- }
1379
- &nbsp;
1380
- return merged;
1381
- }
1382
- &nbsp;
1383
- /**
1384
- * Build fallback translations from critical bundle + URL translations + dev overrides
1385
- */
1386
- function buildFallbackTranslations(
1387
- fetchedUrlTranslations: Record&lt;string, string&gt; | undefined,
1388
- urlTranslationsState: Record&lt;string, string&gt; | undefined,
1389
- devTranslations: Record&lt;string, string&gt; | undefined,
1390
- enableDebug: boolean
1391
- ): Record&lt;string, Record&lt;string, string&gt;&gt; {
1392
- const fallback: Record&lt;string, Record&lt;string, string&gt;&gt; = {};
1393
- &nbsp;
1394
- Object.keys(CRITICAL_TRANSLATIONS).forEach((lang) =&gt; {
1395
- const critical = CRITICAL_TRANSLATIONS[lang as keyof typeof CRITICAL_TRANSLATIONS] as Record&lt;string, string&gt;;
1396
- const urlFallback = fetchedUrlTranslations || urlTranslationsState || {};
1397
- fallback[lang] = mergeTranslations(critical, urlFallback, devTranslations);
1398
- });
1399
- &nbsp;
1400
- if (enableDebug) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1401
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] Using fallback translations (critical + URL)');</span>
1402
- <span class="cstat-no" title="statement not covered" > }</span>
1403
- &nbsp;
1404
- return fallback;
1405
- }
1406
- &nbsp;
1407
- /**
1408
- * Wait for an in-progress global fetch and return its result
1409
- * Returns null if the global fetch fails (caller should retry)
1410
- */
1411
- <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function waitForGlobalFetch(enableDebug: boolean): Promise&lt;Record&lt;string, Record&lt;string, string&gt;&gt; | null&gt; {</span></span>
1412
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1413
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] Fetch already in progress, waiting for existing promise');</span>
1414
- <span class="cstat-no" title="statement not covered" > }</span>
1415
- <span class="cstat-no" title="statement not covered" > try {</span>
1416
- <span class="cstat-no" title="statement not covered" > return await globalFetchPromise!;</span>
1417
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1418
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1419
- <span class="cstat-no" title="statement not covered" > logger.warn('[TranslationsProvider] Global fetch failed, retrying');</span>
1420
- <span class="cstat-no" title="statement not covered" > }</span>
1421
- <span class="cstat-no" title="statement not covered" > return null;</span>
1422
- <span class="cstat-no" title="statement not covered" > }</span>
1423
- <span class="cstat-no" title="statement not covered" >}</span>
1424
- &nbsp;
1425
- /**
1426
- * Fetch translations from a URL and update state.
1427
- * Extracted to reduce cognitive complexity of loadTranslations.
1428
- */
1429
- async function handleUrlTranslationFetch(
1430
- translationUrl: string | undefined,
1431
- enableDebug: boolean,
1432
- setUrlTranslations: React.Dispatch&lt;React.SetStateAction&lt;Record&lt;string, string&gt; | undefined&gt;&gt;
1433
- ): Promise&lt;Record&lt;string, string&gt; | undefined&gt; {
1434
- if (!translationUrl) {
1435
- return undefined;
1436
- <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1437
- <span class="cstat-no" title="statement not covered" > const fetched = await fetchUrlTranslations(translationUrl, enableDebug);</span>
1438
- setUrlTranslations(fetched || undefined);
1439
- return fetched;
1440
- }
1441
- &nbsp;
1442
- /**
1443
- * Wait for an existing global fetch if one is in progress.
1444
- * Returns true if the global fetch succeeded and state was updated (caller should return early).
1445
- * Extracted to reduce cognitive complexity of loadTranslations.
1446
- */
1447
- async function tryWaitForExistingFetch(
1448
- enableDebug: boolean,
1449
- setTranslations: React.Dispatch&lt;React.SetStateAction&lt;Record&lt;string, Record&lt;string, string&gt;&gt;&gt;&gt;,
1450
- setIsLoading: React.Dispatch&lt;React.SetStateAction&lt;boolean&gt;&gt;
1451
- ): Promise&lt;boolean&gt; {
1452
- if (!<span class="branch-0 cbranch-no" title="branch not covered" >globalFetchInProgress || !globalFetchPromise) {</span>
1453
- return false;
1454
- <span class="branch-0 cbranch-no" title="branch not covered" > }</span>
1455
- <span class="cstat-no" title="statement not covered" > const globalResult = await waitForGlobalFetch(enableDebug);</span>
1456
- <span class="cstat-no" title="statement not covered" > if (globalResult) {</span>
1457
- <span class="cstat-no" title="statement not covered" > setTranslations(globalResult);</span>
1458
- <span class="cstat-no" title="statement not covered" > setIsLoading(false);</span>
1459
- <span class="cstat-no" title="statement not covered" > return true;</span>
1460
- <span class="cstat-no" title="statement not covered" > }</span>
1461
- <span class="cstat-no" title="statement not covered" > return false;</span>
1462
- <span class="cstat-no" title="statement not covered" >}</span>
1463
- &nbsp;
1464
- /**
1465
- * TranslationsProvider
1466
- *
1467
- * Provides translation functionality to the application
1468
- * Handles fetching, caching, and fallback strategies
1469
- *
1470
- * Note: The app MUST initialize crudify before mounting TranslationsProvider
1471
- *
1472
- * @example Basic usage
1473
- * ```tsx
1474
- * // App must initialize crudify first
1475
- * await crudify.init(publicApiKey, 'debug')
1476
- *
1477
- * &lt;TranslationsProvider
1478
- * apiKey="xxx"
1479
- * language="es"
1480
- * translationUrl="https://example.com/locales/es/translation.json"
1481
- * skipAutoInit={true}
1482
- * &gt;
1483
- * &lt;App /&gt;
1484
- * &lt;/TranslationsProvider&gt;
1485
- * ```
1486
- *
1487
- * @example With custom loading fallback (recommended for better UX)
1488
- * ```tsx
1489
- * &lt;TranslationsProvider
1490
- * apiKey="xxx"
1491
- * crudifyEnv="prod"
1492
- * language={i18n.language}
1493
- * autoSyncI18n={true}
1494
- * i18nInstance={i18n}
1495
- * waitForInitialLoad={true} // Default - waits on first visit
1496
- * loadingFallback={&lt;LoadingSpinner /&gt;} // Custom loading component
1497
- * &gt;
1498
- * &lt;App /&gt;
1499
- * &lt;/TranslationsProvider&gt;
1500
- * ```
1501
- *
1502
- * @example Disable waiting (legacy behavior - may show keys briefly)
1503
- * ```tsx
1504
- * &lt;TranslationsProvider
1505
- * apiKey="xxx"
1506
- * language="es"
1507
- * waitForInitialLoad={false} // Don't wait - render immediately
1508
- * &gt;
1509
- * &lt;App /&gt;
1510
- * &lt;/TranslationsProvider&gt;
1511
- * ```
1512
- */
1513
- export const TranslationsProvider: React.FC&lt;TranslationsProviderProps&gt; = ({
1514
- children,
1515
- apiKey: propsApiKey,
1516
- crudifyEnv: propsEnv = 'prod',
1517
- featureKeys: propsFeatureKeys,
1518
- language = 'es',
1519
- devTranslations,
1520
- translationUrl,
1521
- enableDebug = false,
1522
- skipAutoInit: _skipAutoInit = true, // Default true - assumes app handles crudify.init()
1523
- autoSyncI18n = true, // Default true - auto-sync with i18next
1524
- i18nInstance,
1525
- loadingFallback,
1526
- waitForInitialLoad = true, // Default true - wait for first load to prevent showing keys
1527
- }) =&gt; {
1528
- // Resolve configuration using configResolver (cookies &gt; props)
1529
- // This ensures TranslationsProvider uses the same config as CrudifyInitializer/SessionProvider
1530
- const resolvedConfig = useMemo(() =&gt; {
1531
- return resolveConfig({
1532
- publicApiKey: propsApiKey,
1533
- env: propsEnv,
1534
- featureKeys: propsFeatureKeys,
1535
- enableDebug,
1536
- });
1537
- }, [propsApiKey, propsEnv, propsFeatureKeys, enableDebug]);
1538
- &nbsp;
1539
- const apiKey = resolvedConfig.<span class="branch-0 cbranch-no" title="branch not covered" >publicApiKey || '';</span>
1540
- const crudifyEnv = resolvedConfig.<span class="branch-0 cbranch-no" title="branch not covered" >env || <span class="branch-0 cbranch-no" title="branch not covered" >propsEnv || '</span>prod';</span>
1541
- const featureKeys = resolvedConfig.featureKeys || propsFeatureKeys;
1542
- &nbsp;
1543
- const [translations, setTranslations] = useState&lt;Record&lt;string, Record&lt;string, string&gt;&gt;&gt;({});
1544
- const [isLoading, setIsLoading] = useState(true);
1545
- const [isInitialLoad, setIsInitialLoad] = useState(true); // Track if this is the first load
1546
- const [error, setError] = useState&lt;string | null&gt;(null);
1547
- const [urlTranslations, setUrlTranslations] = useState&lt;Record&lt;string, string&gt; | undefined&gt;(undefined);
1548
- const [hasFailedPermanently, setHasFailedPermanently] = useState(false);
1549
- &nbsp;
1550
- // Load translations
1551
- const loadTranslations = useCallback(async () =&gt; {
1552
- // Skip if no apiKey available
1553
- if (!apiKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1554
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1555
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] No apiKey - skipping translation fetch');</span>
1556
- <span class="cstat-no" title="statement not covered" > }</span>
1557
- <span class="cstat-no" title="statement not covered" > setIsLoading(false);</span>
1558
- <span class="cstat-no" title="statement not covered" > setIsInitialLoad(false);</span>
1559
- <span class="cstat-no" title="statement not covered" > return;</span>
1560
- <span class="cstat-no" title="statement not covered" > }</span>
1561
- &nbsp;
1562
- // Skip if already failed permanently
1563
- if (hasFailedPermanently) {
1564
- if (enableDebug) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1565
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] Skipping reload - using fallback translations');</span>
1566
- <span class="cstat-no" title="statement not covered" > }</span>
1567
- return;
1568
- }
1569
- &nbsp;
1570
- // Check if we have valid cache before starting the load
1571
- const hasValidCache = translationService.hasValidCache(apiKey);
1572
- if (<span class="branch-0 cbranch-no" title="branch not covered" >hasValidCache &amp;&amp; isInitialLoad) <span class="branch-0 cbranch-no" title="branch not covered" >{</span></span>
1573
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1574
- <span class="cstat-no" title="statement not covered" > logger.debug('[TranslationsProvider] Valid cache found - not blocking initial render');</span>
1575
- <span class="cstat-no" title="statement not covered" > }</span>
1576
- <span class="cstat-no" title="statement not covered" > setIsInitialLoad(false);</span>
1577
- <span class="cstat-no" title="statement not covered" > }</span>
1578
- &nbsp;
1579
- // Global lock: Prevent duplicate fetches across multiple provider instances
1580
- const handled = await tryWaitForExistingFetch(enableDebug, setTranslations, setIsLoading);
1581
- if (handled) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1582
- <span class="cstat-no" title="statement not covered" > return;</span>
1583
- <span class="cstat-no" title="statement not covered" > }</span>
1584
- &nbsp;
1585
- // Mark fetch as in progress
1586
- globalFetchInProgress = true;
1587
- &nbsp;
1588
- setIsLoading(true);
1589
- setError(null);
1590
- &nbsp;
1591
- // Fetch translations from URL if provided
1592
- const fetchedUrlTranslations = await handleUrlTranslationFetch(translationUrl, enableDebug, setUrlTranslations);
1593
- &nbsp;
1594
- // Wrap the main fetch in a global promise
1595
- const fetchPromise = (async () =&gt; {
1596
- try {
1597
- return await fetchMainTranslations(
1598
- apiKey,
1599
- crudifyEnv,
1600
- featureKeys,
1601
- fetchedUrlTranslations,
1602
- devTranslations,
1603
- language,
1604
- enableDebug
1605
- );
1606
- } catch (err: unknown) {
1607
- logger.error('[TranslationsProvider] Failed to load', err instanceof Error ? <span class="branch-0 cbranch-no" title="branch not covered" >err : { message: String(err) })</span>;
1608
- setError(err instanceof Error ? err.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(err))</span>;
1609
- setHasFailedPermanently(true);
1610
- &nbsp;
1611
- return buildFallbackTranslations(fetchedUrlTranslations, urlTranslations, devTranslations, enableDebug);
1612
- }
1613
- })();
1614
- &nbsp;
1615
- // Store as global promise
1616
- globalFetchPromise = fetchPromise;
1617
- &nbsp;
1618
- try {
1619
- const result = await fetchPromise;
1620
- setTranslations(result);
1621
- } finally {
1622
- setIsLoading(false);
1623
- setIsInitialLoad(false);
1624
- globalFetchInProgress = false;
1625
- setTimeout(() =&gt; {
1626
- globalFetchPromise = null;
1627
- }, 1000);
1628
- }
1629
- // eslint-disable-next-line react-hooks/exhaustive-deps
1630
- }, [apiKey, crudifyEnv, featureKeys, translationUrl, devTranslations, enableDebug, language, hasFailedPermanently]);
1631
- &nbsp;
1632
- useEffect(() =&gt; {
1633
- loadTranslations();
1634
- &nbsp;
1635
- // Auto-refresh every hour
1636
- const interval = setInterval(loadTranslations, 60 * 60 * 1000);
1637
- &nbsp;
1638
- return () =&gt; clearInterval(interval);
1639
- }, [loadTranslations]);
1640
- &nbsp;
1641
- // Translation function with variable interpolation
1642
- const t = useMemo(() =&gt; {
1643
- return (key: string, variables?: Record&lt;string, string | number&gt;) =&gt; {
1644
- const currentLang = translations[language<span class="branch-0 cbranch-no" title="branch not covered" >] || {};</span>
1645
- let value = currentLang[key];
1646
- &nbsp;
1647
- // Fallback: search in other languages
1648
- if (!value) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1649
- <span class="cstat-no" title="statement not covered" > const allLangs = Object.keys(translations);</span>
1650
- <span class="cstat-no" title="statement not covered" > for (const lang of allLangs) {</span>
1651
- <span class="cstat-no" title="statement not covered" > if (translations[lang][key]) {</span>
1652
- <span class="cstat-no" title="statement not covered" > value = translations[lang][key];</span>
1653
- <span class="cstat-no" title="statement not covered" > break;</span>
1654
- <span class="cstat-no" title="statement not covered" > }</span>
1655
- <span class="cstat-no" title="statement not covered" > }</span>
1656
- <span class="cstat-no" title="statement not covered" > }</span>
1657
- &nbsp;
1658
- // If not found, return key
1659
- if (!value) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1660
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1661
- <span class="cstat-no" title="statement not covered" > logger.warn(`[TranslationsProvider] Missing translation: "${key}"`);</span>
1662
- <span class="cstat-no" title="statement not covered" > }</span>
1663
- <span class="cstat-no" title="statement not covered" > value = key;</span>
1664
- <span class="cstat-no" title="statement not covered" > }</span>
1665
- &nbsp;
1666
- // Replace variables
1667
- if (variables &amp;&amp; typeof value === 'string') {
1668
- Object.entries(variables).forEach(([varKey, varValue]) =&gt; {
1669
- const regex = new RegExp(`{{${varKey}}}`, 'g');
1670
- value = value.replace(regex, String(varValue));
1671
- });
1672
- }
1673
- &nbsp;
1674
- return value;
1675
- };
1676
- }, [translations, language, enableDebug]);
1677
- &nbsp;
1678
- // Auto-sync translations with i18next
1679
- useI18nAutoSync(translations, language, i18nInstance, autoSyncI18n, enableDebug);
1680
- &nbsp;
1681
- const contextValue = useMemo&lt;TranslationsContextValue&gt;(
1682
- () =&gt; ({
1683
- t,
1684
- language,
1685
- availableLanguages: Object.keys(translations),
1686
- translations,
1687
- isLoading,
1688
- error,
1689
- refreshTranslations: loadTranslations,
1690
- }),
1691
- [t, language, translations, isLoading, error, loadTranslations]
1692
- );
1693
- &nbsp;
1694
- // Early validation: If no apiKey available, skip translations but render children
1695
- if (!apiKey) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1696
- <span class="cstat-no" title="statement not covered" > if (enableDebug) {</span>
1697
- <span class="cstat-no" title="statement not covered" > logger.warn(</span>
1698
- <span class="cstat-no" title="statement not covered" > '[TranslationsProvider] No API key available. Skipping translations. Provide apiKey via props or ensure cookies are set by Lambda.'</span>
1699
- <span class="cstat-no" title="statement not covered" > );</span>
1700
- <span class="cstat-no" title="statement not covered" > }</span>
1701
- <span class="cstat-no" title="statement not covered" > return &lt;&gt;{children}&lt;/&gt;;</span>
1702
- <span class="cstat-no" title="statement not covered" > }</span>
1703
- &nbsp;
1704
- // Block rendering on initial load to prevent showing translation keys
1705
- // On subsequent loads (cache available), render immediately and update in background
1706
- if (waitForInitialLoad &amp;&amp; isInitialLoad &amp;&amp; isLoading) {
1707
- return (
1708
- loadingFallback || (
1709
- &lt;div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100vh' }}&gt;
1710
- &lt;div&gt;Loading translations...&lt;/div&gt;
1711
- &lt;/div&gt;
1712
- )
1713
- );
1714
- }
1715
- &nbsp;
1716
- return &lt;TranslationsContext.Provider value={contextValue}&gt;{children}&lt;/TranslationsContext.Provider&gt;;
1717
- };
1718
- &nbsp;
1719
- /**
1720
- * Hook to use translations
1721
- *
1722
- * @example
1723
- * ```tsx
1724
- * const MyComponent = () =&gt; {
1725
- * const { t } = useTranslations();
1726
- * return &lt;h1&gt;{t('welcome.title')}&lt;/h1&gt;;
1727
- * };
1728
- * ```
1729
- */
1730
- export const useTranslations = (): TranslationsContextValue =&gt; {
1731
- const context = useContext(TranslationsContext);
1732
- if (!context) {
1733
- throw new Error('useTranslations must be used within TranslationsProvider');
1734
- }
1735
- return context;
1736
- };
1737
- &nbsp;</pre></td></tr></table></pre>
1738
-
1739
- <div class='push'></div><!-- for sticky footer -->
1740
- </div><!-- /wrapper -->
1741
- <div class='footer quiet pad2 space-top1 center small'>
1742
- Code coverage generated by
1743
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1744
- at 2026-02-07T06:55:20.952Z
1745
- </div>
1746
- <script src="../prettify.js"></script>
1747
- <script>
1748
- window.onload = function () {
1749
- prettyPrint();
1750
- };
1751
- </script>
1752
- <script src="../sorter.js"></script>
1753
- <script src="../block-navigation.js"></script>
1754
- </body>
1755
- </html>
1756
-