dsl-to-sql 1.0.0-fabric-1p-development.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 (225) hide show
  1. package/.turbo/turbo-build.log +9 -0
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/.turbo/turbo-lint.log +126 -0
  4. package/README.md +45 -0
  5. package/coverage/base.css +224 -0
  6. package/coverage/block-navigation.js +87 -0
  7. package/coverage/favicon.png +0 -0
  8. package/coverage/index.html +236 -0
  9. package/coverage/prettify.css +1 -0
  10. package/coverage/prettify.js +2 -0
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +210 -0
  13. package/coverage/src/constants.ts.html +826 -0
  14. package/coverage/src/database_types.ts.html +136 -0
  15. package/coverage/src/epm-query-builder/EpmQueryBuilder.ts.html +166 -0
  16. package/coverage/src/epm-query-builder/base/BaseAdvancedAggregations.ts.html +568 -0
  17. package/coverage/src/epm-query-builder/base/BaseAnalyticalFunctions.ts.html +694 -0
  18. package/coverage/src/epm-query-builder/base/BaseCTEGenerator.ts.html +1459 -0
  19. package/coverage/src/epm-query-builder/base/BaseCountQueryBuilder.ts.html +400 -0
  20. package/coverage/src/epm-query-builder/base/BaseMeasureBuilder.ts.html +295 -0
  21. package/coverage/src/epm-query-builder/base/BaseOrderBuilder.ts.html +670 -0
  22. package/coverage/src/epm-query-builder/base/BasePaginationBuilder.ts.html +364 -0
  23. package/coverage/src/epm-query-builder/base/BaseQueryBuilder.ts.html +238 -0
  24. package/coverage/src/epm-query-builder/base/BaseRollupBuilder.ts.html +532 -0
  25. package/coverage/src/epm-query-builder/base/BaseSqlBuilder.ts.html +601 -0
  26. package/coverage/src/epm-query-builder/base/BaseSuperFilterBuilder.ts.html +1966 -0
  27. package/coverage/src/epm-query-builder/base/BaseUtilities.ts.html +1798 -0
  28. package/coverage/src/epm-query-builder/base/ColumnRefUtils.ts.html +211 -0
  29. package/coverage/src/epm-query-builder/base/RelationshipResolver.ts.html +706 -0
  30. package/coverage/src/epm-query-builder/base/SharedFilterBuilder.ts.html +1717 -0
  31. package/coverage/src/epm-query-builder/base/index.html +326 -0
  32. package/coverage/src/epm-query-builder/constants/Aggregations.ts.html +133 -0
  33. package/coverage/src/epm-query-builder/constants/Database.ts.html +103 -0
  34. package/coverage/src/epm-query-builder/constants/Source.ts.html +106 -0
  35. package/coverage/src/epm-query-builder/constants/index.html +146 -0
  36. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts.html +286 -0
  37. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts.html +280 -0
  38. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts.html +1924 -0
  39. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts.html +769 -0
  40. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts.html +643 -0
  41. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts.html +2644 -0
  42. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts.html +478 -0
  43. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts.html +1195 -0
  44. package/coverage/src/epm-query-builder/dialects/duckdb/index.html +221 -0
  45. package/coverage/src/epm-query-builder/errors/QueryBuilderErrors.ts.html +280 -0
  46. package/coverage/src/epm-query-builder/errors/index.html +116 -0
  47. package/coverage/src/epm-query-builder/index.html +116 -0
  48. package/coverage/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts.html +100 -0
  49. package/coverage/src/epm-query-builder/interfaces/index.html +131 -0
  50. package/coverage/src/epm-query-builder/interfaces/index.ts.html +88 -0
  51. package/coverage/src/epm-query-builder/utils/format.ts.html +151 -0
  52. package/coverage/src/epm-query-builder/utils/index.html +146 -0
  53. package/coverage/src/epm-query-builder/utils/sql.ts.html +247 -0
  54. package/coverage/src/epm-query-builder/utils/validation.ts.html +124 -0
  55. package/coverage/src/epm-query-builder/validation/QueryOptionsValidator.ts.html +631 -0
  56. package/coverage/src/epm-query-builder/validation/SqlQueryValidator.ts.html +475 -0
  57. package/coverage/src/epm-query-builder/validation/index.html +131 -0
  58. package/coverage/src/filters/FilterConditionBuilder.ts.html +427 -0
  59. package/coverage/src/filters/filter-types.ts.html +484 -0
  60. package/coverage/src/filters/index.html +131 -0
  61. package/coverage/src/index.html +176 -0
  62. package/coverage/src/index.ts.html +103 -0
  63. package/coverage/src/js-lib/JsToSqlParser.ts.html +736 -0
  64. package/coverage/src/js-lib/ParseContext.ts.html +532 -0
  65. package/coverage/src/js-lib/db/azuresql/AzureSqlCallExpressionVisitor.ts.html +196 -0
  66. package/coverage/src/js-lib/db/azuresql/index.html +116 -0
  67. package/coverage/src/js-lib/db/base/ArrayExpressionVisitor.ts.html +133 -0
  68. package/coverage/src/js-lib/db/base/AssignmentExpressionVisitor.ts.html +187 -0
  69. package/coverage/src/js-lib/db/base/BinaryExpressionVisitor.ts.html +223 -0
  70. package/coverage/src/js-lib/db/base/CallExpressionVisitor.ts.html +5479 -0
  71. package/coverage/src/js-lib/db/base/IdentifierVisitor.ts.html +283 -0
  72. package/coverage/src/js-lib/db/base/LiteralVisitor.ts.html +199 -0
  73. package/coverage/src/js-lib/db/base/MemberExpressionVisitor.ts.html +193 -0
  74. package/coverage/src/js-lib/db/base/ProgramVisitor.ts.html +139 -0
  75. package/coverage/src/js-lib/db/base/UnaryExpressionVisitor.ts.html +181 -0
  76. package/coverage/src/js-lib/db/base/VisitorInterface.ts.html +103 -0
  77. package/coverage/src/js-lib/db/base/index.html +251 -0
  78. package/coverage/src/js-lib/db/bigquery/BigQueryCallExpressionVisitor.ts.html +1747 -0
  79. package/coverage/src/js-lib/db/bigquery/index.html +116 -0
  80. package/coverage/src/js-lib/db/commonTransforms.ts.html +2074 -0
  81. package/coverage/src/js-lib/db/databricks/DatabricksCallExpressionVisitor.ts.html +1303 -0
  82. package/coverage/src/js-lib/db/databricks/index.html +116 -0
  83. package/coverage/src/js-lib/db/fabricsql/FabricSqlCallExpressionVisitor.ts.html +196 -0
  84. package/coverage/src/js-lib/db/fabricsql/index.html +116 -0
  85. package/coverage/src/js-lib/db/fabricwarehouse/FabricWarehouseCallExpressionVisitor.ts.html +292 -0
  86. package/coverage/src/js-lib/db/fabricwarehouse/index.html +116 -0
  87. package/coverage/src/js-lib/db/index.html +116 -0
  88. package/coverage/src/js-lib/db/postgresql/PostgreSqlCallExpressionVisitor.ts.html +985 -0
  89. package/coverage/src/js-lib/db/postgresql/index.html +116 -0
  90. package/coverage/src/js-lib/db/redshift/RedshiftCallExpressionVisitor.ts.html +685 -0
  91. package/coverage/src/js-lib/db/redshift/index.html +116 -0
  92. package/coverage/src/js-lib/db/sample/SampleCallExpressionVisitor.ts.html +196 -0
  93. package/coverage/src/js-lib/db/sample/index.html +116 -0
  94. package/coverage/src/js-lib/db/snowflake/SnowflakeCallExpressionVisitor.ts.html +1447 -0
  95. package/coverage/src/js-lib/db/snowflake/index.html +116 -0
  96. package/coverage/src/js-lib/db/validator/FormulaValidator.ts.html +4162 -0
  97. package/coverage/src/js-lib/db/validator/index.html +116 -0
  98. package/coverage/src/js-lib/index.html +131 -0
  99. package/coverage/src/js-lib/objects/BaseObject.ts.html +169 -0
  100. package/coverage/src/js-lib/objects/DateObject.ts.html +169 -0
  101. package/coverage/src/js-lib/objects/PctObject.ts.html +178 -0
  102. package/coverage/src/js-lib/objects/index.html +146 -0
  103. package/coverage/src/query-builder/PaginationBuilder.ts.html +142 -0
  104. package/coverage/src/query-builder/QueryBuilder.ts.html +3118 -0
  105. package/coverage/src/query-builder/SuperFilterBuilder.ts.html +1969 -0
  106. package/coverage/src/query-builder/index.html +146 -0
  107. package/coverage/src/runtime_var.ts.html +109 -0
  108. package/coverage/src/sql-lib/binary_expr.ts.html +133 -0
  109. package/coverage/src/sql-lib/case.ts.html +133 -0
  110. package/coverage/src/sql-lib/column.ts.html +139 -0
  111. package/coverage/src/sql-lib/else.ts.html +124 -0
  112. package/coverage/src/sql-lib/function.ts.html +112 -0
  113. package/coverage/src/sql-lib/index.html +251 -0
  114. package/coverage/src/sql-lib/join.ts.html +127 -0
  115. package/coverage/src/sql-lib/literal.ts.html +130 -0
  116. package/coverage/src/sql-lib/select.ts.html +547 -0
  117. package/coverage/src/sql-lib/unary_expr.ts.html +112 -0
  118. package/coverage/src/sql-lib/when.ts.html +130 -0
  119. package/coverage/src/sql_query_gen.ts.html +535 -0
  120. package/coverage/src/superFilter/DateFilterFactory.ts.html +625 -0
  121. package/coverage/src/superFilter/dateFunction.ts.html +193 -0
  122. package/coverage/src/superFilter/index.html +131 -0
  123. package/coverage/src/utils.ts.html +571 -0
  124. package/dist/index.cjs +8440 -0
  125. package/dist/index.d.cts +927 -0
  126. package/dist/index.d.cts.map +1 -0
  127. package/dist/index.d.ts +927 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +8387 -0
  130. package/dist/index.js.map +1 -0
  131. package/eslint.config.js +4 -0
  132. package/jest.config.ts +44 -0
  133. package/package.json +45 -0
  134. package/src/constants.ts +247 -0
  135. package/src/epm-query-builder/EpmQueryBuilder.ts +27 -0
  136. package/src/epm-query-builder/base/BaseAdvancedAggregations.ts +161 -0
  137. package/src/epm-query-builder/base/BaseAnalyticalFunctions.ts +203 -0
  138. package/src/epm-query-builder/base/BaseCTEGenerator.ts +458 -0
  139. package/src/epm-query-builder/base/BaseCountQueryBuilder.ts +105 -0
  140. package/src/epm-query-builder/base/BaseMeasureBuilder.ts +87 -0
  141. package/src/epm-query-builder/base/BaseOrderBuilder.ts +195 -0
  142. package/src/epm-query-builder/base/BasePaginationBuilder.ts +93 -0
  143. package/src/epm-query-builder/base/BaseQueryBuilder.ts +51 -0
  144. package/src/epm-query-builder/base/BaseRollupBuilder.ts +149 -0
  145. package/src/epm-query-builder/base/BaseSqlBuilder.ts +172 -0
  146. package/src/epm-query-builder/base/BaseSuperFilterBuilder.ts +627 -0
  147. package/src/epm-query-builder/base/BaseUtilities.ts +571 -0
  148. package/src/epm-query-builder/base/ColumnRefUtils.ts +42 -0
  149. package/src/epm-query-builder/base/RelationshipResolver.ts +207 -0
  150. package/src/epm-query-builder/base/SharedFilterBuilder.ts +544 -0
  151. package/src/epm-query-builder/constants/Aggregations.ts +16 -0
  152. package/src/epm-query-builder/constants/Database.ts +6 -0
  153. package/src/epm-query-builder/constants/Source.ts +7 -0
  154. package/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts +67 -0
  155. package/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts +65 -0
  156. package/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts +626 -0
  157. package/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts +228 -0
  158. package/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts +186 -0
  159. package/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts +853 -0
  160. package/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts +131 -0
  161. package/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts +370 -0
  162. package/src/epm-query-builder/errors/QueryBuilderErrors.ts +65 -0
  163. package/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts +5 -0
  164. package/src/epm-query-builder/interfaces/index.ts +1 -0
  165. package/src/epm-query-builder/types/query-builder-types.d.ts +289 -0
  166. package/src/epm-query-builder/utils/format.ts +22 -0
  167. package/src/epm-query-builder/utils/sql.ts +54 -0
  168. package/src/epm-query-builder/utils/validation.ts +13 -0
  169. package/src/epm-query-builder/validation/QueryOptionsValidator.ts +182 -0
  170. package/src/epm-query-builder/validation/SqlQueryValidator.ts +130 -0
  171. package/src/filters/FilterConditionBuilder.ts +114 -0
  172. package/src/filters/filter-types.ts +133 -0
  173. package/src/index.ts +10 -0
  174. package/src/js-lib/JsToSqlParser.ts +217 -0
  175. package/src/js-lib/ParseContext.ts +149 -0
  176. package/src/js-lib/db/base/ArrayExpressionVisitor.ts +16 -0
  177. package/src/js-lib/db/base/AssignmentExpressionVisitor.ts +34 -0
  178. package/src/js-lib/db/base/BinaryExpressionVisitor.ts +46 -0
  179. package/src/js-lib/db/base/CallExpressionVisitor.ts +1798 -0
  180. package/src/js-lib/db/base/IdentifierVisitor.ts +66 -0
  181. package/src/js-lib/db/base/LiteralVisitor.ts +38 -0
  182. package/src/js-lib/db/base/MemberExpressionVisitor.ts +36 -0
  183. package/src/js-lib/db/base/ProgramVisitor.ts +18 -0
  184. package/src/js-lib/db/base/UnaryExpressionVisitor.ts +32 -0
  185. package/src/js-lib/db/base/VisitorInterface.ts +6 -0
  186. package/src/js-lib/db/validator/FormulaValidator.ts +1235 -0
  187. package/src/js-lib/objects/BaseObject.ts +28 -0
  188. package/src/js-lib/objects/DateObject.ts +28 -0
  189. package/src/js-lib/objects/PctObject.ts +31 -0
  190. package/src/query-builder/PaginationBuilder.ts +19 -0
  191. package/src/query-builder/QueryBuilder.ts +1035 -0
  192. package/src/query-builder/SuperFilterBuilder.ts +628 -0
  193. package/src/runtime_var.ts +8 -0
  194. package/src/sql-lib/binary_expr.ts +16 -0
  195. package/src/sql-lib/case.ts +16 -0
  196. package/src/sql-lib/column.ts +18 -0
  197. package/src/sql-lib/else.ts +13 -0
  198. package/src/sql-lib/function.ts +9 -0
  199. package/src/sql-lib/join.ts +14 -0
  200. package/src/sql-lib/literal.ts +15 -0
  201. package/src/sql-lib/select.ts +154 -0
  202. package/src/sql-lib/unary_expr.ts +9 -0
  203. package/src/sql-lib/when.ts +15 -0
  204. package/src/sql-types.d.ts +565 -0
  205. package/src/sql_query_gen.ts +150 -0
  206. package/src/superFilter/DateFilterFactory.ts +180 -0
  207. package/src/superFilter/dateFunction.ts +36 -0
  208. package/src/utils.ts +354 -0
  209. package/test-output/report/junit.xml +329 -0
  210. package/tests/JsToSqlParser.test.ts +163 -0
  211. package/tests/QueryBuilder.test.ts +1320 -0
  212. package/tests/js-lib/CallExpressionVisitor.test.ts +820 -0
  213. package/tests/mocks/MockQueryResolver.ts +14 -0
  214. package/tests/sanity.test.ts +146 -0
  215. package/tests/sql-lib/binary_expr.test.ts +75 -0
  216. package/tests/sql-lib/case.test.ts +117 -0
  217. package/tests/sql-lib/column.test.ts +87 -0
  218. package/tests/sql-lib/else.test.ts +56 -0
  219. package/tests/sql-lib/function.test.ts +96 -0
  220. package/tests/sql-lib/literal.test.ts +75 -0
  221. package/tests/sql-lib/select.test.ts +245 -0
  222. package/tests/sql-lib/unary_expr.test.ts +32 -0
  223. package/tests/utils.test.ts +13 -0
  224. package/tsconfig.json +24 -0
  225. package/tsdown.config.ts +23 -0
@@ -0,0 +1,3118 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/query-builder/QueryBuilder.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/query-builder</a> QueryBuilder.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">79.75% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>319/400</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">68.51% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>198/289</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">72.72% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>40/55</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">80.46% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>313/389</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></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>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-yes">2x</span>
1079
+ <span class="cline-any cline-yes">2x</span>
1080
+ <span class="cline-any cline-yes">2x</span>
1081
+ <span class="cline-any cline-yes">2x</span>
1082
+ <span class="cline-any cline-yes">2x</span>
1083
+ <span class="cline-any cline-yes">2x</span>
1084
+ <span class="cline-any cline-yes">2x</span>
1085
+ <span class="cline-any cline-yes">2x</span>
1086
+ <span class="cline-any cline-yes">2x</span>
1087
+ <span class="cline-any cline-yes">2x</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-yes">2x</span>
1090
+ <span class="cline-any cline-yes">2x</span>
1091
+ <span class="cline-any cline-yes">2x</span>
1092
+ <span class="cline-any cline-yes">2x</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-yes">2x</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&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-yes">24x</span>
1109
+ <span class="cline-any cline-yes">24x</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-yes">16x</span>
1113
+ <span class="cline-any cline-yes">16x</span>
1114
+ <span class="cline-any cline-yes">16x</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-yes">8x</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-yes">8x</span>
1124
+ <span class="cline-any cline-yes">8x</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-yes">2x</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-neutral">&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-yes">25x</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-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-yes">25x</span>
1143
+ <span class="cline-any cline-yes">25x</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&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-neutral">&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-yes">25x</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-yes">25x</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-yes">24x</span>
1164
+ <span class="cline-any cline-yes">24x</span>
1165
+ <span class="cline-any cline-yes">24x</span>
1166
+ <span class="cline-any cline-yes">24x</span>
1167
+ <span class="cline-any cline-yes">24x</span>
1168
+ <span class="cline-any cline-yes">24x</span>
1169
+ <span class="cline-any cline-yes">24x</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-yes">24x</span>
1172
+ <span class="cline-any cline-yes">24x</span>
1173
+ <span class="cline-any cline-yes">24x</span>
1174
+ <span class="cline-any cline-yes">24x</span>
1175
+ <span class="cline-any cline-yes">24x</span>
1176
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-yes">25x</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-yes">24x</span>
1188
+ <span class="cline-any cline-yes">24x</span>
1189
+ <span class="cline-any cline-no">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">24x</span>
1191
+ <span class="cline-any cline-yes">40x</span>
1192
+ <span class="cline-any cline-yes">40x</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-no">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-yes">24x</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-yes">24x</span>
1202
+ <span class="cline-any cline-yes">4x</span>
1203
+ <span class="cline-any cline-yes">20x</span>
1204
+ <span class="cline-any cline-yes">20x</span>
1205
+ <span class="cline-any cline-yes">20x</span>
1206
+ <span class="cline-any cline-yes">21x</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-yes">18x</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-yes">3x</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-yes">20x</span>
1215
+ <span class="cline-any cline-yes">3x</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-yes">17x</span>
1218
+ <span class="cline-any cline-yes">17x</span>
1219
+ <span class="cline-any cline-yes">17x</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-yes">17x</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-yes">24x</span>
1225
+ <span class="cline-any cline-yes">24x</span>
1226
+ <span class="cline-any cline-yes">24x</span>
1227
+ <span class="cline-any cline-yes">24x</span>
1228
+ <span class="cline-any cline-yes">24x</span>
1229
+ <span class="cline-any cline-yes">24x</span>
1230
+ <span class="cline-any cline-yes">51x</span>
1231
+ <span class="cline-any cline-yes">51x</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-yes">24x</span>
1238
+ <span class="cline-any cline-yes">17x</span>
1239
+ <span class="cline-any cline-yes">18x</span>
1240
+ <span class="cline-any cline-yes">18x</span>
1241
+ <span class="cline-any cline-yes">18x</span>
1242
+ <span class="cline-any cline-yes">18x</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-yes">18x</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-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-yes">24x</span>
1252
+ <span class="cline-any cline-yes">24x</span>
1253
+ <span class="cline-any cline-yes">24x</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-yes">24x</span>
1261
+ <span class="cline-any cline-yes">24x</span>
1262
+ <span class="cline-any cline-yes">24x</span>
1263
+ <span class="cline-any cline-yes">24x</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-yes">24x</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-yes">1x</span>
1269
+ <span class="cline-any cline-yes">1x</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-yes">24x</span>
1272
+ <span class="cline-any cline-yes">24x</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-yes">24x</span>
1279
+ <span class="cline-any cline-yes">24x</span>
1280
+ <span class="cline-any cline-yes">9x</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-yes">24x</span>
1284
+ <span class="cline-any cline-yes">24x</span>
1285
+ <span class="cline-any cline-yes">10x</span>
1286
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-yes">24x</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&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-yes">63x</span>
1305
+ <span class="cline-any cline-yes">63x</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-neutral">&nbsp;</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-yes">63x</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-yes">63x</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&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-yes">63x</span>
1317
+ <span class="cline-any cline-yes">36x</span>
1318
+ <span class="cline-any cline-yes">36x</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-yes">36x</span>
1321
+ <span class="cline-any cline-yes">61x</span>
1322
+ <span class="cline-any cline-yes">61x</span>
1323
+ <span class="cline-any cline-yes">40x</span>
1324
+ <span class="cline-any cline-yes">8x</span>
1325
+ <span class="cline-any cline-yes">8x</span>
1326
+ <span class="cline-any cline-yes">8x</span>
1327
+ <span class="cline-any cline-yes">8x</span>
1328
+ <span class="cline-any cline-yes">8x</span>
1329
+ <span class="cline-any cline-neutral">&nbsp;</span>
1330
+ <span class="cline-any cline-neutral">&nbsp;</span>
1331
+ <span class="cline-any cline-neutral">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-yes">32x</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-yes">36x</span>
1341
+ <span class="cline-any cline-yes">8x</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-yes">36x</span>
1344
+ <span class="cline-any cline-yes">24x</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-yes">63x</span>
1348
+ <span class="cline-any cline-yes">32x</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-yes">32x</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-yes">63x</span>
1360
+ <span class="cline-any cline-yes">63x</span>
1361
+ <span class="cline-any cline-yes">63x</span>
1362
+ <span class="cline-any cline-yes">21x</span>
1363
+ <span class="cline-any cline-yes">21x</span>
1364
+ <span class="cline-any cline-neutral">&nbsp;</span>
1365
+ <span class="cline-any cline-yes">42x</span>
1366
+ <span class="cline-any cline-yes">15x</span>
1367
+ <span class="cline-any cline-neutral">&nbsp;</span>
1368
+ <span class="cline-any cline-yes">27x</span>
1369
+ <span class="cline-any cline-yes">27x</span>
1370
+ <span class="cline-any cline-yes">27x</span>
1371
+ <span class="cline-any cline-yes">27x</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-yes">15x</span>
1376
+ <span class="cline-any cline-yes">15x</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-neutral">&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-yes">63x</span>
1385
+ <span class="cline-any cline-yes">63x</span>
1386
+ <span class="cline-any cline-yes">19x</span>
1387
+ <span class="cline-any cline-yes">19x</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-yes">44x</span>
1391
+ <span class="cline-any cline-yes">16x</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-yes">28x</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-neutral">&nbsp;</span>
1397
+ <span class="cline-any cline-neutral">&nbsp;</span>
1398
+ <span class="cline-any cline-yes">28x</span>
1399
+ <span class="cline-any cline-yes">12x</span>
1400
+ <span class="cline-any cline-yes">12x</span>
1401
+ <span class="cline-any cline-neutral">&nbsp;</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-yes">16x</span>
1404
+ <span class="cline-any cline-yes">16x</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-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-yes">24x</span>
1416
+ <span class="cline-any cline-yes">24x</span>
1417
+ <span class="cline-any cline-yes">24x</span>
1418
+ <span class="cline-any cline-yes">24x</span>
1419
+ <span class="cline-any cline-yes">10x</span>
1420
+ <span class="cline-any cline-yes">10x</span>
1421
+ <span class="cline-any cline-yes">12x</span>
1422
+ <span class="cline-any cline-yes">12x</span>
1423
+ <span class="cline-any cline-yes">12x</span>
1424
+ <span class="cline-any cline-yes">12x</span>
1425
+ <span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-yes">4x</span>
1427
+ <span class="cline-any cline-yes">4x</span>
1428
+ <span class="cline-any cline-yes">1x</span>
1429
+ <span class="cline-any cline-yes">1x</span>
1430
+ <span class="cline-any cline-yes">1x</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-yes">4x</span>
1434
+ <span class="cline-any cline-yes">4x</span>
1435
+ <span class="cline-any cline-yes">4x</span>
1436
+ <span class="cline-any cline-yes">4x</span>
1437
+ <span class="cline-any cline-yes">4x</span>
1438
+ <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-yes">4x</span>
1440
+ <span class="cline-any cline-yes">4x</span>
1441
+ <span class="cline-any cline-yes">4x</span>
1442
+ <span class="cline-any cline-yes">1x</span>
1443
+ <span class="cline-any cline-yes">1x</span>
1444
+ <span class="cline-any cline-yes">1x</span>
1445
+ <span class="cline-any cline-yes">1x</span>
1446
+ <span class="cline-any cline-neutral">&nbsp;</span>
1447
+ <span class="cline-any cline-yes">4x</span>
1448
+ <span class="cline-any cline-neutral">&nbsp;</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-yes">8x</span>
1451
+ <span class="cline-any cline-neutral">&nbsp;</span>
1452
+ <span class="cline-any cline-neutral">&nbsp;</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-yes">10x</span>
1455
+ <span class="cline-any cline-yes">7x</span>
1456
+ <span class="cline-any cline-yes">7x</span>
1457
+ <span class="cline-any cline-yes">7x</span>
1458
+ <span class="cline-any cline-yes">7x</span>
1459
+ <span class="cline-any cline-yes">7x</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-yes">24x</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-yes">11x</span>
1467
+ <span class="cline-any cline-yes">11x</span>
1468
+ <span class="cline-any cline-yes">11x</span>
1469
+ <span class="cline-any cline-yes">8x</span>
1470
+ <span class="cline-any cline-yes">8x</span>
1471
+ <span class="cline-any cline-neutral">&nbsp;</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-yes">8x</span>
1474
+ <span class="cline-any cline-yes">8x</span>
1475
+ <span class="cline-any cline-yes">8x</span>
1476
+ <span class="cline-any cline-neutral">&nbsp;</span>
1477
+ <span class="cline-any cline-yes">8x</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
1479
+ <span class="cline-any cline-neutral">&nbsp;</span>
1480
+ <span class="cline-any cline-yes">8x</span>
1481
+ <span class="cline-any cline-yes">8x</span>
1482
+ <span class="cline-any cline-neutral">&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-yes">24x</span>
1486
+ <span class="cline-any cline-yes">24x</span>
1487
+ <span class="cline-any cline-yes">24x</span>
1488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1489
+ <span class="cline-any cline-yes">24x</span>
1490
+ <span class="cline-any cline-yes">24x</span>
1491
+ <span class="cline-any cline-yes">24x</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</span>
1493
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-yes">10x</span>
1495
+ <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-neutral">&nbsp;</span>
1497
+ <span class="cline-any cline-yes">10x</span>
1498
+ <span class="cline-any cline-yes">3x</span>
1499
+ <span class="cline-any cline-neutral">&nbsp;</span>
1500
+ <span class="cline-any cline-yes">10x</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-yes">10x</span>
1504
+ <span class="cline-any cline-neutral">&nbsp;</span>
1505
+ <span class="cline-any cline-neutral">&nbsp;</span>
1506
+ <span class="cline-any cline-neutral">&nbsp;</span>
1507
+ <span class="cline-any cline-neutral">&nbsp;</span>
1508
+ <span class="cline-any cline-yes">14x</span>
1509
+ <span class="cline-any cline-yes">14x</span>
1510
+ <span class="cline-any cline-yes">14x</span>
1511
+ <span class="cline-any cline-yes">8x</span>
1512
+ <span class="cline-any cline-yes">8x</span>
1513
+ <span class="cline-any cline-neutral">&nbsp;</span>
1514
+ <span class="cline-any cline-yes">14x</span>
1515
+ <span class="cline-any cline-yes">14x</span>
1516
+ <span class="cline-any cline-no">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-neutral">&nbsp;</span>
1519
+ <span class="cline-any cline-yes">14x</span>
1520
+ <span class="cline-any cline-yes">14x</span>
1521
+ <span class="cline-any cline-yes">5x</span>
1522
+ <span class="cline-any cline-yes">5x</span>
1523
+ <span class="cline-any cline-neutral">&nbsp;</span>
1524
+ <span class="cline-any cline-yes">7x</span>
1525
+ <span class="cline-any cline-yes">7x</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-yes">14x</span>
1531
+ <span class="cline-any cline-yes">6x</span>
1532
+ <span class="cline-any cline-yes">4x</span>
1533
+ <span class="cline-any cline-yes">4x</span>
1534
+ <span class="cline-any cline-yes">4x</span>
1535
+ <span class="cline-any cline-yes">4x</span>
1536
+ <span class="cline-any cline-yes">4x</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-yes">2x</span>
1540
+ <span class="cline-any cline-no">&nbsp;</span>
1541
+ <span class="cline-any cline-no">&nbsp;</span>
1542
+ <span class="cline-any cline-no">&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-yes">2x</span>
1546
+ <span class="cline-any cline-neutral">&nbsp;</span>
1547
+ <span class="cline-any cline-neutral">&nbsp;</span>
1548
+ <span class="cline-any cline-yes">14x</span>
1549
+ <span class="cline-any cline-yes">9x</span>
1550
+ <span class="cline-any cline-neutral">&nbsp;</span>
1551
+ <span class="cline-any cline-yes">14x</span>
1552
+ <span class="cline-any cline-yes">14x</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-yes">14x</span>
1556
+ <span class="cline-any cline-yes">14x</span>
1557
+ <span class="cline-any cline-yes">14x</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-yes">14x</span>
1565
+ <span class="cline-any cline-neutral">&nbsp;</span>
1566
+ <span class="cline-any cline-yes">14x</span>
1567
+ <span class="cline-any cline-yes">14x</span>
1568
+ <span class="cline-any cline-yes">14x</span>
1569
+ <span class="cline-any cline-yes">14x</span>
1570
+ <span class="cline-any cline-neutral">&nbsp;</span>
1571
+ <span class="cline-any cline-yes">14x</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-neutral">&nbsp;</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span>
1575
+ <span class="cline-any cline-neutral">&nbsp;</span>
1576
+ <span class="cline-any cline-neutral">&nbsp;</span>
1577
+ <span class="cline-any cline-yes">14x</span>
1578
+ <span class="cline-any cline-neutral">&nbsp;</span>
1579
+ <span class="cline-any cline-neutral">&nbsp;</span>
1580
+ <span class="cline-any cline-neutral">&nbsp;</span>
1581
+ <span class="cline-any cline-neutral">&nbsp;</span>
1582
+ <span class="cline-any cline-neutral">&nbsp;</span>
1583
+ <span class="cline-any cline-yes">3x</span>
1584
+ <span class="cline-any cline-yes">3x</span>
1585
+ <span class="cline-any cline-yes">3x</span>
1586
+ <span class="cline-any cline-yes">8x</span>
1587
+ <span class="cline-any cline-neutral">&nbsp;</span>
1588
+ <span class="cline-any cline-neutral">&nbsp;</span>
1589
+ <span class="cline-any cline-yes">3x</span>
1590
+ <span class="cline-any cline-neutral">&nbsp;</span>
1591
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
+ <span class="cline-any cline-yes">2x</span>
1593
+ <span class="cline-any cline-yes">1x</span>
1594
+ <span class="cline-any cline-yes">1x</span>
1595
+ <span class="cline-any cline-neutral">&nbsp;</span>
1596
+ <span class="cline-any cline-yes">1x</span>
1597
+ <span class="cline-any cline-yes">1x</span>
1598
+ <span class="cline-any cline-yes">1x</span>
1599
+ <span class="cline-any cline-yes">1x</span>
1600
+ <span class="cline-any cline-yes">1x</span>
1601
+ <span class="cline-any cline-neutral">&nbsp;</span>
1602
+ <span class="cline-any cline-neutral">&nbsp;</span>
1603
+ <span class="cline-any cline-yes">4x</span>
1604
+ <span class="cline-any cline-yes">4x</span>
1605
+ <span class="cline-any cline-yes">4x</span>
1606
+ <span class="cline-any cline-yes">4x</span>
1607
+ <span class="cline-any cline-yes">4x</span>
1608
+ <span class="cline-any cline-neutral">&nbsp;</span>
1609
+ <span class="cline-any cline-neutral">&nbsp;</span>
1610
+ <span class="cline-any cline-neutral">&nbsp;</span>
1611
+ <span class="cline-any cline-yes">6x</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-neutral">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-yes">39x</span>
1617
+ <span class="cline-any cline-yes">39x</span>
1618
+ <span class="cline-any cline-yes">39x</span>
1619
+ <span class="cline-any cline-yes">39x</span>
1620
+ <span class="cline-any cline-yes">8x</span>
1621
+ <span class="cline-any cline-neutral">&nbsp;</span>
1622
+ <span class="cline-any cline-yes">39x</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-no">&nbsp;</span>
1626
+ <span class="cline-any cline-neutral">&nbsp;</span>
1627
+ <span class="cline-any cline-neutral">&nbsp;</span>
1628
+ <span class="cline-any cline-yes">39x</span>
1629
+ <span class="cline-any cline-yes">2x</span>
1630
+ <span class="cline-any cline-yes">2x</span>
1631
+ <span class="cline-any cline-neutral">&nbsp;</span>
1632
+ <span class="cline-any cline-yes">39x</span>
1633
+ <span class="cline-any cline-yes">10x</span>
1634
+ <span class="cline-any cline-neutral">&nbsp;</span>
1635
+ <span class="cline-any cline-yes">39x</span>
1636
+ <span class="cline-any cline-yes">39x</span>
1637
+ <span class="cline-any cline-yes">6x</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-yes">39x</span>
1640
+ <span class="cline-any cline-yes">39x</span>
1641
+ <span class="cline-any cline-yes">6x</span>
1642
+ <span class="cline-any cline-neutral">&nbsp;</span>
1643
+ <span class="cline-any cline-yes">39x</span>
1644
+ <span class="cline-any cline-neutral">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1646
+ <span class="cline-any cline-neutral">&nbsp;</span>
1647
+ <span class="cline-any cline-neutral">&nbsp;</span>
1648
+ <span class="cline-any cline-neutral">&nbsp;</span>
1649
+ <span class="cline-any cline-neutral">&nbsp;</span>
1650
+ <span class="cline-any cline-yes">25x</span>
1651
+ <span class="cline-any cline-neutral">&nbsp;</span>
1652
+ <span class="cline-any cline-neutral">&nbsp;</span>
1653
+ <span class="cline-any cline-neutral">&nbsp;</span>
1654
+ <span class="cline-any cline-neutral">&nbsp;</span>
1655
+ <span class="cline-any cline-neutral">&nbsp;</span>
1656
+ <span class="cline-any cline-neutral">&nbsp;</span>
1657
+ <span class="cline-any cline-yes">25x</span>
1658
+ <span class="cline-any cline-yes">71x</span>
1659
+ <span class="cline-any cline-yes">71x</span>
1660
+ <span class="cline-any cline-neutral">&nbsp;</span>
1661
+ <span class="cline-any cline-neutral">&nbsp;</span>
1662
+ <span class="cline-any cline-yes">25x</span>
1663
+ <span class="cline-any cline-yes">25x</span>
1664
+ <span class="cline-any cline-yes">35x</span>
1665
+ <span class="cline-any cline-yes">35x</span>
1666
+ <span class="cline-any cline-yes">30x</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-yes">35x</span>
1669
+ <span class="cline-any cline-neutral">&nbsp;</span>
1670
+ <span class="cline-any cline-yes">25x</span>
1671
+ <span class="cline-any cline-neutral">&nbsp;</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-neutral">&nbsp;</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-yes">113x</span>
1678
+ <span class="cline-any cline-yes">113x</span>
1679
+ <span class="cline-any cline-yes">10x</span>
1680
+ <span class="cline-any cline-yes">10x</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-yes">10x</span>
1683
+ <span class="cline-any cline-neutral">&nbsp;</span>
1684
+ <span class="cline-any cline-yes">103x</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-neutral">&nbsp;</span>
1687
+ <span class="cline-any cline-yes">103x</span>
1688
+ <span class="cline-any cline-yes">103x</span>
1689
+ <span class="cline-any cline-yes">103x</span>
1690
+ <span class="cline-any cline-yes">103x</span>
1691
+ <span class="cline-any cline-yes">103x</span>
1692
+ <span class="cline-any cline-yes">103x</span>
1693
+ <span class="cline-any cline-yes">103x</span>
1694
+ <span class="cline-any cline-yes">68x</span>
1695
+ <span class="cline-any cline-yes">68x</span>
1696
+ <span class="cline-any cline-neutral">&nbsp;</span>
1697
+ <span class="cline-any cline-neutral">&nbsp;</span>
1698
+ <span class="cline-any cline-yes">35x</span>
1699
+ <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-neutral">&nbsp;</span>
1701
+ <span class="cline-any cline-yes">35x</span>
1702
+ <span class="cline-any cline-yes">35x</span>
1703
+ <span class="cline-any cline-yes">42x</span>
1704
+ <span class="cline-any cline-neutral">&nbsp;</span>
1705
+ <span class="cline-any cline-yes">35x</span>
1706
+ <span class="cline-any cline-yes">35x</span>
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-neutral">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-neutral">&nbsp;</span>
1712
+ <span class="cline-any cline-neutral">&nbsp;</span>
1713
+ <span class="cline-any cline-neutral">&nbsp;</span>
1714
+ <span class="cline-any cline-neutral">&nbsp;</span>
1715
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-no">&nbsp;</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-neutral">&nbsp;</span>
1725
+ <span class="cline-any cline-no">&nbsp;</span>
1726
+ <span class="cline-any cline-neutral">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-neutral">&nbsp;</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-no">&nbsp;</span>
1738
+ <span class="cline-any cline-no">&nbsp;</span>
1739
+ <span class="cline-any cline-no">&nbsp;</span>
1740
+ <span class="cline-any cline-no">&nbsp;</span>
1741
+ <span class="cline-any cline-no">&nbsp;</span>
1742
+ <span class="cline-any cline-no">&nbsp;</span>
1743
+ <span class="cline-any cline-no">&nbsp;</span>
1744
+ <span class="cline-any cline-no">&nbsp;</span>
1745
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-neutral">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-neutral">&nbsp;</span>
1749
+ <span class="cline-any cline-no">&nbsp;</span>
1750
+ <span class="cline-any cline-neutral">&nbsp;</span>
1751
+ <span class="cline-any cline-neutral">&nbsp;</span>
1752
+ <span class="cline-any cline-neutral">&nbsp;</span>
1753
+ <span class="cline-any cline-neutral">&nbsp;</span>
1754
+ <span class="cline-any cline-no">&nbsp;</span>
1755
+ <span class="cline-any cline-no">&nbsp;</span>
1756
+ <span class="cline-any cline-neutral">&nbsp;</span>
1757
+ <span class="cline-any cline-no">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1759
+ <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-no">&nbsp;</span>
1762
+ <span class="cline-any cline-no">&nbsp;</span>
1763
+ <span class="cline-any cline-neutral">&nbsp;</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-no">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-neutral">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-no">&nbsp;</span>
1773
+ <span class="cline-any cline-no">&nbsp;</span>
1774
+ <span class="cline-any cline-no">&nbsp;</span>
1775
+ <span class="cline-any cline-neutral">&nbsp;</span>
1776
+ <span class="cline-any cline-no">&nbsp;</span>
1777
+ <span class="cline-any cline-no">&nbsp;</span>
1778
+ <span class="cline-any cline-neutral">&nbsp;</span>
1779
+ <span class="cline-any cline-neutral">&nbsp;</span>
1780
+ <span class="cline-any cline-neutral">&nbsp;</span>
1781
+ <span class="cline-any cline-no">&nbsp;</span>
1782
+ <span class="cline-any cline-no">&nbsp;</span>
1783
+ <span class="cline-any cline-no">&nbsp;</span>
1784
+ <span class="cline-any cline-no">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-neutral">&nbsp;</span>
1790
+ <span class="cline-any cline-yes">24x</span>
1791
+ <span class="cline-any cline-yes">24x</span>
1792
+ <span class="cline-any cline-yes">24x</span>
1793
+ <span class="cline-any cline-neutral">&nbsp;</span>
1794
+ <span class="cline-any cline-no">&nbsp;</span>
1795
+ <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-no">&nbsp;</span>
1797
+ <span class="cline-any cline-no">&nbsp;</span>
1798
+ <span class="cline-any cline-no">&nbsp;</span>
1799
+ <span class="cline-any cline-no">&nbsp;</span>
1800
+ <span class="cline-any cline-no">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-no">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1805
+ <span class="cline-any cline-neutral">&nbsp;</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-no">&nbsp;</span>
1808
+ <span class="cline-any cline-neutral">&nbsp;</span>
1809
+ <span class="cline-any cline-neutral">&nbsp;</span>
1810
+ <span class="cline-any cline-yes">24x</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-yes">2x</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-neutral">&nbsp;</span>
1819
+ <span class="cline-any cline-neutral">&nbsp;</span>
1820
+ <span class="cline-any cline-neutral">&nbsp;</span>
1821
+ <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-neutral">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-neutral">&nbsp;</span>
1829
+ <span class="cline-any cline-neutral">&nbsp;</span>
1830
+ <span class="cline-any cline-neutral">&nbsp;</span>
1831
+ <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-neutral">&nbsp;</span>
1833
+ <span class="cline-any cline-neutral">&nbsp;</span>
1834
+ <span class="cline-any cline-neutral">&nbsp;</span>
1835
+ <span class="cline-any cline-neutral">&nbsp;</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-neutral">&nbsp;</span>
1839
+ <span class="cline-any cline-neutral">&nbsp;</span>
1840
+ <span class="cline-any cline-neutral">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-neutral">&nbsp;</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1849
+ <span class="cline-any cline-neutral">&nbsp;</span>
1850
+ <span class="cline-any cline-neutral">&nbsp;</span>
1851
+ <span class="cline-any cline-neutral">&nbsp;</span>
1852
+ <span class="cline-any cline-neutral">&nbsp;</span>
1853
+ <span class="cline-any cline-neutral">&nbsp;</span>
1854
+ <span class="cline-any cline-neutral">&nbsp;</span>
1855
+ <span class="cline-any cline-neutral">&nbsp;</span>
1856
+ <span class="cline-any cline-neutral">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-neutral">&nbsp;</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1862
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
+ <span class="cline-any cline-neutral">&nbsp;</span>
1864
+ <span class="cline-any cline-neutral">&nbsp;</span>
1865
+ <span class="cline-any cline-neutral">&nbsp;</span>
1866
+ <span class="cline-any cline-neutral">&nbsp;</span>
1867
+ <span class="cline-any cline-neutral">&nbsp;</span>
1868
+ <span class="cline-any cline-neutral">&nbsp;</span>
1869
+ <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-neutral">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</span>
1874
+ <span class="cline-any cline-neutral">&nbsp;</span>
1875
+ <span class="cline-any cline-neutral">&nbsp;</span>
1876
+ <span class="cline-any cline-neutral">&nbsp;</span>
1877
+ <span class="cline-any cline-neutral">&nbsp;</span>
1878
+ <span class="cline-any cline-neutral">&nbsp;</span>
1879
+ <span class="cline-any cline-neutral">&nbsp;</span>
1880
+ <span class="cline-any cline-neutral">&nbsp;</span>
1881
+ <span class="cline-any cline-neutral">&nbsp;</span>
1882
+ <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-neutral">&nbsp;</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-neutral">&nbsp;</span>
1887
+ <span class="cline-any cline-neutral">&nbsp;</span>
1888
+ <span class="cline-any cline-neutral">&nbsp;</span>
1889
+ <span class="cline-any cline-neutral">&nbsp;</span>
1890
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-neutral">&nbsp;</span>
1892
+ <span class="cline-any cline-neutral">&nbsp;</span>
1893
+ <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-neutral">&nbsp;</span>
1895
+ <span class="cline-any cline-neutral">&nbsp;</span>
1896
+ <span class="cline-any cline-neutral">&nbsp;</span>
1897
+ <span class="cline-any cline-neutral">&nbsp;</span>
1898
+ <span class="cline-any cline-neutral">&nbsp;</span>
1899
+ <span class="cline-any cline-neutral">&nbsp;</span>
1900
+ <span class="cline-any cline-neutral">&nbsp;</span>
1901
+ <span class="cline-any cline-neutral">&nbsp;</span>
1902
+ <span class="cline-any cline-neutral">&nbsp;</span>
1903
+ <span class="cline-any cline-neutral">&nbsp;</span>
1904
+ <span class="cline-any cline-neutral">&nbsp;</span>
1905
+ <span class="cline-any cline-neutral">&nbsp;</span>
1906
+ <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-neutral">&nbsp;</span>
1909
+ <span class="cline-any cline-neutral">&nbsp;</span>
1910
+ <span class="cline-any cline-neutral">&nbsp;</span>
1911
+ <span class="cline-any cline-neutral">&nbsp;</span>
1912
+ <span class="cline-any cline-neutral">&nbsp;</span>
1913
+ <span class="cline-any cline-neutral">&nbsp;</span>
1914
+ <span class="cline-any cline-neutral">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1919
+ <span class="cline-any cline-neutral">&nbsp;</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-neutral">&nbsp;</span>
1922
+ <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-neutral">&nbsp;</span>
1925
+ <span class="cline-any cline-neutral">&nbsp;</span>
1926
+ <span class="cline-any cline-neutral">&nbsp;</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-neutral">&nbsp;</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-neutral">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1935
+ <span class="cline-any cline-neutral">&nbsp;</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-neutral">&nbsp;</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</span>
1939
+ <span class="cline-any cline-neutral">&nbsp;</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-neutral">&nbsp;</span>
1943
+ <span class="cline-any cline-neutral">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-neutral">&nbsp;</span>
1950
+ <span class="cline-any cline-neutral">&nbsp;</span>
1951
+ <span class="cline-any cline-neutral">&nbsp;</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-neutral">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-neutral">&nbsp;</span>
1956
+ <span class="cline-any cline-neutral">&nbsp;</span>
1957
+ <span class="cline-any cline-neutral">&nbsp;</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-neutral">&nbsp;</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-neutral">&nbsp;</span>
1964
+ <span class="cline-any cline-neutral">&nbsp;</span>
1965
+ <span class="cline-any cline-neutral">&nbsp;</span>
1966
+ <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-neutral">&nbsp;</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-neutral">&nbsp;</span>
1970
+ <span class="cline-any cline-neutral">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-neutral">&nbsp;</span>
1973
+ <span class="cline-any cline-neutral">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-neutral">&nbsp;</span>
1976
+ <span class="cline-any cline-neutral">&nbsp;</span>
1977
+ <span class="cline-any cline-neutral">&nbsp;</span>
1978
+ <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-neutral">&nbsp;</span>
1982
+ <span class="cline-any cline-neutral">&nbsp;</span>
1983
+ <span class="cline-any cline-neutral">&nbsp;</span>
1984
+ <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-neutral">&nbsp;</span>
1986
+ <span class="cline-any cline-neutral">&nbsp;</span>
1987
+ <span class="cline-any cline-neutral">&nbsp;</span>
1988
+ <span class="cline-any cline-neutral">&nbsp;</span>
1989
+ <span class="cline-any cline-neutral">&nbsp;</span>
1990
+ <span class="cline-any cline-neutral">&nbsp;</span>
1991
+ <span class="cline-any cline-neutral">&nbsp;</span>
1992
+ <span class="cline-any cline-neutral">&nbsp;</span>
1993
+ <span class="cline-any cline-neutral">&nbsp;</span>
1994
+ <span class="cline-any cline-neutral">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1996
+ <span class="cline-any cline-neutral">&nbsp;</span>
1997
+ <span class="cline-any cline-neutral">&nbsp;</span>
1998
+ <span class="cline-any cline-neutral">&nbsp;</span>
1999
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
+ <span class="cline-any cline-neutral">&nbsp;</span>
2001
+ <span class="cline-any cline-neutral">&nbsp;</span>
2002
+ <span class="cline-any cline-neutral">&nbsp;</span>
2003
+ <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
2007
+ <span class="cline-any cline-neutral">&nbsp;</span>
2008
+ <span class="cline-any cline-neutral">&nbsp;</span>
2009
+ <span class="cline-any cline-neutral">&nbsp;</span>
2010
+ <span class="cline-any cline-neutral">&nbsp;</span>
2011
+ <span class="cline-any cline-neutral">&nbsp;</span>
2012
+ <span class="cline-any cline-neutral">&nbsp;</span>
2013
+ <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-neutral">&nbsp;</span>
2018
+ <span class="cline-any cline-neutral">&nbsp;</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-neutral">&nbsp;</span>
2024
+ <span class="cline-any cline-neutral">&nbsp;</span>
2025
+ <span class="cline-any cline-neutral">&nbsp;</span>
2026
+ <span class="cline-any cline-neutral">&nbsp;</span>
2027
+ <span class="cline-any cline-neutral">&nbsp;</span>
2028
+ <span class="cline-any cline-neutral">&nbsp;</span>
2029
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-neutral">&nbsp;</span>
2033
+ <span class="cline-any cline-neutral">&nbsp;</span>
2034
+ <span class="cline-any cline-neutral">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-neutral">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-neutral">&nbsp;</span>
2042
+ <span class="cline-any cline-neutral">&nbsp;</span>
2043
+ <span class="cline-any cline-neutral">&nbsp;</span>
2044
+ <span class="cline-any cline-neutral">&nbsp;</span>
2045
+ <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-neutral">&nbsp;</span>
2047
+ <span class="cline-any cline-neutral">&nbsp;</span>
2048
+ <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
2050
+ <span class="cline-any cline-neutral">&nbsp;</span>
2051
+ <span class="cline-any cline-neutral">&nbsp;</span>
2052
+ <span class="cline-any cline-neutral">&nbsp;</span>
2053
+ <span class="cline-any cline-neutral">&nbsp;</span>
2054
+ <span class="cline-any cline-neutral">&nbsp;</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
2058
+ <span class="cline-any cline-neutral">&nbsp;</span>
2059
+ <span class="cline-any cline-neutral">&nbsp;</span>
2060
+ <span class="cline-any cline-neutral">&nbsp;</span>
2061
+ <span class="cline-any cline-neutral">&nbsp;</span>
2062
+ <span class="cline-any cline-neutral">&nbsp;</span>
2063
+ <span class="cline-any cline-neutral">&nbsp;</span>
2064
+ <span class="cline-any cline-neutral">&nbsp;</span>
2065
+ <span class="cline-any cline-neutral">&nbsp;</span>
2066
+ <span class="cline-any cline-neutral">&nbsp;</span>
2067
+ <span class="cline-any cline-neutral">&nbsp;</span>
2068
+ <span class="cline-any cline-neutral">&nbsp;</span>
2069
+ <span class="cline-any cline-neutral">&nbsp;</span>
2070
+ <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-neutral">&nbsp;</span>
2072
+ <span class="cline-any cline-neutral">&nbsp;</span>
2073
+ <span class="cline-any cline-neutral">&nbsp;</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
2075
+ <span class="cline-any cline-neutral">&nbsp;</span>
2076
+ <span class="cline-any cline-neutral">&nbsp;</span>
2077
+ <span class="cline-any cline-neutral">&nbsp;</span>
2078
+ <span class="cline-any cline-neutral">&nbsp;</span>
2079
+ <span class="cline-any cline-neutral">&nbsp;</span>
2080
+ <span class="cline-any cline-neutral">&nbsp;</span>
2081
+ <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-neutral">&nbsp;</span>
2083
+ <span class="cline-any cline-neutral">&nbsp;</span>
2084
+ <span class="cline-any cline-neutral">&nbsp;</span>
2085
+ <span class="cline-any cline-neutral">&nbsp;</span>
2086
+ <span class="cline-any cline-neutral">&nbsp;</span>
2087
+ <span class="cline-any cline-neutral">&nbsp;</span>
2088
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
2089
+ IMDMColumnConfigWithParsedMeta,
2090
+ MDM_COLUMN_TYPE,
2091
+ ResolvedExpressionType,
2092
+ CteExpression,
2093
+ } from '../js-lib/ParseContext';
2094
+ import {
2095
+ FilterConfig,
2096
+ JoinExpressions,
2097
+ Rule,
2098
+ RuleGroup,
2099
+ ISuperFilterConfig,
2100
+ IGroupFilter,
2101
+ IManualFilterConfig,
2102
+ } from '../filters/filter-types';
2103
+ import { RUNTIME_TABLE_NAME } from '../runtime_var';
2104
+ import { PaginationBuilder, createPaginationBuilder } from './PaginationBuilder';
2105
+ import { From, RawSqlExpression, Select } from '../sql-types';
2106
+ import { SelectBuilder } from '../sql-lib/select';
2107
+ import { toColumn } from '../sql-lib/column';
2108
+ import { processSelect } from '../sql_query_gen';
2109
+ import {
2110
+ getCurrentDate,
2111
+ getCurrentDateTime,
2112
+ getEntityNameFormatter,
2113
+ getFormattedTableName,
2114
+ getJoinExpressions,
2115
+ resolveRuntimeVariables,
2116
+ stripWhereClause,
2117
+ } from '../utils';
2118
+ import { SuperFilterBuilder } from './SuperFilterBuilder';
2119
+ &nbsp;
2120
+ export type SortConfig = { column: string; order: 'ASC' | 'DESC' }[];
2121
+ &nbsp;
2122
+ export type PaginationConfig = { skip: number; take: number };
2123
+ &nbsp;
2124
+ export type FilterResolverParams = {
2125
+ filterConfig: FilterConfig;
2126
+ schema?: IColumnSchemaItem[];
2127
+ };
2128
+ &nbsp;
2129
+ export interface QueryResolver {
2130
+ filterResolver(params: FilterResolverParams): string;
2131
+ }
2132
+ &nbsp;
2133
+ export type RuntimeVariables = {
2134
+ $RUNTIME_LOGGEDIN_NAME: string;
2135
+ $RUNTIME_LOGGEDIN_EMAIL: string;
2136
+ $RUNTIME_CURRENT_DATE?: string;
2137
+ $RUNTIME_CURRENT_DATETIME?: string;
2138
+ };
2139
+ &nbsp;
2140
+ export type QueryBuilderOptions = {
2141
+ selectedColumns: string[];
2142
+ databaseDetails: Record&lt;string, any&gt;;
2143
+ primaryKeyColumns: string[];
2144
+ filterConfig?: FilterConfig;
2145
+ pagination?: PaginationConfig;
2146
+ sortConfig?: SortConfig;
2147
+ searchExpression?: string;
2148
+ distinct?: boolean;
2149
+ columnConfigMap: Record&lt;string, IMDMColumnConfigWithParsedMeta&gt;;
2150
+ queryResolver: QueryResolver; // instance of BaseDB in database-service-link
2151
+ runtimeVariables: RuntimeVariables;
2152
+ schema?: IColumnSchemaItem[];
2153
+ includeFinalCTESelectQuery?: boolean;
2154
+ finalResponseAsObject?: boolean;
2155
+ superFilters?: ISuperFilterConfig;
2156
+ skipCountForRankingFilter?: boolean;<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2157
+ joinClauses?: JoinExpressions;
2158
+ manualFilterOptions?: IManualFilterConfig[];
2159
+ };
2160
+ &nbsp;
2161
+ type BuildState = {
2162
+ pendingFilterConfig: FilterConfig;
2163
+ pendingSortConfig: SortConfig;
2164
+ isSortPending: boolean;
2165
+ isPaginationPending: boolean;
2166
+ isSearchPending: boolean;
2167
+ hasFormulaColumns: boolean;
2168
+ isSuperFilterPending: boolean;
2169
+ };
2170
+ &nbsp;
2171
+ type BuildOptions = Partial&lt;Omit&lt;QueryBuilderOptions, 'tableName' | 'queryResolver' | 'schema'&gt;&gt;;
2172
+ &nbsp;
2173
+ type MainCteExpression = {
2174
+ type: ResolvedExpressionType.CTE;
2175
+ cteName: string;
2176
+ value: Select;
2177
+ };
2178
+ &nbsp;
2179
+ export type FinalQueryResult = {
2180
+ finalQuery: string;
2181
+ finalCteName?: string; // For group by feat need to pass cte name
2182
+ };<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2183
+ &nbsp;
2184
+ type CalculationOrderResult = {
2185
+ nativeColumns: Set&lt;string&gt;;
2186
+ formulaColumnsByDependencyLevel: IMDMColumnConfigWithParsedMeta[][];
2187
+ };
2188
+ &nbsp;
2189
+ export enum DEFAULT_VALUE_TYPE {
2190
+ MANUAL = 'MANUAL',
2191
+ DERIVED = 'DERIVED',
2192
+ NONE = 'NONE',
2193
+ }
2194
+ &nbsp;
2195
+ type IColumnSchemaItem = {
2196
+ name: string;
2197
+ type: string;
2198
+ defaultValue?: string | number;
2199
+ isNull<span class="missing-if-branch" title="if path not taken" >I</span>able?: boolean;
2200
+ isIdentity<span class="cstat-no" title="statement not covered" >?: boole</span>an;
2201
+ };
2202
+ &nbsp;
2203
+ export const MAX_STRING_TYPE = 'nvarchar(max)';
2204
+ &nbsp;
2205
+ /**<span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span></span>
2206
+ * Steps:<span class="cstat-no" title="statement not covered" ></span>
2207
+ * 1. Separate out filters for native columns and formula columns
2208
+ * 2. Apply filters for native columns in the main CTE. If Native columns have sorting config then -
2209
+ * - If SortConfig exists for Formula columns with cte, do not apply sorting
2210
+ * - If SortConfig exists for Formula columns without cte, apply sorting
2211
+ * - If SortConfig does not exist for Formula columns, apply sorting
2212
+ * 3. Apply filters for formula columns in the CTE followed by the column specific CTEs due to alias not supported in where clause
2213
+ * 4. Apply SortConfig and pagination in the CTE with last filter
2214
+ * 5. Perform final projection and apply SortConfig and Pagination, if still exists
2215
+ */
2216
+ export class QueryBuilder {
2217
+ private readonly paginationBuilder: PaginationBuilder;
2218
+ private readonly options: QueryBuilderOptions;
2219
+ &nbsp;
2220
+ constructor(options: QueryBuilderOptions) {
2221
+ this.options = options;
2222
+ this.paginationBuilder = createPaginationBuilder();
2223
+ }
2224
+ &nbsp;
2225
+ build(options: BuildOptions = {}): FinalQueryResult {
2226
+ const combinedOptions = { ...this.options, ...options };
2227
+ const impl = new QueryBuilderImpl(combinedOptions, this.paginationBuilder);
2228
+ return impl.build();
2229
+ }<span class="missing-if-branch" title="else path not taken" >E</span>
2230
+ &nbsp;
2231
+ buildCountQuery(options: BuildOptions = {}): FinalQueryResult {
2232
+ const combinedOptions = {
2233
+ ...this.options,
2234
+ ...options,
2235
+ sortConfig: undefined, // not required for count query
2236
+ pagination: undefined, // not required for count query
2237
+ };
2238
+ const impl = new QueryBuilderImpl(combinedOptions, this.paginationBuilder);
2239
+ return impl.build(true);<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2240
+ }
2241
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2242
+ &nbsp;
2243
+ /**
2244
+ * Implementation class for QueryBuilder
2245
+ *
2246
+ * @private exposed for testing
2247
+ */
2248
+ export class QueryBuilderImpl {
2249
+ private readonly paginationBuilder: PaginationBuilder;
2250
+ private readonly options: QueryBuilderOptions;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2251
+ private buildState: BuildState;
2252
+ private readon<span class="missing-if-branch" title="else path not taken" >E</span>ly entityNameFormatter: (name: string, type?: string) =&gt; string;
2253
+ &nbsp;
2254
+ constructor(options: QueryBuilderOptions, paginationBuilder: PaginationBuilder) {
2255
+ this.options = {
2256
+ ...options,
2257
+ searchExpression: options.searchExpression<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2258
+ ? stripWhereClause(options.searchExpression)
2259
+ : undefined,
2260
+ sortConfig: this.getRelevantSortConfig(options.sortConfig, new Set(options.selectedColumns)),
2261
+ };
2262
+ this.paginationBuilder = paginationBuilder;
2263
+ this.buildState = {
2264
+ pendingFilterConfig: {
2265
+ ...(options.filterConfig ?? { combinator: 'and', not: false }),
2266
+ rules: [],
2267
+ },<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2268
+ hasFormulaColumns: false,
2269
+ pendingSortConfig: [],
2270
+ isSortPending: true,
2271
+ isPaginationPending: true,
2272
+ isSearchPending: options.searchExpression !== undefined,
2273
+ is<span class="missing-if-branch" title="else path not taken" >E</span>SuperFilterPending: options.superFilters !== undefined,
2274
+ };
2275
+ this.entityNameFormatter = getEntityNameFormatter();
2276
+ // Set runtime variables with current date/time values
2277
+ Object.assign(this.options.runtimeVariables, {
2278
+ $RUNTIME_CURRENT_DATE: getCurrentDate(),
2279
+ $RUNTIME_CURRENT_DATETIME: getCurrentDateTime(),
2280
+ });
2281
+ }
2282
+ <span class="missing-if-branch" title="else path not taken" >E</span>
2283
+ build(isCountQuery = false): FinalQueryResult {
2284
+ const { joinClauses, superFilters } = this.options;
2285
+ const { joinRelation = [] } = joinClauses || {};
2286
+ const requiredColumns = this.filterRequiredColumns();
2287
+ this.addColumnsFromFilterConfig(requiredColumns);
2288
+ const { nativeColumns, formulaColumnsByDependencyLevel } =
2289
+ this.getCalculationOrder(requiredColumns);
2290
+ this.buildState.hasFormulaColumns = formulaColumnsByDependencyLevel.length &gt; 0;
2291
+ this.buildState.isSuperFilterPending = superFilters !== undefined;
2292
+ &nbsp;
2293
+ // build main CTE and intermediate CTE for formula columns join relation
2294
+ const mainCteFormulas = joinRelation.length &gt; 0 ? [] : formulaColumnsByDependencyLevel;
2295
+ const columnExprs = this.retrieveColumnExprsInFront(mainCteFormulas);
2296
+ const mainCTE = this.buildMainCTE(nativeColumns, columnExprs);
2297
+ const intermediateCTE = this.buildIntermediateCTE(
2298
+ mainCTE.cteName,
2299
+ formulaColumnsByDependencyLevel,
2300
+ );
2301
+ return this.buildFinalProjection(mainCTE, intermediateCTE, isCountQuery);
2302
+ }
2303
+ &nbsp;
2304
+ /**
2305
+ * Returns the sort config with only the columns that are part of the requested columns
2306
+ */
2307
+ private getRelevantSortConfig(
2308
+ sortConfig: SortConfig | undefined,
2309
+ requestedColumns: Set&lt;string&gt;,
2310
+ ): SortConfig | undefined {
2311
+ return sortConfig?.filter((s) =&gt; requestedColumns.has(s.column));
2312
+ }
2313
+ &nbsp;
2314
+ /**
2315
+ * Adds columns used in the filter config to the set of all columns
2316
+ */<span class="missing-if-branch" title="if path not taken" >I</span>
2317
+ private ad<span class="cstat-no" title="statement not covered" >dColumns</span>FromFilterConfig(requiredColumns: Set&lt;string&gt;): void {
2318
+ const { filterConfig } = this.options;
2319
+ &nbsp;
2320
+ if (!filterConfig) return;
2321
+ &nbsp;
2322
+ const traverse = (rule: Rule | RuleGroup) =&gt; {
2323
+ if ('column' in rule) {
2324
+ requiredColumns.add(rule.column);
2325
+ } else if ('rules' in rule) {
2326
+ rule.rules.forEach(traverse);
2327
+ }
2328
+ };
2329
+ filterConfig.rules.forEach(traverse);
2330
+ }
2331
+ &nbsp;
2332
+ private retrieveColumnExprsInFront(<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2333
+ calcOrderMembers: IMDMColumnConfigWithParsedMeta[][],
2334
+ ): IMDMColumnConfigWithParsedMeta[] {
2335
+ if (calcOrderMembers.length === 0) return [];
2336
+ &nbsp;
2337
+ let lastColumnExprIndex = -1;<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2338
+ const firstCalcOrder<span class="missing-if-branch" title="else path not taken" >E</span>Members = calcOrderMembers[0];
2339
+ for (let i = 0; i &lt; firstCalcOrderMembers.length; i++) {
2340
+ if (
2341
+ firstCalcOrderMembers[i].columnMeta.sqlQueryProps?.resolvedExpression.type ===
2342
+ ResolvedExpressionType.COLUMN
2343
+ ) {
2344
+ lastColumnExprIndex = i;
2345
+ } else {
2346
+ break;
2347
+ }
2348
+ }
2349
+ &nbsp;
2350
+ if (lastColumnExprIndex === -1) {
2351
+ return [];
2352
+ }
2353
+ &nbsp;
2354
+ const columnExprsInFront = firstCalcOrderMembers.splice(0, lastColumnExprIndex + 1);
2355
+ if (firstCalcOrderMembers.length === 0) {
2356
+ calcOrderMembers.shift();
2357
+ }
2358
+ return columnExprsInFront;
2359
+ }
2360
+ &nbsp;
2361
+ private buildMainCTE(
2362
+ nativeColumns: Set&lt;string&gt;,
2363
+ columnExprs: IMDMColumnConfigWithParsedMeta[],
2364
+ ): MainCteExpression {
2365
+ const columnsInMainCTE = new Set([...nativeColumns, ...columnExprs.map((c) =&gt; c.columnName)]);
2366
+ const selectBuilder = new SelectBuilder();
2367
+ const { joinClauses } = this.options;
2368
+ const { alias } = joinClauses || {};
2369
+ const tableAlias = alias ? `${this.entityNameFormatter(alias)}.` : '';
2370
+ &nbsp;
2371
+ const columns = Array.from(nativeColumns).map((c) =&gt; {
2372
+ const schemaMatch = this.options.schema?.find((s) =&gt; s.name === c);
2373
+ return toColumn({
2374
+ type: 'sql_expr',
2375
+ value: `${tableAlias}` + this.entityNameFormatter(c, schemaMatch?.type ?? ''),
2376
+ meta: { rawColumnName: c },
2377
+ });
2378
+ });
2379
+ &nbsp;
2380
+ if (columnExprs.length) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2381
+ columnExprs.forEach((c) =&gt; {
2382
+ const schemaMatch = this.options.schema?.find((s) =&gt; s.name === c.columnName);
2383
+ let resolvedExpressionValue =
2384
+ c.columnMeta.sqlQueryProps?.resolvedExpression?.value?.join(', ');
2385
+ if (resolvedExpressionValue) {
2386
+ resolvedExpressionValue = resolveRuntimeVariables(
2387
+ resolvedExpressionValue,<span class="branch-1 cbranch-no" title="branch not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
2388
+ this.options.runtimeVariables,
2389
+ );
2390
+ }
2391
+ columns.push(
2392
+ toColumn(
2393
+ {
2394
+ type: 'sql_expr',
2395
+ value: resolvedExpressionValue ?? '',
2396
+ meta: { rawColumnName: c.columnName },
2397
+ },
2398
+ this.entityNameFormatter(c.columnName, schemaMatch?.type ?? ''),
2399
+ ),
2400
+ );
2401
+ });
2402
+ }
2403
+ &nbsp;
2404
+ const formattedTableName = getFormattedTableName(this.options.databaseDetails);
2405
+ sele<span class="missing-if-branch" title="if path not taken" >I</span>ctBuilder.addColumns(columns);
2406
+ selectBu<span class="cstat-no" title="statement not covered" >ilder.addFrom([</span>
2407
+ {
2408
+ type: 'from',
2409
+ table: `${formattedTableName}${alias ? ` AS ${this.entityNameFormatter(alias)}` : ''}`,
2410
+ } as From,
2411
+ ]);
2412
+ &nbsp;
2413
+ // Build filter condition
2414
+ const where = [];
2415
+ const filterCondition = this.getFilterExpression(columnsInMainCTE);
2416
+ if (filterCondition) {
2417
+ where.push(filterCondition);
2418
+ }
2419
+ &nbsp;
2420
+ if (
2421
+ this.buildState.isSearchPending &amp;&amp;
2422
+ this.buildState.isSuperFilterPending === false &amp;&amp;
2423
+ this.buildState.hasFormulaColumns === false
2424
+ ) {
2425
+ this.buildState.isSearchPending = false;
2426
+ where.push(this.options.searchExpression);
2427
+ }
2428
+ if (where.length) {
2429
+ selectBuilder.addWhere({
2430
+ type: 'sql_expr',
2431
+ value: where.join(' AND '),
2432
+ } as RawSqlExpression);
2433
+ }
2434
+ &nbsp;
2435
+ // Build sort expression
2436
+ const sortExpression = this.getSortExpression(columnsInMainCTE);
2437
+ if (sortExpression) {
2438
+ selectBuilder.addOrderby([{ type: 'sql_expr', value: sortExpression } as RawSqlExpression]);
2439
+ }
2440
+ &nbsp;
2441
+ // Build pagination expression
2442
+ const paginationExpression = this.getPaginationExpression();
2443
+ if (paginationExpression) {
2444
+ selectBuilder.addLimit({
2445
+ type: 'sql_expr',
2446
+ value: paginationExpression,
2447
+ } as RawSqlExp<span class="missing-if-branch" title="else path not taken" >E</span>ression);
2448
+ }
2449
+ &nbsp;
2450
+ return {
2451
+ type: ResolvedExpressionType.CTE,
2452
+ cteName: 'cte_main',
2453
+ value: selectBuilder.build(),
2454
+ };<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2455
+ }
2456
+ &nbsp;
2457
+ /**
2458
+ * Returns the filter expression for the selected columns. If column type is formula,
2459
+ * stores the rules in pending filter config and process it in the next call to getFilterExpression
2460
+ * else processes immediately.
2461
+ *
2462
+ * Note - Pass empty set to process any pending filter config
2463
+ */
2464
+ private getFilterExpression(columns: Set&lt;string&gt;): string | undefined {
2465
+ const { filterConfig, columnConfigMap, queryResolver, databaseDetails } = this.options;
2466
+ if (!filterConfig) {
2467
+ return;
2468
+ }<span class="missing-if-branch" title="else path not taken" >E</span>
2469
+ &nbsp;
2470
+ // extract pending filter config
2471
+ const filterConfigToProcess = this.buildState.pendingFilterConfig;
2472
+ &nbsp;
2473
+ // Reset pending filter config
2474
+ this.buildState.pendingFilterConfig = {
2475
+ rules: [],
2476
+ combinator: filterConfig.combinator,
2477
+ not: filterConfig.not,
2478
+ };
2479
+ &nbsp;
2480
+ if (columns.size) {
2481
+ const nativeColumnRules: (Rule | RuleGroup)[] = [];
2482
+ const formulaColumnRules: (Rule | RuleGroup)[] = [];
2483
+ // Get rules for selected columns from original filter config
2484
+ filterConfig.rules.forEach((rule) =&gt; {
2485
+ const column<span class="missing-if-branch" title="else path not taken" >E</span>Name = (rule as Rule).column ?? (rule as RuleGroup).rules[0].column;
2486
+ if (columns.has(columnName)) {
2487
+ if (columnConfigMap[columnName].columnType === MDM_COLUMN_TYPE.FORMULA) {
2488
+ formulaColumnRules.push(rule);
2489
+ &nbsp;
2490
+ const schema = this.options.schema ?? [];
2491
+ const exists = schema.some((col) =&gt; col.name === columnName);
2492
+ if (!exists) {
2493
+ schema.push({
2494
+ name: columnName,
2495
+ type: MAX_STRING_TYPE,<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2496
+ });
2497
+ }
2498
+ } else {<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2499
+ nativeColumnRules.push(rule);
2500
+ }<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2501
+ }
2502
+ });
2503
+ &nbsp;
2504
+ // if column type is formula, store the rules in pending filter config else process immediately
2505
+ if (fo<span class="missing-if-branch" title="if path not taken" >I</span>rmulaColumnRules.length) {
2506
+ this.bui<span class="cstat-no" title="statement not covered" >ldState.pendingFilterConfig.rules = formulaColumnRules;</span>
2507
+ }
2508
+ if (nativeColumnRules.length) {
2509
+ filterConfigToProcess.rules = filterConfigToProcess.rules.concat(nativeColumnRules);
2510
+ }
2511
+ }
2512
+ &nbsp;
2513
+ if (filterConfigToProcess.rules.length) {
2514
+ const resolvedFilterQuery = queryResolver.filterResolver({
2515
+ filterConfig: filterConfigToProcess,
2516
+ schema: this.options.schema,
2517
+ });
2518
+ return stripWhereClause(resolvedFilterQuery);
2519
+ }
2520
+ }
2521
+ &nbsp;
2522
+ /**
2523
+ * Returns the sort expression if each column in the sort config is part of selected columns
2524
+ */
2525
+ private getSortExpression(columns: Set&lt;string&gt;): string | undefined {
2526
+ const { <span class="missing-if-branch" title="if path not taken" >I</span>sortConfig, joinClauses } = this.options;
2527
+ const { alias } = joinClauses<span class="cstat-no" title="statement not covered" > || {};</span>
2528
+ if (!sortCon<span class="cstat-no" title="statement not covered" >fig || sortConfig.length === 0) {</span>
2529
+ this.buildState.isSortPending = false;
2530
+ return;
2531
+ }
2532
+ <span class="branch-0 cbranch-no" title="branch not covered" ></span>
2533
+ if (this.buildState.isSortPending === false) {
2534
+ return;
2535
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2536
+ <span class="branch-0 cbranch-no" title="branch not covered" ></span>
2537
+ const selectedSortColumns = sortConfig.filter((s) =&gt; columns.has(s.column));
2538
+ this.buildState.pendingSortConfig = (this.buildState.pendingSortConfig ?? []).concat(
2539
+ selectedSortColumns,
2540
+ );
2541
+ &nbsp;
2542
+ const hasPendingFilters = this.buildState.pendingFilterConfig.rules.length &gt; 0;
2543
+ if (
2544
+ this.buildState.pendingSortConfig.length === sortConfig.length &amp;&amp;
2545
+ !hasPendingFilters &amp;&amp;
2546
+ !this.buildState.isSearchPending &amp;&amp;
2547
+ !this.buildState.isSuperFilterPending
2548
+ ) {
2549
+ this.buildState.isSortPending = false;
2550
+ return `${sort<span class="missing-if-branch" title="if path not taken" >I</span>Config.map((s) =&gt; `${alias &amp;&amp; !this.buildState.isSuperFilterPending ? `${this.entityNameFormatter(alias)}.` : ''}${this.entityNameFormatter(s.column)} ${s.order}`).join(', ')}`;
2551
+ }<span class="cstat-no" title="statement not covered" ></span>
2552
+ }<span class="cstat-no" title="statement not covered" ></span>
2553
+ <span class="cstat-no" title="statement not covered" ></span>
2554
+ /**
2555
+ * Returns the pagination expression if the pagination config is set and sort is not pending.
2556
+ * It must be called after getSortExpression.
2557
+ */
2558
+ private getPaginationExpression(): string | undefined {
2559
+ const { pagination } = this.options;
2560
+ if (!pagination) {<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2561
+ this.buildState.isPaginationPending = false;
2562
+ return;<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2563
+ }<span class="missing-if-branch" title="if path not taken" >I</span>
2564
+ <span class="cstat-no" title="statement not covered" ></span>
2565
+ // If pagination is already processed, return
2566
+ if (this.buildState.isPaginationPending === false) {
2567
+ return;
2568
+ }<span class="missing-if-branch" title="if path not taken" >I</span>
2569
+ <span class="cstat-no" title="statement not covered" ></span>
2570
+ // If sort i<span class="cstat-no" title="statement not covered" >s not processed, throw error</span>
2571
+ if (this.bui<span class="cstat-no" title="statement not covered" >ldState.pendingSortConfig === </span>undefined) {
2572
+ throw new <span class="cstat-no" title="statement not covered" >Error('getSortExpression() mus</span>t be called before getPaginationExpression()');
2573
+ }
2574
+ &nbsp;
2575
+ // If sort is not complete, return
2576
+ if (this.buildState.isSortPending || this.buildState.isSearchPending) {
2577
+ this.buildState.isPaginationPending = true;
2578
+ return;
2579
+ }<span class="missing-if-branch" title="else path not taken" >E</span>
2580
+ &nbsp;
2581
+ // If pagination can be completed, return
2582
+ this.bui<span class="missing-if-branch" title="if path not taken" >I</span>ldState.isPaginationPending = false;
2583
+ return this.<span class="cstat-no" title="statement not covered" >paginationBuilder.generateQuery(pagination.skip, pagination.take);</span>
2584
+ }
2585
+ &nbsp;
2586
+ /**
2587
+ * Builds the intermediate CTEs for the formula columns
2588
+ * 1. Replace table name with previous cte name
2589
+ * 2. Apply filter condition
2590
+ * 3. Apply sort expression, if applicable
2591
+ * 4. Apply pagination, if applicable
2592
+ * 5. Return CTEs/Column expressions
2593
+ */
2594
+ private buildIntermediateCTE(
2595
+ prev<span class="missing-if-branch" title="else path not taken" >E</span>iousCTEName: string,
2596
+ formulaColumnsInCalcOrder: IMDMColumnConfigWithParsedMeta[][],
2597
+ ): CteExpression {
2598
+ let parentCTEName = previousCTEName;
2599
+ const tableNameRegex = new RegExp(`\\${RUNTIME_TABLE_NAME}`, 'g');
2600
+ &nbsp;
2601
+ const cteParts: string[] = [];
2602
+ formulaColumnsInCalcOrder.forEach((stageMembers) =&gt; {
2603
+ const pendingColumns: IMDMColumnConfigWithParsedMeta[] = [];
2604
+ &nbsp;
2605
+ stageMembers.forEach((column) =&gt; {
2606
+ const {
2607
+ columnName,<span class="branch-1 cbranch-no" title="branch not covered" ></span>
2608
+ columnMeta: { sqlQueryProps },
2609
+ } = column;
2610
+ const isCteExpression =
2611
+ sqlQueryProps?.resolvedExpression?.type === ResolvedExpressionType.CTE;
2612
+ const intermediateParts = [];
2613
+ &nbsp;
2614
+ if (isCteExpression) {
2615
+ // add staging cte to process any pending filters, sort, pagination
2616
+ const stagingCte = this.addStagingCTE(parentCTEName, pendingColumns);
2617
+ if (stagingCte) {<span class="branch-0 cbranch-no" title="branch not covered" ></span>
2618
+ pendingColumns.length = 0;
2619
+ parentCTEName = stagingCte!.cteName;
2620
+ intermediateParts.push(stagingCte.expr);
2621
+ }
2622
+ <span class="branch-0 cbranch-no" title="branch not covered" ></span>
2623
+ // process current column cte
2624
+ const sqlParts = this.buildSqlQueryParts([columnName]);
2625
+ const expr = sqlQueryProps.resolvedExpression as CteExpression;
2626
+ let resolvedCte = expr.value.join(', ').replace(tableNameRegex, parentCTEName);
2627
+ if (resolvedCte) {
2628
+ resolvedCte = resolveRuntimeVariables(resolvedCte, this.options.runtimeVariables);
2629
+ }
2630
+ parentCTEName = expr.cteName;
2631
+ intermediateParts.push(resolvedCte);
2632
+ if (sqlParts.length) {
2633
+ <span class="missing-if-branch" title="if path not taken" >I</span> const cteName = `cte_post_${parentCTEName}`;
2634
+ const postCte = `${cteName} A<span class="cstat-no" title="statement not covered" >S (SELECT * FROM ${parentCTEName}${sqlParts.lengt</span>h ? ' ' + sqlParts.join(' ') : ''})`;
2635
+ <span class="cstat-no" title="statement not covered" > intermediateParts.push(postCte);</span>
2636
+ pare<span class="cstat-no" title="statement not covered" >ntCTEName = cteName;</span>
2637
+ }
2638
+ cteParts.push(intermediateParts.join(', '));
2639
+ } else {
2640
+ pendingColumns.push(column);
2641
+ }
2642
+ });
2643
+ &nbsp;
2644
+ // add staging cte if there are pending columns at the end of stage.
2645
+ if (pendingColumns.length) {
2646
+ const stagingCte = this.addStagingCTE(parentCTEName, pendingColumns);
2647
+ pendingColumns.length = 0;
2648
+ if (stagingCte) {
2649
+ cteParts.push(stagingCte.expr);
2650
+ parentCTEName = stagingCte.cteName;
2651
+ }
2652
+ }
2653
+ });
2654
+ &nbsp;
2655
+ return { type: ResolvedExpressionType.CTE, cteName: parentCTEName, value: cteParts };
2656
+ }
2657
+ &nbsp;
2658
+ private addStagingCTE(
2659
+ parentCTEName: string,
2660
+ columnConfigs: IMDMColumnConfigWithParsedMeta[],
2661
+ ): { cteName: string; expr: string } | undefined {
2662
+ const pendingColumnsSet = new Set(columnConfigs.map((config) =&gt; config.columnName));
2663
+ const sqlParts = this.buildSqlQueryParts(Array.from(pendingColumnsSet));
2664
+ &nbsp;
2665
+ if (sqlParts.length !== 0 || columnConfigs.length !== 0) {
2666
+ const cteName = `cte_staging_${parentCTEName}`;
2667
+ const columnsToProject = [
2668
+ '*',
2669
+ ...columnConfigs.map((config) =&gt; {
2670
+ let resolvedExpressionValue =
2671
+ config.columnMeta.sqlQueryProps?.resolvedExpression?.value?.join(', ');
2672
+ if (resolvedExpressionValue) {
2673
+ resolvedExpressionValue = resolveRuntimeVariables(
2674
+ resolvedExpressionValue,
2675
+ this.options.runtimeVariables,
2676
+ );
2677
+ }
2678
+ return `${resolvedExpressionValue} AS ${this.entityNameFormatter(config.columnName)}`;
2679
+ }),
2680
+ ].join(', ');
2681
+ const stagingCte = `${cteName} AS (SELECT ${columnsToProject} FROM ${parentCTEName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''})`;
2682
+ return { cteName, expr: stagingCte };
2683
+ }
2684
+ }
2685
+ &nbsp;
2686
+ private buildFinalProjection(
2687
+ mainCTE: MainCteExpression,
2688
+ intermediateCTE: CteExpression,
2689
+ isCountQuery: boolean = false,
2690
+ ): FinalQu<span class="missing-if-branch" title="else path not taken" >E</span>eryResult {
2691
+ const {
2692
+ distinct,
2693
+ selectedColumns,
2694
+ includeFinalCTESelectQuery = true,
2695
+ fi<span class="missing-if-branch" title="if path not taken" >I</span>nalResponseAsObject = false,
2696
+ joinCl<span class="cstat-no" title="statement not covered" >auses,</span>
2697
+ } = this.options;
2698
+ const { joinRelation, alias } = joinClauses || {};
2699
+ const mainTableAlias = alias ? `${this.entityNameFormatter(alias)}` : '';
2700
+ &nbsp;
2701
+ // final query is select from main cte and intermediate cte if exists and isFilterPending is false
2702
+ const finalSqlParts = this.buildState.isSuperFilterPending ? false : true;
2703
+ const sqlParts = this.buildSqlQueryParts([], finalSqlParts);<span class="branch-2 cbranch-no" title="branch not covered" ><span class="branch-1 cbranch-no" title="branch not covered" ></span></span>
2704
+ &nbsp;
2705
+ if (
2706
+ sqlParts.length === 0 &amp;&amp;
2707
+ intermediateCTE.value.length === 0 &amp;&amp;
2708
+ !this.buildState.isSuperFilterPending
2709
+ ) {<span class="branch-2 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span></span>
2710
+ if (jo<span class="cstat-no" title="statement not covered" >inRelati</span>on?.length) {
2711
+ mainCTE.value.from = this.applyJoinExpressionToMainCTE(mainCTE.value);
2712
+ }
2713
+ if (distinct) {
2714
+ this.applyDistinctExpressionToMainCTE(mainCTE);
2715
+ }
2716
+ const query = isCountQuery
2717
+ ? this.applyCountExpressionToMainCTE(mainCTE)
2718
+ : processSelect(mainCTE.value);
2719
+ return {
2720
+ finalQuery: query,
2721
+ };
2722
+ } else {
2723
+ let currentCteName = mainCTE.cteName;
2724
+ const cteParts = [`cte_main AS (${processSelect(mainCTE.value)})`];
2725
+ if (intermediateCTE.value.length &gt; 0) {
2726
+ <span class="fstat-no" title="function not covered" ></span> currentCteName = intermediateCTE.cteName;
2727
+ cteParts.push(intermediateCTE.value.join(<span class="cstat-no" title="statement not covered" >', '));</span>
2728
+ }<span class="cstat-no" title="statement not covered" ></span>
2729
+ let tableName = <span class="cstat-no" title="statement not covered" >currentCteName;<span class="fstat-no" title="function not covered" ></span></span>
2730
+ if (joinRelation?.<span class="cstat-no" title="statement not covered" >length) {</span>
2731
+ cons<span class="cstat-no" title="statement not covered" >t joinExpr =</span> getJoinExpressions(
2732
+ joinClauses as JoinExpressions,
2733
+ <span class="cstat-no" title="statement not covered" > this.options?.databaseDetails,</span>
2734
+ ).jo<span class="cstat-no" title="statement not covered" >in(' ');</span>
2735
+ sqlParts.splice(0, 0, joinExpr);
2736
+ }<span class="cstat-no" title="statement not covered" ></span>
2737
+ let column = '*';
2738
+ if<span class="cstat-no" title="statement not covered" > (distinct) {</span>
2739
+ tableName = `${tableName}${mainTableAlias ? ` AS ${mainTableAlias}` : ''}`;
2740
+ &nbsp;
2741
+ column = `DISTINCT ${selectedColumns
2742
+ .map((c) =&gt; {
2743
+ const schemaMatch = this.options.schema?.find((s) =&gt; s.name === c);
2744
+ return (
2745
+ `${mainTableAlias ? `${mainTableAlias}.` : ''}` +
2746
+ this.entityNameFormatter(c, schemaMatch?.type ?? '')
2747
+ <span class="fstat-no" title="function not covered" ></span> );
2748
+ <span class="cstat-no" title="statement not covered" > })</span>
2749
+ .j<span class="cstat-no" title="statement not covered" >oin(', ')}`</span>;
2750
+ }<span class="cstat-no" title="statement not covered" ></span>
2751
+ if (isCountQuery) {<span class="cstat-no" title="statement not covered" ></span>
2752
+ if (distinct) {<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2753
+ const distinctCountCt<span class="cstat-no" title="statement not covered" >e = this.getDistinctCount</span>Cte(currentCteName, sqlParts);
2754
+ sq<span class="cstat-no" title="statement not covered" >lParts.length = 0;</span>
2755
+ tableN<span class="cstat-no" title="statement not covered" >ame = distinctCountCte.cteName;</span>
2756
+ cteParts.push(distinctCountCte.value.join(', '));
2757
+ column = `COUNT(*) AS row_count`;
2758
+ } else {<span class="cstat-no" title="statement not covered" ></span>
2759
+ if (joinRelation?.length) {
2760
+ <span class="cstat-no" title="statement not covered" > const primar</span>yKeyColumns = this.options.primaryKeyColumns?.[0];
2761
+ if (mainTableAlias &amp;&amp; primaryKeyColumns) {
2762
+ column = `DISTINCT ${mainTableAlias}.${this.entityNameFormatter(primaryKeyColumns)}`;
2763
+ }
2764
+ }
2765
+ column = `COUNT(${<span class="cstat-no" title="statement not covered" >column}) AS row_count`;</span>
2766
+ }<span class="cstat-no" title="statement not covered" ></span>
2767
+ }
2768
+ if<span class="cstat-no" title="statement not covered" > (!distinct) {</span>
2769
+ tabl<span class="cstat-no" title="statement not covered" >eName = `${tableName}${mainTableAlias ? ` AS ${mainTableAlias}`</span> : ''}`;
2770
+ }<span class="cstat-no" title="statement not covered" ></span>
2771
+ let selectedColumn =
2772
+ <span class="cstat-no" title="statement not covered" > column === '*' &amp;&amp; mainTableAlias ? `DISTINCT ${mainTableAlias}.*` : column;</span>
2773
+ <span class="cstat-no" title="statement not covered" ></span>
2774
+ if (isCountQuery &amp;&amp; this.buildState.isSuperFilterPending) {
2775
+ <span class="cstat-no" title="statement not covered" > selectedColumn = mainTableAlias &amp;&amp; !distinct ? `DISTINCT ${mainTableAlias}.*` : '*';</span>
2776
+ }<span class="cstat-no" title="statement not covered" ></span>
2777
+ <span class="cstat-no" title="statement not covered" ></span>
2778
+ const selectedProjection = `SELECT ${selectedColumn} FROM ${tableName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''}`;
2779
+ <span class="cstat-no" title="statement not covered" ></span>
2780
+ let finalProjection = '';
2781
+ <span class="fstat-no" title="function not covered" ></span> if (this.buildState.isSuperFilterPending) {
2782
+ const { cteDefinition, final<span class="cstat-no" title="statement not covered" >Query, finalC</span>teName } = this.buildFinalQueryComponents(
2783
+ currentCteName,<span class="cstat-no" title="statement not covered" ></span>
2784
+ <span class="cstat-no" title="statement not covered" > selectedProjection,</span>
2785
+ is<span class="cstat-no" title="statement not covered" >CountQuery,</span>
2786
+ distinct,<span class="fstat-no" title="function not covered" ></span>
2787
+ );<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
2788
+ currentC<span class="cstat-no" title="statement not covered" >teName = finalCteName;</span>
2789
+ cteParts.push(cteDefinition);
2790
+ finalProjection = finalQuery;
2791
+ } else {
2792
+ finalProjection = sel<span class="cstat-no" title="statement not covered" >ectedProjection;</span>
2793
+ }<span class="cstat-no" title="statement not covered" ></span>
2794
+ const cteJoins = `<span class="cstat-no" title="statement not covered" >WITH ${cteParts.join(', ')}`;</span>
2795
+ let finalQuery = ct<span class="cstat-no" title="statement not covered" >eJoins;</span>
2796
+ if<span class="cstat-no" title="statement not covered" > (includeFinalCTESelectQuery) {</span>
2797
+ finalQuery += ` ${f<span class="cstat-no" title="statement not covered" >inalProjection}`;</span>
2798
+ }<span class="cstat-no" title="statement not covered" ></span>
2799
+ &nbsp;
2800
+ if (finalResponseAsObject) {
2801
+ return {
2802
+ finalQuery: finalQuery,
2803
+ <span class="missing-if-branch" title="if path not taken" >I</span> finalCteName: currentCteName,
2804
+ };
2805
+ }<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2806
+ <span class="cstat-no" title="statement not covered" ></span>
2807
+ return {<span class="cstat-no" title="statement not covered" ></span>
2808
+ finalQuery,<span class="cstat-no" title="statement not covered" ></span>
2809
+ };<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
2810
+ }<span class="cstat-no" title="statement not covered" ></span>
2811
+ }<span class="cstat-no" title="statement not covered" ></span>
2812
+ &nbsp;
2813
+ private applyDistinctExpressionToMainCTE(mainCTE: MainCteExpression) {
2814
+ const { <span class="cstat-no" title="statement not covered" >selectedColumns } = this.o<span class="fstat-no" title="function not covered" >pt</span>ions;</span>
2815
+ if (mainCTE.<span class="cstat-no" title="statement not covered" >value.columns.length &gt; se</span>lectedColumns.length) {
2816
+ mainCTE.value.columns = mainCTE.value.columns.filter((c) =&gt; {
2817
+ retu<span class="cstat-no" title="statement not covered" >rn selectedColumns.<span class="fstat-no" title="function not covered" >in</span>cludes(c.expr.meta?.rawColumnName);</span>
2818
+ });<span class="cstat-no" title="statement not covered" ></span>
2819
+ }
2820
+ mainCTE.value.distinct = 'DISTINCT';
2821
+ }
2822
+ &nbsp;
2823
+ private applyCountExpressionToMainCTE(mainCTE: MainCteExpression): string {
2824
+ if (mainCTE.value.distinct) {
2825
+ const mainCteResult = `WITH cte_main AS (${processSelect(mainCTE.value)})`;
2826
+ return `${mainCteResult} SELECT COUNT(*) AS row_count FROM cte_main`;
2827
+ }
2828
+ &nbsp;
2829
+ const columnValue =
2830
+ mainCTE.value.columns.length &gt; 1 ? '*' : `${mainCTE.value.columns[0].expr.value}`;
2831
+ mainCTE.value.columns[0].expr.value = `COUNT(${columnValue})`;
2832
+ mainCTE.value.columns[0].as = `row_count`;
2833
+ mainCTE.value.columns.length = 1;
2834
+ return processSelect(mainCTE.value);
2835
+ }
2836
+ &nbsp;
2837
+ private getDistinctCountCte(parentCTEName: string, sqlParts: string[]): CteExpression {
2838
+ const { selectedColumns, joinClauses } = this.options;
2839
+ const { alias } = joinClauses || {};
2840
+ const cteName = `cte_distinct_${parentCTEName}`;
2841
+ const fromName = `${parentCTEName}${alias ? ` AS ${this.entityNameFormatter(alias)}` : ''}`;
2842
+ return {
2843
+ type: ResolvedExpressionType.CTE,
2844
+ cteName,
2845
+ value: [
2846
+ `${cteName} AS (SELECT DISTINCT ${selectedColumns.map((c) =&gt; `${alias ? `${this.entityNameFormatter(alias)}.` : ''}` + this.entityNameFormatter(c)).join(', ')} FROM ${fromName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''})`,
2847
+ ],
2848
+ };
2849
+ }
2850
+ &nbsp;
2851
+ private buildSqlQueryParts(columns: string[], isFinalProjection = false): string[] {
2852
+ const sqlParts = [];
2853
+ &nbsp;
2854
+ const where = [];
2855
+ const filterCondition = this.getFilterExpression(new Set(columns));
2856
+ if (filterCondition) {
2857
+ where.push(filterCondition);
2858
+ }
2859
+ if (columns.length === 0 &amp;&amp; this.buildState.isSuperFilterPending) {
2860
+ const superFilterCondition = this.getSuperFilterExpression(isFinalProjection);
2861
+ if (superFilterCondition) {
2862
+ where.push(superFilterCondition);
2863
+ }
2864
+ }
2865
+ if (columns.length === 0 &amp;&amp; this.buildState.isSearchPending) {
2866
+ this.buildState.isSearchPending = false;
2867
+ where.push(this.options.searchExpression);
2868
+ }
2869
+ if (where.length) {
2870
+ sqlParts.push(`WHERE ${where.join(' AND ')}`);
2871
+ }
2872
+ &nbsp;
2873
+ const sortExpression = this.getSortExpression(new Set(columns));
2874
+ if (sortExpression) {
2875
+ sqlParts.push(`ORDER BY ${sortExpression}`);
2876
+ }
2877
+ &nbsp;
2878
+ const paginationExpression = this.getPaginationExpression();
2879
+ if (paginationExpression) {
2880
+ sqlParts.push(paginationExpression);
2881
+ }
2882
+ &nbsp;
2883
+ return sqlParts;
2884
+ }
2885
+ &nbsp;
2886
+ /**
2887
+ * Returns the calculation order for the given columns
2888
+ * @private exposed for testing
2889
+ */
2890
+ public getCalculationOrder(columns: Set&lt;string&gt;): CalculationOrderResult {
2891
+ const state = {
2892
+ dependencyLevel: -1,
2893
+ dependencyLevelMap: new Map&lt;string, number&gt;(),
2894
+ nativeColumns: new Set&lt;string&gt;(),
2895
+ visited: new Set&lt;string&gt;(),
2896
+ };
2897
+ &nbsp;
2898
+ // trigger dependency tracing for each column
2899
+ columns.forEach((columnName) =&gt; {
2900
+ state.dependencyLevel = -1; // reset dependency level for each column
2901
+ this.dfs(columnName, state);
2902
+ });
2903
+ &nbsp;
2904
+ // build output
2905
+ const formulaColumnsByDependencyLevel: IMDMColumnConfigWithParsedMeta[][] = [];
2906
+ for (const [columnName, level] of state.dependencyLevelMap) {
2907
+ const columnConfig = this.options.columnConfigMap[columnName];
2908
+ if (level &gt;= formulaColumnsByDependencyLevel.length) {
2909
+ formulaColumnsByDependencyLevel.push([]);
2910
+ }
2911
+ formulaColumnsByDependencyLevel[level].push(columnConfig);
2912
+ }
2913
+ &nbsp;
2914
+ return {
2915
+ nativeColumns: state.nativeColumns,
2916
+ formulaColumnsByDependencyLevel,
2917
+ };
2918
+ }
2919
+ &nbsp;
2920
+ private dfs(
2921
+ columnName: string,
2922
+ state: {
2923
+ dependencyLevel: number;
2924
+ dependencyLevelMap: Map&lt;string, number&gt;;
2925
+ nativeColumns: Set&lt;string&gt;;
2926
+ visited: Set&lt;string&gt;;
2927
+ },
2928
+ ) {
2929
+ // If dependency level is already resolved, return
2930
+ const level = state.dependencyLevelMap.get(columnName);
2931
+ if (level !== undefined) {
2932
+ if (level &gt; state.dependencyLevel) {
2933
+ state.dependencyLevel = level;
2934
+ }
2935
+ return;
2936
+ }
2937
+ &nbsp;
2938
+ if (state.visited.has(columnName)) {
2939
+ throw new Error(`Cycle detected in formula dependencies: ${columnName}`);
2940
+ }
2941
+ &nbsp;
2942
+ const columnConfig = this.options.columnConfigMap[columnName];
2943
+ const { columnType, columnMeta } = columnConfig;
2944
+ const { sqlQueryProps, isCustomColumn, deps, defaultValueType } = columnMeta;
2945
+ &nbsp;
2946
+ const isNativeColumn =
2947
+ columnType !== MDM_COLUMN_TYPE.FORMULA &amp;&amp; defaultValueType !== DEFAULT_VALUE_TYPE.DERIVED;
2948
+ const isFormulaDbColumn =
2949
+ columnType === MDM_COLUMN_TYPE.FORMULA &amp;&amp; !sqlQueryProps &amp;&amp; !isCustomColumn &amp;&amp; !deps;
2950
+ const isDerivedDbColumn =
2951
+ defaultValueType === DEFAULT_VALUE_TYPE.DERIVED &amp;&amp; !sqlQueryProps &amp;&amp; !deps;
2952
+ &nbsp;
2953
+ if (isNativeColumn || isFormulaDbColumn || isDerivedDbColumn) {
2954
+ state.nativeColumns.add(columnName);
2955
+ return;
2956
+ }
2957
+ &nbsp;
2958
+ // Skip processing to maintain backward compatibility with older formula visual columns
2959
+ if (columnType === MDM_COLUMN_TYPE.FORMULA &amp;&amp; isCustomColumn &amp;&amp; !sqlQueryProps) {
2960
+ return;
2961
+ }
2962
+ &nbsp;
2963
+ state.visited.add(columnName);
2964
+ deps?.forEach((colName) =&gt; {
2965
+ this.dfs(colName, state);
2966
+ });
2967
+ &nbsp;
2968
+ state.visited.delete(columnName);
2969
+ state.dependencyLevelMap.set(columnName, ++state.dependencyLevel);
2970
+ }
2971
+ &nbsp;
2972
+ /**
2973
+ * Applies the join positions from the query builder to the given Select AST.
2974
+ * The join positions are added to the FROM list of the AST.
2975
+ *
2976
+ * @param {Select} ast - The Select AST to apply the join positions to.
2977
+ * @returns {string[]} - An empty array, for consistency with other methods.
2978
+ */
2979
+ private applyJoinExpressionToMainCTE(ast: Select): From[] {
2980
+ const { joinClauses, databaseDetails } = this.options;
2981
+ const joinExpressions = getJoinExpressions(joinClauses as JoinExpressions, databaseDetails);
2982
+ const joins: From[] = joinExpressions.map((j) =&gt; {
2983
+ const raw: RawSqlExpression = { type: 'sql_expr', value: j };
2984
+ return raw as unknown as From;
2985
+ });
2986
+ if (joins.length) {
2987
+ ast.distinct = 'DISTINCT';
2988
+ }
2989
+ const joinFroms = ast.from as From[];
2990
+ // set the FROM list as base table + joins
2991
+ return joinFroms?.concat(joins);
2992
+ }
2993
+ &nbsp;
2994
+ /**
2995
+ * Gets the super filter expression.
2996
+ * If super filters are present and the pending filter config is not empty,
2997
+ * it will process the super filter condition and return the result.
2998
+ * If the super filter expression is empty, it will return an empty string.
2999
+ * @returns {string} - The super filter expression.
3000
+ */
3001
+ private getSuperFilterExpression(isFinalProjection?: boolean): string {
3002
+ if (!this.options.superFilters || !this.options.superFilters.children.length) return '';
3003
+ const { superFilters } = this.options;
3004
+ &nbsp;
3005
+ const { children } = superFilters;
3006
+ const { rankingFilters, nonRankingFilters } = children.reduce(
3007
+ (acc, child) =&gt; {
3008
+ const filterType = (child as { filters: IGroupFilter }).filters.filterType;
3009
+ if (filterType === 'RANKING') {
3010
+ acc.rankingFilters.push(child);
3011
+ } else {
3012
+ acc.nonRankingFilters.push(child);
3013
+ }
3014
+ return acc;
3015
+ },
3016
+ {
3017
+ rankingFilters: [] as typeof children,
3018
+ nonRankingFilters: [] as typeof children,
3019
+ },
3020
+ );
3021
+ &nbsp;
3022
+ let activeFilters = { ...superFilters, children: nonRankingFilters };
3023
+ let joinClauses = this.options.joinClauses;
3024
+ &nbsp;
3025
+ // Process ranking filters if pending and available
3026
+ if (rankingFilters.length &amp;&amp; isFinalProjection &amp;&amp; this.buildState.isSuperFilterPending) {
3027
+ activeFilters = { ...superFilters, children: rankingFilters };
3028
+ joinClauses = { alias: '', joinRelation: [] };
3029
+ }
3030
+ if (rankingFilters.length === 0) {
3031
+ this.buildState.isSuperFilterPending = false;
3032
+ }
3033
+ if (activeFilters.children.length) {
3034
+ const sqlQueryBuilder = new SuperFilterBuilder(
3035
+ activeFilters,
3036
+ this.options.databaseDetails,
3037
+ this.options.skipCountForRankingFilter,
3038
+ joinClauses,
3039
+ );
3040
+ return sqlQueryBuilder.build();
3041
+ }
3042
+ &nbsp;
3043
+ return '';
3044
+ }
3045
+ &nbsp;
3046
+ private buildFinalQueryComponents(
3047
+ currentCteName: string,
3048
+ selectProjection: string,
3049
+ isCountQuery: boolean,
3050
+ distinct: boolean,
3051
+ ): { cteDefinition: string; finalQuery: string; finalCteName: string } {
3052
+ const { selectedColumns } = this.options;
3053
+ let selectQuery = '*';
3054
+ if (distinct &amp;&amp; !isCountQuery) {
3055
+ selectQuery = `DISTINCT ${selectedColumns
3056
+ .map((c) =&gt; {
3057
+ const schemaMatch = this.options.schema?.find((s) =&gt; s.name === c);
3058
+ return this.entityNameFormatter(c, schemaMatch?.type ?? '');
3059
+ })
3060
+ .join(', ')}`;
3061
+ }
3062
+ &nbsp;
3063
+ const finalCteName = `${currentCteName}_main_cte`;
3064
+ const cteDefinition = `${finalCteName} AS (${selectProjection})`;
3065
+ &nbsp;
3066
+ const columns = isCountQuery ? `COUNT(${selectQuery}) AS row_count` : `${selectQuery}`;
3067
+ const sqlParts = this.buildSqlQueryParts([], true);
3068
+ &nbsp;
3069
+ this.buildState.isSuperFilterPending = false;
3070
+ &nbsp;
3071
+ const finalQuery = `SELECT ${columns} FROM ${finalCteName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''}`;
3072
+ &nbsp;
3073
+ return { cteDefinition, finalQuery, finalCteName };
3074
+ }
3075
+ &nbsp;
3076
+ private filterRequiredColumns(): Set&lt;string&gt; {
3077
+ const { selectedColumns, superFilters, primaryKeyColumns, sortConfig = [] } = this.options;
3078
+ const requiredColumn = new Set&lt;string&gt;(selectedColumns);
3079
+ if (superFilters?.children?.length) {
3080
+ // Collect all columnIds from superFilters
3081
+ (superFilters?.children as { filters: IGroupFilter }[])?.forEach((child) =&gt; {
3082
+ const filterColumn = child.filters?.columnIds?.[0];
3083
+ if (filterColumn) requiredColumn.add(filterColumn);
3084
+ child?.filters?.rankingFilter?.forEach?.((rank) =&gt; {
3085
+ if (rank?.rankByColumnName) requiredColumn.add(rank.rankByColumnName);
3086
+ });
3087
+ });
3088
+ primaryKeyColumns.forEach((col) =&gt; {
3089
+ requiredColumn.add(col);
3090
+ });
3091
+ sortConfig.forEach((col) =&gt; {
3092
+ requiredColumn.add(col?.column);
3093
+ });
3094
+ }
3095
+ &nbsp;
3096
+ return new Set(requiredColumn);
3097
+ }
3098
+ }
3099
+ &nbsp;</pre></td></tr></table></pre>
3100
+
3101
+ <div class='push'></div><!-- for sticky footer -->
3102
+ </div><!-- /wrapper -->
3103
+ <div class='footer quiet pad2 space-top1 center small'>
3104
+ Code coverage generated by
3105
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3106
+ at 2025-12-06T06:36:03.131Z
3107
+ </div>
3108
+ <script src="../../prettify.js"></script>
3109
+ <script>
3110
+ window.onload = function () {
3111
+ prettyPrint();
3112
+ };
3113
+ </script>
3114
+ <script src="../../sorter.js"></script>
3115
+ <script src="../../block-navigation.js"></script>
3116
+ </body>
3117
+ </html>
3118
+