@budibase/server 2.3.17 → 2.3.18-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/builder/assets/{index.06e34d35.js → index.7089444f.js} +361 -361
  3. package/builder/assets/{index.4488f38d.css → index.7e76c039.css} +1 -1
  4. package/builder/index.html +2 -2
  5. package/dist/api/controllers/query/index.js +2 -0
  6. package/dist/api/controllers/row/ExternalRequest.js +4 -2
  7. package/dist/api/controllers/row/external.js +12 -1
  8. package/dist/api/controllers/row/staticFormula.js +5 -1
  9. package/dist/api/controllers/table/external.js +8 -8
  10. package/dist/api/index.js +1 -21
  11. package/dist/app.js +7 -1
  12. package/dist/constants/index.js +4 -24
  13. package/dist/db/defaultData/datasource_bb_default.js +6 -5
  14. package/dist/db/linkedRows/LinkController.js +9 -8
  15. package/dist/ddApm.js +11 -0
  16. package/dist/elasticApm.js +14 -0
  17. package/dist/integrations/base/sql.js +10 -3
  18. package/dist/package.json +12 -8
  19. package/dist/sdk/app/backups/exports.js +8 -2
  20. package/dist/sdk/app/datasources/datasources.js +3 -0
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/dist/utilities/redis.js +2 -0
  23. package/dist/utilities/retry.js +30 -0
  24. package/jest-testcontainers-config.js +8 -0
  25. package/jest.config.ts +34 -22
  26. package/package.json +13 -9
  27. package/scripts/load/create-many-apps.js +24 -0
  28. package/scripts/load/create-many-rows.js +30 -0
  29. package/scripts/load/utils.js +66 -0
  30. package/specs/openapi.json +6 -6
  31. package/specs/openapi.yaml +3 -3
  32. package/specs/resources/query.js +1 -1
  33. package/specs/resources/table.js +1 -1
  34. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  35. package/src/api/controllers/query/index.ts +2 -0
  36. package/src/api/controllers/row/ExternalRequest.ts +6 -2
  37. package/src/api/controllers/row/external.ts +13 -1
  38. package/src/api/controllers/row/staticFormula.ts +7 -1
  39. package/src/api/controllers/table/external.ts +3 -2
  40. package/src/api/index.ts +3 -22
  41. package/src/api/routes/public/applications.ts +0 -1
  42. package/src/api/routes/public/tests/compare.spec.js +1 -1
  43. package/src/api/routes/public/tests/users.spec.js +1 -1
  44. package/src/api/routes/public/tests/utils.ts +25 -8
  45. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  46. package/src/api/routes/tests/analytics.spec.js +4 -1
  47. package/src/api/routes/tests/apikeys.spec.js +1 -1
  48. package/src/api/routes/tests/application.spec.ts +20 -6
  49. package/src/api/routes/tests/auth.spec.js +2 -2
  50. package/src/api/routes/tests/automation.spec.js +6 -2
  51. package/src/api/routes/tests/backup.spec.ts +4 -14
  52. package/src/api/routes/tests/{cloud.spec.ts → cloud.seq.spec.ts} +11 -15
  53. package/src/api/routes/tests/component.spec.js +1 -1
  54. package/src/api/routes/tests/datasource.spec.ts +20 -3
  55. package/src/api/routes/tests/dev.spec.js +1 -1
  56. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  57. package/src/api/routes/tests/integration.spec.js +1 -1
  58. package/src/api/routes/tests/layout.spec.js +1 -1
  59. package/src/api/routes/tests/metadata.spec.js +1 -1
  60. package/src/api/routes/tests/misc.spec.js +1 -1
  61. package/src/api/routes/tests/permissions.spec.js +4 -1
  62. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  63. package/src/api/routes/tests/role.spec.js +6 -1
  64. package/src/api/routes/tests/routing.spec.js +1 -1
  65. package/src/api/routes/tests/row.spec.js +11 -3
  66. package/src/api/routes/tests/screen.spec.js +1 -1
  67. package/src/api/routes/tests/static.spec.js +2 -13
  68. package/src/api/routes/tests/table.spec.js +1 -1
  69. package/src/api/routes/tests/templates.spec.js +1 -1
  70. package/src/api/routes/tests/user.spec.js +11 -12
  71. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -2
  72. package/src/api/routes/tests/utilities/index.ts +5 -3
  73. package/src/api/routes/tests/view.spec.js +4 -1
  74. package/src/api/routes/tests/webhook.spec.js +11 -2
  75. package/src/app.ts +10 -1
  76. package/src/automations/tests/automation.spec.js +4 -4
  77. package/src/automations/tests/bash.spec.js +1 -1
  78. package/src/automations/tests/discord.spec.js +1 -1
  79. package/src/automations/tests/executeQuery.spec.js +2 -3
  80. package/src/automations/tests/executeScript.spec.js +1 -1
  81. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  82. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  83. package/src/automations/tests/serverLog.spec.js +1 -1
  84. package/src/automations/tests/updateRow.spec.js +1 -1
  85. package/src/automations/tests/zapier.spec.js +1 -1
  86. package/src/constants/index.ts +1 -23
  87. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  88. package/src/db/linkedRows/LinkController.ts +2 -1
  89. package/src/db/tests/linkController.spec.js +4 -1
  90. package/src/db/tests/linkTests.spec.js +1 -1
  91. package/src/ddApm.ts +7 -0
  92. package/src/elasticApm.ts +10 -0
  93. package/src/integration-test/postgres.spec.ts +762 -0
  94. package/src/integrations/base/sql.ts +15 -5
  95. package/src/integrations/oracle.ts +1 -1
  96. package/src/integrations/tests/couchdb.spec.ts +0 -2
  97. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  98. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  99. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +1 -1
  100. package/src/migrations/tests/index.spec.ts +13 -20
  101. package/src/sdk/app/backups/exports.ts +8 -2
  102. package/src/sdk/app/datasources/datasources.ts +3 -0
  103. package/src/tests/jestEnv.ts +8 -11
  104. package/src/tests/jestSetup.ts +9 -7
  105. package/src/tests/logging.ts +34 -0
  106. package/src/tests/utilities/TestConfiguration.ts +166 -92
  107. package/src/tests/utilities/structures.ts +16 -2
  108. package/src/utilities/redis.ts +2 -0
  109. package/src/utilities/retry.ts +18 -0
  110. package/tsconfig.build.json +1 -0
  111. package/coverage/clover.xml +0 -11771
  112. package/coverage/coverage-final.json +0 -284
  113. package/coverage/lcov-report/base.css +0 -224
  114. package/coverage/lcov-report/block-navigation.js +0 -87
  115. package/coverage/lcov-report/favicon.png +0 -0
  116. package/coverage/lcov-report/index.html +0 -1031
  117. package/coverage/lcov-report/prettify.css +0 -1
  118. package/coverage/lcov-report/prettify.js +0 -2
  119. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  120. package/coverage/lcov-report/sorter.js +0 -196
  121. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
  122. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
  123. package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
  124. package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
  125. package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
  126. package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
  127. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
  128. package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
  129. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
  130. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
  131. package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
  132. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
  133. package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
  134. package/coverage/lcov-report/src/api/controllers/index.html +0 -431
  135. package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
  136. package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
  137. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
  138. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
  139. package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
  140. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
  141. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
  142. package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
  143. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
  144. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
  145. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
  146. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
  147. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
  148. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
  149. package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
  150. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
  151. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
  152. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
  153. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
  154. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
  155. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
  156. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
  157. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
  158. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
  159. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
  160. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
  161. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
  162. package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
  163. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
  164. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
  165. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
  166. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
  167. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
  168. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
  169. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
  170. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
  171. package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
  172. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
  173. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
  174. package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
  175. package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
  176. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
  177. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
  178. package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
  179. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
  180. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
  181. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
  182. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -577
  183. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
  184. package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
  185. package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
  186. package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
  187. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
  188. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
  189. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
  190. package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
  191. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
  192. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
  193. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
  194. package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
  195. package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
  196. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
  197. package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
  198. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
  199. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
  200. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
  201. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
  202. package/coverage/lcov-report/src/api/index.html +0 -116
  203. package/coverage/lcov-report/src/api/index.ts.html +0 -352
  204. package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
  205. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
  206. package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
  207. package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
  208. package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
  209. package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
  210. package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
  211. package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
  212. package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
  213. package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
  214. package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
  215. package/coverage/lcov-report/src/api/routes/index.html +0 -551
  216. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
  217. package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
  218. package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
  219. package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
  220. package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
  221. package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
  222. package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
  223. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
  224. package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
  225. package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
  226. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
  227. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
  228. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
  229. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
  230. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
  231. package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
  232. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
  233. package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
  234. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
  235. package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
  236. package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
  237. package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
  238. package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
  239. package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
  240. package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
  241. package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
  242. package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
  243. package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
  244. package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
  245. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
  246. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
  247. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
  248. package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
  249. package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
  250. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
  251. package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
  252. package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
  253. package/coverage/lcov-report/src/app.ts.html +0 -424
  254. package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
  255. package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
  256. package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
  257. package/coverage/lcov-report/src/automations/index.html +0 -191
  258. package/coverage/lcov-report/src/automations/index.ts.html +0 -163
  259. package/coverage/lcov-report/src/automations/logging/index.html +0 -116
  260. package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
  261. package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
  262. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
  263. package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
  264. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
  265. package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -397
  266. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
  267. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
  268. package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
  269. package/coverage/lcov-report/src/automations/steps/index.html +0 -371
  270. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -409
  271. package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
  272. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
  273. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
  274. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
  275. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
  276. package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -340
  277. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
  278. package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
  279. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -403
  280. package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
  281. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
  282. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
  283. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
  284. package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
  285. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
  286. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
  287. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
  288. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
  289. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
  290. package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
  291. package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
  292. package/coverage/lcov-report/src/constants/index.html +0 -146
  293. package/coverage/lcov-report/src/constants/index.ts.html +0 -697
  294. package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
  295. package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
  296. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
  297. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
  298. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
  299. package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
  300. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
  301. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
  302. package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
  303. package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
  304. package/coverage/lcov-report/src/db/index.html +0 -176
  305. package/coverage/lcov-report/src/db/index.ts.html +0 -133
  306. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
  307. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
  308. package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
  309. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
  310. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
  311. package/coverage/lcov-report/src/db/newid.ts.html +0 -100
  312. package/coverage/lcov-report/src/db/utils.ts.html +0 -913
  313. package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
  314. package/coverage/lcov-report/src/definitions/index.html +0 -116
  315. package/coverage/lcov-report/src/environment.ts.html +0 -472
  316. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
  317. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
  318. package/coverage/lcov-report/src/events/index.html +0 -161
  319. package/coverage/lcov-report/src/events/index.ts.html +0 -100
  320. package/coverage/lcov-report/src/events/utils.ts.html +0 -319
  321. package/coverage/lcov-report/src/index.html +0 -191
  322. package/coverage/lcov-report/src/index.ts.html +0 -133
  323. package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
  324. package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
  325. package/coverage/lcov-report/src/integrations/base/index.html +0 -161
  326. package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
  327. package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
  328. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
  329. package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
  330. package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
  331. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
  332. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
  333. package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
  334. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
  335. package/coverage/lcov-report/src/integrations/index.html +0 -371
  336. package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
  337. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
  338. package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
  339. package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
  340. package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
  341. package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
  342. package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
  343. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
  344. package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
  345. package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
  346. package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
  347. package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
  348. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
  349. package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
  350. package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
  351. package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
  352. package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
  353. package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
  354. package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
  355. package/coverage/lcov-report/src/middleware/index.html +0 -236
  356. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
  357. package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
  358. package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
  359. package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
  360. package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
  361. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
  362. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
  363. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
  364. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
  365. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
  366. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
  367. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
  368. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
  369. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
  370. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
  371. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
  372. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
  373. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
  374. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
  375. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
  376. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
  377. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
  378. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
  379. package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
  380. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
  381. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
  382. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
  383. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
  384. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
  385. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
  386. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
  387. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
  388. package/coverage/lcov-report/src/migrations/index.html +0 -116
  389. package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
  390. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
  391. package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
  392. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
  393. package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
  394. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
  395. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
  396. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
  397. package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
  398. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
  399. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
  400. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
  401. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
  402. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
  403. package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
  404. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
  405. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
  406. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
  407. package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
  408. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
  409. package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
  410. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
  411. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
  412. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
  413. package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
  414. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
  415. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
  416. package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
  417. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
  418. package/coverage/lcov-report/src/sdk/index.html +0 -116
  419. package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
  420. package/coverage/lcov-report/src/sdk/users/index.html +0 -131
  421. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
  422. package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
  423. package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
  424. package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
  425. package/coverage/lcov-report/src/startup.ts.html +0 -484
  426. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
  427. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
  428. package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
  429. package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
  430. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
  431. package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
  432. package/coverage/lcov-report/src/threads/index.html +0 -161
  433. package/coverage/lcov-report/src/threads/index.ts.html +0 -418
  434. package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
  435. package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
  436. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
  437. package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
  438. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
  439. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
  440. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
  441. package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
  442. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
  443. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
  444. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
  445. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
  446. package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
  447. package/coverage/lcov-report/src/utilities/index.html +0 -251
  448. package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
  449. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
  450. package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
  451. package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
  452. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
  453. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
  454. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
  455. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
  456. package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
  457. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
  458. package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
  459. package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
  460. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
  461. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
  462. package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
  463. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
  464. package/coverage/lcov-report/src/watch.ts.html +0 -196
  465. package/coverage/lcov-report/src/websocket.ts.html +0 -163
  466. package/coverage/lcov.info +0 -21770
  467. package/dist/api/routes/public/tests/utils.js +0 -33
@@ -1,2305 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/api/controllers/row/ExternalRequest.ts</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">src/api/controllers/row</a> ExternalRequest.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">2.73% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>8/293</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/186</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>0/33</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">2.74% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>8/291</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 oninput="onInput()" type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></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>
624
- <a name='L559'></a><a href='#L559'>559</a>
625
- <a name='L560'></a><a href='#L560'>560</a>
626
- <a name='L561'></a><a href='#L561'>561</a>
627
- <a name='L562'></a><a href='#L562'>562</a>
628
- <a name='L563'></a><a href='#L563'>563</a>
629
- <a name='L564'></a><a href='#L564'>564</a>
630
- <a name='L565'></a><a href='#L565'>565</a>
631
- <a name='L566'></a><a href='#L566'>566</a>
632
- <a name='L567'></a><a href='#L567'>567</a>
633
- <a name='L568'></a><a href='#L568'>568</a>
634
- <a name='L569'></a><a href='#L569'>569</a>
635
- <a name='L570'></a><a href='#L570'>570</a>
636
- <a name='L571'></a><a href='#L571'>571</a>
637
- <a name='L572'></a><a href='#L572'>572</a>
638
- <a name='L573'></a><a href='#L573'>573</a>
639
- <a name='L574'></a><a href='#L574'>574</a>
640
- <a name='L575'></a><a href='#L575'>575</a>
641
- <a name='L576'></a><a href='#L576'>576</a>
642
- <a name='L577'></a><a href='#L577'>577</a>
643
- <a name='L578'></a><a href='#L578'>578</a>
644
- <a name='L579'></a><a href='#L579'>579</a>
645
- <a name='L580'></a><a href='#L580'>580</a>
646
- <a name='L581'></a><a href='#L581'>581</a>
647
- <a name='L582'></a><a href='#L582'>582</a>
648
- <a name='L583'></a><a href='#L583'>583</a>
649
- <a name='L584'></a><a href='#L584'>584</a>
650
- <a name='L585'></a><a href='#L585'>585</a>
651
- <a name='L586'></a><a href='#L586'>586</a>
652
- <a name='L587'></a><a href='#L587'>587</a>
653
- <a name='L588'></a><a href='#L588'>588</a>
654
- <a name='L589'></a><a href='#L589'>589</a>
655
- <a name='L590'></a><a href='#L590'>590</a>
656
- <a name='L591'></a><a href='#L591'>591</a>
657
- <a name='L592'></a><a href='#L592'>592</a>
658
- <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a>
662
- <a name='L597'></a><a href='#L597'>597</a>
663
- <a name='L598'></a><a href='#L598'>598</a>
664
- <a name='L599'></a><a href='#L599'>599</a>
665
- <a name='L600'></a><a href='#L600'>600</a>
666
- <a name='L601'></a><a href='#L601'>601</a>
667
- <a name='L602'></a><a href='#L602'>602</a>
668
- <a name='L603'></a><a href='#L603'>603</a>
669
- <a name='L604'></a><a href='#L604'>604</a>
670
- <a name='L605'></a><a href='#L605'>605</a>
671
- <a name='L606'></a><a href='#L606'>606</a>
672
- <a name='L607'></a><a href='#L607'>607</a>
673
- <a name='L608'></a><a href='#L608'>608</a>
674
- <a name='L609'></a><a href='#L609'>609</a>
675
- <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a>
677
- <a name='L612'></a><a href='#L612'>612</a>
678
- <a name='L613'></a><a href='#L613'>613</a>
679
- <a name='L614'></a><a href='#L614'>614</a>
680
- <a name='L615'></a><a href='#L615'>615</a>
681
- <a name='L616'></a><a href='#L616'>616</a>
682
- <a name='L617'></a><a href='#L617'>617</a>
683
- <a name='L618'></a><a href='#L618'>618</a>
684
- <a name='L619'></a><a href='#L619'>619</a>
685
- <a name='L620'></a><a href='#L620'>620</a>
686
- <a name='L621'></a><a href='#L621'>621</a>
687
- <a name='L622'></a><a href='#L622'>622</a>
688
- <a name='L623'></a><a href='#L623'>623</a>
689
- <a name='L624'></a><a href='#L624'>624</a>
690
- <a name='L625'></a><a href='#L625'>625</a>
691
- <a name='L626'></a><a href='#L626'>626</a>
692
- <a name='L627'></a><a href='#L627'>627</a>
693
- <a name='L628'></a><a href='#L628'>628</a>
694
- <a name='L629'></a><a href='#L629'>629</a>
695
- <a name='L630'></a><a href='#L630'>630</a>
696
- <a name='L631'></a><a href='#L631'>631</a>
697
- <a name='L632'></a><a href='#L632'>632</a>
698
- <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a>
700
- <a name='L635'></a><a href='#L635'>635</a>
701
- <a name='L636'></a><a href='#L636'>636</a>
702
- <a name='L637'></a><a href='#L637'>637</a>
703
- <a name='L638'></a><a href='#L638'>638</a>
704
- <a name='L639'></a><a href='#L639'>639</a>
705
- <a name='L640'></a><a href='#L640'>640</a>
706
- <a name='L641'></a><a href='#L641'>641</a>
707
- <a name='L642'></a><a href='#L642'>642</a>
708
- <a name='L643'></a><a href='#L643'>643</a>
709
- <a name='L644'></a><a href='#L644'>644</a>
710
- <a name='L645'></a><a href='#L645'>645</a>
711
- <a name='L646'></a><a href='#L646'>646</a>
712
- <a name='L647'></a><a href='#L647'>647</a>
713
- <a name='L648'></a><a href='#L648'>648</a>
714
- <a name='L649'></a><a href='#L649'>649</a>
715
- <a name='L650'></a><a href='#L650'>650</a>
716
- <a name='L651'></a><a href='#L651'>651</a>
717
- <a name='L652'></a><a href='#L652'>652</a>
718
- <a name='L653'></a><a href='#L653'>653</a>
719
- <a name='L654'></a><a href='#L654'>654</a>
720
- <a name='L655'></a><a href='#L655'>655</a>
721
- <a name='L656'></a><a href='#L656'>656</a>
722
- <a name='L657'></a><a href='#L657'>657</a>
723
- <a name='L658'></a><a href='#L658'>658</a>
724
- <a name='L659'></a><a href='#L659'>659</a>
725
- <a name='L660'></a><a href='#L660'>660</a>
726
- <a name='L661'></a><a href='#L661'>661</a>
727
- <a name='L662'></a><a href='#L662'>662</a>
728
- <a name='L663'></a><a href='#L663'>663</a>
729
- <a name='L664'></a><a href='#L664'>664</a>
730
- <a name='L665'></a><a href='#L665'>665</a>
731
- <a name='L666'></a><a href='#L666'>666</a>
732
- <a name='L667'></a><a href='#L667'>667</a>
733
- <a name='L668'></a><a href='#L668'>668</a>
734
- <a name='L669'></a><a href='#L669'>669</a>
735
- <a name='L670'></a><a href='#L670'>670</a>
736
- <a name='L671'></a><a href='#L671'>671</a>
737
- <a name='L672'></a><a href='#L672'>672</a>
738
- <a name='L673'></a><a href='#L673'>673</a>
739
- <a name='L674'></a><a href='#L674'>674</a>
740
- <a name='L675'></a><a href='#L675'>675</a>
741
- <a name='L676'></a><a href='#L676'>676</a>
742
- <a name='L677'></a><a href='#L677'>677</a>
743
- <a name='L678'></a><a href='#L678'>678</a>
744
- <a name='L679'></a><a href='#L679'>679</a>
745
- <a name='L680'></a><a href='#L680'>680</a>
746
- <a name='L681'></a><a href='#L681'>681</a>
747
- <a name='L682'></a><a href='#L682'>682</a>
748
- <a name='L683'></a><a href='#L683'>683</a>
749
- <a name='L684'></a><a href='#L684'>684</a>
750
- <a name='L685'></a><a href='#L685'>685</a>
751
- <a name='L686'></a><a href='#L686'>686</a>
752
- <a name='L687'></a><a href='#L687'>687</a>
753
- <a name='L688'></a><a href='#L688'>688</a>
754
- <a name='L689'></a><a href='#L689'>689</a>
755
- <a name='L690'></a><a href='#L690'>690</a>
756
- <a name='L691'></a><a href='#L691'>691</a>
757
- <a name='L692'></a><a href='#L692'>692</a>
758
- <a name='L693'></a><a href='#L693'>693</a>
759
- <a name='L694'></a><a href='#L694'>694</a>
760
- <a name='L695'></a><a href='#L695'>695</a>
761
- <a name='L696'></a><a href='#L696'>696</a>
762
- <a name='L697'></a><a href='#L697'>697</a>
763
- <a name='L698'></a><a href='#L698'>698</a>
764
- <a name='L699'></a><a href='#L699'>699</a>
765
- <a name='L700'></a><a href='#L700'>700</a>
766
- <a name='L701'></a><a href='#L701'>701</a>
767
- <a name='L702'></a><a href='#L702'>702</a>
768
- <a name='L703'></a><a href='#L703'>703</a>
769
- <a name='L704'></a><a href='#L704'>704</a>
770
- <a name='L705'></a><a href='#L705'>705</a>
771
- <a name='L706'></a><a href='#L706'>706</a>
772
- <a name='L707'></a><a href='#L707'>707</a>
773
- <a name='L708'></a><a href='#L708'>708</a>
774
- <a name='L709'></a><a href='#L709'>709</a>
775
- <a name='L710'></a><a href='#L710'>710</a>
776
- <a name='L711'></a><a href='#L711'>711</a>
777
- <a name='L712'></a><a href='#L712'>712</a>
778
- <a name='L713'></a><a href='#L713'>713</a>
779
- <a name='L714'></a><a href='#L714'>714</a>
780
- <a name='L715'></a><a href='#L715'>715</a>
781
- <a name='L716'></a><a href='#L716'>716</a>
782
- <a name='L717'></a><a href='#L717'>717</a>
783
- <a name='L718'></a><a href='#L718'>718</a>
784
- <a name='L719'></a><a href='#L719'>719</a>
785
- <a name='L720'></a><a href='#L720'>720</a>
786
- <a name='L721'></a><a href='#L721'>721</a>
787
- <a name='L722'></a><a href='#L722'>722</a>
788
- <a name='L723'></a><a href='#L723'>723</a>
789
- <a name='L724'></a><a href='#L724'>724</a>
790
- <a name='L725'></a><a href='#L725'>725</a>
791
- <a name='L726'></a><a href='#L726'>726</a>
792
- <a name='L727'></a><a href='#L727'>727</a>
793
- <a name='L728'></a><a href='#L728'>728</a>
794
- <a name='L729'></a><a href='#L729'>729</a>
795
- <a name='L730'></a><a href='#L730'>730</a>
796
- <a name='L731'></a><a href='#L731'>731</a>
797
- <a name='L732'></a><a href='#L732'>732</a>
798
- <a name='L733'></a><a href='#L733'>733</a>
799
- <a name='L734'></a><a href='#L734'>734</a>
800
- <a name='L735'></a><a href='#L735'>735</a>
801
- <a name='L736'></a><a href='#L736'>736</a>
802
- <a name='L737'></a><a href='#L737'>737</a>
803
- <a name='L738'></a><a href='#L738'>738</a>
804
- <a name='L739'></a><a href='#L739'>739</a>
805
- <a name='L740'></a><a href='#L740'>740</a>
806
- <a name='L741'></a><a href='#L741'>741</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-yes">56x</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-yes">56x</span>
825
- <span class="cline-any cline-yes">56x</span>
826
- <span class="cline-any cline-yes">56x</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-yes">56x</span>
829
- <span class="cline-any cline-yes">56x</span>
830
- <span class="cline-any cline-yes">56x</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-yes">56x</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&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-neutral">&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-no">&nbsp;</span>
868
- <span class="cline-any cline-no">&nbsp;</span>
869
- <span class="cline-any cline-no">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-no">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-no">&nbsp;</span>
874
- <span class="cline-any cline-neutral">&nbsp;</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-no">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-no">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-no">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-no">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-no">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-no">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-no">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-no">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-no">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-no">&nbsp;</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-no">&nbsp;</span>
963
- <span class="cline-any cline-no">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-no">&nbsp;</span>
970
- <span class="cline-any cline-no">&nbsp;</span>
971
- <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-no">&nbsp;</span>
973
- <span class="cline-any cline-no">&nbsp;</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-neutral">&nbsp;</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-no">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-no">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-neutral">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-no">&nbsp;</span>
994
- <span class="cline-any cline-no">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-neutral">&nbsp;</span>
997
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-neutral">&nbsp;</span>
1002
- <span class="cline-any cline-neutral">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-no">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-neutral">&nbsp;</span>
1007
- <span class="cline-any cline-no">&nbsp;</span>
1008
- <span class="cline-any cline-neutral">&nbsp;</span>
1009
- <span class="cline-any cline-neutral">&nbsp;</span>
1010
- <span class="cline-any cline-neutral">&nbsp;</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-neutral">&nbsp;</span>
1018
- <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-no">&nbsp;</span>
1021
- <span class="cline-any cline-neutral">&nbsp;</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-no">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-no">&nbsp;</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-no">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-no">&nbsp;</span>
1037
- <span class="cline-any cline-no">&nbsp;</span>
1038
- <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-no">&nbsp;</span>
1041
- <span class="cline-any cline-no">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-neutral">&nbsp;</span>
1046
- <span class="cline-any cline-no">&nbsp;</span>
1047
- <span class="cline-any cline-no">&nbsp;</span>
1048
- <span class="cline-any cline-neutral">&nbsp;</span>
1049
- <span class="cline-any cline-neutral">&nbsp;</span>
1050
- <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-no">&nbsp;</span>
1052
- <span class="cline-any cline-no">&nbsp;</span>
1053
- <span class="cline-any cline-no">&nbsp;</span>
1054
- <span class="cline-any cline-no">&nbsp;</span>
1055
- <span class="cline-any cline-neutral">&nbsp;</span>
1056
- <span class="cline-any cline-no">&nbsp;</span>
1057
- <span class="cline-any cline-neutral">&nbsp;</span>
1058
- <span class="cline-any cline-neutral">&nbsp;</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-neutral">&nbsp;</span>
1061
- <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1063
- <span class="cline-any cline-neutral">&nbsp;</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-no">&nbsp;</span>
1066
- <span class="cline-any cline-no">&nbsp;</span>
1067
- <span class="cline-any cline-no">&nbsp;</span>
1068
- <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-no">&nbsp;</span>
1071
- <span class="cline-any cline-no">&nbsp;</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-neutral">&nbsp;</span>
1074
- <span class="cline-any cline-no">&nbsp;</span>
1075
- <span class="cline-any cline-no">&nbsp;</span>
1076
- <span class="cline-any cline-no">&nbsp;</span>
1077
- <span class="cline-any cline-neutral">&nbsp;</span>
1078
- <span class="cline-any cline-no">&nbsp;</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-no">&nbsp;</span>
1081
- <span class="cline-any cline-no">&nbsp;</span>
1082
- <span class="cline-any cline-neutral">&nbsp;</span>
1083
- <span class="cline-any cline-no">&nbsp;</span>
1084
- <span class="cline-any cline-neutral">&nbsp;</span>
1085
- <span class="cline-any cline-no">&nbsp;</span>
1086
- <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-no">&nbsp;</span>
1088
- <span class="cline-any cline-no">&nbsp;</span>
1089
- <span class="cline-any cline-no">&nbsp;</span>
1090
- <span class="cline-any cline-no">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-no">&nbsp;</span>
1093
- <span class="cline-any cline-neutral">&nbsp;</span>
1094
- <span class="cline-any cline-neutral">&nbsp;</span>
1095
- <span class="cline-any cline-no">&nbsp;</span>
1096
- <span class="cline-any cline-neutral">&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-no">&nbsp;</span>
1101
- <span class="cline-any cline-neutral">&nbsp;</span>
1102
- <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-neutral">&nbsp;</span>
1106
- <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-neutral">&nbsp;</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-neutral">&nbsp;</span>
1112
- <span class="cline-any cline-no">&nbsp;</span>
1113
- <span class="cline-any cline-neutral">&nbsp;</span>
1114
- <span class="cline-any cline-no">&nbsp;</span>
1115
- <span class="cline-any cline-no">&nbsp;</span>
1116
- <span class="cline-any cline-no">&nbsp;</span>
1117
- <span class="cline-any cline-neutral">&nbsp;</span>
1118
- <span class="cline-any cline-neutral">&nbsp;</span>
1119
- <span class="cline-any cline-neutral">&nbsp;</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-neutral">&nbsp;</span>
1127
- <span class="cline-any cline-neutral">&nbsp;</span>
1128
- <span class="cline-any cline-neutral">&nbsp;</span>
1129
- <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-no">&nbsp;</span>
1131
- <span class="cline-any cline-neutral">&nbsp;</span>
1132
- <span class="cline-any cline-neutral">&nbsp;</span>
1133
- <span class="cline-any cline-neutral">&nbsp;</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-neutral">&nbsp;</span>
1136
- <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-no">&nbsp;</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-neutral">&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-no">&nbsp;</span>
1147
- <span class="cline-any cline-neutral">&nbsp;</span>
1148
- <span class="cline-any cline-neutral">&nbsp;</span>
1149
- <span class="cline-any cline-neutral">&nbsp;</span>
1150
- <span class="cline-any cline-neutral">&nbsp;</span>
1151
- <span class="cline-any cline-neutral">&nbsp;</span>
1152
- <span class="cline-any cline-no">&nbsp;</span>
1153
- <span class="cline-any cline-neutral">&nbsp;</span>
1154
- <span class="cline-any cline-neutral">&nbsp;</span>
1155
- <span class="cline-any cline-neutral">&nbsp;</span>
1156
- <span class="cline-any cline-neutral">&nbsp;</span>
1157
- <span class="cline-any cline-neutral">&nbsp;</span>
1158
- <span class="cline-any cline-neutral">&nbsp;</span>
1159
- <span class="cline-any cline-neutral">&nbsp;</span>
1160
- <span class="cline-any cline-neutral">&nbsp;</span>
1161
- <span class="cline-any cline-neutral">&nbsp;</span>
1162
- <span class="cline-any cline-neutral">&nbsp;</span>
1163
- <span class="cline-any cline-neutral">&nbsp;</span>
1164
- <span class="cline-any cline-neutral">&nbsp;</span>
1165
- <span class="cline-any cline-neutral">&nbsp;</span>
1166
- <span class="cline-any cline-neutral">&nbsp;</span>
1167
- <span class="cline-any cline-neutral">&nbsp;</span>
1168
- <span class="cline-any cline-neutral">&nbsp;</span>
1169
- <span class="cline-any cline-no">&nbsp;</span>
1170
- <span class="cline-any cline-no">&nbsp;</span>
1171
- <span class="cline-any cline-no">&nbsp;</span>
1172
- <span class="cline-any cline-no">&nbsp;</span>
1173
- <span class="cline-any cline-no">&nbsp;</span>
1174
- <span class="cline-any cline-neutral">&nbsp;</span>
1175
- <span class="cline-any cline-no">&nbsp;</span>
1176
- <span class="cline-any cline-no">&nbsp;</span>
1177
- <span class="cline-any cline-neutral">&nbsp;</span>
1178
- <span class="cline-any cline-neutral">&nbsp;</span>
1179
- <span class="cline-any cline-no">&nbsp;</span>
1180
- <span class="cline-any cline-neutral">&nbsp;</span>
1181
- <span class="cline-any cline-neutral">&nbsp;</span>
1182
- <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-no">&nbsp;</span>
1184
- <span class="cline-any cline-neutral">&nbsp;</span>
1185
- <span class="cline-any cline-no">&nbsp;</span>
1186
- <span class="cline-any cline-no">&nbsp;</span>
1187
- <span class="cline-any cline-no">&nbsp;</span>
1188
- <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-no">&nbsp;</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-no">&nbsp;</span>
1192
- <span class="cline-any cline-no">&nbsp;</span>
1193
- <span class="cline-any cline-no">&nbsp;</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-no">&nbsp;</span>
1196
- <span class="cline-any cline-no">&nbsp;</span>
1197
- <span class="cline-any cline-no">&nbsp;</span>
1198
- <span class="cline-any cline-neutral">&nbsp;</span>
1199
- <span class="cline-any cline-neutral">&nbsp;</span>
1200
- <span class="cline-any cline-no">&nbsp;</span>
1201
- <span class="cline-any cline-neutral">&nbsp;</span>
1202
- <span class="cline-any cline-no">&nbsp;</span>
1203
- <span class="cline-any cline-neutral">&nbsp;</span>
1204
- <span class="cline-any cline-neutral">&nbsp;</span>
1205
- <span class="cline-any cline-no">&nbsp;</span>
1206
- <span class="cline-any cline-neutral">&nbsp;</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-no">&nbsp;</span>
1209
- <span class="cline-any cline-neutral">&nbsp;</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-neutral">&nbsp;</span>
1212
- <span class="cline-any cline-neutral">&nbsp;</span>
1213
- <span class="cline-any cline-neutral">&nbsp;</span>
1214
- <span class="cline-any cline-neutral">&nbsp;</span>
1215
- <span class="cline-any cline-neutral">&nbsp;</span>
1216
- <span class="cline-any cline-no">&nbsp;</span>
1217
- <span class="cline-any cline-no">&nbsp;</span>
1218
- <span class="cline-any cline-neutral">&nbsp;</span>
1219
- <span class="cline-any cline-no">&nbsp;</span>
1220
- <span class="cline-any cline-no">&nbsp;</span>
1221
- <span class="cline-any cline-no">&nbsp;</span>
1222
- <span class="cline-any cline-no">&nbsp;</span>
1223
- <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-no">&nbsp;</span>
1225
- <span class="cline-any cline-no">&nbsp;</span>
1226
- <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-neutral">&nbsp;</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-neutral">&nbsp;</span>
1231
- <span class="cline-any cline-no">&nbsp;</span>
1232
- <span class="cline-any cline-neutral">&nbsp;</span>
1233
- <span class="cline-any cline-no">&nbsp;</span>
1234
- <span class="cline-any cline-no">&nbsp;</span>
1235
- <span class="cline-any cline-no">&nbsp;</span>
1236
- <span class="cline-any cline-neutral">&nbsp;</span>
1237
- <span class="cline-any cline-no">&nbsp;</span>
1238
- <span class="cline-any cline-neutral">&nbsp;</span>
1239
- <span class="cline-any cline-no">&nbsp;</span>
1240
- <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-neutral">&nbsp;</span>
1242
- <span class="cline-any cline-neutral">&nbsp;</span>
1243
- <span class="cline-any cline-neutral">&nbsp;</span>
1244
- <span class="cline-any cline-neutral">&nbsp;</span>
1245
- <span class="cline-any cline-neutral">&nbsp;</span>
1246
- <span class="cline-any cline-neutral">&nbsp;</span>
1247
- <span class="cline-any cline-neutral">&nbsp;</span>
1248
- <span class="cline-any cline-no">&nbsp;</span>
1249
- <span class="cline-any cline-no">&nbsp;</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1251
- <span class="cline-any cline-neutral">&nbsp;</span>
1252
- <span class="cline-any cline-no">&nbsp;</span>
1253
- <span class="cline-any cline-no">&nbsp;</span>
1254
- <span class="cline-any cline-neutral">&nbsp;</span>
1255
- <span class="cline-any cline-neutral">&nbsp;</span>
1256
- <span class="cline-any cline-neutral">&nbsp;</span>
1257
- <span class="cline-any cline-neutral">&nbsp;</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
- <span class="cline-any cline-neutral">&nbsp;</span>
1261
- <span class="cline-any cline-neutral">&nbsp;</span>
1262
- <span class="cline-any cline-neutral">&nbsp;</span>
1263
- <span class="cline-any cline-no">&nbsp;</span>
1264
- <span class="cline-any cline-no">&nbsp;</span>
1265
- <span class="cline-any cline-no">&nbsp;</span>
1266
- <span class="cline-any cline-no">&nbsp;</span>
1267
- <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-no">&nbsp;</span>
1269
- <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-no">&nbsp;</span>
1271
- <span class="cline-any cline-no">&nbsp;</span>
1272
- <span class="cline-any cline-neutral">&nbsp;</span>
1273
- <span class="cline-any cline-no">&nbsp;</span>
1274
- <span class="cline-any cline-no">&nbsp;</span>
1275
- <span class="cline-any cline-no">&nbsp;</span>
1276
- <span class="cline-any cline-neutral">&nbsp;</span>
1277
- <span class="cline-any cline-no">&nbsp;</span>
1278
- <span class="cline-any cline-neutral">&nbsp;</span>
1279
- <span class="cline-any cline-neutral">&nbsp;</span>
1280
- <span class="cline-any cline-neutral">&nbsp;</span>
1281
- <span class="cline-any cline-neutral">&nbsp;</span>
1282
- <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-neutral">&nbsp;</span>
1284
- <span class="cline-any cline-neutral">&nbsp;</span>
1285
- <span class="cline-any cline-no">&nbsp;</span>
1286
- <span class="cline-any cline-no">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-no">&nbsp;</span>
1290
- <span class="cline-any cline-neutral">&nbsp;</span>
1291
- <span class="cline-any cline-no">&nbsp;</span>
1292
- <span class="cline-any cline-no">&nbsp;</span>
1293
- <span class="cline-any cline-no">&nbsp;</span>
1294
- <span class="cline-any cline-no">&nbsp;</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-no">&nbsp;</span>
1297
- <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-no">&nbsp;</span>
1299
- <span class="cline-any cline-neutral">&nbsp;</span>
1300
- <span class="cline-any cline-neutral">&nbsp;</span>
1301
- <span class="cline-any cline-neutral">&nbsp;</span>
1302
- <span class="cline-any cline-neutral">&nbsp;</span>
1303
- <span class="cline-any cline-neutral">&nbsp;</span>
1304
- <span class="cline-any cline-neutral">&nbsp;</span>
1305
- <span class="cline-any cline-neutral">&nbsp;</span>
1306
- <span class="cline-any cline-no">&nbsp;</span>
1307
- <span class="cline-any cline-no">&nbsp;</span>
1308
- <span class="cline-any cline-no">&nbsp;</span>
1309
- <span class="cline-any cline-no">&nbsp;</span>
1310
- <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-no">&nbsp;</span>
1312
- <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-neutral">&nbsp;</span>
1315
- <span class="cline-any cline-neutral">&nbsp;</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-neutral">&nbsp;</span>
1319
- <span class="cline-any cline-neutral">&nbsp;</span>
1320
- <span class="cline-any cline-neutral">&nbsp;</span>
1321
- <span class="cline-any cline-neutral">&nbsp;</span>
1322
- <span class="cline-any cline-no">&nbsp;</span>
1323
- <span class="cline-any cline-neutral">&nbsp;</span>
1324
- <span class="cline-any cline-no">&nbsp;</span>
1325
- <span class="cline-any cline-no">&nbsp;</span>
1326
- <span class="cline-any cline-no">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-no">&nbsp;</span>
1329
- <span class="cline-any cline-no">&nbsp;</span>
1330
- <span class="cline-any cline-no">&nbsp;</span>
1331
- <span class="cline-any cline-no">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-no">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-no">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-neutral">&nbsp;</span>
1338
- <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-neutral">&nbsp;</span>
1340
- <span class="cline-any cline-neutral">&nbsp;</span>
1341
- <span class="cline-any cline-neutral">&nbsp;</span>
1342
- <span class="cline-any cline-neutral">&nbsp;</span>
1343
- <span class="cline-any cline-neutral">&nbsp;</span>
1344
- <span class="cline-any cline-no">&nbsp;</span>
1345
- <span class="cline-any cline-no">&nbsp;</span>
1346
- <span class="cline-any cline-no">&nbsp;</span>
1347
- <span class="cline-any cline-neutral">&nbsp;</span>
1348
- <span class="cline-any cline-no">&nbsp;</span>
1349
- <span class="cline-any cline-neutral">&nbsp;</span>
1350
- <span class="cline-any cline-neutral">&nbsp;</span>
1351
- <span class="cline-any cline-neutral">&nbsp;</span>
1352
- <span class="cline-any cline-neutral">&nbsp;</span>
1353
- <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span>
1355
- <span class="cline-any cline-neutral">&nbsp;</span>
1356
- <span class="cline-any cline-neutral">&nbsp;</span>
1357
- <span class="cline-any cline-neutral">&nbsp;</span>
1358
- <span class="cline-any cline-neutral">&nbsp;</span>
1359
- <span class="cline-any cline-neutral">&nbsp;</span>
1360
- <span class="cline-any cline-neutral">&nbsp;</span>
1361
- <span class="cline-any cline-neutral">&nbsp;</span>
1362
- <span class="cline-any cline-neutral">&nbsp;</span>
1363
- <span class="cline-any cline-neutral">&nbsp;</span>
1364
- <span class="cline-any cline-neutral">&nbsp;</span>
1365
- <span class="cline-any cline-neutral">&nbsp;</span>
1366
- <span class="cline-any cline-neutral">&nbsp;</span>
1367
- <span class="cline-any cline-no">&nbsp;</span>
1368
- <span class="cline-any cline-no">&nbsp;</span>
1369
- <span class="cline-any cline-no">&nbsp;</span>
1370
- <span class="cline-any cline-no">&nbsp;</span>
1371
- <span class="cline-any cline-no">&nbsp;</span>
1372
- <span class="cline-any cline-no">&nbsp;</span>
1373
- <span class="cline-any cline-neutral">&nbsp;</span>
1374
- <span class="cline-any cline-no">&nbsp;</span>
1375
- <span class="cline-any cline-no">&nbsp;</span>
1376
- <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-neutral">&nbsp;</span>
1378
- <span class="cline-any cline-no">&nbsp;</span>
1379
- <span class="cline-any cline-no">&nbsp;</span>
1380
- <span class="cline-any cline-neutral">&nbsp;</span>
1381
- <span class="cline-any cline-no">&nbsp;</span>
1382
- <span class="cline-any cline-neutral">&nbsp;</span>
1383
- <span class="cline-any cline-neutral">&nbsp;</span>
1384
- <span class="cline-any cline-no">&nbsp;</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-neutral">&nbsp;</span>
1388
- <span class="cline-any cline-neutral">&nbsp;</span>
1389
- <span class="cline-any cline-neutral">&nbsp;</span>
1390
- <span class="cline-any cline-neutral">&nbsp;</span>
1391
- <span class="cline-any cline-neutral">&nbsp;</span>
1392
- <span class="cline-any cline-neutral">&nbsp;</span>
1393
- <span class="cline-any cline-neutral">&nbsp;</span>
1394
- <span class="cline-any cline-neutral">&nbsp;</span>
1395
- <span class="cline-any cline-neutral">&nbsp;</span>
1396
- <span class="cline-any cline-no">&nbsp;</span>
1397
- <span class="cline-any cline-neutral">&nbsp;</span>
1398
- <span class="cline-any cline-neutral">&nbsp;</span>
1399
- <span class="cline-any cline-neutral">&nbsp;</span>
1400
- <span class="cline-any cline-no">&nbsp;</span>
1401
- <span class="cline-any cline-no">&nbsp;</span>
1402
- <span class="cline-any cline-neutral">&nbsp;</span>
1403
- <span class="cline-any cline-no">&nbsp;</span>
1404
- <span class="cline-any cline-neutral">&nbsp;</span>
1405
- <span class="cline-any cline-neutral">&nbsp;</span>
1406
- <span class="cline-any cline-neutral">&nbsp;</span>
1407
- <span class="cline-any cline-no">&nbsp;</span>
1408
- <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-no">&nbsp;</span>
1410
- <span class="cline-any cline-no">&nbsp;</span>
1411
- <span class="cline-any cline-neutral">&nbsp;</span>
1412
- <span class="cline-any cline-no">&nbsp;</span>
1413
- <span class="cline-any cline-no">&nbsp;</span>
1414
- <span class="cline-any cline-no">&nbsp;</span>
1415
- <span class="cline-any cline-no">&nbsp;</span>
1416
- <span class="cline-any cline-neutral">&nbsp;</span>
1417
- <span class="cline-any cline-neutral">&nbsp;</span>
1418
- <span class="cline-any cline-neutral">&nbsp;</span>
1419
- <span class="cline-any cline-neutral">&nbsp;</span>
1420
- <span class="cline-any cline-neutral">&nbsp;</span>
1421
- <span class="cline-any cline-neutral">&nbsp;</span>
1422
- <span class="cline-any cline-neutral">&nbsp;</span>
1423
- <span class="cline-any cline-neutral">&nbsp;</span>
1424
- <span class="cline-any cline-neutral">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-neutral">&nbsp;</span>
1427
- <span class="cline-any cline-neutral">&nbsp;</span>
1428
- <span class="cline-any cline-neutral">&nbsp;</span>
1429
- <span class="cline-any cline-neutral">&nbsp;</span>
1430
- <span class="cline-any cline-neutral">&nbsp;</span>
1431
- <span class="cline-any cline-neutral">&nbsp;</span>
1432
- <span class="cline-any cline-neutral">&nbsp;</span>
1433
- <span class="cline-any cline-neutral">&nbsp;</span>
1434
- <span class="cline-any cline-neutral">&nbsp;</span>
1435
- <span class="cline-any cline-neutral">&nbsp;</span>
1436
- <span class="cline-any cline-neutral">&nbsp;</span>
1437
- <span class="cline-any cline-neutral">&nbsp;</span>
1438
- <span class="cline-any cline-neutral">&nbsp;</span>
1439
- <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-no">&nbsp;</span>
1441
- <span class="cline-any cline-neutral">&nbsp;</span>
1442
- <span class="cline-any cline-neutral">&nbsp;</span>
1443
- <span class="cline-any cline-no">&nbsp;</span>
1444
- <span class="cline-any cline-neutral">&nbsp;</span>
1445
- <span class="cline-any cline-no">&nbsp;</span>
1446
- <span class="cline-any cline-neutral">&nbsp;</span>
1447
- <span class="cline-any cline-no">&nbsp;</span>
1448
- <span class="cline-any cline-neutral">&nbsp;</span>
1449
- <span class="cline-any cline-no">&nbsp;</span>
1450
- <span class="cline-any cline-no">&nbsp;</span>
1451
- <span class="cline-any cline-no">&nbsp;</span>
1452
- <span class="cline-any cline-no">&nbsp;</span>
1453
- <span class="cline-any cline-neutral">&nbsp;</span>
1454
- <span class="cline-any cline-no">&nbsp;</span>
1455
- <span class="cline-any cline-no">&nbsp;</span>
1456
- <span class="cline-any cline-no">&nbsp;</span>
1457
- <span class="cline-any cline-no">&nbsp;</span>
1458
- <span class="cline-any cline-no">&nbsp;</span>
1459
- <span class="cline-any cline-no">&nbsp;</span>
1460
- <span class="cline-any cline-neutral">&nbsp;</span>
1461
- <span class="cline-any cline-neutral">&nbsp;</span>
1462
- <span class="cline-any cline-neutral">&nbsp;</span>
1463
- <span class="cline-any cline-no">&nbsp;</span>
1464
- <span class="cline-any cline-neutral">&nbsp;</span>
1465
- <span class="cline-any cline-neutral">&nbsp;</span>
1466
- <span class="cline-any cline-neutral">&nbsp;</span>
1467
- <span class="cline-any cline-no">&nbsp;</span>
1468
- <span class="cline-any cline-no">&nbsp;</span>
1469
- <span class="cline-any cline-no">&nbsp;</span>
1470
- <span class="cline-any cline-no">&nbsp;</span>
1471
- <span class="cline-any cline-neutral">&nbsp;</span>
1472
- <span class="cline-any cline-no">&nbsp;</span>
1473
- <span class="cline-any cline-no">&nbsp;</span>
1474
- <span class="cline-any cline-no">&nbsp;</span>
1475
- <span class="cline-any cline-no">&nbsp;</span>
1476
- <span class="cline-any cline-neutral">&nbsp;</span>
1477
- <span class="cline-any cline-no">&nbsp;</span>
1478
- <span class="cline-any cline-neutral">&nbsp;</span>
1479
- <span class="cline-any cline-no">&nbsp;</span>
1480
- <span class="cline-any cline-no">&nbsp;</span>
1481
- <span class="cline-any cline-no">&nbsp;</span>
1482
- <span class="cline-any cline-no">&nbsp;</span>
1483
- <span class="cline-any cline-neutral">&nbsp;</span>
1484
- <span class="cline-any cline-neutral">&nbsp;</span>
1485
- <span class="cline-any cline-no">&nbsp;</span>
1486
- <span class="cline-any cline-neutral">&nbsp;</span>
1487
- <span class="cline-any cline-neutral">&nbsp;</span>
1488
- <span class="cline-any cline-neutral">&nbsp;</span>
1489
- <span class="cline-any cline-neutral">&nbsp;</span>
1490
- <span class="cline-any cline-no">&nbsp;</span>
1491
- <span class="cline-any cline-no">&nbsp;</span>
1492
- <span class="cline-any cline-no">&nbsp;</span>
1493
- <span class="cline-any cline-neutral">&nbsp;</span>
1494
- <span class="cline-any cline-neutral">&nbsp;</span>
1495
- <span class="cline-any cline-no">&nbsp;</span>
1496
- <span class="cline-any cline-no">&nbsp;</span>
1497
- <span class="cline-any cline-neutral">&nbsp;</span>
1498
- <span class="cline-any cline-no">&nbsp;</span>
1499
- <span class="cline-any cline-no">&nbsp;</span>
1500
- <span class="cline-any cline-no">&nbsp;</span>
1501
- <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-neutral">&nbsp;</span>
1503
- <span class="cline-any cline-neutral">&nbsp;</span>
1504
- <span class="cline-any cline-no">&nbsp;</span>
1505
- <span class="cline-any cline-neutral">&nbsp;</span>
1506
- <span class="cline-any cline-no">&nbsp;</span>
1507
- <span class="cline-any cline-neutral">&nbsp;</span>
1508
- <span class="cline-any cline-neutral">&nbsp;</span>
1509
- <span class="cline-any cline-neutral">&nbsp;</span>
1510
- <span class="cline-any cline-neutral">&nbsp;</span>
1511
- <span class="cline-any cline-neutral">&nbsp;</span>
1512
- <span class="cline-any cline-neutral">&nbsp;</span>
1513
- <span class="cline-any cline-neutral">&nbsp;</span>
1514
- <span class="cline-any cline-neutral">&nbsp;</span>
1515
- <span class="cline-any cline-neutral">&nbsp;</span>
1516
- <span class="cline-any cline-neutral">&nbsp;</span>
1517
- <span class="cline-any cline-neutral">&nbsp;</span>
1518
- <span class="cline-any cline-neutral">&nbsp;</span>
1519
- <span class="cline-any cline-neutral">&nbsp;</span>
1520
- <span class="cline-any cline-neutral">&nbsp;</span>
1521
- <span class="cline-any cline-neutral">&nbsp;</span>
1522
- <span class="cline-any cline-neutral">&nbsp;</span>
1523
- <span class="cline-any cline-neutral">&nbsp;</span>
1524
- <span class="cline-any cline-neutral">&nbsp;</span>
1525
- <span class="cline-any cline-neutral">&nbsp;</span>
1526
- <span class="cline-any cline-neutral">&nbsp;</span>
1527
- <span class="cline-any cline-neutral">&nbsp;</span>
1528
- <span class="cline-any cline-neutral">&nbsp;</span>
1529
- <span class="cline-any cline-neutral">&nbsp;</span>
1530
- <span class="cline-any cline-no">&nbsp;</span>
1531
- <span class="cline-any cline-neutral">&nbsp;</span>
1532
- <span class="cline-any cline-no">&nbsp;</span>
1533
- <span class="cline-any cline-no">&nbsp;</span>
1534
- <span class="cline-any cline-neutral">&nbsp;</span>
1535
- <span class="cline-any cline-neutral">&nbsp;</span>
1536
- <span class="cline-any cline-neutral">&nbsp;</span>
1537
- <span class="cline-any cline-neutral">&nbsp;</span>
1538
- <span class="cline-any cline-neutral">&nbsp;</span>
1539
- <span class="cline-any cline-no">&nbsp;</span>
1540
- <span class="cline-any cline-neutral">&nbsp;</span>
1541
- <span class="cline-any cline-no">&nbsp;</span>
1542
- <span class="cline-any cline-neutral">&nbsp;</span>
1543
- <span class="cline-any cline-neutral">&nbsp;</span>
1544
- <span class="cline-any cline-neutral">&nbsp;</span>
1545
- <span class="cline-any cline-neutral">&nbsp;</span>
1546
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
1547
- FilterType,
1548
- IncludeRelationship,
1549
- Operation,
1550
- PaginationJson,
1551
- RelationshipsJson,
1552
- SearchFilters,
1553
- SortJson,
1554
- Datasource,
1555
- FieldSchema,
1556
- Row,
1557
- Table,
1558
- } from "@budibase/types"
1559
- import {
1560
- breakRowIdField,
1561
- generateRowIdField,
1562
- isRowId,
1563
- convertRowId,
1564
- } from "../../../integrations/utils"
1565
- import { getDatasourceAndQuery } from "./utils"
1566
- import { FieldTypes, RelationshipTypes } from "../../../constants"
1567
- import { breakExternalTableId, isSQL } from "../../../integrations/utils"
1568
- import { processObjectSync } from "@budibase/string-templates"
1569
- import { cloneDeep } from "lodash/fp"
1570
- import { processFormulas, processDates } from "../../../utilities/rowProcessor"
1571
- import { context } from "@budibase/backend-core"
1572
- import { removeKeyNumbering } from "./utils"
1573
- import sdk from "../../../sdk"
1574
- &nbsp;
1575
- export interface ManyRelationship {
1576
- tableId?: string
1577
- id?: string
1578
- isUpdate?: boolean
1579
- key: string
1580
- [key: string]: any
1581
- }
1582
- &nbsp;
1583
- export interface RunConfig {
1584
- id?: any[]
1585
- filters?: SearchFilters
1586
- sort?: SortJson
1587
- paginate?: PaginationJson
1588
- datasource?: Datasource
1589
- row?: Row
1590
- rows?: Row[]
1591
- tables?: Record&lt;string, Table&gt;
1592
- }
1593
- &nbsp;
1594
- function <span class="fstat-no" title="function not covered" >buildFilters(</span>
1595
- id: string | undefined | string[],
1596
- filters: SearchFilters,
1597
- table: Table
1598
- ) {
1599
- const primary = <span class="cstat-no" title="statement not covered" >table.primary</span>
1600
- // if passed in array need to copy for shifting etc
1601
- let idCopy: undefined | string | any[] = <span class="cstat-no" title="statement not covered" >cloneDeep(id)</span>
1602
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (filters) {</span>
1603
- // need to map over the filters and make sure the _id field isn't present
1604
- let prefix = <span class="cstat-no" title="statement not covered" >1</span>
1605
- <span class="cstat-no" title="statement not covered" > for (let operator of Object.values(filters)) {</span>
1606
- <span class="cstat-no" title="statement not covered" > for (let field of Object.keys(operator || {})) {</span>
1607
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (removeKeyNumbering(field) === "_id") {</span>
1608
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (primary) {</span>
1609
- const parts = <span class="cstat-no" title="statement not covered" >breakRowIdField(operator[field])</span>
1610
- <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
1611
- <span class="cstat-no" title="statement not covered" > operator[`${prefix}:${field}`] = parts.shift()</span>
1612
- }
1613
- <span class="cstat-no" title="statement not covered" > prefix++</span>
1614
- }
1615
- // make sure this field doesn't exist on any filter
1616
- <span class="cstat-no" title="statement not covered" > delete operator[field]</span>
1617
- }
1618
- }
1619
- }
1620
- }
1621
- // there is no id, just use the user provided filters
1622
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!idCopy || !table) {</span>
1623
- <span class="cstat-no" title="statement not covered" > return filters</span>
1624
- }
1625
- // if used as URL parameter it will have been joined
1626
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(idCopy)) {</span>
1627
- <span class="cstat-no" title="statement not covered" > idCopy = breakRowIdField(idCopy)</span>
1628
- }
1629
- const equal: any = <span class="cstat-no" title="statement not covered" >{}</span>
1630
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (primary &amp;&amp; idCopy) {</span>
1631
- <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
1632
- // work through the ID and get the parts
1633
- <span class="cstat-no" title="statement not covered" > equal[field] = idCopy.shift()</span>
1634
- }
1635
- }
1636
- <span class="cstat-no" title="statement not covered" > return {</span>
1637
- equal,
1638
- }
1639
- }
1640
- &nbsp;
1641
- /**
1642
- * This function checks the incoming parameters to make sure all the inputs are
1643
- * valid based on on the table schema. The main thing this is looking for is when a
1644
- * user has made use of the _id field of a row for a foreign key or a search parameter.
1645
- * In these cases the key will be sent up as [1], rather than 1. In these cases we will
1646
- * simplify it down to the requirements. This function is quite complex as we try to be
1647
- * relatively restrictive over what types of columns we will perform this action for.
1648
- */
1649
- function <span class="fstat-no" title="function not covered" >cleanupConfig(c</span>onfig: RunConfig, table: Table): RunConfig {
1650
- const primaryOptions = <span class="cstat-no" title="statement not covered" >[</span>
1651
- FieldTypes.STRING,
1652
- FieldTypes.LONGFORM,
1653
- FieldTypes.OPTIONS,
1654
- FieldTypes.NUMBER,
1655
- ]
1656
- // filter out fields which cannot be keys
1657
- const fieldNames = <span class="cstat-no" title="statement not covered" >Object.entries(table.schema)</span>
1658
- .filter(<span class="fstat-no" title="function not covered" >schema =&gt; <span class="cstat-no" title="statement not covered" >p</span>rimaryOptions.find(<span class="fstat-no" title="function not covered" >val =&gt; <span class="cstat-no" title="statement not covered" >v</span>al === schema[1].type)</span>)</span>
1659
- .map(<span class="fstat-no" title="function not covered" >([</span>fieldName]) =&gt; <span class="cstat-no" title="statement not covered" >fieldName)</span>
1660
- const iterateObject = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(o</span>bj: { [key: string]: any }) =&gt; {</span>
1661
- <span class="cstat-no" title="statement not covered" > for (let [field, value] of Object.entries(obj)) {</span>
1662
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldNames.find(<span class="fstat-no" title="function not covered" >name =&gt; <span class="cstat-no" title="statement not covered" >n</span>ame === field) &amp;&amp; i</span>sRowId(value)) {</span>
1663
- <span class="cstat-no" title="statement not covered" > obj[field] = convertRowId(value)</span>
1664
- }
1665
- }
1666
- }
1667
- // check the row and filters to make sure they aren't a key of some sort
1668
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (config.filters) {</span>
1669
- <span class="cstat-no" title="statement not covered" > for (let [key, filter] of Object.entries(config.filters)) {</span>
1670
- // oneOf is an array, don't iterate it
1671
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1672
- typeof filter !== "object" ||
1673
- Object.keys(filter).length === 0 ||
1674
- key === FilterType.ONE_OF
1675
- ) {
1676
- <span class="cstat-no" title="statement not covered" > continue</span>
1677
- }
1678
- <span class="cstat-no" title="statement not covered" > iterateObject(filter)</span>
1679
- }
1680
- }
1681
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (config.row) {</span>
1682
- <span class="cstat-no" title="statement not covered" > iterateObject(config.row)</span>
1683
- }
1684
- &nbsp;
1685
- <span class="cstat-no" title="statement not covered" > return config</span>
1686
- }
1687
- &nbsp;
1688
- function <span class="fstat-no" title="function not covered" >generateIdForRow(r</span>ow: Row | undefined, table: Table): string {
1689
- const primary = <span class="cstat-no" title="statement not covered" >table.primary</span>
1690
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row || !primary) {</span>
1691
- <span class="cstat-no" title="statement not covered" > return ""</span>
1692
- }
1693
- // build id array
1694
- let idParts = <span class="cstat-no" title="statement not covered" >[]</span>
1695
- <span class="cstat-no" title="statement not covered" > for (let field of primary) {</span>
1696
- // need to handle table name + field or just field, depending on if relationships used
1697
- const fieldValue = <span class="cstat-no" title="statement not covered" >row[`${table.name}.${field}`] || row[field]</span>
1698
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (fieldValue) {</span>
1699
- <span class="cstat-no" title="statement not covered" > idParts.push(fieldValue)</span>
1700
- }
1701
- }
1702
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (idParts.length === 0) {</span>
1703
- <span class="cstat-no" title="statement not covered" > return ""</span>
1704
- }
1705
- <span class="cstat-no" title="statement not covered" > return generateRowIdField(idParts)</span>
1706
- }
1707
- &nbsp;
1708
- function <span class="fstat-no" title="function not covered" >getEndpoint(t</span>ableId: string | undefined, operation: string) {
1709
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableId) {</span>
1710
- <span class="cstat-no" title="statement not covered" > return {}</span>
1711
- }
1712
- const { datasourceId, tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
1713
- <span class="cstat-no" title="statement not covered" > return {</span>
1714
- datasourceId,
1715
- entityId: tableName,
1716
- operation,
1717
- }
1718
- }
1719
- &nbsp;
1720
- function <span class="fstat-no" title="function not covered" >basicProcessing(r</span>ow: Row, table: Table): Row {
1721
- const thisRow: Row = <span class="cstat-no" title="statement not covered" >{}</span>
1722
- // filter the row down to what is actually the row (not joined)
1723
- <span class="cstat-no" title="statement not covered" > for (let fieldName of Object.keys(table.schema)) {</span>
1724
- const pathValue = <span class="cstat-no" title="statement not covered" >row[`${table.name}.${fieldName}`]</span>
1725
- const value = <span class="cstat-no" title="statement not covered" >pathValue != null ? pathValue : row[fieldName]</span>
1726
- // all responses include "select col as table.col" so that overlaps are handled
1727
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (value != null) {</span>
1728
- <span class="cstat-no" title="statement not covered" > thisRow[fieldName] = value</span>
1729
- }
1730
- }
1731
- <span class="cstat-no" title="statement not covered" > thisRow._id = generateIdForRow(row, table)</span>
1732
- <span class="cstat-no" title="statement not covered" > thisRow.tableId = table._id</span>
1733
- <span class="cstat-no" title="statement not covered" > thisRow._rev = "rev"</span>
1734
- <span class="cstat-no" title="statement not covered" > return processFormulas(table, thisRow)</span>
1735
- }
1736
- &nbsp;
1737
- function <span class="fstat-no" title="function not covered" >fixArrayTypes(r</span>ow: Row, table: Table) {
1738
- <span class="cstat-no" title="statement not covered" > for (let [fieldName, schema] of Object.entries(table.schema)) {</span>
1739
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1740
- schema.type === FieldTypes.ARRAY &amp;&amp;
1741
- typeof row[fieldName] === "string"
1742
- ) {
1743
- <span class="cstat-no" title="statement not covered" > try {</span>
1744
- <span class="cstat-no" title="statement not covered" > row[fieldName] = JSON.parse(row[fieldName])</span>
1745
- } catch (err) {
1746
- // couldn't convert back to array, ignore
1747
- <span class="cstat-no" title="statement not covered" > delete row[fieldName]</span>
1748
- }
1749
- }
1750
- }
1751
- <span class="cstat-no" title="statement not covered" > return row</span>
1752
- }
1753
- &nbsp;
1754
- function <span class="fstat-no" title="function not covered" >isOneSide(f</span>ield: FieldSchema) {
1755
- <span class="cstat-no" title="statement not covered" > return (</span>
1756
- field.relationshipType &amp;&amp; field.relationshipType.split("-")[0] === "one"
1757
- )
1758
- }
1759
- &nbsp;
1760
- export class <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >ExternalRequest {</span></span>
1761
- private operation: Operation
1762
- private tableId: string
1763
- private datasource?: Datasource
1764
- private <span class="cstat-no" title="statement not covered" >tables: { [key: string]: Table } = {}</span>
1765
- &nbsp;
1766
- <span class="fstat-no" title="function not covered" > constructor(o</span>peration: Operation, tableId: string, datasource?: Datasource) {
1767
- <span class="cstat-no" title="statement not covered" > this.operation = operation</span>
1768
- <span class="cstat-no" title="statement not covered" > this.tableId = tableId</span>
1769
- <span class="cstat-no" title="statement not covered" > this.datasource = datasource</span>
1770
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (datasource &amp;&amp; datasource.entities) {</span>
1771
- <span class="cstat-no" title="statement not covered" > this.tables = datasource.entities</span>
1772
- }
1773
- }
1774
- &nbsp;
1775
- <span class="fstat-no" title="function not covered" > getTable(t</span>ableId: string | undefined): Table | undefined {
1776
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableId) {</span>
1777
- <span class="cstat-no" title="statement not covered" > throw "Table ID is unknown, cannot find table"</span>
1778
- }
1779
- const { tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
1780
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (tableName) {</span>
1781
- <span class="cstat-no" title="statement not covered" > return this.tables[tableName]</span>
1782
- }
1783
- }
1784
- &nbsp;
1785
- <span class="fstat-no" title="function not covered" > inputProcessing(r</span>ow: Row | undefined, table: Table) {
1786
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row) {</span>
1787
- <span class="cstat-no" title="statement not covered" > return { row, manyRelationships: [] }</span>
1788
- }
1789
- // we don't really support composite keys for relationships, this is why [0] is used
1790
- // @ts-ignore
1791
- const tablePrimary: string = <span class="cstat-no" title="statement not covered" >table.primary[0]</span>
1792
- let newRow: Row = <span class="cstat-no" title="statement not covered" >{},</span>
1793
- manyRelationships: ManyRelationship[] = <span class="cstat-no" title="statement not covered" >[]</span>
1794
- <span class="cstat-no" title="statement not covered" > for (let [key, field] of Object.entries(table.schema)) {</span>
1795
- // if set already, or not set just skip it
1796
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1797
- row[key] == null ||
1798
- newRow[key] ||
1799
- field.autocolumn ||
1800
- field.type === FieldTypes.FORMULA
1801
- ) {
1802
- <span class="cstat-no" title="statement not covered" > continue</span>
1803
- }
1804
- // if its an empty string then it means return the column to null (if possible)
1805
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (row[key] === "") {</span>
1806
- <span class="cstat-no" title="statement not covered" > newRow[key] = null</span>
1807
- <span class="cstat-no" title="statement not covered" > continue</span>
1808
- }
1809
- // parse floats/numbers
1810
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type === FieldTypes.NUMBER &amp;&amp; !isNaN(parseFloat(row[key]))) {</span>
1811
- <span class="cstat-no" title="statement not covered" > newRow[key] = parseFloat(row[key])</span>
1812
- }
1813
- // if its not a link then just copy it over
1814
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK) {</span>
1815
- <span class="cstat-no" title="statement not covered" > newRow[key] = row[key]</span>
1816
- <span class="cstat-no" title="statement not covered" > continue</span>
1817
- }
1818
- const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field?.tableId)</span>
1819
- // table has to exist for many to many
1820
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkTableName || !this.tables[linkTableName]) {</span>
1821
- <span class="cstat-no" title="statement not covered" > continue</span>
1822
- }
1823
- const linkTable = <span class="cstat-no" title="statement not covered" >this.tables[linkTableName]</span>
1824
- // @ts-ignore
1825
- const linkTablePrimary = <span class="cstat-no" title="statement not covered" >linkTable.primary[0]</span>
1826
- // one to many
1827
- <span class="cstat-no" title="statement not covered" > if (isOneSide(field)) {</span>
1828
- let id = <span class="cstat-no" title="statement not covered" >row[key][0]</span>
1829
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof row[key] === "string") {</span>
1830
- <span class="cstat-no" title="statement not covered" > id = decodeURIComponent(row[key]).match(/\[(.*?)\]/)?.[1]</span>
1831
- }
1832
- <span class="cstat-no" title="statement not covered" > newRow[field.foreignKey || linkTablePrimary] = breakRowIdField(id)[0]</span>
1833
- }
1834
- // many to many
1835
- else <span class="cstat-no" title="statement not covered" >if (field.through) {</span>
1836
- // we're not inserting a doc, will be a bunch of update calls
1837
- const otherKey: string = <span class="cstat-no" title="statement not covered" >field.throughFrom || linkTablePrimary</span>
1838
- const thisKey: string = <span class="cstat-no" title="statement not covered" >field.throughTo || tablePrimary</span>
1839
- <span class="cstat-no" title="statement not covered" > row[key].map(<span class="fstat-no" title="function not covered" >(r</span>elationship: any) =&gt; {</span>
1840
- <span class="cstat-no" title="statement not covered" > manyRelationships.push({</span>
1841
- tableId: field.through || field.tableId,
1842
- isUpdate: false,
1843
- key: otherKey,
1844
- [otherKey]: breakRowIdField(relationship)[0],
1845
- // leave the ID for enrichment later
1846
- [thisKey]: `{{ literal ${tablePrimary} }}`,
1847
- })
1848
- })
1849
- }
1850
- // many to one
1851
- else {
1852
- const thisKey: string = <span class="cstat-no" title="statement not covered" >"id"</span>
1853
- // @ts-ignore
1854
- const otherKey: string = <span class="cstat-no" title="statement not covered" >field.fieldName</span>
1855
- <span class="cstat-no" title="statement not covered" > row[key].map(<span class="fstat-no" title="function not covered" >(r</span>elationship: any) =&gt; {</span>
1856
- <span class="cstat-no" title="statement not covered" > manyRelationships.push({</span>
1857
- tableId: field.tableId,
1858
- isUpdate: true,
1859
- key: otherKey,
1860
- [thisKey]: breakRowIdField(relationship)[0],
1861
- // leave the ID for enrichment later
1862
- [otherKey]: `{{ literal ${tablePrimary} }}`,
1863
- })
1864
- })
1865
- }
1866
- }
1867
- // we return the relationships that may need to be created in the through table
1868
- // we do this so that if the ID is generated by the DB it can be inserted
1869
- // after the fact
1870
- <span class="cstat-no" title="statement not covered" > return { row: newRow, manyRelationships }</span>
1871
- }
1872
- &nbsp;
1873
- <span class="fstat-no" title="function not covered" > squashRelationshipColumns(</span>
1874
- table: Table,
1875
- row: Row,
1876
- relationships: RelationshipsJson[]
1877
- ): Row {
1878
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
1879
- const linkedTable = <span class="cstat-no" title="statement not covered" >this.tables[relationship.tableName]</span>
1880
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkedTable || !row[relationship.column]) {</span>
1881
- <span class="cstat-no" title="statement not covered" > continue</span>
1882
- }
1883
- const display = <span class="cstat-no" title="statement not covered" >linkedTable.primaryDisplay</span>
1884
- <span class="cstat-no" title="statement not covered" > for (let key of Object.keys(row[relationship.column])) {</span>
1885
- const related: Row = <span class="cstat-no" title="statement not covered" >row[relationship.column][key]</span>
1886
- <span class="cstat-no" title="statement not covered" > row[relationship.column][key] = {</span>
1887
- primaryDisplay: display ? related[display] : undefined,
1888
- _id: related._id,
1889
- }
1890
- }
1891
- }
1892
- <span class="cstat-no" title="statement not covered" > return row</span>
1893
- }
1894
- &nbsp;
1895
- /**
1896
- * This iterates through the returned rows and works out what elements of the rows
1897
- * actually match up to another row (based on primary keys) - this is pretty specific
1898
- * to SQL and the way that SQL relationships are returned based on joins.
1899
- * This is complicated, but the idea is that when a SQL query returns all the relations
1900
- * will be separate rows, with all of the data in each row. We have to decipher what comes
1901
- * from where (which tables) and how to convert that into budibase columns.
1902
- */
1903
- <span class="fstat-no" title="function not covered" > updateRelationshipColumns(</span>
1904
- table: Table,
1905
- row: Row,
1906
- rows: { [key: string]: Row },
1907
- relationships: RelationshipsJson[]
1908
- ) {
1909
- const columns: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >{}</span>
1910
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
1911
- const linkedTable = <span class="cstat-no" title="statement not covered" >this.tables[relationship.tableName]</span>
1912
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkedTable) {</span>
1913
- <span class="cstat-no" title="statement not covered" > continue</span>
1914
- }
1915
- const fromColumn = <span class="cstat-no" title="statement not covered" >`${table.name}.${relationship.from}`</span>
1916
- const toColumn = <span class="cstat-no" title="statement not covered" >`${linkedTable.name}.${relationship.to}`</span>
1917
- // this is important when working with multiple relationships
1918
- // between the same tables, don't want to overlap/multiply the relations
1919
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1920
- !relationship.through &amp;&amp;
1921
- row[fromColumn]?.toString() !== row[toColumn]?.toString()
1922
- ) {
1923
- <span class="cstat-no" title="statement not covered" > continue</span>
1924
- }
1925
- let linked = <span class="cstat-no" title="statement not covered" >basicProcessing(row, linkedTable)</span>
1926
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linked._id) {</span>
1927
- <span class="cstat-no" title="statement not covered" > continue</span>
1928
- }
1929
- <span class="cstat-no" title="statement not covered" > columns[relationship.column] = linked</span>
1930
- }
1931
- <span class="cstat-no" title="statement not covered" > for (let [column, related] of Object.entries(columns)) {</span>
1932
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!row._id) {</span>
1933
- <span class="cstat-no" title="statement not covered" > continue</span>
1934
- }
1935
- const rowId: string = <span class="cstat-no" title="statement not covered" >row._id</span>
1936
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(rows[rowId][column])) {</span>
1937
- <span class="cstat-no" title="statement not covered" > rows[rowId][column] = []</span>
1938
- }
1939
- // make sure relationship hasn't been found already
1940
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
1941
- !rows[rowId][column].find(
1942
- <span class="fstat-no" title="function not covered" > (r</span>elation: Row) =&gt; <span class="cstat-no" title="statement not covered" >relation._id === related._id</span>
1943
- )
1944
- ) {
1945
- <span class="cstat-no" title="statement not covered" > rows[rowId][column].push(related)</span>
1946
- }
1947
- }
1948
- <span class="cstat-no" title="statement not covered" > return rows</span>
1949
- }
1950
- &nbsp;
1951
- <span class="fstat-no" title="function not covered" > outputProcessing(</span>
1952
- rows: Row[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span>
1953
- table: Table,
1954
- relationships: RelationshipsJson[]
1955
- ) {
1956
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!rows || rows.length === 0 || rows[0].read === true) {</span>
1957
- <span class="cstat-no" title="statement not covered" > return []</span>
1958
- }
1959
- let finalRows: { [key: string]: Row } = <span class="cstat-no" title="statement not covered" >{}</span>
1960
- <span class="cstat-no" title="statement not covered" > for (let row of rows) {</span>
1961
- const rowId = <span class="cstat-no" title="statement not covered" >generateIdForRow(row, table)</span>
1962
- <span class="cstat-no" title="statement not covered" > row._id = rowId</span>
1963
- // this is a relationship of some sort
1964
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (finalRows[rowId]) {</span>
1965
- <span class="cstat-no" title="statement not covered" > finalRows = this.updateRelationshipColumns(</span>
1966
- table,
1967
- row,
1968
- finalRows,
1969
- relationships
1970
- )
1971
- <span class="cstat-no" title="statement not covered" > continue</span>
1972
- }
1973
- const thisRow = <span class="cstat-no" title="statement not covered" >fixArrayTypes(basicProcessing(row, table), table)</span>
1974
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (thisRow._id == null) {</span>
1975
- <span class="cstat-no" title="statement not covered" > throw "Unable to generate row ID for SQL rows"</span>
1976
- }
1977
- <span class="cstat-no" title="statement not covered" > finalRows[thisRow._id] = thisRow</span>
1978
- // do this at end once its been added to the final rows
1979
- <span class="cstat-no" title="statement not covered" > finalRows = this.updateRelationshipColumns(</span>
1980
- table,
1981
- row,
1982
- finalRows,
1983
- relationships
1984
- )
1985
- }
1986
- &nbsp;
1987
- // Process some additional data types
1988
- let finalRowArray = <span class="cstat-no" title="statement not covered" >Object.values(finalRows)</span>
1989
- <span class="cstat-no" title="statement not covered" > finalRowArray = processDates(table, finalRowArray)</span>
1990
- <span class="cstat-no" title="statement not covered" > finalRowArray = processFormulas(table, finalRowArray) as Row[]</span>
1991
- &nbsp;
1992
- <span class="cstat-no" title="statement not covered" > return finalRowArray.map(<span class="fstat-no" title="function not covered" >(r</span>ow: Row) =&gt;</span>
1993
- <span class="cstat-no" title="statement not covered" > this.squashRelationshipColumns(table, row, relationships)</span>
1994
- )
1995
- }
1996
- &nbsp;
1997
- /**
1998
- * Gets the list of relationship JSON structures based on the columns in the table,
1999
- * this will be used by the underlying library to build whatever relationship mechanism
2000
- * it has (e.g. SQL joins).
2001
- */
2002
- <span class="fstat-no" title="function not covered" > buildRelationships(t</span>able: Table): RelationshipsJson[] {
2003
- const relationships = <span class="cstat-no" title="statement not covered" >[]</span>
2004
- <span class="cstat-no" title="statement not covered" > for (let [fieldName, field] of Object.entries(table.schema)) {</span>
2005
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK) {</span>
2006
- <span class="cstat-no" title="statement not covered" > continue</span>
2007
- }
2008
- const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field.tableId)</span>
2009
- // no table to link to, this is not a valid relationships
2010
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkTableName || !this.tables[linkTableName]) {</span>
2011
- <span class="cstat-no" title="statement not covered" > continue</span>
2012
- }
2013
- const linkTable = <span class="cstat-no" title="statement not covered" >this.tables[linkTableName]</span>
2014
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!table.primary || !linkTable.primary) {</span>
2015
- <span class="cstat-no" title="statement not covered" > continue</span>
2016
- }
2017
- const definition: any = <span class="cstat-no" title="statement not covered" >{</span>
2018
- // if no foreign key specified then use the name of the field in other table
2019
- from: field.foreignKey || table.primary[0],
2020
- to: field.fieldName,
2021
- tableName: linkTableName,
2022
- // need to specify where to put this back into
2023
- column: fieldName,
2024
- }
2025
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.through) {</span>
2026
- const { tableName: throughTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(</span>
2027
- field.through
2028
- )
2029
- <span class="cstat-no" title="statement not covered" > definition.through = throughTableName</span>
2030
- // don't support composite keys for relationships
2031
- <span class="cstat-no" title="statement not covered" > definition.from = field.throughTo || table.primary[0]</span>
2032
- <span class="cstat-no" title="statement not covered" > definition.to = field.throughFrom || linkTable.primary[0]</span>
2033
- <span class="cstat-no" title="statement not covered" > definition.fromPrimary = table.primary[0]</span>
2034
- <span class="cstat-no" title="statement not covered" > definition.toPrimary = linkTable.primary[0]</span>
2035
- }
2036
- <span class="cstat-no" title="statement not covered" > relationships.push(definition)</span>
2037
- }
2038
- <span class="cstat-no" title="statement not covered" > return relationships</span>
2039
- }
2040
- &nbsp;
2041
- /**
2042
- * This is a cached lookup, of relationship records, this is mainly for creating/deleting junction
2043
- * information.
2044
- */
2045
- <span class="fstat-no" title="function not covered" > async l</span>ookupRelations(tableId: string, row: Row) {
2046
- const related: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >{}</span>
2047
- const { tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
2048
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {</span>
2049
- <span class="cstat-no" title="statement not covered" > return related</span>
2050
- }
2051
- const table = <span class="cstat-no" title="statement not covered" >this.tables[tableName]</span>
2052
- // @ts-ignore
2053
- const primaryKey = <span class="cstat-no" title="statement not covered" >table.primary[0]</span>
2054
- // make a new request to get the row with all its relationships
2055
- // we need this to work out if any relationships need removed
2056
- <span class="cstat-no" title="statement not covered" > for (let field of Object.values(table.schema)) {</span>
2057
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2058
- field.type !== FieldTypes.LINK ||
2059
- !field.fieldName ||
2060
- isOneSide(field)
2061
- ) {
2062
- <span class="cstat-no" title="statement not covered" > continue</span>
2063
- }
2064
- const isMany = <span class="cstat-no" title="statement not covered" >field.relationshipType === RelationshipTypes.MANY_TO_MANY</span>
2065
- const tableId = <span class="cstat-no" title="statement not covered" >isMany ? field.through : field.tableId</span>
2066
- const { tableName: relatedTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
2067
- // @ts-ignore
2068
- const linkPrimaryKey = <span class="cstat-no" title="statement not covered" >this.tables[relatedTableName].primary[0]</span>
2069
- const manyKey = <span class="cstat-no" title="statement not covered" >field.throughTo || primaryKey</span>
2070
- const lookupField = <span class="cstat-no" title="statement not covered" >isMany ? primaryKey : field.foreignKey</span>
2071
- const fieldName = <span class="cstat-no" title="statement not covered" >isMany ? manyKey : field.fieldName</span>
2072
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!lookupField || !row[lookupField]) {</span>
2073
- <span class="cstat-no" title="statement not covered" > continue</span>
2074
- }
2075
- const response = <span class="cstat-no" title="statement not covered" >await getDatasourceAndQuery({</span>
2076
- endpoint: getEndpoint(tableId, Operation.READ),
2077
- filters: {
2078
- equal: {
2079
- [fieldName]: row[lookupField],
2080
- },
2081
- },
2082
- })
2083
- // this is the response from knex if no rows found
2084
- const rows = <span class="cstat-no" title="statement not covered" >!response[0].read ? response : []</span>
2085
- const storeTo = <span class="cstat-no" title="statement not covered" >isMany ? field.throughFrom || linkPrimaryKey : fieldName</span>
2086
- <span class="cstat-no" title="statement not covered" > related[storeTo] = { rows, isMany, tableId }</span>
2087
- }
2088
- <span class="cstat-no" title="statement not covered" > return related</span>
2089
- }
2090
- &nbsp;
2091
- /**
2092
- * Once a row has been written we may need to update a many field, e.g. updating foreign keys
2093
- * in a bunch of rows in another table, or inserting/deleting rows from a junction table (many to many).
2094
- * This is quite a complex process and is handled by this function, there are a few things going on here:
2095
- * 1. If updating foreign keys its relatively simple, just create a filter for the row that needs updated
2096
- * and write the various components.
2097
- * 2. If junction table, then we lookup what exists already, write what doesn't exist, work out what
2098
- * isn't supposed to exist anymore and delete those. This is better than the usual method of delete them
2099
- * all and then re-create, as theres no chance of losing data (e.g. delete succeed, but write fail).
2100
- */
2101
- <span class="fstat-no" title="function not covered" > async h</span>andleManyRelationships(
2102
- mainTableId: string,
2103
- row: Row,
2104
- relationships: ManyRelationship[]
2105
- ) {
2106
- // if we're creating (in a through table) need to wipe the existing ones first
2107
- const promises = <span class="cstat-no" title="statement not covered" >[]</span>
2108
- const related = <span class="cstat-no" title="statement not covered" >await this.lookupRelations(mainTableId, row)</span>
2109
- <span class="cstat-no" title="statement not covered" > for (let relationship of relationships) {</span>
2110
- const { key, tableId, isUpdate, id, ...rest } = <span class="cstat-no" title="statement not covered" >relationship</span>
2111
- const body: { [key: string]: any } = <span class="cstat-no" title="statement not covered" >processObjectSync(rest, row, {})</span>
2112
- const linkTable = <span class="cstat-no" title="statement not covered" >this.getTable(tableId)</span>
2113
- // @ts-ignore
2114
- const linkPrimary = <span class="cstat-no" title="statement not covered" >linkTable?.primary[0]</span>
2115
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!linkTable || !linkPrimary) {</span>
2116
- <span class="cstat-no" title="statement not covered" > return</span>
2117
- }
2118
- const rows = <span class="cstat-no" title="statement not covered" >related[key]?.rows || []</span>
2119
- const found = <span class="cstat-no" title="statement not covered" >rows.find(</span>
2120
- <span class="fstat-no" title="function not covered" > (r</span>ow: { [key: string]: any }) =&gt;
2121
- <span class="cstat-no" title="statement not covered" > row[linkPrimary] === relationship.id ||</span>
2122
- row[linkPrimary] === body?.[linkPrimary]
2123
- )
2124
- const operation = <span class="cstat-no" title="statement not covered" >isUpdate ? Operation.UPDATE : Operation.CREATE</span>
2125
- <span class="cstat-no" title="statement not covered" > if (!found) {</span>
2126
- <span class="cstat-no" title="statement not covered" > promises.push(</span>
2127
- getDatasourceAndQuery({
2128
- endpoint: getEndpoint(tableId, operation),
2129
- // if we're doing many relationships then we're writing, only one response
2130
- body,
2131
- filters: buildFilters(id, {}, linkTable),
2132
- })
2133
- )
2134
- } else {
2135
- // remove the relationship from cache so it isn't adjusted again
2136
- <span class="cstat-no" title="statement not covered" > rows.splice(rows.indexOf(found), 1)</span>
2137
- }
2138
- }
2139
- // finally cleanup anything that needs to be removed
2140
- <span class="cstat-no" title="statement not covered" > for (let [colName, { isMany, rows, tableId }] of Object.entries(related)) {</span>
2141
- const table: Table | undefined = <span class="cstat-no" title="statement not covered" >this.getTable(tableId)</span>
2142
- // if its not the foreign key skip it, nothing to do
2143
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2144
- !table ||
2145
- (!isMany &amp;&amp; table.primary &amp;&amp; table.primary.indexOf(colName) !== -1)
2146
- ) {
2147
- <span class="cstat-no" title="statement not covered" > continue</span>
2148
- }
2149
- <span class="cstat-no" title="statement not covered" > for (let row of rows) {</span>
2150
- const filters = <span class="cstat-no" title="statement not covered" >buildFilters(generateIdForRow(row, table), {}, table)</span>
2151
- // safety check, if there are no filters on deletion bad things happen
2152
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Object.keys(filters).length !== 0) {</span>
2153
- const op = <span class="cstat-no" title="statement not covered" >isMany ? Operation.DELETE : Operation.UPDATE</span>
2154
- const body = <span class="cstat-no" title="statement not covered" >isMany ? null : { [colName]: null }</span>
2155
- <span class="cstat-no" title="statement not covered" > promises.push(</span>
2156
- getDatasourceAndQuery({
2157
- endpoint: getEndpoint(tableId, op),
2158
- body,
2159
- filters,
2160
- })
2161
- )
2162
- }
2163
- }
2164
- }
2165
- <span class="cstat-no" title="statement not covered" > await Promise.all(promises)</span>
2166
- }
2167
- &nbsp;
2168
- /**
2169
- * This function is a bit crazy, but the exact purpose of it is to protect against the scenario in which
2170
- * you have column overlap in relationships, e.g. we join a few different tables and they all have the
2171
- * concept of an ID, but for some of them it will be null (if they say don't have a relationship).
2172
- * Creating the specific list of fields that we desire, and excluding the ones that are no use to us
2173
- * is more performant and has the added benefit of protecting against this scenario.
2174
- */
2175
- <span class="fstat-no" title="function not covered" > buildFields(</span>
2176
- table: Table,
2177
- includeRelations: IncludeRelationship = <span class="branch-0 cbranch-no" title="branch not covered" >IncludeRelationship.INCLUDE</span>
2178
- ) {
2179
- function <span class="fstat-no" title="function not covered" >extractRealFields(t</span>able: Table, existing: string[] = <span class="branch-0 cbranch-no" title="branch not covered" >[])</span> {
2180
- <span class="cstat-no" title="statement not covered" > return Object.entries(table.schema)</span>
2181
- .filter(
2182
- <span class="fstat-no" title="function not covered" > column =&gt;</span>
2183
- <span class="cstat-no" title="statement not covered" > column[1].type !== FieldTypes.LINK &amp;&amp;</span>
2184
- column[1].type !== FieldTypes.FORMULA &amp;&amp;
2185
- !existing.find(<span class="fstat-no" title="function not covered" >(f</span>ield: string) =&gt; <span class="cstat-no" title="statement not covered" >field === column[0])</span>
2186
- )
2187
- .map(<span class="fstat-no" title="function not covered" >column =&gt; <span class="cstat-no" title="statement not covered" >`</span>${table.name}.${column[0]}`)</span>
2188
- }
2189
- let fields = <span class="cstat-no" title="statement not covered" >extractRealFields(table)</span>
2190
- <span class="cstat-no" title="statement not covered" > for (let field of Object.values(table.schema)) {</span>
2191
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (field.type !== FieldTypes.LINK || !includeRelations) {</span>
2192
- <span class="cstat-no" title="statement not covered" > continue</span>
2193
- }
2194
- const { tableName: linkTableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(field.tableId)</span>
2195
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (linkTableName) {</span>
2196
- const linkTable = <span class="cstat-no" title="statement not covered" >this.tables[linkTableName]</span>
2197
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (linkTable) {</span>
2198
- const linkedFields = <span class="cstat-no" title="statement not covered" >extractRealFields(linkTable, fields)</span>
2199
- <span class="cstat-no" title="statement not covered" > fields = fields.concat(linkedFields)</span>
2200
- }
2201
- }
2202
- }
2203
- <span class="cstat-no" title="statement not covered" > return fields</span>
2204
- }
2205
- &nbsp;
2206
- <span class="fstat-no" title="function not covered" > async r</span>un(config: RunConfig) {
2207
- const { operation, tableId } = <span class="cstat-no" title="statement not covered" >this</span>
2208
- let { datasourceId, tableName } = <span class="cstat-no" title="statement not covered" >breakExternalTableId(tableId)</span>
2209
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!tableName) {</span>
2210
- <span class="cstat-no" title="statement not covered" > throw "Unable to run without a table name"</span>
2211
- }
2212
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource) {</span>
2213
- <span class="cstat-no" title="statement not covered" > this.datasource = await sdk.datasources.get(datasourceId!)</span>
2214
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource || !this.datasource.entities) {</span>
2215
- <span class="cstat-no" title="statement not covered" > throw "No tables found, fetch tables before query."</span>
2216
- }
2217
- <span class="cstat-no" title="statement not covered" > this.tables = this.datasource.entities</span>
2218
- }
2219
- const table = <span class="cstat-no" title="statement not covered" >this.tables[tableName]</span>
2220
- let isSql = <span class="cstat-no" title="statement not covered" >isSQL(this.datasource)</span>
2221
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!table) {</span>
2222
- <span class="cstat-no" title="statement not covered" > throw `Unable to process query, table "${tableName}" not defined.`</span>
2223
- }
2224
- // look for specific components of config which may not be considered acceptable
2225
- let { id, row, filters, sort, paginate, rows } = <span class="cstat-no" title="statement not covered" >cleanupConfig(</span>
2226
- config,
2227
- table
2228
- )
2229
- //if the sort column is a formula, remove it
2230
- <span class="cstat-no" title="statement not covered" > for (let sortColumn of Object.keys(sort || {})) {</span>
2231
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (table.schema[sortColumn]?.type === "formula") {</span>
2232
- <span class="cstat-no" title="statement not covered" > delete sort?.[sortColumn]</span>
2233
- }
2234
- }
2235
- <span class="cstat-no" title="statement not covered" > filters = buildFilters(id, filters || {}, table)</span>
2236
- const relationships = <span class="cstat-no" title="statement not covered" >this.buildRelationships(table)</span>
2237
- // clean up row on ingress using schema
2238
- const processed = <span class="cstat-no" title="statement not covered" >this.inputProcessing(row, table)</span>
2239
- <span class="cstat-no" title="statement not covered" > row = processed.row</span>
2240
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
2241
- operation === Operation.DELETE &amp;&amp;
2242
- (filters == null || Object.keys(filters).length === 0)
2243
- ) {
2244
- <span class="cstat-no" title="statement not covered" > throw "Deletion must be filtered"</span>
2245
- }
2246
- let json = <span class="cstat-no" title="statement not covered" >{</span>
2247
- endpoint: {
2248
- datasourceId,
2249
- entityId: tableName,
2250
- operation,
2251
- },
2252
- resource: {
2253
- // have to specify the fields to avoid column overlap (for SQL)
2254
- fields: isSql ? this.buildFields(table) : [],
2255
- },
2256
- filters,
2257
- sort,
2258
- paginate,
2259
- relationships,
2260
- body: row || rows,
2261
- // pass an id filter into extra, purely for mysql/returning
2262
- extra: {
2263
- idFilter: buildFilters(id || generateIdForRow(row, table), {}, table),
2264
- },
2265
- meta: {
2266
- table,
2267
- },
2268
- }
2269
- // can't really use response right now
2270
- const response = <span class="cstat-no" title="statement not covered" >await getDatasourceAndQuery(json)</span>
2271
- // handle many to many relationships now if we know the ID (could be auto increment)
2272
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (operation !== Operation.READ &amp;&amp; processed.manyRelationships) {</span>
2273
- <span class="cstat-no" title="statement not covered" > await this.handleManyRelationships(</span>
2274
- table._id || "",
2275
- response[0],
2276
- processed.manyRelationships
2277
- )
2278
- }
2279
- const output = <span class="cstat-no" title="statement not covered" >this.outputProcessing(response, table, relationships)</span>
2280
- // if reading it'll just be an array of rows, return whole thing
2281
- <span class="cstat-no" title="statement not covered" > return operation === Operation.READ &amp;&amp; Array.isArray(response)</span>
2282
- ? output
2283
- : { row: output[0], table }
2284
- }
2285
- }
2286
- &nbsp;</pre></td></tr></table></pre>
2287
-
2288
- <div class='push'></div><!-- for sticky footer -->
2289
- </div><!-- /wrapper -->
2290
- <div class='footer quiet pad2 space-top1 center small'>
2291
- Code coverage generated by
2292
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2293
- at Thu Feb 16 2023 16:35:51 GMT+0000 (Coordinated Universal Time)
2294
- </div>
2295
- <script src="../../../../prettify.js"></script>
2296
- <script>
2297
- window.onload = function () {
2298
- prettyPrint();
2299
- };
2300
- </script>
2301
- <script src="../../../../sorter.js"></script>
2302
- <script src="../../../../block-navigation.js"></script>
2303
- </body>
2304
- </html>
2305
-