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.
- package/.turbo/turbo-build.log +9 -0
- package/.turbo/turbo-check-types.log +4 -0
- package/.turbo/turbo-lint.log +126 -0
- package/README.md +45 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +236 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/constants.ts.html +826 -0
- package/coverage/src/database_types.ts.html +136 -0
- package/coverage/src/epm-query-builder/EpmQueryBuilder.ts.html +166 -0
- package/coverage/src/epm-query-builder/base/BaseAdvancedAggregations.ts.html +568 -0
- package/coverage/src/epm-query-builder/base/BaseAnalyticalFunctions.ts.html +694 -0
- package/coverage/src/epm-query-builder/base/BaseCTEGenerator.ts.html +1459 -0
- package/coverage/src/epm-query-builder/base/BaseCountQueryBuilder.ts.html +400 -0
- package/coverage/src/epm-query-builder/base/BaseMeasureBuilder.ts.html +295 -0
- package/coverage/src/epm-query-builder/base/BaseOrderBuilder.ts.html +670 -0
- package/coverage/src/epm-query-builder/base/BasePaginationBuilder.ts.html +364 -0
- package/coverage/src/epm-query-builder/base/BaseQueryBuilder.ts.html +238 -0
- package/coverage/src/epm-query-builder/base/BaseRollupBuilder.ts.html +532 -0
- package/coverage/src/epm-query-builder/base/BaseSqlBuilder.ts.html +601 -0
- package/coverage/src/epm-query-builder/base/BaseSuperFilterBuilder.ts.html +1966 -0
- package/coverage/src/epm-query-builder/base/BaseUtilities.ts.html +1798 -0
- package/coverage/src/epm-query-builder/base/ColumnRefUtils.ts.html +211 -0
- package/coverage/src/epm-query-builder/base/RelationshipResolver.ts.html +706 -0
- package/coverage/src/epm-query-builder/base/SharedFilterBuilder.ts.html +1717 -0
- package/coverage/src/epm-query-builder/base/index.html +326 -0
- package/coverage/src/epm-query-builder/constants/Aggregations.ts.html +133 -0
- package/coverage/src/epm-query-builder/constants/Database.ts.html +103 -0
- package/coverage/src/epm-query-builder/constants/Source.ts.html +106 -0
- package/coverage/src/epm-query-builder/constants/index.html +146 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts.html +286 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts.html +280 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts.html +1924 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts.html +769 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts.html +643 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts.html +2644 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts.html +478 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts.html +1195 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/index.html +221 -0
- package/coverage/src/epm-query-builder/errors/QueryBuilderErrors.ts.html +280 -0
- package/coverage/src/epm-query-builder/errors/index.html +116 -0
- package/coverage/src/epm-query-builder/index.html +116 -0
- package/coverage/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts.html +100 -0
- package/coverage/src/epm-query-builder/interfaces/index.html +131 -0
- package/coverage/src/epm-query-builder/interfaces/index.ts.html +88 -0
- package/coverage/src/epm-query-builder/utils/format.ts.html +151 -0
- package/coverage/src/epm-query-builder/utils/index.html +146 -0
- package/coverage/src/epm-query-builder/utils/sql.ts.html +247 -0
- package/coverage/src/epm-query-builder/utils/validation.ts.html +124 -0
- package/coverage/src/epm-query-builder/validation/QueryOptionsValidator.ts.html +631 -0
- package/coverage/src/epm-query-builder/validation/SqlQueryValidator.ts.html +475 -0
- package/coverage/src/epm-query-builder/validation/index.html +131 -0
- package/coverage/src/filters/FilterConditionBuilder.ts.html +427 -0
- package/coverage/src/filters/filter-types.ts.html +484 -0
- package/coverage/src/filters/index.html +131 -0
- package/coverage/src/index.html +176 -0
- package/coverage/src/index.ts.html +103 -0
- package/coverage/src/js-lib/JsToSqlParser.ts.html +736 -0
- package/coverage/src/js-lib/ParseContext.ts.html +532 -0
- package/coverage/src/js-lib/db/azuresql/AzureSqlCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/azuresql/index.html +116 -0
- package/coverage/src/js-lib/db/base/ArrayExpressionVisitor.ts.html +133 -0
- package/coverage/src/js-lib/db/base/AssignmentExpressionVisitor.ts.html +187 -0
- package/coverage/src/js-lib/db/base/BinaryExpressionVisitor.ts.html +223 -0
- package/coverage/src/js-lib/db/base/CallExpressionVisitor.ts.html +5479 -0
- package/coverage/src/js-lib/db/base/IdentifierVisitor.ts.html +283 -0
- package/coverage/src/js-lib/db/base/LiteralVisitor.ts.html +199 -0
- package/coverage/src/js-lib/db/base/MemberExpressionVisitor.ts.html +193 -0
- package/coverage/src/js-lib/db/base/ProgramVisitor.ts.html +139 -0
- package/coverage/src/js-lib/db/base/UnaryExpressionVisitor.ts.html +181 -0
- package/coverage/src/js-lib/db/base/VisitorInterface.ts.html +103 -0
- package/coverage/src/js-lib/db/base/index.html +251 -0
- package/coverage/src/js-lib/db/bigquery/BigQueryCallExpressionVisitor.ts.html +1747 -0
- package/coverage/src/js-lib/db/bigquery/index.html +116 -0
- package/coverage/src/js-lib/db/commonTransforms.ts.html +2074 -0
- package/coverage/src/js-lib/db/databricks/DatabricksCallExpressionVisitor.ts.html +1303 -0
- package/coverage/src/js-lib/db/databricks/index.html +116 -0
- package/coverage/src/js-lib/db/fabricsql/FabricSqlCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/fabricsql/index.html +116 -0
- package/coverage/src/js-lib/db/fabricwarehouse/FabricWarehouseCallExpressionVisitor.ts.html +292 -0
- package/coverage/src/js-lib/db/fabricwarehouse/index.html +116 -0
- package/coverage/src/js-lib/db/index.html +116 -0
- package/coverage/src/js-lib/db/postgresql/PostgreSqlCallExpressionVisitor.ts.html +985 -0
- package/coverage/src/js-lib/db/postgresql/index.html +116 -0
- package/coverage/src/js-lib/db/redshift/RedshiftCallExpressionVisitor.ts.html +685 -0
- package/coverage/src/js-lib/db/redshift/index.html +116 -0
- package/coverage/src/js-lib/db/sample/SampleCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/sample/index.html +116 -0
- package/coverage/src/js-lib/db/snowflake/SnowflakeCallExpressionVisitor.ts.html +1447 -0
- package/coverage/src/js-lib/db/snowflake/index.html +116 -0
- package/coverage/src/js-lib/db/validator/FormulaValidator.ts.html +4162 -0
- package/coverage/src/js-lib/db/validator/index.html +116 -0
- package/coverage/src/js-lib/index.html +131 -0
- package/coverage/src/js-lib/objects/BaseObject.ts.html +169 -0
- package/coverage/src/js-lib/objects/DateObject.ts.html +169 -0
- package/coverage/src/js-lib/objects/PctObject.ts.html +178 -0
- package/coverage/src/js-lib/objects/index.html +146 -0
- package/coverage/src/query-builder/PaginationBuilder.ts.html +142 -0
- package/coverage/src/query-builder/QueryBuilder.ts.html +3118 -0
- package/coverage/src/query-builder/SuperFilterBuilder.ts.html +1969 -0
- package/coverage/src/query-builder/index.html +146 -0
- package/coverage/src/runtime_var.ts.html +109 -0
- package/coverage/src/sql-lib/binary_expr.ts.html +133 -0
- package/coverage/src/sql-lib/case.ts.html +133 -0
- package/coverage/src/sql-lib/column.ts.html +139 -0
- package/coverage/src/sql-lib/else.ts.html +124 -0
- package/coverage/src/sql-lib/function.ts.html +112 -0
- package/coverage/src/sql-lib/index.html +251 -0
- package/coverage/src/sql-lib/join.ts.html +127 -0
- package/coverage/src/sql-lib/literal.ts.html +130 -0
- package/coverage/src/sql-lib/select.ts.html +547 -0
- package/coverage/src/sql-lib/unary_expr.ts.html +112 -0
- package/coverage/src/sql-lib/when.ts.html +130 -0
- package/coverage/src/sql_query_gen.ts.html +535 -0
- package/coverage/src/superFilter/DateFilterFactory.ts.html +625 -0
- package/coverage/src/superFilter/dateFunction.ts.html +193 -0
- package/coverage/src/superFilter/index.html +131 -0
- package/coverage/src/utils.ts.html +571 -0
- package/dist/index.cjs +8440 -0
- package/dist/index.d.cts +927 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +927 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8387 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +4 -0
- package/jest.config.ts +44 -0
- package/package.json +45 -0
- package/src/constants.ts +247 -0
- package/src/epm-query-builder/EpmQueryBuilder.ts +27 -0
- package/src/epm-query-builder/base/BaseAdvancedAggregations.ts +161 -0
- package/src/epm-query-builder/base/BaseAnalyticalFunctions.ts +203 -0
- package/src/epm-query-builder/base/BaseCTEGenerator.ts +458 -0
- package/src/epm-query-builder/base/BaseCountQueryBuilder.ts +105 -0
- package/src/epm-query-builder/base/BaseMeasureBuilder.ts +87 -0
- package/src/epm-query-builder/base/BaseOrderBuilder.ts +195 -0
- package/src/epm-query-builder/base/BasePaginationBuilder.ts +93 -0
- package/src/epm-query-builder/base/BaseQueryBuilder.ts +51 -0
- package/src/epm-query-builder/base/BaseRollupBuilder.ts +149 -0
- package/src/epm-query-builder/base/BaseSqlBuilder.ts +172 -0
- package/src/epm-query-builder/base/BaseSuperFilterBuilder.ts +627 -0
- package/src/epm-query-builder/base/BaseUtilities.ts +571 -0
- package/src/epm-query-builder/base/ColumnRefUtils.ts +42 -0
- package/src/epm-query-builder/base/RelationshipResolver.ts +207 -0
- package/src/epm-query-builder/base/SharedFilterBuilder.ts +544 -0
- package/src/epm-query-builder/constants/Aggregations.ts +16 -0
- package/src/epm-query-builder/constants/Database.ts +6 -0
- package/src/epm-query-builder/constants/Source.ts +7 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts +67 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts +65 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts +626 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts +228 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts +186 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts +853 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts +131 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts +370 -0
- package/src/epm-query-builder/errors/QueryBuilderErrors.ts +65 -0
- package/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts +5 -0
- package/src/epm-query-builder/interfaces/index.ts +1 -0
- package/src/epm-query-builder/types/query-builder-types.d.ts +289 -0
- package/src/epm-query-builder/utils/format.ts +22 -0
- package/src/epm-query-builder/utils/sql.ts +54 -0
- package/src/epm-query-builder/utils/validation.ts +13 -0
- package/src/epm-query-builder/validation/QueryOptionsValidator.ts +182 -0
- package/src/epm-query-builder/validation/SqlQueryValidator.ts +130 -0
- package/src/filters/FilterConditionBuilder.ts +114 -0
- package/src/filters/filter-types.ts +133 -0
- package/src/index.ts +10 -0
- package/src/js-lib/JsToSqlParser.ts +217 -0
- package/src/js-lib/ParseContext.ts +149 -0
- package/src/js-lib/db/base/ArrayExpressionVisitor.ts +16 -0
- package/src/js-lib/db/base/AssignmentExpressionVisitor.ts +34 -0
- package/src/js-lib/db/base/BinaryExpressionVisitor.ts +46 -0
- package/src/js-lib/db/base/CallExpressionVisitor.ts +1798 -0
- package/src/js-lib/db/base/IdentifierVisitor.ts +66 -0
- package/src/js-lib/db/base/LiteralVisitor.ts +38 -0
- package/src/js-lib/db/base/MemberExpressionVisitor.ts +36 -0
- package/src/js-lib/db/base/ProgramVisitor.ts +18 -0
- package/src/js-lib/db/base/UnaryExpressionVisitor.ts +32 -0
- package/src/js-lib/db/base/VisitorInterface.ts +6 -0
- package/src/js-lib/db/validator/FormulaValidator.ts +1235 -0
- package/src/js-lib/objects/BaseObject.ts +28 -0
- package/src/js-lib/objects/DateObject.ts +28 -0
- package/src/js-lib/objects/PctObject.ts +31 -0
- package/src/query-builder/PaginationBuilder.ts +19 -0
- package/src/query-builder/QueryBuilder.ts +1035 -0
- package/src/query-builder/SuperFilterBuilder.ts +628 -0
- package/src/runtime_var.ts +8 -0
- package/src/sql-lib/binary_expr.ts +16 -0
- package/src/sql-lib/case.ts +16 -0
- package/src/sql-lib/column.ts +18 -0
- package/src/sql-lib/else.ts +13 -0
- package/src/sql-lib/function.ts +9 -0
- package/src/sql-lib/join.ts +14 -0
- package/src/sql-lib/literal.ts +15 -0
- package/src/sql-lib/select.ts +154 -0
- package/src/sql-lib/unary_expr.ts +9 -0
- package/src/sql-lib/when.ts +15 -0
- package/src/sql-types.d.ts +565 -0
- package/src/sql_query_gen.ts +150 -0
- package/src/superFilter/DateFilterFactory.ts +180 -0
- package/src/superFilter/dateFunction.ts +36 -0
- package/src/utils.ts +354 -0
- package/test-output/report/junit.xml +329 -0
- package/tests/JsToSqlParser.test.ts +163 -0
- package/tests/QueryBuilder.test.ts +1320 -0
- package/tests/js-lib/CallExpressionVisitor.test.ts +820 -0
- package/tests/mocks/MockQueryResolver.ts +14 -0
- package/tests/sanity.test.ts +146 -0
- package/tests/sql-lib/binary_expr.test.ts +75 -0
- package/tests/sql-lib/case.test.ts +117 -0
- package/tests/sql-lib/column.test.ts +87 -0
- package/tests/sql-lib/else.test.ts +56 -0
- package/tests/sql-lib/function.test.ts +96 -0
- package/tests/sql-lib/literal.test.ts +75 -0
- package/tests/sql-lib/select.test.ts +245 -0
- package/tests/sql-lib/unary_expr.test.ts +32 -0
- package/tests/utils.test.ts +13 -0
- package/tsconfig.json +24 -0
- 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"> </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"> </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"> </span>
|
|
1094
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1111
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1155
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1208
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1212
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1221
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1223
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1244
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1265
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1277
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1290
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1293
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1303
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1309
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1310
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1311
|
+
<span class="cline-any cline-yes">63x</span>
|
|
1312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1334
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1335
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1339
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1346
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1352
|
+
<span class="cline-any cline-yes">32x</span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </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"> </span>
|
|
1373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1374
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1380
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1381
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1383
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1389
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1393
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1394
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1411
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1414
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1447
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1450
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1463
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1465
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1472
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1477
|
+
<span class="cline-any cline-yes">8x</span>
|
|
1478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1479
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1500
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1528
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1529
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1539
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1545
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1565
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1571
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1577
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1578
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1579
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1582
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1591
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1602
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1622
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1623
|
+
<span class="cline-any cline-no"> </span>
|
|
1624
|
+
<span class="cline-any cline-no"> </span>
|
|
1625
|
+
<span class="cline-any cline-no"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </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"> </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"> </span>
|
|
1643
|
+
<span class="cline-any cline-yes">39x</span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1668
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1682
|
+
<span class="cline-any cline-yes">10x</span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-yes">103x</span>
|
|
1685
|
+
<span class="cline-any cline-no"> </span>
|
|
1686
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1699
|
+
<span class="cline-any cline-no"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </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"> </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"> </span>
|
|
1708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-no"> </span>
|
|
1717
|
+
<span class="cline-any cline-no"> </span>
|
|
1718
|
+
<span class="cline-any cline-no"> </span>
|
|
1719
|
+
<span class="cline-any cline-no"> </span>
|
|
1720
|
+
<span class="cline-any cline-no"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
+
<span class="cline-any cline-no"> </span>
|
|
1723
|
+
<span class="cline-any cline-no"> </span>
|
|
1724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1725
|
+
<span class="cline-any cline-no"> </span>
|
|
1726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1727
|
+
<span class="cline-any cline-no"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-no"> </span>
|
|
1738
|
+
<span class="cline-any cline-no"> </span>
|
|
1739
|
+
<span class="cline-any cline-no"> </span>
|
|
1740
|
+
<span class="cline-any cline-no"> </span>
|
|
1741
|
+
<span class="cline-any cline-no"> </span>
|
|
1742
|
+
<span class="cline-any cline-no"> </span>
|
|
1743
|
+
<span class="cline-any cline-no"> </span>
|
|
1744
|
+
<span class="cline-any cline-no"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
+
<span class="cline-any cline-no"> </span>
|
|
1748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1749
|
+
<span class="cline-any cline-no"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1754
|
+
<span class="cline-any cline-no"> </span>
|
|
1755
|
+
<span class="cline-any cline-no"> </span>
|
|
1756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1757
|
+
<span class="cline-any cline-no"> </span>
|
|
1758
|
+
<span class="cline-any cline-no"> </span>
|
|
1759
|
+
<span class="cline-any cline-no"> </span>
|
|
1760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1761
|
+
<span class="cline-any cline-no"> </span>
|
|
1762
|
+
<span class="cline-any cline-no"> </span>
|
|
1763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1764
|
+
<span class="cline-any cline-no"> </span>
|
|
1765
|
+
<span class="cline-any cline-no"> </span>
|
|
1766
|
+
<span class="cline-any cline-no"> </span>
|
|
1767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
+
<span class="cline-any cline-no"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1771
|
+
<span class="cline-any cline-no"> </span>
|
|
1772
|
+
<span class="cline-any cline-no"> </span>
|
|
1773
|
+
<span class="cline-any cline-no"> </span>
|
|
1774
|
+
<span class="cline-any cline-no"> </span>
|
|
1775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1776
|
+
<span class="cline-any cline-no"> </span>
|
|
1777
|
+
<span class="cline-any cline-no"> </span>
|
|
1778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1781
|
+
<span class="cline-any cline-no"> </span>
|
|
1782
|
+
<span class="cline-any cline-no"> </span>
|
|
1783
|
+
<span class="cline-any cline-no"> </span>
|
|
1784
|
+
<span class="cline-any cline-no"> </span>
|
|
1785
|
+
<span class="cline-any cline-no"> </span>
|
|
1786
|
+
<span class="cline-any cline-no"> </span>
|
|
1787
|
+
<span class="cline-any cline-no"> </span>
|
|
1788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1789
|
+
<span class="cline-any cline-neutral"> </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"> </span>
|
|
1794
|
+
<span class="cline-any cline-no"> </span>
|
|
1795
|
+
<span class="cline-any cline-no"> </span>
|
|
1796
|
+
<span class="cline-any cline-no"> </span>
|
|
1797
|
+
<span class="cline-any cline-no"> </span>
|
|
1798
|
+
<span class="cline-any cline-no"> </span>
|
|
1799
|
+
<span class="cline-any cline-no"> </span>
|
|
1800
|
+
<span class="cline-any cline-no"> </span>
|
|
1801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1803
|
+
<span class="cline-any cline-no"> </span>
|
|
1804
|
+
<span class="cline-any cline-no"> </span>
|
|
1805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
+
<span class="cline-any cline-no"> </span>
|
|
1807
|
+
<span class="cline-any cline-no"> </span>
|
|
1808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1813
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1850
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1862
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1888
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1897
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1899
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1901
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1905
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1914
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1935
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1942
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1953
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2035
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2044
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2045
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2069
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2070
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
+
<span class="cline-any cline-neutral"> </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
|
+
|
|
2120
|
+
export type SortConfig = { column: string; order: 'ASC' | 'DESC' }[];
|
|
2121
|
+
|
|
2122
|
+
export type PaginationConfig = { skip: number; take: number };
|
|
2123
|
+
|
|
2124
|
+
export type FilterResolverParams = {
|
|
2125
|
+
filterConfig: FilterConfig;
|
|
2126
|
+
schema?: IColumnSchemaItem[];
|
|
2127
|
+
};
|
|
2128
|
+
|
|
2129
|
+
export interface QueryResolver {
|
|
2130
|
+
filterResolver(params: FilterResolverParams): string;
|
|
2131
|
+
}
|
|
2132
|
+
|
|
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
|
+
|
|
2140
|
+
export type QueryBuilderOptions = {
|
|
2141
|
+
selectedColumns: string[];
|
|
2142
|
+
databaseDetails: Record<string, any>;
|
|
2143
|
+
primaryKeyColumns: string[];
|
|
2144
|
+
filterConfig?: FilterConfig;
|
|
2145
|
+
pagination?: PaginationConfig;
|
|
2146
|
+
sortConfig?: SortConfig;
|
|
2147
|
+
searchExpression?: string;
|
|
2148
|
+
distinct?: boolean;
|
|
2149
|
+
columnConfigMap: Record<string, IMDMColumnConfigWithParsedMeta>;
|
|
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
|
+
|
|
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
|
+
|
|
2171
|
+
type BuildOptions = Partial<Omit<QueryBuilderOptions, 'tableName' | 'queryResolver' | 'schema'>>;
|
|
2172
|
+
|
|
2173
|
+
type MainCteExpression = {
|
|
2174
|
+
type: ResolvedExpressionType.CTE;
|
|
2175
|
+
cteName: string;
|
|
2176
|
+
value: Select;
|
|
2177
|
+
};
|
|
2178
|
+
|
|
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
|
+
|
|
2184
|
+
type CalculationOrderResult = {
|
|
2185
|
+
nativeColumns: Set<string>;
|
|
2186
|
+
formulaColumnsByDependencyLevel: IMDMColumnConfigWithParsedMeta[][];
|
|
2187
|
+
};
|
|
2188
|
+
|
|
2189
|
+
export enum DEFAULT_VALUE_TYPE {
|
|
2190
|
+
MANUAL = 'MANUAL',
|
|
2191
|
+
DERIVED = 'DERIVED',
|
|
2192
|
+
NONE = 'NONE',
|
|
2193
|
+
}
|
|
2194
|
+
|
|
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
|
+
|
|
2203
|
+
export const MAX_STRING_TYPE = 'nvarchar(max)';
|
|
2204
|
+
|
|
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
|
+
|
|
2220
|
+
constructor(options: QueryBuilderOptions) {
|
|
2221
|
+
this.options = options;
|
|
2222
|
+
this.paginationBuilder = createPaginationBuilder();
|
|
2223
|
+
}
|
|
2224
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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) => string;
|
|
2253
|
+
|
|
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 > 0;
|
|
2291
|
+
this.buildState.isSuperFilterPending = superFilters !== undefined;
|
|
2292
|
+
|
|
2293
|
+
// build main CTE and intermediate CTE for formula columns join relation
|
|
2294
|
+
const mainCteFormulas = joinRelation.length > 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
|
+
|
|
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<string>,
|
|
2310
|
+
): SortConfig | undefined {
|
|
2311
|
+
return sortConfig?.filter((s) => requestedColumns.has(s.column));
|
|
2312
|
+
}
|
|
2313
|
+
|
|
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<string>): void {
|
|
2318
|
+
const { filterConfig } = this.options;
|
|
2319
|
+
|
|
2320
|
+
if (!filterConfig) return;
|
|
2321
|
+
|
|
2322
|
+
const traverse = (rule: Rule | RuleGroup) => {
|
|
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
|
+
|
|
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
|
+
|
|
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 < 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
|
+
|
|
2350
|
+
if (lastColumnExprIndex === -1) {
|
|
2351
|
+
return [];
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
const columnExprsInFront = firstCalcOrderMembers.splice(0, lastColumnExprIndex + 1);
|
|
2355
|
+
if (firstCalcOrderMembers.length === 0) {
|
|
2356
|
+
calcOrderMembers.shift();
|
|
2357
|
+
}
|
|
2358
|
+
return columnExprsInFront;
|
|
2359
|
+
}
|
|
2360
|
+
|
|
2361
|
+
private buildMainCTE(
|
|
2362
|
+
nativeColumns: Set<string>,
|
|
2363
|
+
columnExprs: IMDMColumnConfigWithParsedMeta[],
|
|
2364
|
+
): MainCteExpression {
|
|
2365
|
+
const columnsInMainCTE = new Set([...nativeColumns, ...columnExprs.map((c) => c.columnName)]);
|
|
2366
|
+
const selectBuilder = new SelectBuilder();
|
|
2367
|
+
const { joinClauses } = this.options;
|
|
2368
|
+
const { alias } = joinClauses || {};
|
|
2369
|
+
const tableAlias = alias ? `${this.entityNameFormatter(alias)}.` : '';
|
|
2370
|
+
|
|
2371
|
+
const columns = Array.from(nativeColumns).map((c) => {
|
|
2372
|
+
const schemaMatch = this.options.schema?.find((s) => 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
|
+
|
|
2380
|
+
if (columnExprs.length) {<span class="branch-1 cbranch-no" title="branch not covered" ></span>
|
|
2381
|
+
columnExprs.forEach((c) => {
|
|
2382
|
+
const schemaMatch = this.options.schema?.find((s) => 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
|
+
|
|
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
|
+
|
|
2413
|
+
// Build filter condition
|
|
2414
|
+
const where = [];
|
|
2415
|
+
const filterCondition = this.getFilterExpression(columnsInMainCTE);
|
|
2416
|
+
if (filterCondition) {
|
|
2417
|
+
where.push(filterCondition);
|
|
2418
|
+
}
|
|
2419
|
+
|
|
2420
|
+
if (
|
|
2421
|
+
this.buildState.isSearchPending &&
|
|
2422
|
+
this.buildState.isSuperFilterPending === false &&
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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<string>): 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
|
+
|
|
2470
|
+
// extract pending filter config
|
|
2471
|
+
const filterConfigToProcess = this.buildState.pendingFilterConfig;
|
|
2472
|
+
|
|
2473
|
+
// Reset pending filter config
|
|
2474
|
+
this.buildState.pendingFilterConfig = {
|
|
2475
|
+
rules: [],
|
|
2476
|
+
combinator: filterConfig.combinator,
|
|
2477
|
+
not: filterConfig.not,
|
|
2478
|
+
};
|
|
2479
|
+
|
|
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) => {
|
|
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
|
+
|
|
2490
|
+
const schema = this.options.schema ?? [];
|
|
2491
|
+
const exists = schema.some((col) => 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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2522
|
+
/**
|
|
2523
|
+
* Returns the sort expression if each column in the sort config is part of selected columns
|
|
2524
|
+
*/
|
|
2525
|
+
private getSortExpression(columns: Set<string>): 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) => columns.has(s.column));
|
|
2538
|
+
this.buildState.pendingSortConfig = (this.buildState.pendingSortConfig ?? []).concat(
|
|
2539
|
+
selectedSortColumns,
|
|
2540
|
+
);
|
|
2541
|
+
|
|
2542
|
+
const hasPendingFilters = this.buildState.pendingFilterConfig.rules.length > 0;
|
|
2543
|
+
if (
|
|
2544
|
+
this.buildState.pendingSortConfig.length === sortConfig.length &&
|
|
2545
|
+
!hasPendingFilters &&
|
|
2546
|
+
!this.buildState.isSearchPending &&
|
|
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) => `${alias && !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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2601
|
+
const cteParts: string[] = [];
|
|
2602
|
+
formulaColumnsInCalcOrder.forEach((stageMembers) => {
|
|
2603
|
+
const pendingColumns: IMDMColumnConfigWithParsedMeta[] = [];
|
|
2604
|
+
|
|
2605
|
+
stageMembers.forEach((column) => {
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2655
|
+
return { type: ResolvedExpressionType.CTE, cteName: parentCTEName, value: cteParts };
|
|
2656
|
+
}
|
|
2657
|
+
|
|
2658
|
+
private addStagingCTE(
|
|
2659
|
+
parentCTEName: string,
|
|
2660
|
+
columnConfigs: IMDMColumnConfigWithParsedMeta[],
|
|
2661
|
+
): { cteName: string; expr: string } | undefined {
|
|
2662
|
+
const pendingColumnsSet = new Set(columnConfigs.map((config) => config.columnName));
|
|
2663
|
+
const sqlParts = this.buildSqlQueryParts(Array.from(pendingColumnsSet));
|
|
2664
|
+
|
|
2665
|
+
if (sqlParts.length !== 0 || columnConfigs.length !== 0) {
|
|
2666
|
+
const cteName = `cte_staging_${parentCTEName}`;
|
|
2667
|
+
const columnsToProject = [
|
|
2668
|
+
'*',
|
|
2669
|
+
...columnConfigs.map((config) => {
|
|
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
|
+
|
|
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
|
+
|
|
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
|
+
|
|
2705
|
+
if (
|
|
2706
|
+
sqlParts.length === 0 &&
|
|
2707
|
+
intermediateCTE.value.length === 0 &&
|
|
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 > 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
|
+
|
|
2741
|
+
column = `DISTINCT ${selectedColumns
|
|
2742
|
+
.map((c) => {
|
|
2743
|
+
const schemaMatch = this.options.schema?.find((s) => 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 && 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 === '*' && mainTableAlias ? `DISTINCT ${mainTableAlias}.*` : column;</span>
|
|
2773
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2774
|
+
if (isCountQuery && this.buildState.isSuperFilterPending) {
|
|
2775
|
+
<span class="cstat-no" title="statement not covered" > selectedColumn = mainTableAlias && !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
|
+
|
|
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
|
+
|
|
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 > se</span>lectedColumns.length) {
|
|
2816
|
+
mainCTE.value.columns = mainCTE.value.columns.filter((c) => {
|
|
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
|
+
|
|
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
|
+
|
|
2829
|
+
const columnValue =
|
|
2830
|
+
mainCTE.value.columns.length > 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
|
+
|
|
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) => `${alias ? `${this.entityNameFormatter(alias)}.` : ''}` + this.entityNameFormatter(c)).join(', ')} FROM ${fromName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''})`,
|
|
2847
|
+
],
|
|
2848
|
+
};
|
|
2849
|
+
}
|
|
2850
|
+
|
|
2851
|
+
private buildSqlQueryParts(columns: string[], isFinalProjection = false): string[] {
|
|
2852
|
+
const sqlParts = [];
|
|
2853
|
+
|
|
2854
|
+
const where = [];
|
|
2855
|
+
const filterCondition = this.getFilterExpression(new Set(columns));
|
|
2856
|
+
if (filterCondition) {
|
|
2857
|
+
where.push(filterCondition);
|
|
2858
|
+
}
|
|
2859
|
+
if (columns.length === 0 && this.buildState.isSuperFilterPending) {
|
|
2860
|
+
const superFilterCondition = this.getSuperFilterExpression(isFinalProjection);
|
|
2861
|
+
if (superFilterCondition) {
|
|
2862
|
+
where.push(superFilterCondition);
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
if (columns.length === 0 && 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
|
+
|
|
2873
|
+
const sortExpression = this.getSortExpression(new Set(columns));
|
|
2874
|
+
if (sortExpression) {
|
|
2875
|
+
sqlParts.push(`ORDER BY ${sortExpression}`);
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2878
|
+
const paginationExpression = this.getPaginationExpression();
|
|
2879
|
+
if (paginationExpression) {
|
|
2880
|
+
sqlParts.push(paginationExpression);
|
|
2881
|
+
}
|
|
2882
|
+
|
|
2883
|
+
return sqlParts;
|
|
2884
|
+
}
|
|
2885
|
+
|
|
2886
|
+
/**
|
|
2887
|
+
* Returns the calculation order for the given columns
|
|
2888
|
+
* @private exposed for testing
|
|
2889
|
+
*/
|
|
2890
|
+
public getCalculationOrder(columns: Set<string>): CalculationOrderResult {
|
|
2891
|
+
const state = {
|
|
2892
|
+
dependencyLevel: -1,
|
|
2893
|
+
dependencyLevelMap: new Map<string, number>(),
|
|
2894
|
+
nativeColumns: new Set<string>(),
|
|
2895
|
+
visited: new Set<string>(),
|
|
2896
|
+
};
|
|
2897
|
+
|
|
2898
|
+
// trigger dependency tracing for each column
|
|
2899
|
+
columns.forEach((columnName) => {
|
|
2900
|
+
state.dependencyLevel = -1; // reset dependency level for each column
|
|
2901
|
+
this.dfs(columnName, state);
|
|
2902
|
+
});
|
|
2903
|
+
|
|
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 >= formulaColumnsByDependencyLevel.length) {
|
|
2909
|
+
formulaColumnsByDependencyLevel.push([]);
|
|
2910
|
+
}
|
|
2911
|
+
formulaColumnsByDependencyLevel[level].push(columnConfig);
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2914
|
+
return {
|
|
2915
|
+
nativeColumns: state.nativeColumns,
|
|
2916
|
+
formulaColumnsByDependencyLevel,
|
|
2917
|
+
};
|
|
2918
|
+
}
|
|
2919
|
+
|
|
2920
|
+
private dfs(
|
|
2921
|
+
columnName: string,
|
|
2922
|
+
state: {
|
|
2923
|
+
dependencyLevel: number;
|
|
2924
|
+
dependencyLevelMap: Map<string, number>;
|
|
2925
|
+
nativeColumns: Set<string>;
|
|
2926
|
+
visited: Set<string>;
|
|
2927
|
+
},
|
|
2928
|
+
) {
|
|
2929
|
+
// If dependency level is already resolved, return
|
|
2930
|
+
const level = state.dependencyLevelMap.get(columnName);
|
|
2931
|
+
if (level !== undefined) {
|
|
2932
|
+
if (level > state.dependencyLevel) {
|
|
2933
|
+
state.dependencyLevel = level;
|
|
2934
|
+
}
|
|
2935
|
+
return;
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
if (state.visited.has(columnName)) {
|
|
2939
|
+
throw new Error(`Cycle detected in formula dependencies: ${columnName}`);
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
const columnConfig = this.options.columnConfigMap[columnName];
|
|
2943
|
+
const { columnType, columnMeta } = columnConfig;
|
|
2944
|
+
const { sqlQueryProps, isCustomColumn, deps, defaultValueType } = columnMeta;
|
|
2945
|
+
|
|
2946
|
+
const isNativeColumn =
|
|
2947
|
+
columnType !== MDM_COLUMN_TYPE.FORMULA && defaultValueType !== DEFAULT_VALUE_TYPE.DERIVED;
|
|
2948
|
+
const isFormulaDbColumn =
|
|
2949
|
+
columnType === MDM_COLUMN_TYPE.FORMULA && !sqlQueryProps && !isCustomColumn && !deps;
|
|
2950
|
+
const isDerivedDbColumn =
|
|
2951
|
+
defaultValueType === DEFAULT_VALUE_TYPE.DERIVED && !sqlQueryProps && !deps;
|
|
2952
|
+
|
|
2953
|
+
if (isNativeColumn || isFormulaDbColumn || isDerivedDbColumn) {
|
|
2954
|
+
state.nativeColumns.add(columnName);
|
|
2955
|
+
return;
|
|
2956
|
+
}
|
|
2957
|
+
|
|
2958
|
+
// Skip processing to maintain backward compatibility with older formula visual columns
|
|
2959
|
+
if (columnType === MDM_COLUMN_TYPE.FORMULA && isCustomColumn && !sqlQueryProps) {
|
|
2960
|
+
return;
|
|
2961
|
+
}
|
|
2962
|
+
|
|
2963
|
+
state.visited.add(columnName);
|
|
2964
|
+
deps?.forEach((colName) => {
|
|
2965
|
+
this.dfs(colName, state);
|
|
2966
|
+
});
|
|
2967
|
+
|
|
2968
|
+
state.visited.delete(columnName);
|
|
2969
|
+
state.dependencyLevelMap.set(columnName, ++state.dependencyLevel);
|
|
2970
|
+
}
|
|
2971
|
+
|
|
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) => {
|
|
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
|
+
|
|
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
|
+
|
|
3005
|
+
const { children } = superFilters;
|
|
3006
|
+
const { rankingFilters, nonRankingFilters } = children.reduce(
|
|
3007
|
+
(acc, child) => {
|
|
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
|
+
|
|
3022
|
+
let activeFilters = { ...superFilters, children: nonRankingFilters };
|
|
3023
|
+
let joinClauses = this.options.joinClauses;
|
|
3024
|
+
|
|
3025
|
+
// Process ranking filters if pending and available
|
|
3026
|
+
if (rankingFilters.length && isFinalProjection && 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
|
+
|
|
3043
|
+
return '';
|
|
3044
|
+
}
|
|
3045
|
+
|
|
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 && !isCountQuery) {
|
|
3055
|
+
selectQuery = `DISTINCT ${selectedColumns
|
|
3056
|
+
.map((c) => {
|
|
3057
|
+
const schemaMatch = this.options.schema?.find((s) => s.name === c);
|
|
3058
|
+
return this.entityNameFormatter(c, schemaMatch?.type ?? '');
|
|
3059
|
+
})
|
|
3060
|
+
.join(', ')}`;
|
|
3061
|
+
}
|
|
3062
|
+
|
|
3063
|
+
const finalCteName = `${currentCteName}_main_cte`;
|
|
3064
|
+
const cteDefinition = `${finalCteName} AS (${selectProjection})`;
|
|
3065
|
+
|
|
3066
|
+
const columns = isCountQuery ? `COUNT(${selectQuery}) AS row_count` : `${selectQuery}`;
|
|
3067
|
+
const sqlParts = this.buildSqlQueryParts([], true);
|
|
3068
|
+
|
|
3069
|
+
this.buildState.isSuperFilterPending = false;
|
|
3070
|
+
|
|
3071
|
+
const finalQuery = `SELECT ${columns} FROM ${finalCteName}${sqlParts.length ? ' ' + sqlParts.join(' ') : ''}`;
|
|
3072
|
+
|
|
3073
|
+
return { cteDefinition, finalQuery, finalCteName };
|
|
3074
|
+
}
|
|
3075
|
+
|
|
3076
|
+
private filterRequiredColumns(): Set<string> {
|
|
3077
|
+
const { selectedColumns, superFilters, primaryKeyColumns, sortConfig = [] } = this.options;
|
|
3078
|
+
const requiredColumn = new Set<string>(selectedColumns);
|
|
3079
|
+
if (superFilters?.children?.length) {
|
|
3080
|
+
// Collect all columnIds from superFilters
|
|
3081
|
+
(superFilters?.children as { filters: IGroupFilter }[])?.forEach((child) => {
|
|
3082
|
+
const filterColumn = child.filters?.columnIds?.[0];
|
|
3083
|
+
if (filterColumn) requiredColumn.add(filterColumn);
|
|
3084
|
+
child?.filters?.rankingFilter?.forEach?.((rank) => {
|
|
3085
|
+
if (rank?.rankByColumnName) requiredColumn.add(rank.rankByColumnName);
|
|
3086
|
+
});
|
|
3087
|
+
});
|
|
3088
|
+
primaryKeyColumns.forEach((col) => {
|
|
3089
|
+
requiredColumn.add(col);
|
|
3090
|
+
});
|
|
3091
|
+
sortConfig.forEach((col) => {
|
|
3092
|
+
requiredColumn.add(col?.column);
|
|
3093
|
+
});
|
|
3094
|
+
}
|
|
3095
|
+
|
|
3096
|
+
return new Set(requiredColumn);
|
|
3097
|
+
}
|
|
3098
|
+
}
|
|
3099
|
+
</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
|
+
|