@deepkit/http 1.0.1-alpha.68 → 1.0.1-alpha.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/cjs/src/decorator.d.ts +8 -6
  2. package/dist/cjs/src/decorator.js +49 -12
  3. package/dist/cjs/src/decorator.js.map +1 -1
  4. package/dist/cjs/src/filter.d.ts +3 -3
  5. package/dist/cjs/src/filter.js +3 -3
  6. package/dist/cjs/src/filter.js.map +1 -1
  7. package/dist/cjs/src/http.d.ts +49 -11
  8. package/dist/cjs/src/http.js +128 -37
  9. package/dist/cjs/src/http.js.map +1 -1
  10. package/dist/cjs/src/kernel.d.ts +3 -3
  11. package/dist/cjs/src/kernel.js +1 -1
  12. package/dist/cjs/src/kernel.js.map +1 -1
  13. package/dist/cjs/src/model.d.ts +11 -3
  14. package/dist/cjs/src/model.js +58 -26
  15. package/dist/cjs/src/model.js.map +1 -1
  16. package/dist/cjs/src/module.js +5 -3
  17. package/dist/cjs/src/module.js.map +1 -1
  18. package/dist/cjs/src/router.d.ts +84 -11
  19. package/dist/cjs/src/router.js +280 -94
  20. package/dist/cjs/src/router.js.map +1 -1
  21. package/dist/cjs/src/static-serving.js +15 -8
  22. package/dist/cjs/src/static-serving.js.map +1 -1
  23. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  24. package/dist/esm/src/decorator.d.ts +8 -6
  25. package/dist/esm/src/decorator.js +47 -11
  26. package/dist/esm/src/decorator.js.map +1 -1
  27. package/dist/esm/src/filter.d.ts +3 -3
  28. package/dist/esm/src/filter.js +4 -4
  29. package/dist/esm/src/filter.js.map +1 -1
  30. package/dist/esm/src/http.d.ts +49 -11
  31. package/dist/esm/src/http.js +101 -23
  32. package/dist/esm/src/http.js.map +1 -1
  33. package/dist/esm/src/kernel.d.ts +3 -3
  34. package/dist/esm/src/kernel.js +2 -2
  35. package/dist/esm/src/kernel.js.map +1 -1
  36. package/dist/esm/src/model.d.ts +11 -3
  37. package/dist/esm/src/model.js +47 -15
  38. package/dist/esm/src/model.js.map +1 -1
  39. package/dist/esm/src/module.js +5 -3
  40. package/dist/esm/src/module.js.map +1 -1
  41. package/dist/esm/src/router.d.ts +84 -11
  42. package/dist/esm/src/router.js +278 -94
  43. package/dist/esm/src/router.js.map +1 -1
  44. package/dist/esm/src/static-serving.js +16 -9
  45. package/dist/esm/src/static-serving.js.map +1 -1
  46. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  47. package/package.json +17 -14
  48. package/src/decorator.ts +9 -6
  49. package/src/filter.ts +4 -4
  50. package/src/http.ts +88 -15
  51. package/src/kernel.ts +2 -2
  52. package/src/model.ts +35 -6
  53. package/src/module.ts +5 -3
  54. package/src/router.ts +286 -73
  55. package/src/static-serving.ts +6 -3
  56. package/coverage/clover.xml +0 -1086
  57. package/coverage/coverage-final.json +0 -12
  58. package/coverage/lcov-report/base.css +0 -224
  59. package/coverage/lcov-report/block-navigation.js +0 -79
  60. package/coverage/lcov-report/favicon.png +0 -0
  61. package/coverage/lcov-report/index.html +0 -126
  62. package/coverage/lcov-report/prettify.css +0 -1
  63. package/coverage/lcov-report/prettify.js +0 -2
  64. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  65. package/coverage/lcov-report/sorter.js +0 -170
  66. package/coverage/lcov-report/src/controllers.ts.html +0 -113
  67. package/coverage/lcov-report/src/decorator.ts.html +0 -1280
  68. package/coverage/lcov-report/src/filter.ts.html +0 -734
  69. package/coverage/lcov-report/src/http.ts.html +0 -2192
  70. package/coverage/lcov-report/src/index.html +0 -246
  71. package/coverage/lcov-report/src/kernel.ts.html +0 -260
  72. package/coverage/lcov-report/src/middleware.ts.html +0 -428
  73. package/coverage/lcov-report/src/model.ts.html +0 -937
  74. package/coverage/lcov-report/src/module.config.ts.html +0 -89
  75. package/coverage/lcov-report/src/module.ts.html +0 -245
  76. package/coverage/lcov-report/src/router.ts.html +0 -2318
  77. package/coverage/lcov-report/tests/index.html +0 -111
  78. package/coverage/lcov-report/tests/utils.ts.html +0 -176
  79. package/coverage/lcov.info +0 -2225
  80. package/dist/cjs/tests/filter.spec.d.ts +0 -1
  81. package/dist/cjs/tests/filter.spec.js +0 -251
  82. package/dist/cjs/tests/filter.spec.js.map +0 -1
  83. package/dist/cjs/tests/middleware.spec.d.ts +0 -1
  84. package/dist/cjs/tests/middleware.spec.js +0 -471
  85. package/dist/cjs/tests/middleware.spec.js.map +0 -1
  86. package/dist/cjs/tests/model.spec.d.ts +0 -1
  87. package/dist/cjs/tests/model.spec.js +0 -23
  88. package/dist/cjs/tests/model.spec.js.map +0 -1
  89. package/dist/cjs/tests/module.spec.d.ts +0 -1
  90. package/dist/cjs/tests/module.spec.js +0 -46
  91. package/dist/cjs/tests/module.spec.js.map +0 -1
  92. package/dist/cjs/tests/router.spec.d.ts +0 -1
  93. package/dist/cjs/tests/router.spec.js +0 -987
  94. package/dist/cjs/tests/router.spec.js.map +0 -1
  95. package/dist/cjs/tests/utils.d.ts +0 -8
  96. package/dist/cjs/tests/utils.js +0 -30
  97. package/dist/cjs/tests/utils.js.map +0 -1
  98. package/dist/esm/tests/filter.spec.d.ts +0 -1
  99. package/dist/esm/tests/filter.spec.js +0 -249
  100. package/dist/esm/tests/filter.spec.js.map +0 -1
  101. package/dist/esm/tests/middleware.spec.d.ts +0 -1
  102. package/dist/esm/tests/middleware.spec.js +0 -469
  103. package/dist/esm/tests/middleware.spec.js.map +0 -1
  104. package/dist/esm/tests/model.spec.d.ts +0 -1
  105. package/dist/esm/tests/model.spec.js +0 -21
  106. package/dist/esm/tests/model.spec.js.map +0 -1
  107. package/dist/esm/tests/module.spec.d.ts +0 -1
  108. package/dist/esm/tests/module.spec.js +0 -44
  109. package/dist/esm/tests/module.spec.js.map +0 -1
  110. package/dist/esm/tests/router.spec.d.ts +0 -1
  111. package/dist/esm/tests/router.spec.js +0 -985
  112. package/dist/esm/tests/router.spec.js.map +0 -1
  113. package/dist/esm/tests/utils.d.ts +0 -8
  114. package/dist/esm/tests/utils.js +0 -26
  115. package/dist/esm/tests/utils.js.map +0 -1
  116. package/tests/filter.spec.ts +0 -181
  117. package/tests/middleware.spec.ts +0 -440
  118. package/tests/model.spec.ts +0 -26
  119. package/tests/module.spec.ts +0 -32
  120. package/tests/router.spec.ts +0 -781
  121. package/tests/utils.ts +0 -32
@@ -1,2318 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/router.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</a> router.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">53.14% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>186/350</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">18.27% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>36/197</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">53.06% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>26/49</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">56.77% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>176/310</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
- </div>
58
- <div class='status-line medium'></div>
59
- <pre><table class="coverage">
60
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
- <a name='L2'></a><a href='#L2'>2</a>
62
- <a name='L3'></a><a href='#L3'>3</a>
63
- <a name='L4'></a><a href='#L4'>4</a>
64
- <a name='L5'></a><a href='#L5'>5</a>
65
- <a name='L6'></a><a href='#L6'>6</a>
66
- <a name='L7'></a><a href='#L7'>7</a>
67
- <a name='L8'></a><a href='#L8'>8</a>
68
- <a name='L9'></a><a href='#L9'>9</a>
69
- <a name='L10'></a><a href='#L10'>10</a>
70
- <a name='L11'></a><a href='#L11'>11</a>
71
- <a name='L12'></a><a href='#L12'>12</a>
72
- <a name='L13'></a><a href='#L13'>13</a>
73
- <a name='L14'></a><a href='#L14'>14</a>
74
- <a name='L15'></a><a href='#L15'>15</a>
75
- <a name='L16'></a><a href='#L16'>16</a>
76
- <a name='L17'></a><a href='#L17'>17</a>
77
- <a name='L18'></a><a href='#L18'>18</a>
78
- <a name='L19'></a><a href='#L19'>19</a>
79
- <a name='L20'></a><a href='#L20'>20</a>
80
- <a name='L21'></a><a href='#L21'>21</a>
81
- <a name='L22'></a><a href='#L22'>22</a>
82
- <a name='L23'></a><a href='#L23'>23</a>
83
- <a name='L24'></a><a href='#L24'>24</a>
84
- <a name='L25'></a><a href='#L25'>25</a>
85
- <a name='L26'></a><a href='#L26'>26</a>
86
- <a name='L27'></a><a href='#L27'>27</a>
87
- <a name='L28'></a><a href='#L28'>28</a>
88
- <a name='L29'></a><a href='#L29'>29</a>
89
- <a name='L30'></a><a href='#L30'>30</a>
90
- <a name='L31'></a><a href='#L31'>31</a>
91
- <a name='L32'></a><a href='#L32'>32</a>
92
- <a name='L33'></a><a href='#L33'>33</a>
93
- <a name='L34'></a><a href='#L34'>34</a>
94
- <a name='L35'></a><a href='#L35'>35</a>
95
- <a name='L36'></a><a href='#L36'>36</a>
96
- <a name='L37'></a><a href='#L37'>37</a>
97
- <a name='L38'></a><a href='#L38'>38</a>
98
- <a name='L39'></a><a href='#L39'>39</a>
99
- <a name='L40'></a><a href='#L40'>40</a>
100
- <a name='L41'></a><a href='#L41'>41</a>
101
- <a name='L42'></a><a href='#L42'>42</a>
102
- <a name='L43'></a><a href='#L43'>43</a>
103
- <a name='L44'></a><a href='#L44'>44</a>
104
- <a name='L45'></a><a href='#L45'>45</a>
105
- <a name='L46'></a><a href='#L46'>46</a>
106
- <a name='L47'></a><a href='#L47'>47</a>
107
- <a name='L48'></a><a href='#L48'>48</a>
108
- <a name='L49'></a><a href='#L49'>49</a>
109
- <a name='L50'></a><a href='#L50'>50</a>
110
- <a name='L51'></a><a href='#L51'>51</a>
111
- <a name='L52'></a><a href='#L52'>52</a>
112
- <a name='L53'></a><a href='#L53'>53</a>
113
- <a name='L54'></a><a href='#L54'>54</a>
114
- <a name='L55'></a><a href='#L55'>55</a>
115
- <a name='L56'></a><a href='#L56'>56</a>
116
- <a name='L57'></a><a href='#L57'>57</a>
117
- <a name='L58'></a><a href='#L58'>58</a>
118
- <a name='L59'></a><a href='#L59'>59</a>
119
- <a name='L60'></a><a href='#L60'>60</a>
120
- <a name='L61'></a><a href='#L61'>61</a>
121
- <a name='L62'></a><a href='#L62'>62</a>
122
- <a name='L63'></a><a href='#L63'>63</a>
123
- <a name='L64'></a><a href='#L64'>64</a>
124
- <a name='L65'></a><a href='#L65'>65</a>
125
- <a name='L66'></a><a href='#L66'>66</a>
126
- <a name='L67'></a><a href='#L67'>67</a>
127
- <a name='L68'></a><a href='#L68'>68</a>
128
- <a name='L69'></a><a href='#L69'>69</a>
129
- <a name='L70'></a><a href='#L70'>70</a>
130
- <a name='L71'></a><a href='#L71'>71</a>
131
- <a name='L72'></a><a href='#L72'>72</a>
132
- <a name='L73'></a><a href='#L73'>73</a>
133
- <a name='L74'></a><a href='#L74'>74</a>
134
- <a name='L75'></a><a href='#L75'>75</a>
135
- <a name='L76'></a><a href='#L76'>76</a>
136
- <a name='L77'></a><a href='#L77'>77</a>
137
- <a name='L78'></a><a href='#L78'>78</a>
138
- <a name='L79'></a><a href='#L79'>79</a>
139
- <a name='L80'></a><a href='#L80'>80</a>
140
- <a name='L81'></a><a href='#L81'>81</a>
141
- <a name='L82'></a><a href='#L82'>82</a>
142
- <a name='L83'></a><a href='#L83'>83</a>
143
- <a name='L84'></a><a href='#L84'>84</a>
144
- <a name='L85'></a><a href='#L85'>85</a>
145
- <a name='L86'></a><a href='#L86'>86</a>
146
- <a name='L87'></a><a href='#L87'>87</a>
147
- <a name='L88'></a><a href='#L88'>88</a>
148
- <a name='L89'></a><a href='#L89'>89</a>
149
- <a name='L90'></a><a href='#L90'>90</a>
150
- <a name='L91'></a><a href='#L91'>91</a>
151
- <a name='L92'></a><a href='#L92'>92</a>
152
- <a name='L93'></a><a href='#L93'>93</a>
153
- <a name='L94'></a><a href='#L94'>94</a>
154
- <a name='L95'></a><a href='#L95'>95</a>
155
- <a name='L96'></a><a href='#L96'>96</a>
156
- <a name='L97'></a><a href='#L97'>97</a>
157
- <a name='L98'></a><a href='#L98'>98</a>
158
- <a name='L99'></a><a href='#L99'>99</a>
159
- <a name='L100'></a><a href='#L100'>100</a>
160
- <a name='L101'></a><a href='#L101'>101</a>
161
- <a name='L102'></a><a href='#L102'>102</a>
162
- <a name='L103'></a><a href='#L103'>103</a>
163
- <a name='L104'></a><a href='#L104'>104</a>
164
- <a name='L105'></a><a href='#L105'>105</a>
165
- <a name='L106'></a><a href='#L106'>106</a>
166
- <a name='L107'></a><a href='#L107'>107</a>
167
- <a name='L108'></a><a href='#L108'>108</a>
168
- <a name='L109'></a><a href='#L109'>109</a>
169
- <a name='L110'></a><a href='#L110'>110</a>
170
- <a name='L111'></a><a href='#L111'>111</a>
171
- <a name='L112'></a><a href='#L112'>112</a>
172
- <a name='L113'></a><a href='#L113'>113</a>
173
- <a name='L114'></a><a href='#L114'>114</a>
174
- <a name='L115'></a><a href='#L115'>115</a>
175
- <a name='L116'></a><a href='#L116'>116</a>
176
- <a name='L117'></a><a href='#L117'>117</a>
177
- <a name='L118'></a><a href='#L118'>118</a>
178
- <a name='L119'></a><a href='#L119'>119</a>
179
- <a name='L120'></a><a href='#L120'>120</a>
180
- <a name='L121'></a><a href='#L121'>121</a>
181
- <a name='L122'></a><a href='#L122'>122</a>
182
- <a name='L123'></a><a href='#L123'>123</a>
183
- <a name='L124'></a><a href='#L124'>124</a>
184
- <a name='L125'></a><a href='#L125'>125</a>
185
- <a name='L126'></a><a href='#L126'>126</a>
186
- <a name='L127'></a><a href='#L127'>127</a>
187
- <a name='L128'></a><a href='#L128'>128</a>
188
- <a name='L129'></a><a href='#L129'>129</a>
189
- <a name='L130'></a><a href='#L130'>130</a>
190
- <a name='L131'></a><a href='#L131'>131</a>
191
- <a name='L132'></a><a href='#L132'>132</a>
192
- <a name='L133'></a><a href='#L133'>133</a>
193
- <a name='L134'></a><a href='#L134'>134</a>
194
- <a name='L135'></a><a href='#L135'>135</a>
195
- <a name='L136'></a><a href='#L136'>136</a>
196
- <a name='L137'></a><a href='#L137'>137</a>
197
- <a name='L138'></a><a href='#L138'>138</a>
198
- <a name='L139'></a><a href='#L139'>139</a>
199
- <a name='L140'></a><a href='#L140'>140</a>
200
- <a name='L141'></a><a href='#L141'>141</a>
201
- <a name='L142'></a><a href='#L142'>142</a>
202
- <a name='L143'></a><a href='#L143'>143</a>
203
- <a name='L144'></a><a href='#L144'>144</a>
204
- <a name='L145'></a><a href='#L145'>145</a>
205
- <a name='L146'></a><a href='#L146'>146</a>
206
- <a name='L147'></a><a href='#L147'>147</a>
207
- <a name='L148'></a><a href='#L148'>148</a>
208
- <a name='L149'></a><a href='#L149'>149</a>
209
- <a name='L150'></a><a href='#L150'>150</a>
210
- <a name='L151'></a><a href='#L151'>151</a>
211
- <a name='L152'></a><a href='#L152'>152</a>
212
- <a name='L153'></a><a href='#L153'>153</a>
213
- <a name='L154'></a><a href='#L154'>154</a>
214
- <a name='L155'></a><a href='#L155'>155</a>
215
- <a name='L156'></a><a href='#L156'>156</a>
216
- <a name='L157'></a><a href='#L157'>157</a>
217
- <a name='L158'></a><a href='#L158'>158</a>
218
- <a name='L159'></a><a href='#L159'>159</a>
219
- <a name='L160'></a><a href='#L160'>160</a>
220
- <a name='L161'></a><a href='#L161'>161</a>
221
- <a name='L162'></a><a href='#L162'>162</a>
222
- <a name='L163'></a><a href='#L163'>163</a>
223
- <a name='L164'></a><a href='#L164'>164</a>
224
- <a name='L165'></a><a href='#L165'>165</a>
225
- <a name='L166'></a><a href='#L166'>166</a>
226
- <a name='L167'></a><a href='#L167'>167</a>
227
- <a name='L168'></a><a href='#L168'>168</a>
228
- <a name='L169'></a><a href='#L169'>169</a>
229
- <a name='L170'></a><a href='#L170'>170</a>
230
- <a name='L171'></a><a href='#L171'>171</a>
231
- <a name='L172'></a><a href='#L172'>172</a>
232
- <a name='L173'></a><a href='#L173'>173</a>
233
- <a name='L174'></a><a href='#L174'>174</a>
234
- <a name='L175'></a><a href='#L175'>175</a>
235
- <a name='L176'></a><a href='#L176'>176</a>
236
- <a name='L177'></a><a href='#L177'>177</a>
237
- <a name='L178'></a><a href='#L178'>178</a>
238
- <a name='L179'></a><a href='#L179'>179</a>
239
- <a name='L180'></a><a href='#L180'>180</a>
240
- <a name='L181'></a><a href='#L181'>181</a>
241
- <a name='L182'></a><a href='#L182'>182</a>
242
- <a name='L183'></a><a href='#L183'>183</a>
243
- <a name='L184'></a><a href='#L184'>184</a>
244
- <a name='L185'></a><a href='#L185'>185</a>
245
- <a name='L186'></a><a href='#L186'>186</a>
246
- <a name='L187'></a><a href='#L187'>187</a>
247
- <a name='L188'></a><a href='#L188'>188</a>
248
- <a name='L189'></a><a href='#L189'>189</a>
249
- <a name='L190'></a><a href='#L190'>190</a>
250
- <a name='L191'></a><a href='#L191'>191</a>
251
- <a name='L192'></a><a href='#L192'>192</a>
252
- <a name='L193'></a><a href='#L193'>193</a>
253
- <a name='L194'></a><a href='#L194'>194</a>
254
- <a name='L195'></a><a href='#L195'>195</a>
255
- <a name='L196'></a><a href='#L196'>196</a>
256
- <a name='L197'></a><a href='#L197'>197</a>
257
- <a name='L198'></a><a href='#L198'>198</a>
258
- <a name='L199'></a><a href='#L199'>199</a>
259
- <a name='L200'></a><a href='#L200'>200</a>
260
- <a name='L201'></a><a href='#L201'>201</a>
261
- <a name='L202'></a><a href='#L202'>202</a>
262
- <a name='L203'></a><a href='#L203'>203</a>
263
- <a name='L204'></a><a href='#L204'>204</a>
264
- <a name='L205'></a><a href='#L205'>205</a>
265
- <a name='L206'></a><a href='#L206'>206</a>
266
- <a name='L207'></a><a href='#L207'>207</a>
267
- <a name='L208'></a><a href='#L208'>208</a>
268
- <a name='L209'></a><a href='#L209'>209</a>
269
- <a name='L210'></a><a href='#L210'>210</a>
270
- <a name='L211'></a><a href='#L211'>211</a>
271
- <a name='L212'></a><a href='#L212'>212</a>
272
- <a name='L213'></a><a href='#L213'>213</a>
273
- <a name='L214'></a><a href='#L214'>214</a>
274
- <a name='L215'></a><a href='#L215'>215</a>
275
- <a name='L216'></a><a href='#L216'>216</a>
276
- <a name='L217'></a><a href='#L217'>217</a>
277
- <a name='L218'></a><a href='#L218'>218</a>
278
- <a name='L219'></a><a href='#L219'>219</a>
279
- <a name='L220'></a><a href='#L220'>220</a>
280
- <a name='L221'></a><a href='#L221'>221</a>
281
- <a name='L222'></a><a href='#L222'>222</a>
282
- <a name='L223'></a><a href='#L223'>223</a>
283
- <a name='L224'></a><a href='#L224'>224</a>
284
- <a name='L225'></a><a href='#L225'>225</a>
285
- <a name='L226'></a><a href='#L226'>226</a>
286
- <a name='L227'></a><a href='#L227'>227</a>
287
- <a name='L228'></a><a href='#L228'>228</a>
288
- <a name='L229'></a><a href='#L229'>229</a>
289
- <a name='L230'></a><a href='#L230'>230</a>
290
- <a name='L231'></a><a href='#L231'>231</a>
291
- <a name='L232'></a><a href='#L232'>232</a>
292
- <a name='L233'></a><a href='#L233'>233</a>
293
- <a name='L234'></a><a href='#L234'>234</a>
294
- <a name='L235'></a><a href='#L235'>235</a>
295
- <a name='L236'></a><a href='#L236'>236</a>
296
- <a name='L237'></a><a href='#L237'>237</a>
297
- <a name='L238'></a><a href='#L238'>238</a>
298
- <a name='L239'></a><a href='#L239'>239</a>
299
- <a name='L240'></a><a href='#L240'>240</a>
300
- <a name='L241'></a><a href='#L241'>241</a>
301
- <a name='L242'></a><a href='#L242'>242</a>
302
- <a name='L243'></a><a href='#L243'>243</a>
303
- <a name='L244'></a><a href='#L244'>244</a>
304
- <a name='L245'></a><a href='#L245'>245</a>
305
- <a name='L246'></a><a href='#L246'>246</a>
306
- <a name='L247'></a><a href='#L247'>247</a>
307
- <a name='L248'></a><a href='#L248'>248</a>
308
- <a name='L249'></a><a href='#L249'>249</a>
309
- <a name='L250'></a><a href='#L250'>250</a>
310
- <a name='L251'></a><a href='#L251'>251</a>
311
- <a name='L252'></a><a href='#L252'>252</a>
312
- <a name='L253'></a><a href='#L253'>253</a>
313
- <a name='L254'></a><a href='#L254'>254</a>
314
- <a name='L255'></a><a href='#L255'>255</a>
315
- <a name='L256'></a><a href='#L256'>256</a>
316
- <a name='L257'></a><a href='#L257'>257</a>
317
- <a name='L258'></a><a href='#L258'>258</a>
318
- <a name='L259'></a><a href='#L259'>259</a>
319
- <a name='L260'></a><a href='#L260'>260</a>
320
- <a name='L261'></a><a href='#L261'>261</a>
321
- <a name='L262'></a><a href='#L262'>262</a>
322
- <a name='L263'></a><a href='#L263'>263</a>
323
- <a name='L264'></a><a href='#L264'>264</a>
324
- <a name='L265'></a><a href='#L265'>265</a>
325
- <a name='L266'></a><a href='#L266'>266</a>
326
- <a name='L267'></a><a href='#L267'>267</a>
327
- <a name='L268'></a><a href='#L268'>268</a>
328
- <a name='L269'></a><a href='#L269'>269</a>
329
- <a name='L270'></a><a href='#L270'>270</a>
330
- <a name='L271'></a><a href='#L271'>271</a>
331
- <a name='L272'></a><a href='#L272'>272</a>
332
- <a name='L273'></a><a href='#L273'>273</a>
333
- <a name='L274'></a><a href='#L274'>274</a>
334
- <a name='L275'></a><a href='#L275'>275</a>
335
- <a name='L276'></a><a href='#L276'>276</a>
336
- <a name='L277'></a><a href='#L277'>277</a>
337
- <a name='L278'></a><a href='#L278'>278</a>
338
- <a name='L279'></a><a href='#L279'>279</a>
339
- <a name='L280'></a><a href='#L280'>280</a>
340
- <a name='L281'></a><a href='#L281'>281</a>
341
- <a name='L282'></a><a href='#L282'>282</a>
342
- <a name='L283'></a><a href='#L283'>283</a>
343
- <a name='L284'></a><a href='#L284'>284</a>
344
- <a name='L285'></a><a href='#L285'>285</a>
345
- <a name='L286'></a><a href='#L286'>286</a>
346
- <a name='L287'></a><a href='#L287'>287</a>
347
- <a name='L288'></a><a href='#L288'>288</a>
348
- <a name='L289'></a><a href='#L289'>289</a>
349
- <a name='L290'></a><a href='#L290'>290</a>
350
- <a name='L291'></a><a href='#L291'>291</a>
351
- <a name='L292'></a><a href='#L292'>292</a>
352
- <a name='L293'></a><a href='#L293'>293</a>
353
- <a name='L294'></a><a href='#L294'>294</a>
354
- <a name='L295'></a><a href='#L295'>295</a>
355
- <a name='L296'></a><a href='#L296'>296</a>
356
- <a name='L297'></a><a href='#L297'>297</a>
357
- <a name='L298'></a><a href='#L298'>298</a>
358
- <a name='L299'></a><a href='#L299'>299</a>
359
- <a name='L300'></a><a href='#L300'>300</a>
360
- <a name='L301'></a><a href='#L301'>301</a>
361
- <a name='L302'></a><a href='#L302'>302</a>
362
- <a name='L303'></a><a href='#L303'>303</a>
363
- <a name='L304'></a><a href='#L304'>304</a>
364
- <a name='L305'></a><a href='#L305'>305</a>
365
- <a name='L306'></a><a href='#L306'>306</a>
366
- <a name='L307'></a><a href='#L307'>307</a>
367
- <a name='L308'></a><a href='#L308'>308</a>
368
- <a name='L309'></a><a href='#L309'>309</a>
369
- <a name='L310'></a><a href='#L310'>310</a>
370
- <a name='L311'></a><a href='#L311'>311</a>
371
- <a name='L312'></a><a href='#L312'>312</a>
372
- <a name='L313'></a><a href='#L313'>313</a>
373
- <a name='L314'></a><a href='#L314'>314</a>
374
- <a name='L315'></a><a href='#L315'>315</a>
375
- <a name='L316'></a><a href='#L316'>316</a>
376
- <a name='L317'></a><a href='#L317'>317</a>
377
- <a name='L318'></a><a href='#L318'>318</a>
378
- <a name='L319'></a><a href='#L319'>319</a>
379
- <a name='L320'></a><a href='#L320'>320</a>
380
- <a name='L321'></a><a href='#L321'>321</a>
381
- <a name='L322'></a><a href='#L322'>322</a>
382
- <a name='L323'></a><a href='#L323'>323</a>
383
- <a name='L324'></a><a href='#L324'>324</a>
384
- <a name='L325'></a><a href='#L325'>325</a>
385
- <a name='L326'></a><a href='#L326'>326</a>
386
- <a name='L327'></a><a href='#L327'>327</a>
387
- <a name='L328'></a><a href='#L328'>328</a>
388
- <a name='L329'></a><a href='#L329'>329</a>
389
- <a name='L330'></a><a href='#L330'>330</a>
390
- <a name='L331'></a><a href='#L331'>331</a>
391
- <a name='L332'></a><a href='#L332'>332</a>
392
- <a name='L333'></a><a href='#L333'>333</a>
393
- <a name='L334'></a><a href='#L334'>334</a>
394
- <a name='L335'></a><a href='#L335'>335</a>
395
- <a name='L336'></a><a href='#L336'>336</a>
396
- <a name='L337'></a><a href='#L337'>337</a>
397
- <a name='L338'></a><a href='#L338'>338</a>
398
- <a name='L339'></a><a href='#L339'>339</a>
399
- <a name='L340'></a><a href='#L340'>340</a>
400
- <a name='L341'></a><a href='#L341'>341</a>
401
- <a name='L342'></a><a href='#L342'>342</a>
402
- <a name='L343'></a><a href='#L343'>343</a>
403
- <a name='L344'></a><a href='#L344'>344</a>
404
- <a name='L345'></a><a href='#L345'>345</a>
405
- <a name='L346'></a><a href='#L346'>346</a>
406
- <a name='L347'></a><a href='#L347'>347</a>
407
- <a name='L348'></a><a href='#L348'>348</a>
408
- <a name='L349'></a><a href='#L349'>349</a>
409
- <a name='L350'></a><a href='#L350'>350</a>
410
- <a name='L351'></a><a href='#L351'>351</a>
411
- <a name='L352'></a><a href='#L352'>352</a>
412
- <a name='L353'></a><a href='#L353'>353</a>
413
- <a name='L354'></a><a href='#L354'>354</a>
414
- <a name='L355'></a><a href='#L355'>355</a>
415
- <a name='L356'></a><a href='#L356'>356</a>
416
- <a name='L357'></a><a href='#L357'>357</a>
417
- <a name='L358'></a><a href='#L358'>358</a>
418
- <a name='L359'></a><a href='#L359'>359</a>
419
- <a name='L360'></a><a href='#L360'>360</a>
420
- <a name='L361'></a><a href='#L361'>361</a>
421
- <a name='L362'></a><a href='#L362'>362</a>
422
- <a name='L363'></a><a href='#L363'>363</a>
423
- <a name='L364'></a><a href='#L364'>364</a>
424
- <a name='L365'></a><a href='#L365'>365</a>
425
- <a name='L366'></a><a href='#L366'>366</a>
426
- <a name='L367'></a><a href='#L367'>367</a>
427
- <a name='L368'></a><a href='#L368'>368</a>
428
- <a name='L369'></a><a href='#L369'>369</a>
429
- <a name='L370'></a><a href='#L370'>370</a>
430
- <a name='L371'></a><a href='#L371'>371</a>
431
- <a name='L372'></a><a href='#L372'>372</a>
432
- <a name='L373'></a><a href='#L373'>373</a>
433
- <a name='L374'></a><a href='#L374'>374</a>
434
- <a name='L375'></a><a href='#L375'>375</a>
435
- <a name='L376'></a><a href='#L376'>376</a>
436
- <a name='L377'></a><a href='#L377'>377</a>
437
- <a name='L378'></a><a href='#L378'>378</a>
438
- <a name='L379'></a><a href='#L379'>379</a>
439
- <a name='L380'></a><a href='#L380'>380</a>
440
- <a name='L381'></a><a href='#L381'>381</a>
441
- <a name='L382'></a><a href='#L382'>382</a>
442
- <a name='L383'></a><a href='#L383'>383</a>
443
- <a name='L384'></a><a href='#L384'>384</a>
444
- <a name='L385'></a><a href='#L385'>385</a>
445
- <a name='L386'></a><a href='#L386'>386</a>
446
- <a name='L387'></a><a href='#L387'>387</a>
447
- <a name='L388'></a><a href='#L388'>388</a>
448
- <a name='L389'></a><a href='#L389'>389</a>
449
- <a name='L390'></a><a href='#L390'>390</a>
450
- <a name='L391'></a><a href='#L391'>391</a>
451
- <a name='L392'></a><a href='#L392'>392</a>
452
- <a name='L393'></a><a href='#L393'>393</a>
453
- <a name='L394'></a><a href='#L394'>394</a>
454
- <a name='L395'></a><a href='#L395'>395</a>
455
- <a name='L396'></a><a href='#L396'>396</a>
456
- <a name='L397'></a><a href='#L397'>397</a>
457
- <a name='L398'></a><a href='#L398'>398</a>
458
- <a name='L399'></a><a href='#L399'>399</a>
459
- <a name='L400'></a><a href='#L400'>400</a>
460
- <a name='L401'></a><a href='#L401'>401</a>
461
- <a name='L402'></a><a href='#L402'>402</a>
462
- <a name='L403'></a><a href='#L403'>403</a>
463
- <a name='L404'></a><a href='#L404'>404</a>
464
- <a name='L405'></a><a href='#L405'>405</a>
465
- <a name='L406'></a><a href='#L406'>406</a>
466
- <a name='L407'></a><a href='#L407'>407</a>
467
- <a name='L408'></a><a href='#L408'>408</a>
468
- <a name='L409'></a><a href='#L409'>409</a>
469
- <a name='L410'></a><a href='#L410'>410</a>
470
- <a name='L411'></a><a href='#L411'>411</a>
471
- <a name='L412'></a><a href='#L412'>412</a>
472
- <a name='L413'></a><a href='#L413'>413</a>
473
- <a name='L414'></a><a href='#L414'>414</a>
474
- <a name='L415'></a><a href='#L415'>415</a>
475
- <a name='L416'></a><a href='#L416'>416</a>
476
- <a name='L417'></a><a href='#L417'>417</a>
477
- <a name='L418'></a><a href='#L418'>418</a>
478
- <a name='L419'></a><a href='#L419'>419</a>
479
- <a name='L420'></a><a href='#L420'>420</a>
480
- <a name='L421'></a><a href='#L421'>421</a>
481
- <a name='L422'></a><a href='#L422'>422</a>
482
- <a name='L423'></a><a href='#L423'>423</a>
483
- <a name='L424'></a><a href='#L424'>424</a>
484
- <a name='L425'></a><a href='#L425'>425</a>
485
- <a name='L426'></a><a href='#L426'>426</a>
486
- <a name='L427'></a><a href='#L427'>427</a>
487
- <a name='L428'></a><a href='#L428'>428</a>
488
- <a name='L429'></a><a href='#L429'>429</a>
489
- <a name='L430'></a><a href='#L430'>430</a>
490
- <a name='L431'></a><a href='#L431'>431</a>
491
- <a name='L432'></a><a href='#L432'>432</a>
492
- <a name='L433'></a><a href='#L433'>433</a>
493
- <a name='L434'></a><a href='#L434'>434</a>
494
- <a name='L435'></a><a href='#L435'>435</a>
495
- <a name='L436'></a><a href='#L436'>436</a>
496
- <a name='L437'></a><a href='#L437'>437</a>
497
- <a name='L438'></a><a href='#L438'>438</a>
498
- <a name='L439'></a><a href='#L439'>439</a>
499
- <a name='L440'></a><a href='#L440'>440</a>
500
- <a name='L441'></a><a href='#L441'>441</a>
501
- <a name='L442'></a><a href='#L442'>442</a>
502
- <a name='L443'></a><a href='#L443'>443</a>
503
- <a name='L444'></a><a href='#L444'>444</a>
504
- <a name='L445'></a><a href='#L445'>445</a>
505
- <a name='L446'></a><a href='#L446'>446</a>
506
- <a name='L447'></a><a href='#L447'>447</a>
507
- <a name='L448'></a><a href='#L448'>448</a>
508
- <a name='L449'></a><a href='#L449'>449</a>
509
- <a name='L450'></a><a href='#L450'>450</a>
510
- <a name='L451'></a><a href='#L451'>451</a>
511
- <a name='L452'></a><a href='#L452'>452</a>
512
- <a name='L453'></a><a href='#L453'>453</a>
513
- <a name='L454'></a><a href='#L454'>454</a>
514
- <a name='L455'></a><a href='#L455'>455</a>
515
- <a name='L456'></a><a href='#L456'>456</a>
516
- <a name='L457'></a><a href='#L457'>457</a>
517
- <a name='L458'></a><a href='#L458'>458</a>
518
- <a name='L459'></a><a href='#L459'>459</a>
519
- <a name='L460'></a><a href='#L460'>460</a>
520
- <a name='L461'></a><a href='#L461'>461</a>
521
- <a name='L462'></a><a href='#L462'>462</a>
522
- <a name='L463'></a><a href='#L463'>463</a>
523
- <a name='L464'></a><a href='#L464'>464</a>
524
- <a name='L465'></a><a href='#L465'>465</a>
525
- <a name='L466'></a><a href='#L466'>466</a>
526
- <a name='L467'></a><a href='#L467'>467</a>
527
- <a name='L468'></a><a href='#L468'>468</a>
528
- <a name='L469'></a><a href='#L469'>469</a>
529
- <a name='L470'></a><a href='#L470'>470</a>
530
- <a name='L471'></a><a href='#L471'>471</a>
531
- <a name='L472'></a><a href='#L472'>472</a>
532
- <a name='L473'></a><a href='#L473'>473</a>
533
- <a name='L474'></a><a href='#L474'>474</a>
534
- <a name='L475'></a><a href='#L475'>475</a>
535
- <a name='L476'></a><a href='#L476'>476</a>
536
- <a name='L477'></a><a href='#L477'>477</a>
537
- <a name='L478'></a><a href='#L478'>478</a>
538
- <a name='L479'></a><a href='#L479'>479</a>
539
- <a name='L480'></a><a href='#L480'>480</a>
540
- <a name='L481'></a><a href='#L481'>481</a>
541
- <a name='L482'></a><a href='#L482'>482</a>
542
- <a name='L483'></a><a href='#L483'>483</a>
543
- <a name='L484'></a><a href='#L484'>484</a>
544
- <a name='L485'></a><a href='#L485'>485</a>
545
- <a name='L486'></a><a href='#L486'>486</a>
546
- <a name='L487'></a><a href='#L487'>487</a>
547
- <a name='L488'></a><a href='#L488'>488</a>
548
- <a name='L489'></a><a href='#L489'>489</a>
549
- <a name='L490'></a><a href='#L490'>490</a>
550
- <a name='L491'></a><a href='#L491'>491</a>
551
- <a name='L492'></a><a href='#L492'>492</a>
552
- <a name='L493'></a><a href='#L493'>493</a>
553
- <a name='L494'></a><a href='#L494'>494</a>
554
- <a name='L495'></a><a href='#L495'>495</a>
555
- <a name='L496'></a><a href='#L496'>496</a>
556
- <a name='L497'></a><a href='#L497'>497</a>
557
- <a name='L498'></a><a href='#L498'>498</a>
558
- <a name='L499'></a><a href='#L499'>499</a>
559
- <a name='L500'></a><a href='#L500'>500</a>
560
- <a name='L501'></a><a href='#L501'>501</a>
561
- <a name='L502'></a><a href='#L502'>502</a>
562
- <a name='L503'></a><a href='#L503'>503</a>
563
- <a name='L504'></a><a href='#L504'>504</a>
564
- <a name='L505'></a><a href='#L505'>505</a>
565
- <a name='L506'></a><a href='#L506'>506</a>
566
- <a name='L507'></a><a href='#L507'>507</a>
567
- <a name='L508'></a><a href='#L508'>508</a>
568
- <a name='L509'></a><a href='#L509'>509</a>
569
- <a name='L510'></a><a href='#L510'>510</a>
570
- <a name='L511'></a><a href='#L511'>511</a>
571
- <a name='L512'></a><a href='#L512'>512</a>
572
- <a name='L513'></a><a href='#L513'>513</a>
573
- <a name='L514'></a><a href='#L514'>514</a>
574
- <a name='L515'></a><a href='#L515'>515</a>
575
- <a name='L516'></a><a href='#L516'>516</a>
576
- <a name='L517'></a><a href='#L517'>517</a>
577
- <a name='L518'></a><a href='#L518'>518</a>
578
- <a name='L519'></a><a href='#L519'>519</a>
579
- <a name='L520'></a><a href='#L520'>520</a>
580
- <a name='L521'></a><a href='#L521'>521</a>
581
- <a name='L522'></a><a href='#L522'>522</a>
582
- <a name='L523'></a><a href='#L523'>523</a>
583
- <a name='L524'></a><a href='#L524'>524</a>
584
- <a name='L525'></a><a href='#L525'>525</a>
585
- <a name='L526'></a><a href='#L526'>526</a>
586
- <a name='L527'></a><a href='#L527'>527</a>
587
- <a name='L528'></a><a href='#L528'>528</a>
588
- <a name='L529'></a><a href='#L529'>529</a>
589
- <a name='L530'></a><a href='#L530'>530</a>
590
- <a name='L531'></a><a href='#L531'>531</a>
591
- <a name='L532'></a><a href='#L532'>532</a>
592
- <a name='L533'></a><a href='#L533'>533</a>
593
- <a name='L534'></a><a href='#L534'>534</a>
594
- <a name='L535'></a><a href='#L535'>535</a>
595
- <a name='L536'></a><a href='#L536'>536</a>
596
- <a name='L537'></a><a href='#L537'>537</a>
597
- <a name='L538'></a><a href='#L538'>538</a>
598
- <a name='L539'></a><a href='#L539'>539</a>
599
- <a name='L540'></a><a href='#L540'>540</a>
600
- <a name='L541'></a><a href='#L541'>541</a>
601
- <a name='L542'></a><a href='#L542'>542</a>
602
- <a name='L543'></a><a href='#L543'>543</a>
603
- <a name='L544'></a><a href='#L544'>544</a>
604
- <a name='L545'></a><a href='#L545'>545</a>
605
- <a name='L546'></a><a href='#L546'>546</a>
606
- <a name='L547'></a><a href='#L547'>547</a>
607
- <a name='L548'></a><a href='#L548'>548</a>
608
- <a name='L549'></a><a href='#L549'>549</a>
609
- <a name='L550'></a><a href='#L550'>550</a>
610
- <a name='L551'></a><a href='#L551'>551</a>
611
- <a name='L552'></a><a href='#L552'>552</a>
612
- <a name='L553'></a><a href='#L553'>553</a>
613
- <a name='L554'></a><a href='#L554'>554</a>
614
- <a name='L555'></a><a href='#L555'>555</a>
615
- <a name='L556'></a><a href='#L556'>556</a>
616
- <a name='L557'></a><a href='#L557'>557</a>
617
- <a name='L558'></a><a href='#L558'>558</a>
618
- <a name='L559'></a><a href='#L559'>559</a>
619
- <a name='L560'></a><a href='#L560'>560</a>
620
- <a name='L561'></a><a href='#L561'>561</a>
621
- <a name='L562'></a><a href='#L562'>562</a>
622
- <a name='L563'></a><a href='#L563'>563</a>
623
- <a name='L564'></a><a href='#L564'>564</a>
624
- <a name='L565'></a><a href='#L565'>565</a>
625
- <a name='L566'></a><a href='#L566'>566</a>
626
- <a name='L567'></a><a href='#L567'>567</a>
627
- <a name='L568'></a><a href='#L568'>568</a>
628
- <a name='L569'></a><a href='#L569'>569</a>
629
- <a name='L570'></a><a href='#L570'>570</a>
630
- <a name='L571'></a><a href='#L571'>571</a>
631
- <a name='L572'></a><a href='#L572'>572</a>
632
- <a name='L573'></a><a href='#L573'>573</a>
633
- <a name='L574'></a><a href='#L574'>574</a>
634
- <a name='L575'></a><a href='#L575'>575</a>
635
- <a name='L576'></a><a href='#L576'>576</a>
636
- <a name='L577'></a><a href='#L577'>577</a>
637
- <a name='L578'></a><a href='#L578'>578</a>
638
- <a name='L579'></a><a href='#L579'>579</a>
639
- <a name='L580'></a><a href='#L580'>580</a>
640
- <a name='L581'></a><a href='#L581'>581</a>
641
- <a name='L582'></a><a href='#L582'>582</a>
642
- <a name='L583'></a><a href='#L583'>583</a>
643
- <a name='L584'></a><a href='#L584'>584</a>
644
- <a name='L585'></a><a href='#L585'>585</a>
645
- <a name='L586'></a><a href='#L586'>586</a>
646
- <a name='L587'></a><a href='#L587'>587</a>
647
- <a name='L588'></a><a href='#L588'>588</a>
648
- <a name='L589'></a><a href='#L589'>589</a>
649
- <a name='L590'></a><a href='#L590'>590</a>
650
- <a name='L591'></a><a href='#L591'>591</a>
651
- <a name='L592'></a><a href='#L592'>592</a>
652
- <a name='L593'></a><a href='#L593'>593</a>
653
- <a name='L594'></a><a href='#L594'>594</a>
654
- <a name='L595'></a><a href='#L595'>595</a>
655
- <a name='L596'></a><a href='#L596'>596</a>
656
- <a name='L597'></a><a href='#L597'>597</a>
657
- <a name='L598'></a><a href='#L598'>598</a>
658
- <a name='L599'></a><a href='#L599'>599</a>
659
- <a name='L600'></a><a href='#L600'>600</a>
660
- <a name='L601'></a><a href='#L601'>601</a>
661
- <a name='L602'></a><a href='#L602'>602</a>
662
- <a name='L603'></a><a href='#L603'>603</a>
663
- <a name='L604'></a><a href='#L604'>604</a>
664
- <a name='L605'></a><a href='#L605'>605</a>
665
- <a name='L606'></a><a href='#L606'>606</a>
666
- <a name='L607'></a><a href='#L607'>607</a>
667
- <a name='L608'></a><a href='#L608'>608</a>
668
- <a name='L609'></a><a href='#L609'>609</a>
669
- <a name='L610'></a><a href='#L610'>610</a>
670
- <a name='L611'></a><a href='#L611'>611</a>
671
- <a name='L612'></a><a href='#L612'>612</a>
672
- <a name='L613'></a><a href='#L613'>613</a>
673
- <a name='L614'></a><a href='#L614'>614</a>
674
- <a name='L615'></a><a href='#L615'>615</a>
675
- <a name='L616'></a><a href='#L616'>616</a>
676
- <a name='L617'></a><a href='#L617'>617</a>
677
- <a name='L618'></a><a href='#L618'>618</a>
678
- <a name='L619'></a><a href='#L619'>619</a>
679
- <a name='L620'></a><a href='#L620'>620</a>
680
- <a name='L621'></a><a href='#L621'>621</a>
681
- <a name='L622'></a><a href='#L622'>622</a>
682
- <a name='L623'></a><a href='#L623'>623</a>
683
- <a name='L624'></a><a href='#L624'>624</a>
684
- <a name='L625'></a><a href='#L625'>625</a>
685
- <a name='L626'></a><a href='#L626'>626</a>
686
- <a name='L627'></a><a href='#L627'>627</a>
687
- <a name='L628'></a><a href='#L628'>628</a>
688
- <a name='L629'></a><a href='#L629'>629</a>
689
- <a name='L630'></a><a href='#L630'>630</a>
690
- <a name='L631'></a><a href='#L631'>631</a>
691
- <a name='L632'></a><a href='#L632'>632</a>
692
- <a name='L633'></a><a href='#L633'>633</a>
693
- <a name='L634'></a><a href='#L634'>634</a>
694
- <a name='L635'></a><a href='#L635'>635</a>
695
- <a name='L636'></a><a href='#L636'>636</a>
696
- <a name='L637'></a><a href='#L637'>637</a>
697
- <a name='L638'></a><a href='#L638'>638</a>
698
- <a name='L639'></a><a href='#L639'>639</a>
699
- <a name='L640'></a><a href='#L640'>640</a>
700
- <a name='L641'></a><a href='#L641'>641</a>
701
- <a name='L642'></a><a href='#L642'>642</a>
702
- <a name='L643'></a><a href='#L643'>643</a>
703
- <a name='L644'></a><a href='#L644'>644</a>
704
- <a name='L645'></a><a href='#L645'>645</a>
705
- <a name='L646'></a><a href='#L646'>646</a>
706
- <a name='L647'></a><a href='#L647'>647</a>
707
- <a name='L648'></a><a href='#L648'>648</a>
708
- <a name='L649'></a><a href='#L649'>649</a>
709
- <a name='L650'></a><a href='#L650'>650</a>
710
- <a name='L651'></a><a href='#L651'>651</a>
711
- <a name='L652'></a><a href='#L652'>652</a>
712
- <a name='L653'></a><a href='#L653'>653</a>
713
- <a name='L654'></a><a href='#L654'>654</a>
714
- <a name='L655'></a><a href='#L655'>655</a>
715
- <a name='L656'></a><a href='#L656'>656</a>
716
- <a name='L657'></a><a href='#L657'>657</a>
717
- <a name='L658'></a><a href='#L658'>658</a>
718
- <a name='L659'></a><a href='#L659'>659</a>
719
- <a name='L660'></a><a href='#L660'>660</a>
720
- <a name='L661'></a><a href='#L661'>661</a>
721
- <a name='L662'></a><a href='#L662'>662</a>
722
- <a name='L663'></a><a href='#L663'>663</a>
723
- <a name='L664'></a><a href='#L664'>664</a>
724
- <a name='L665'></a><a href='#L665'>665</a>
725
- <a name='L666'></a><a href='#L666'>666</a>
726
- <a name='L667'></a><a href='#L667'>667</a>
727
- <a name='L668'></a><a href='#L668'>668</a>
728
- <a name='L669'></a><a href='#L669'>669</a>
729
- <a name='L670'></a><a href='#L670'>670</a>
730
- <a name='L671'></a><a href='#L671'>671</a>
731
- <a name='L672'></a><a href='#L672'>672</a>
732
- <a name='L673'></a><a href='#L673'>673</a>
733
- <a name='L674'></a><a href='#L674'>674</a>
734
- <a name='L675'></a><a href='#L675'>675</a>
735
- <a name='L676'></a><a href='#L676'>676</a>
736
- <a name='L677'></a><a href='#L677'>677</a>
737
- <a name='L678'></a><a href='#L678'>678</a>
738
- <a name='L679'></a><a href='#L679'>679</a>
739
- <a name='L680'></a><a href='#L680'>680</a>
740
- <a name='L681'></a><a href='#L681'>681</a>
741
- <a name='L682'></a><a href='#L682'>682</a>
742
- <a name='L683'></a><a href='#L683'>683</a>
743
- <a name='L684'></a><a href='#L684'>684</a>
744
- <a name='L685'></a><a href='#L685'>685</a>
745
- <a name='L686'></a><a href='#L686'>686</a>
746
- <a name='L687'></a><a href='#L687'>687</a>
747
- <a name='L688'></a><a href='#L688'>688</a>
748
- <a name='L689'></a><a href='#L689'>689</a>
749
- <a name='L690'></a><a href='#L690'>690</a>
750
- <a name='L691'></a><a href='#L691'>691</a>
751
- <a name='L692'></a><a href='#L692'>692</a>
752
- <a name='L693'></a><a href='#L693'>693</a>
753
- <a name='L694'></a><a href='#L694'>694</a>
754
- <a name='L695'></a><a href='#L695'>695</a>
755
- <a name='L696'></a><a href='#L696'>696</a>
756
- <a name='L697'></a><a href='#L697'>697</a>
757
- <a name='L698'></a><a href='#L698'>698</a>
758
- <a name='L699'></a><a href='#L699'>699</a>
759
- <a name='L700'></a><a href='#L700'>700</a>
760
- <a name='L701'></a><a href='#L701'>701</a>
761
- <a name='L702'></a><a href='#L702'>702</a>
762
- <a name='L703'></a><a href='#L703'>703</a>
763
- <a name='L704'></a><a href='#L704'>704</a>
764
- <a name='L705'></a><a href='#L705'>705</a>
765
- <a name='L706'></a><a href='#L706'>706</a>
766
- <a name='L707'></a><a href='#L707'>707</a>
767
- <a name='L708'></a><a href='#L708'>708</a>
768
- <a name='L709'></a><a href='#L709'>709</a>
769
- <a name='L710'></a><a href='#L710'>710</a>
770
- <a name='L711'></a><a href='#L711'>711</a>
771
- <a name='L712'></a><a href='#L712'>712</a>
772
- <a name='L713'></a><a href='#L713'>713</a>
773
- <a name='L714'></a><a href='#L714'>714</a>
774
- <a name='L715'></a><a href='#L715'>715</a>
775
- <a name='L716'></a><a href='#L716'>716</a>
776
- <a name='L717'></a><a href='#L717'>717</a>
777
- <a name='L718'></a><a href='#L718'>718</a>
778
- <a name='L719'></a><a href='#L719'>719</a>
779
- <a name='L720'></a><a href='#L720'>720</a>
780
- <a name='L721'></a><a href='#L721'>721</a>
781
- <a name='L722'></a><a href='#L722'>722</a>
782
- <a name='L723'></a><a href='#L723'>723</a>
783
- <a name='L724'></a><a href='#L724'>724</a>
784
- <a name='L725'></a><a href='#L725'>725</a>
785
- <a name='L726'></a><a href='#L726'>726</a>
786
- <a name='L727'></a><a href='#L727'>727</a>
787
- <a name='L728'></a><a href='#L728'>728</a>
788
- <a name='L729'></a><a href='#L729'>729</a>
789
- <a name='L730'></a><a href='#L730'>730</a>
790
- <a name='L731'></a><a href='#L731'>731</a>
791
- <a name='L732'></a><a href='#L732'>732</a>
792
- <a name='L733'></a><a href='#L733'>733</a>
793
- <a name='L734'></a><a href='#L734'>734</a>
794
- <a name='L735'></a><a href='#L735'>735</a>
795
- <a name='L736'></a><a href='#L736'>736</a>
796
- <a name='L737'></a><a href='#L737'>737</a>
797
- <a name='L738'></a><a href='#L738'>738</a>
798
- <a name='L739'></a><a href='#L739'>739</a>
799
- <a name='L740'></a><a href='#L740'>740</a>
800
- <a name='L741'></a><a href='#L741'>741</a>
801
- <a name='L742'></a><a href='#L742'>742</a>
802
- <a name='L743'></a><a href='#L743'>743</a>
803
- <a name='L744'></a><a href='#L744'>744</a>
804
- <a name='L745'></a><a href='#L745'>745</a>
805
- <a name='L746'></a><a href='#L746'>746</a>
806
- <a name='L747'></a><a href='#L747'>747</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-yes">7x</span>
816
- <span class="cline-any cline-yes">1x</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-yes">5x</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-yes">1x</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-yes">1x</span>
839
- <span class="cline-any cline-yes">2x</span>
840
- <span class="cline-any cline-yes">1x</span>
841
- <span class="cline-any cline-yes">1x</span>
842
- <span class="cline-any cline-yes">1x</span>
843
- <span class="cline-any cline-yes">1x</span>
844
- <span class="cline-any cline-yes">1x</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-yes">1x</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-neutral">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-neutral">&nbsp;</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-neutral">&nbsp;</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-yes">1x</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-no">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-yes">1x</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-yes">1x</span>
913
- <span class="cline-any cline-yes">1x</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-yes">1x</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-yes">1x</span>
918
- <span class="cline-any cline-yes">1x</span>
919
- <span class="cline-any cline-yes">1x</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-yes">1x</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-yes">1x</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-yes">1x</span>
936
- <span class="cline-any cline-neutral">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-yes">1x</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-yes">1x</span>
944
- <span class="cline-any cline-yes">1x</span>
945
- <span class="cline-any cline-yes">1x</span>
946
- <span class="cline-any cline-yes">1x</span>
947
- <span class="cline-any cline-yes">1x</span>
948
- <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-neutral">&nbsp;</span>
952
- <span class="cline-any cline-no">&nbsp;</span>
953
- <span class="cline-any cline-no">&nbsp;</span>
954
- <span class="cline-any cline-no">&nbsp;</span>
955
- <span class="cline-any cline-neutral">&nbsp;</span>
956
- <span class="cline-any cline-no">&nbsp;</span>
957
- <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-yes">3x</span>
961
- <span class="cline-any cline-yes">3x</span>
962
- <span class="cline-any cline-yes">3x</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-neutral">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-yes">1x</span>
970
- <span class="cline-any cline-neutral">&nbsp;</span>
971
- <span class="cline-any cline-yes">1x</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-yes">1x</span>
974
- <span class="cline-any cline-neutral">&nbsp;</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-yes">1x</span>
978
- <span class="cline-any cline-yes">1x</span>
979
- <span class="cline-any cline-yes">1x</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-yes">2x</span>
984
- <span class="cline-any cline-neutral">&nbsp;</span>
985
- <span class="cline-any cline-neutral">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-neutral">&nbsp;</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-neutral">&nbsp;</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-neutral">&nbsp;</span>
997
- <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-yes">1x</span>
999
- <span class="cline-any cline-neutral">&nbsp;</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-neutral">&nbsp;</span>
1002
- <span class="cline-any cline-neutral">&nbsp;</span>
1003
- <span class="cline-any cline-yes">1x</span>
1004
- <span class="cline-any cline-neutral">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-neutral">&nbsp;</span>
1007
- <span class="cline-any cline-yes">1x</span>
1008
- <span class="cline-any cline-neutral">&nbsp;</span>
1009
- <span class="cline-any cline-neutral">&nbsp;</span>
1010
- <span class="cline-any cline-neutral">&nbsp;</span>
1011
- <span class="cline-any cline-no">&nbsp;</span>
1012
- <span class="cline-any cline-no">&nbsp;</span>
1013
- <span class="cline-any cline-no">&nbsp;</span>
1014
- <span class="cline-any cline-no">&nbsp;</span>
1015
- <span class="cline-any cline-no">&nbsp;</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-no">&nbsp;</span>
1018
- <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-yes">1x</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-yes">1x</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-no">&nbsp;</span>
1032
- <span class="cline-any cline-no">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-yes">3x</span>
1038
- <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-neutral">&nbsp;</span>
1040
- <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-yes">2x</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">1x</span>
1046
- <span class="cline-any cline-yes">1x</span>
1047
- <span class="cline-any cline-yes">1x</span>
1048
- <span class="cline-any cline-neutral">&nbsp;</span>
1049
- <span class="cline-any cline-yes">1x</span>
1050
- <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-yes">1x</span>
1052
- <span class="cline-any cline-yes">1x</span>
1053
- <span class="cline-any cline-yes">1x</span>
1054
- <span class="cline-any cline-yes">1x</span>
1055
- <span class="cline-any cline-yes">1x</span>
1056
- <span class="cline-any cline-yes">1x</span>
1057
- <span class="cline-any cline-yes">1x</span>
1058
- <span class="cline-any cline-yes">1x</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-yes">1x</span>
1061
- <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-neutral">&nbsp;</span>
1063
- <span class="cline-any cline-yes">1x</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-yes">1x</span>
1067
- <span class="cline-any cline-yes">1x</span>
1068
- <span class="cline-any cline-yes">1x</span>
1069
- <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-yes">1x</span>
1071
- <span class="cline-any cline-yes">1x</span>
1072
- <span class="cline-any cline-yes">1x</span>
1073
- <span class="cline-any cline-yes">1x</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-yes">1x</span>
1076
- <span class="cline-any cline-yes">1x</span>
1077
- <span class="cline-any cline-yes">1x</span>
1078
- <span class="cline-any cline-neutral">&nbsp;</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-yes">1x</span>
1081
- <span class="cline-any cline-neutral">&nbsp;</span>
1082
- <span class="cline-any cline-neutral">&nbsp;</span>
1083
- <span class="cline-any cline-yes">1x</span>
1084
- <span class="cline-any cline-no">&nbsp;</span>
1085
- <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-no">&nbsp;</span>
1087
- <span class="cline-any cline-neutral">&nbsp;</span>
1088
- <span class="cline-any cline-neutral">&nbsp;</span>
1089
- <span class="cline-any cline-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-neutral">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-neutral">&nbsp;</span>
1093
- <span class="cline-any cline-neutral">&nbsp;</span>
1094
- <span class="cline-any cline-neutral">&nbsp;</span>
1095
- <span class="cline-any cline-neutral">&nbsp;</span>
1096
- <span class="cline-any cline-neutral">&nbsp;</span>
1097
- <span class="cline-any cline-neutral">&nbsp;</span>
1098
- <span class="cline-any cline-neutral">&nbsp;</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-neutral">&nbsp;</span>
1101
- <span class="cline-any cline-neutral">&nbsp;</span>
1102
- <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-neutral">&nbsp;</span>
1106
- <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-neutral">&nbsp;</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-neutral">&nbsp;</span>
1112
- <span class="cline-any cline-neutral">&nbsp;</span>
1113
- <span class="cline-any cline-yes">1x</span>
1114
- <span class="cline-any cline-yes">1x</span>
1115
- <span class="cline-any cline-yes">1x</span>
1116
- <span class="cline-any cline-neutral">&nbsp;</span>
1117
- <span class="cline-any cline-yes">1x</span>
1118
- <span class="cline-any cline-no">&nbsp;</span>
1119
- <span class="cline-any cline-neutral">&nbsp;</span>
1120
- <span class="cline-any cline-no">&nbsp;</span>
1121
- <span class="cline-any cline-no">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-no">&nbsp;</span>
1125
- <span class="cline-any cline-no">&nbsp;</span>
1126
- <span class="cline-any cline-neutral">&nbsp;</span>
1127
- <span class="cline-any cline-neutral">&nbsp;</span>
1128
- <span class="cline-any cline-no">&nbsp;</span>
1129
- <span class="cline-any cline-no">&nbsp;</span>
1130
- <span class="cline-any cline-no">&nbsp;</span>
1131
- <span class="cline-any cline-no">&nbsp;</span>
1132
- <span class="cline-any cline-neutral">&nbsp;</span>
1133
- <span class="cline-any cline-neutral">&nbsp;</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-no">&nbsp;</span>
1136
- <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-no">&nbsp;</span>
1138
- <span class="cline-any cline-no">&nbsp;</span>
1139
- <span class="cline-any cline-no">&nbsp;</span>
1140
- <span class="cline-any cline-no">&nbsp;</span>
1141
- <span class="cline-any cline-no">&nbsp;</span>
1142
- <span class="cline-any cline-no">&nbsp;</span>
1143
- <span class="cline-any cline-no">&nbsp;</span>
1144
- <span class="cline-any cline-neutral">&nbsp;</span>
1145
- <span class="cline-any cline-neutral">&nbsp;</span>
1146
- <span class="cline-any cline-neutral">&nbsp;</span>
1147
- <span class="cline-any cline-neutral">&nbsp;</span>
1148
- <span class="cline-any cline-no">&nbsp;</span>
1149
- <span class="cline-any cline-no">&nbsp;</span>
1150
- <span class="cline-any cline-no">&nbsp;</span>
1151
- <span class="cline-any cline-no">&nbsp;</span>
1152
- <span class="cline-any cline-no">&nbsp;</span>
1153
- <span class="cline-any cline-no">&nbsp;</span>
1154
- <span class="cline-any cline-no">&nbsp;</span>
1155
- <span class="cline-any cline-neutral">&nbsp;</span>
1156
- <span class="cline-any cline-neutral">&nbsp;</span>
1157
- <span class="cline-any cline-neutral">&nbsp;</span>
1158
- <span class="cline-any cline-neutral">&nbsp;</span>
1159
- <span class="cline-any cline-no">&nbsp;</span>
1160
- <span class="cline-any cline-no">&nbsp;</span>
1161
- <span class="cline-any cline-neutral">&nbsp;</span>
1162
- <span class="cline-any cline-no">&nbsp;</span>
1163
- <span class="cline-any cline-no">&nbsp;</span>
1164
- <span class="cline-any cline-neutral">&nbsp;</span>
1165
- <span class="cline-any cline-no">&nbsp;</span>
1166
- <span class="cline-any cline-no">&nbsp;</span>
1167
- <span class="cline-any cline-neutral">&nbsp;</span>
1168
- <span class="cline-any cline-no">&nbsp;</span>
1169
- <span class="cline-any cline-no">&nbsp;</span>
1170
- <span class="cline-any cline-no">&nbsp;</span>
1171
- <span class="cline-any cline-neutral">&nbsp;</span>
1172
- <span class="cline-any cline-neutral">&nbsp;</span>
1173
- <span class="cline-any cline-neutral">&nbsp;</span>
1174
- <span class="cline-any cline-no">&nbsp;</span>
1175
- <span class="cline-any cline-neutral">&nbsp;</span>
1176
- <span class="cline-any cline-neutral">&nbsp;</span>
1177
- <span class="cline-any cline-yes">1x</span>
1178
- <span class="cline-any cline-no">&nbsp;</span>
1179
- <span class="cline-any cline-neutral">&nbsp;</span>
1180
- <span class="cline-any cline-neutral">&nbsp;</span>
1181
- <span class="cline-any cline-yes">1x</span>
1182
- <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-neutral">&nbsp;</span>
1184
- <span class="cline-any cline-yes">1x</span>
1185
- <span class="cline-any cline-neutral">&nbsp;</span>
1186
- <span class="cline-any cline-neutral">&nbsp;</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-yes">1x</span>
1189
- <span class="cline-any cline-neutral">&nbsp;</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-yes">1x</span>
1192
- <span class="cline-any cline-neutral">&nbsp;</span>
1193
- <span class="cline-any cline-neutral">&nbsp;</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-neutral">&nbsp;</span>
1196
- <span class="cline-any cline-neutral">&nbsp;</span>
1197
- <span class="cline-any cline-neutral">&nbsp;</span>
1198
- <span class="cline-any cline-neutral">&nbsp;</span>
1199
- <span class="cline-any cline-yes">1x</span>
1200
- <span class="cline-any cline-neutral">&nbsp;</span>
1201
- <span class="cline-any cline-yes">1x</span>
1202
- <span class="cline-any cline-neutral">&nbsp;</span>
1203
- <span class="cline-any cline-yes">1x</span>
1204
- <span class="cline-any cline-yes">1x</span>
1205
- <span class="cline-any cline-neutral">&nbsp;</span>
1206
- <span class="cline-any cline-neutral">&nbsp;</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-neutral">&nbsp;</span>
1209
- <span class="cline-any cline-no">&nbsp;</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-neutral">&nbsp;</span>
1212
- <span class="cline-any cline-neutral">&nbsp;</span>
1213
- <span class="cline-any cline-neutral">&nbsp;</span>
1214
- <span class="cline-any cline-neutral">&nbsp;</span>
1215
- <span class="cline-any cline-neutral">&nbsp;</span>
1216
- <span class="cline-any cline-neutral">&nbsp;</span>
1217
- <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-yes">1x</span>
1219
- <span class="cline-any cline-yes">1x</span>
1220
- <span class="cline-any cline-neutral">&nbsp;</span>
1221
- <span class="cline-any cline-neutral">&nbsp;</span>
1222
- <span class="cline-any cline-neutral">&nbsp;</span>
1223
- <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-yes">1x</span>
1225
- <span class="cline-any cline-yes">1x</span>
1226
- <span class="cline-any cline-yes">1x</span>
1227
- <span class="cline-any cline-yes">1x</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-yes">1x</span>
1230
- <span class="cline-any cline-yes">1x</span>
1231
- <span class="cline-any cline-yes">1x</span>
1232
- <span class="cline-any cline-yes">1x</span>
1233
- <span class="cline-any cline-yes">1x</span>
1234
- <span class="cline-any cline-neutral">&nbsp;</span>
1235
- <span class="cline-any cline-yes">1x</span>
1236
- <span class="cline-any cline-yes">1x</span>
1237
- <span class="cline-any cline-yes">1x</span>
1238
- <span class="cline-any cline-yes">1x</span>
1239
- <span class="cline-any cline-neutral">&nbsp;</span>
1240
- <span class="cline-any cline-yes">1x</span>
1241
- <span class="cline-any cline-yes">1x</span>
1242
- <span class="cline-any cline-neutral">&nbsp;</span>
1243
- <span class="cline-any cline-yes">1x</span>
1244
- <span class="cline-any cline-yes">1x</span>
1245
- <span class="cline-any cline-no">&nbsp;</span>
1246
- <span class="cline-any cline-no">&nbsp;</span>
1247
- <span class="cline-any cline-no">&nbsp;</span>
1248
- <span class="cline-any cline-neutral">&nbsp;</span>
1249
- <span class="cline-any cline-no">&nbsp;</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1251
- <span class="cline-any cline-no">&nbsp;</span>
1252
- <span class="cline-any cline-no">&nbsp;</span>
1253
- <span class="cline-any cline-no">&nbsp;</span>
1254
- <span class="cline-any cline-no">&nbsp;</span>
1255
- <span class="cline-any cline-no">&nbsp;</span>
1256
- <span class="cline-any cline-no">&nbsp;</span>
1257
- <span class="cline-any cline-neutral">&nbsp;</span>
1258
- <span class="cline-any cline-no">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
- <span class="cline-any cline-yes">1x</span>
1261
- <span class="cline-any cline-no">&nbsp;</span>
1262
- <span class="cline-any cline-no">&nbsp;</span>
1263
- <span class="cline-any cline-no">&nbsp;</span>
1264
- <span class="cline-any cline-no">&nbsp;</span>
1265
- <span class="cline-any cline-neutral">&nbsp;</span>
1266
- <span class="cline-any cline-no">&nbsp;</span>
1267
- <span class="cline-any cline-no">&nbsp;</span>
1268
- <span class="cline-any cline-no">&nbsp;</span>
1269
- <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-no">&nbsp;</span>
1271
- <span class="cline-any cline-no">&nbsp;</span>
1272
- <span class="cline-any cline-no">&nbsp;</span>
1273
- <span class="cline-any cline-neutral">&nbsp;</span>
1274
- <span class="cline-any cline-yes">1x</span>
1275
- <span class="cline-any cline-neutral">&nbsp;</span>
1276
- <span class="cline-any cline-yes">1x</span>
1277
- <span class="cline-any cline-yes">1x</span>
1278
- <span class="cline-any cline-yes">1x</span>
1279
- <span class="cline-any cline-yes">1x</span>
1280
- <span class="cline-any cline-yes">1x</span>
1281
- <span class="cline-any cline-neutral">&nbsp;</span>
1282
- <span class="cline-any cline-yes">1x</span>
1283
- <span class="cline-any cline-yes">1x</span>
1284
- <span class="cline-any cline-yes">1x</span>
1285
- <span class="cline-any cline-neutral">&nbsp;</span>
1286
- <span class="cline-any cline-no">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
- <span class="cline-any cline-yes">1x</span>
1291
- <span class="cline-any cline-yes">1x</span>
1292
- <span class="cline-any cline-yes">1x</span>
1293
- <span class="cline-any cline-neutral">&nbsp;</span>
1294
- <span class="cline-any cline-yes">1x</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-yes">1x</span>
1297
- <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-neutral">&nbsp;</span>
1299
- <span class="cline-any cline-yes">1x</span>
1300
- <span class="cline-any cline-no">&nbsp;</span>
1301
- <span class="cline-any cline-no">&nbsp;</span>
1302
- <span class="cline-any cline-neutral">&nbsp;</span>
1303
- <span class="cline-any cline-neutral">&nbsp;</span>
1304
- <span class="cline-any cline-neutral">&nbsp;</span>
1305
- <span class="cline-any cline-yes">1x</span>
1306
- <span class="cline-any cline-yes">1x</span>
1307
- <span class="cline-any cline-neutral">&nbsp;</span>
1308
- <span class="cline-any cline-yes">1x</span>
1309
- <span class="cline-any cline-no">&nbsp;</span>
1310
- <span class="cline-any cline-no">&nbsp;</span>
1311
- <span class="cline-any cline-no">&nbsp;</span>
1312
- <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-neutral">&nbsp;</span>
1315
- <span class="cline-any cline-neutral">&nbsp;</span>
1316
- <span class="cline-any cline-neutral">&nbsp;</span>
1317
- <span class="cline-any cline-neutral">&nbsp;</span>
1318
- <span class="cline-any cline-neutral">&nbsp;</span>
1319
- <span class="cline-any cline-neutral">&nbsp;</span>
1320
- <span class="cline-any cline-neutral">&nbsp;</span>
1321
- <span class="cline-any cline-neutral">&nbsp;</span>
1322
- <span class="cline-any cline-neutral">&nbsp;</span>
1323
- <span class="cline-any cline-neutral">&nbsp;</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-neutral">&nbsp;</span>
1326
- <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-neutral">&nbsp;</span>
1329
- <span class="cline-any cline-neutral">&nbsp;</span>
1330
- <span class="cline-any cline-yes">1x</span>
1331
- <span class="cline-any cline-no">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-no">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-no">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-neutral">&nbsp;</span>
1338
- <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-neutral">&nbsp;</span>
1340
- <span class="cline-any cline-yes">1x</span>
1341
- <span class="cline-any cline-yes">1x</span>
1342
- <span class="cline-any cline-no">&nbsp;</span>
1343
- <span class="cline-any cline-no">&nbsp;</span>
1344
- <span class="cline-any cline-no">&nbsp;</span>
1345
- <span class="cline-any cline-neutral">&nbsp;</span>
1346
- <span class="cline-any cline-neutral">&nbsp;</span>
1347
- <span class="cline-any cline-no">&nbsp;</span>
1348
- <span class="cline-any cline-neutral">&nbsp;</span>
1349
- <span class="cline-any cline-neutral">&nbsp;</span>
1350
- <span class="cline-any cline-yes">1x</span>
1351
- <span class="cline-any cline-yes">1x</span>
1352
- <span class="cline-any cline-no">&nbsp;</span>
1353
- <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span>
1355
- <span class="cline-any cline-yes">1x</span>
1356
- <span class="cline-any cline-yes">1x</span>
1357
- <span class="cline-any cline-no">&nbsp;</span>
1358
- <span class="cline-any cline-no">&nbsp;</span>
1359
- <span class="cline-any cline-no">&nbsp;</span>
1360
- <span class="cline-any cline-neutral">&nbsp;</span>
1361
- <span class="cline-any cline-no">&nbsp;</span>
1362
- <span class="cline-any cline-no">&nbsp;</span>
1363
- <span class="cline-any cline-no">&nbsp;</span>
1364
- <span class="cline-any cline-no">&nbsp;</span>
1365
- <span class="cline-any cline-neutral">&nbsp;</span>
1366
- <span class="cline-any cline-no">&nbsp;</span>
1367
- <span class="cline-any cline-neutral">&nbsp;</span>
1368
- <span class="cline-any cline-neutral">&nbsp;</span>
1369
- <span class="cline-any cline-neutral">&nbsp;</span>
1370
- <span class="cline-any cline-neutral">&nbsp;</span>
1371
- <span class="cline-any cline-no">&nbsp;</span>
1372
- <span class="cline-any cline-neutral">&nbsp;</span>
1373
- <span class="cline-any cline-neutral">&nbsp;</span>
1374
- <span class="cline-any cline-neutral">&nbsp;</span>
1375
- <span class="cline-any cline-neutral">&nbsp;</span>
1376
- <span class="cline-any cline-neutral">&nbsp;</span>
1377
- <span class="cline-any cline-neutral">&nbsp;</span>
1378
- <span class="cline-any cline-yes">1x</span>
1379
- <span class="cline-any cline-yes">1x</span>
1380
- <span class="cline-any cline-yes">1x</span>
1381
- <span class="cline-any cline-neutral">&nbsp;</span>
1382
- <span class="cline-any cline-neutral">&nbsp;</span>
1383
- <span class="cline-any cline-neutral">&nbsp;</span>
1384
- <span class="cline-any cline-neutral">&nbsp;</span>
1385
- <span class="cline-any cline-neutral">&nbsp;</span>
1386
- <span class="cline-any cline-neutral">&nbsp;</span>
1387
- <span class="cline-any cline-neutral">&nbsp;</span>
1388
- <span class="cline-any cline-neutral">&nbsp;</span>
1389
- <span class="cline-any cline-neutral">&nbsp;</span>
1390
- <span class="cline-any cline-neutral">&nbsp;</span>
1391
- <span class="cline-any cline-neutral">&nbsp;</span>
1392
- <span class="cline-any cline-neutral">&nbsp;</span>
1393
- <span class="cline-any cline-neutral">&nbsp;</span>
1394
- <span class="cline-any cline-yes">1x</span>
1395
- <span class="cline-any cline-yes">1x</span>
1396
- <span class="cline-any cline-yes">1x</span>
1397
- <span class="cline-any cline-yes">1x</span>
1398
- <span class="cline-any cline-neutral">&nbsp;</span>
1399
- <span class="cline-any cline-neutral">&nbsp;</span>
1400
- <span class="cline-any cline-neutral">&nbsp;</span>
1401
- <span class="cline-any cline-yes">1x</span>
1402
- <span class="cline-any cline-neutral">&nbsp;</span>
1403
- <span class="cline-any cline-neutral">&nbsp;</span>
1404
- <span class="cline-any cline-neutral">&nbsp;</span>
1405
- <span class="cline-any cline-neutral">&nbsp;</span>
1406
- <span class="cline-any cline-neutral">&nbsp;</span>
1407
- <span class="cline-any cline-neutral">&nbsp;</span>
1408
- <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-neutral">&nbsp;</span>
1410
- <span class="cline-any cline-no">&nbsp;</span>
1411
- <span class="cline-any cline-neutral">&nbsp;</span>
1412
- <span class="cline-any cline-no">&nbsp;</span>
1413
- <span class="cline-any cline-no">&nbsp;</span>
1414
- <span class="cline-any cline-no">&nbsp;</span>
1415
- <span class="cline-any cline-neutral">&nbsp;</span>
1416
- <span class="cline-any cline-neutral">&nbsp;</span>
1417
- <span class="cline-any cline-no">&nbsp;</span>
1418
- <span class="cline-any cline-no">&nbsp;</span>
1419
- <span class="cline-any cline-no">&nbsp;</span>
1420
- <span class="cline-any cline-no">&nbsp;</span>
1421
- <span class="cline-any cline-neutral">&nbsp;</span>
1422
- <span class="cline-any cline-no">&nbsp;</span>
1423
- <span class="cline-any cline-no">&nbsp;</span>
1424
- <span class="cline-any cline-no">&nbsp;</span>
1425
- <span class="cline-any cline-no">&nbsp;</span>
1426
- <span class="cline-any cline-no">&nbsp;</span>
1427
- <span class="cline-any cline-neutral">&nbsp;</span>
1428
- <span class="cline-any cline-neutral">&nbsp;</span>
1429
- <span class="cline-any cline-no">&nbsp;</span>
1430
- <span class="cline-any cline-neutral">&nbsp;</span>
1431
- <span class="cline-any cline-neutral">&nbsp;</span>
1432
- <span class="cline-any cline-neutral">&nbsp;</span>
1433
- <span class="cline-any cline-neutral">&nbsp;</span>
1434
- <span class="cline-any cline-neutral">&nbsp;</span>
1435
- <span class="cline-any cline-no">&nbsp;</span>
1436
- <span class="cline-any cline-neutral">&nbsp;</span>
1437
- <span class="cline-any cline-neutral">&nbsp;</span>
1438
- <span class="cline-any cline-neutral">&nbsp;</span>
1439
- <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-neutral">&nbsp;</span>
1441
- <span class="cline-any cline-neutral">&nbsp;</span>
1442
- <span class="cline-any cline-neutral">&nbsp;</span>
1443
- <span class="cline-any cline-neutral">&nbsp;</span>
1444
- <span class="cline-any cline-neutral">&nbsp;</span>
1445
- <span class="cline-any cline-neutral">&nbsp;</span>
1446
- <span class="cline-any cline-yes">1x</span>
1447
- <span class="cline-any cline-yes">1x</span>
1448
- <span class="cline-any cline-neutral">&nbsp;</span>
1449
- <span class="cline-any cline-neutral">&nbsp;</span>
1450
- <span class="cline-any cline-neutral">&nbsp;</span>
1451
- <span class="cline-any cline-yes">1x</span>
1452
- <span class="cline-any cline-yes">1x</span>
1453
- <span class="cline-any cline-yes">1x</span>
1454
- <span class="cline-any cline-neutral">&nbsp;</span>
1455
- <span class="cline-any cline-yes">1x</span>
1456
- <span class="cline-any cline-yes">1x</span>
1457
- <span class="cline-any cline-neutral">&nbsp;</span>
1458
- <span class="cline-any cline-neutral">&nbsp;</span>
1459
- <span class="cline-any cline-neutral">&nbsp;</span>
1460
- <span class="cline-any cline-neutral">&nbsp;</span>
1461
- <span class="cline-any cline-yes">1x</span>
1462
- <span class="cline-any cline-yes">1x</span>
1463
- <span class="cline-any cline-yes">1x</span>
1464
- <span class="cline-any cline-yes">1x</span>
1465
- <span class="cline-any cline-yes">1x</span>
1466
- <span class="cline-any cline-yes">1x</span>
1467
- <span class="cline-any cline-yes">1x</span>
1468
- <span class="cline-any cline-neutral">&nbsp;</span>
1469
- <span class="cline-any cline-yes">1x</span>
1470
- <span class="cline-any cline-no">&nbsp;</span>
1471
- <span class="cline-any cline-neutral">&nbsp;</span>
1472
- <span class="cline-any cline-yes">1x</span>
1473
- <span class="cline-any cline-no">&nbsp;</span>
1474
- <span class="cline-any cline-neutral">&nbsp;</span>
1475
- <span class="cline-any cline-neutral">&nbsp;</span>
1476
- <span class="cline-any cline-yes">1x</span>
1477
- <span class="cline-any cline-neutral">&nbsp;</span>
1478
- <span class="cline-any cline-yes">1x</span>
1479
- <span class="cline-any cline-yes">1x</span>
1480
- <span class="cline-any cline-neutral">&nbsp;</span>
1481
- <span class="cline-any cline-yes">1x</span>
1482
- <span class="cline-any cline-yes">1x</span>
1483
- <span class="cline-any cline-neutral">&nbsp;</span>
1484
- <span class="cline-any cline-yes">1x</span>
1485
- <span class="cline-any cline-yes">1x</span>
1486
- <span class="cline-any cline-yes">1x</span>
1487
- <span class="cline-any cline-yes">1x</span>
1488
- <span class="cline-any cline-yes">1x</span>
1489
- <span class="cline-any cline-neutral">&nbsp;</span>
1490
- <span class="cline-any cline-neutral">&nbsp;</span>
1491
- <span class="cline-any cline-neutral">&nbsp;</span>
1492
- <span class="cline-any cline-neutral">&nbsp;</span>
1493
- <span class="cline-any cline-yes">1x</span>
1494
- <span class="cline-any cline-yes">1x</span>
1495
- <span class="cline-any cline-yes">1x</span>
1496
- <span class="cline-any cline-neutral">&nbsp;</span>
1497
- <span class="cline-any cline-yes">1x</span>
1498
- <span class="cline-any cline-neutral">&nbsp;</span>
1499
- <span class="cline-any cline-yes">1x</span>
1500
- <span class="cline-any cline-yes">1x</span>
1501
- <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-neutral">&nbsp;</span>
1503
- <span class="cline-any cline-yes">1x</span>
1504
- <span class="cline-any cline-neutral">&nbsp;</span>
1505
- <span class="cline-any cline-neutral">&nbsp;</span>
1506
- <span class="cline-any cline-neutral">&nbsp;</span>
1507
- <span class="cline-any cline-neutral">&nbsp;</span>
1508
- <span class="cline-any cline-neutral">&nbsp;</span>
1509
- <span class="cline-any cline-neutral">&nbsp;</span>
1510
- <span class="cline-any cline-neutral">&nbsp;</span>
1511
- <span class="cline-any cline-neutral">&nbsp;</span>
1512
- <span class="cline-any cline-neutral">&nbsp;</span>
1513
- <span class="cline-any cline-neutral">&nbsp;</span>
1514
- <span class="cline-any cline-neutral">&nbsp;</span>
1515
- <span class="cline-any cline-neutral">&nbsp;</span>
1516
- <span class="cline-any cline-no">&nbsp;</span>
1517
- <span class="cline-any cline-no">&nbsp;</span>
1518
- <span class="cline-any cline-neutral">&nbsp;</span>
1519
- <span class="cline-any cline-no">&nbsp;</span>
1520
- <span class="cline-any cline-no">&nbsp;</span>
1521
- <span class="cline-any cline-neutral">&nbsp;</span>
1522
- <span class="cline-any cline-neutral">&nbsp;</span>
1523
- <span class="cline-any cline-no">&nbsp;</span>
1524
- <span class="cline-any cline-neutral">&nbsp;</span>
1525
- <span class="cline-any cline-neutral">&nbsp;</span>
1526
- <span class="cline-any cline-neutral">&nbsp;</span>
1527
- <span class="cline-any cline-neutral">&nbsp;</span>
1528
- <span class="cline-any cline-neutral">&nbsp;</span>
1529
- <span class="cline-any cline-neutral">&nbsp;</span>
1530
- <span class="cline-any cline-neutral">&nbsp;</span>
1531
- <span class="cline-any cline-neutral">&nbsp;</span>
1532
- <span class="cline-any cline-no">&nbsp;</span>
1533
- <span class="cline-any cline-no">&nbsp;</span>
1534
- <span class="cline-any cline-neutral">&nbsp;</span>
1535
- <span class="cline-any cline-neutral">&nbsp;</span>
1536
- <span class="cline-any cline-no">&nbsp;</span>
1537
- <span class="cline-any cline-neutral">&nbsp;</span>
1538
- <span class="cline-any cline-neutral">&nbsp;</span>
1539
- <span class="cline-any cline-neutral">&nbsp;</span>
1540
- <span class="cline-any cline-yes">1x</span>
1541
- <span class="cline-any cline-yes">1x</span>
1542
- <span class="cline-any cline-neutral">&nbsp;</span>
1543
- <span class="cline-any cline-neutral">&nbsp;</span>
1544
- <span class="cline-any cline-yes">1x</span>
1545
- <span class="cline-any cline-neutral">&nbsp;</span>
1546
- <span class="cline-any cline-neutral">&nbsp;</span>
1547
- <span class="cline-any cline-neutral">&nbsp;</span>
1548
- <span class="cline-any cline-yes">1x</span>
1549
- <span class="cline-any cline-yes">1x</span>
1550
- <span class="cline-any cline-neutral">&nbsp;</span>
1551
- <span class="cline-any cline-neutral">&nbsp;</span>
1552
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/*
1553
- * Deepkit Framework
1554
- * Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
1555
- *
1556
- * This program is free software: you can redistribute it and/or modify
1557
- * it under the terms of the MIT License.
1558
- *
1559
- * You should have received a copy of the MIT License along with this program.
1560
- */
1561
- import { asyncOperation, ClassType, CompilerContext, getClassName, isClass, isObject, urlJoin } from '@deepkit/core';
1562
- import {
1563
- assertType,
1564
- entity,
1565
- findMember,
1566
- getSerializeFunction,
1567
- getValidatorFunction,
1568
- metaAnnotation,
1569
- OuterType,
1570
- ReflectionClass,
1571
- ReflectionKind,
1572
- ReflectionParameter,
1573
- SerializationOptions,
1574
- serializer,
1575
- Serializer,
1576
- stringifyType,
1577
- typeToObject,
1578
- ValidationError
1579
- } from '@deepkit/type';
1580
- // @ts-ignore
1581
- import formidable from 'formidable';
1582
- import { IncomingMessage } from 'http';
1583
- import querystring from 'querystring';
1584
- import { httpClass } from './decorator';
1585
- import { BodyValidationError, getRegExp, HttpRequest, HttpRequestQuery, HttpRequestResolvedParameters, ValidatedBody } from './model';
1586
- import { InjectorContext, InjectorModule, TagRegistry } from '@deepkit/injector';
1587
- import { Logger } from '@deepkit/logger';
1588
- import { HttpControllers } from './controllers';
1589
- import { MiddlewareRegistry, MiddlewareRegistryEntry } from '@deepkit/app';
1590
- import { HttpMiddlewareConfig, HttpMiddlewareFn } from './middleware';
1591
- &nbsp;
1592
- export type RouteParameterResolverForInjector = ((injector: InjectorContext) =&gt; any[] | Promise&lt;any[]&gt;);
1593
- &nbsp;
1594
- interface ResolvedController {
1595
- parameters: RouteParameterResolverForInjector;
1596
- routeConfig: RouteConfig;
1597
- uploadedFiles: { [name: string]: UploadedFile };
1598
- middlewares?: (injector: InjectorContext) =&gt; { fn: HttpMiddlewareFn, timeout: number }[];
1599
- }
1600
- &nbsp;
1601
- @entity.name('@deepkit/UploadedFile')
1602
- export class UploadedFile {
1603
- /**
1604
- * The size of the uploaded file in bytes.
1605
- */
1606
- size!: number;
1607
- &nbsp;
1608
- /**
1609
- * The path this file is being written to.
1610
- */
1611
- path!: string;
1612
- &nbsp;
1613
- /**
1614
- * The name this file had according to the uploading client.
1615
- */
1616
- name!: string | null;
1617
- &nbsp;
1618
- /**
1619
- * The mime type of this file, according to the uploading client.
1620
- */
1621
- type!: string | null;
1622
- &nbsp;
1623
- /**
1624
- * A Date object (or `null`) containing the time this file was last written to.
1625
- * Mostly here for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/).
1626
- */
1627
- lastModifiedDate!: Date | null;
1628
- &nbsp;
1629
- // /**
1630
- // * If `options.hash` calculation was set, you can read the hex digest out of this var.
1631
- // */
1632
- // hash!: string | 'sha1' | 'md5' | 'sha256' | null;
1633
- }
1634
- &nbsp;
1635
- function <span class="fstat-no" title="function not covered" >parseBody<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(</span>f</span></span>orm: any, req: IncomingMessage, files: { [name: string]: UploadedFile }) {
1636
- <span class="cstat-no" title="statement not covered" > return asyncOperation(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
1637
- <span class="cstat-no" title="statement not covered" > form.parse(req, <span class="fstat-no" title="function not covered" >(e</span>rr: any, fields: any, files: any) =&gt; {</span>
1638
- <span class="cstat-no" title="statement not covered" > if (err) {</span>
1639
- <span class="cstat-no" title="statement not covered" > reject(err);</span>
1640
- } else {
1641
- <span class="cstat-no" title="statement not covered" > resolve({ fields, files });</span>
1642
- }
1643
- });
1644
- });
1645
- }
1646
- &nbsp;
1647
- export interface RouteControllerAction {
1648
- //if not set, the root module is used
1649
- module?: InjectorModule&lt;any&gt;;
1650
- controller: ClassType;
1651
- methodName: string;
1652
- }
1653
- &nbsp;
1654
- function <span class="fstat-no" title="function not covered" >getRouterControllerActionName<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(</span>a</span></span>ction: RouteControllerAction): string {
1655
- <span class="cstat-no" title="statement not covered" > return `${getClassName(action.controller)}.${action.methodName}`;</span>
1656
- }
1657
- &nbsp;
1658
- export class RouteConfig {
1659
- public baseUrl: string = '';
1660
- &nbsp;
1661
- public responses: { statusCode: number, description: string, type?: OuterType }[] = [];
1662
- &nbsp;
1663
- public description: string = '';
1664
- public groups: string[] = [];
1665
- public category: string = '';
1666
- &nbsp;
1667
- public returnType?: OuterType;
1668
- &nbsp;
1669
- public serializationOptions?: SerializationOptions;
1670
- public serializer?: Serializer;
1671
- &nbsp;
1672
- /**
1673
- * When assigned defines where this route came from.
1674
- */
1675
- public module?: InjectorModule&lt;any&gt;;
1676
- &nbsp;
1677
- resolverForToken: Map&lt;any, ClassType&gt; = new Map();
1678
- &nbsp;
1679
- middlewares: { config: HttpMiddlewareConfig, module: InjectorModule&lt;any&gt; }[] = [];
1680
- &nbsp;
1681
- resolverForParameterName: Map&lt;string, ClassType&gt; = new Map();
1682
- &nbsp;
1683
- /**
1684
- * An arbitrary data container the user can use to store app specific settings/values.
1685
- */
1686
- data = new Map&lt;any, any&gt;();
1687
- &nbsp;
1688
- constructor(
1689
- public readonly name: string,
1690
- public readonly httpMethods: string[],
1691
- public readonly path: string,
1692
- public readonly action: RouteControllerAction,
1693
- public internal: boolean = false,
1694
- ) {
1695
- }
1696
- &nbsp;
1697
- <span class="fstat-no" title="function not covered" > getSchemaForResponse(</span>statusCode: number): OuterType | undefined {
1698
- <span class="cstat-no" title="statement not covered" > if (!this.responses.length) <span class="cstat-no" title="statement not covered" >return;</span></span>
1699
- <span class="cstat-no" title="statement not covered" > for (const response of this.responses) {</span>
1700
- <span class="cstat-no" title="statement not covered" > if (response.statusCode === statusCode) <span class="cstat-no" title="statement not covered" >return response.type;</span></span>
1701
- }
1702
- <span class="cstat-no" title="statement not covered" > return;</span>
1703
- }
1704
- &nbsp;
1705
- getFullPath(): string {
1706
- let path = this.baseUrl ? <span class="branch-0 cbranch-no" title="branch not covered" >urlJoin(this.baseUrl, this.path) </span>: this.path;
1707
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!path.startsWith('/')) path = '/' + path;
1708
- return path;
1709
- }
1710
- }
1711
- &nbsp;
1712
- class ParsedRoute {
1713
- public regex?: string;
1714
- &nbsp;
1715
- public pathParameterNames: { [name: string]: number } = {};
1716
- &nbsp;
1717
- protected parameters: ParsedRouteParameter[] = [];
1718
- &nbsp;
1719
- constructor(public routeConfig: RouteConfig) {
1720
- }
1721
- &nbsp;
1722
- addParameter(property: ReflectionParameter): ParsedRouteParameter {
1723
- const parameter = new ParsedRouteParameter(property);
1724
- this.parameters.push(parameter);
1725
- return parameter;
1726
- }
1727
- &nbsp;
1728
- getParameters(): ParsedRouteParameter[] {
1729
- return this.parameters;
1730
- }
1731
- &nbsp;
1732
- <span class="fstat-no" title="function not covered" > getParameter(</span>name: string): ParsedRouteParameter {
1733
- <span class="cstat-no" title="statement not covered" > for (const parameter of this.parameters) {</span>
1734
- <span class="cstat-no" title="statement not covered" > if (parameter.getName() === name) <span class="cstat-no" title="statement not covered" >return parameter;</span></span>
1735
- }
1736
- <span class="cstat-no" title="statement not covered" > throw new Error(`No route parameter with name ${name} defined.`);</span>
1737
- }
1738
- }
1739
- &nbsp;
1740
- class ParsedRouteParameter {
1741
- regexPosition?: number;
1742
- &nbsp;
1743
- constructor(
1744
- public parameter: ReflectionParameter,
1745
- ) {
1746
- }
1747
- &nbsp;
1748
- get body() {
1749
- return metaAnnotation.getForName(this.parameter.type, 'httpBody') !== undefined;
1750
- }
1751
- &nbsp;
1752
- get bodyValidation() {
1753
- return metaAnnotation.getForName(this.parameter.type, 'httpBodyValidation') !== undefined;
1754
- }
1755
- &nbsp;
1756
- <span class="fstat-no" title="function not covered" > getType(</span>): OuterType {
1757
- <span class="cstat-no" title="statement not covered" > if (this.bodyValidation) {</span>
1758
- <span class="cstat-no" title="statement not covered" > assertType(this.parameter.type, ReflectionKind.class);</span>
1759
- const valueType = <span class="cstat-no" title="statement not covered" >findMember('value', this.parameter.type);</span>
1760
- <span class="cstat-no" title="statement not covered" > if (!valueType || valueType.kind !== ReflectionKind.property) <span class="cstat-no" title="statement not covered" >throw new Error(`No property value found at ${stringifyType(this.parameter.type)}`);</span></span>
1761
- <span class="cstat-no" title="statement not covered" > return valueType.type as OuterType;</span>
1762
- }
1763
- <span class="cstat-no" title="statement not covered" > return this.parameter.parameter;</span>
1764
- }
1765
- &nbsp;
1766
- get query() {
1767
- return metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
1768
- }
1769
- &nbsp;
1770
- get queries() {
1771
- return metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
1772
- }
1773
- &nbsp;
1774
- <span class="fstat-no" title="function not covered" > get t</span>ypePath(): string | undefined {
1775
- const typeOptions = <span class="cstat-no" title="statement not covered" >metaAnnotation.getForName(this.parameter.type, 'httpQueries') || metaAnnotation.getForName(this.parameter.type, 'httpQuery');</span>
1776
- <span class="cstat-no" title="statement not covered" > if (!typeOptions) <span class="cstat-no" title="statement not covered" >return;</span></span>
1777
- const options = <span class="cstat-no" title="statement not covered" >typeToObject(typeOptions[0]);</span>
1778
- <span class="cstat-no" title="statement not covered" > if (isObject(options)) <span class="cstat-no" title="statement not covered" >return options.name;</span></span>
1779
- <span class="cstat-no" title="statement not covered" > return;</span>
1780
- }
1781
- &nbsp;
1782
- getName() {
1783
- return this.parameter.name;
1784
- }
1785
- &nbsp;
1786
- isPartOfPath(): boolean {
1787
- return this.regexPosition !== undefined;
1788
- }
1789
- }
1790
- &nbsp;
1791
- function parseRoutePathToRegex<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span></span>outeConfig: RouteConfig): { regex: string, parameterNames: { [name: string]: number } } {
1792
- const parameterNames: { [name: string]: number } = {};
1793
- let path = routeConfig.getFullPath();
1794
- &nbsp;
1795
- const method = ReflectionClass.from(routeConfig.action.controller).getMethod(routeConfig.action.methodName);
1796
- &nbsp;
1797
- let argumentIndex = 0;
1798
- path = path.replace(/:(\w+)/g, (a, name) =&gt; {
1799
- parameterNames[name] = argumentIndex;
1800
- argumentIndex++;
1801
- const parameter = method.getParameterOrUndefined(name);
1802
- <span class="missing-if-branch" title="else path not taken" >E</span>if (parameter) {
1803
- const regExp = getRegExp(parameter.type);
1804
- <span class="missing-if-branch" title="if path not taken" >I</span>if (regExp) <span class="cstat-no" title="statement not covered" >return regExp;</span>
1805
- }
1806
- return String.raw`([^/]+)`;
1807
- });
1808
- &nbsp;
1809
- return { regex: path, parameterNames };
1810
- }
1811
- &nbsp;
1812
- export function parseRouteControllerAction<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(r</span></span>outeConfig: RouteConfig): ParsedRoute {
1813
- const schema = ReflectionClass.from(routeConfig.action.controller);
1814
- const parsedRoute = new ParsedRoute(routeConfig);
1815
- &nbsp;
1816
- const methodArgumentProperties = schema.getMethodParameters(routeConfig.action.methodName);
1817
- const parsedPath = parseRoutePathToRegex(routeConfig);
1818
- parsedRoute.regex = parsedPath.regex;
1819
- parsedRoute.pathParameterNames = parsedPath.parameterNames;
1820
- &nbsp;
1821
- for (const property of methodArgumentProperties) {
1822
- const parsedParameter = parsedRoute.addParameter(property);
1823
- parsedParameter.regexPosition = parsedPath.parameterNames[property.name];
1824
- }
1825
- &nbsp;
1826
- return parsedRoute;
1827
- }
1828
- &nbsp;
1829
- export function <span class="fstat-no" title="function not covered" >dotToUrlPath(</span>dotPath: string): string {
1830
- <span class="cstat-no" title="statement not covered" > if (-1 === dotPath.indexOf('.')) <span class="cstat-no" title="statement not covered" >return dotPath;</span></span>
1831
- &nbsp;
1832
- <span class="cstat-no" title="statement not covered" > return dotPath.replace(/\./g, '][').replace('][', '[') + ']';</span>
1833
- }
1834
- &nbsp;
1835
- export interface RouteParameterResolver {
1836
- resolve(context: RouteParameterResolverContext): any | Promise&lt;any&gt;;
1837
- }
1838
- &nbsp;
1839
- export interface RouteParameterResolverContext {
1840
- token: ClassType | string | symbol | any;
1841
- route: RouteConfig;
1842
- request: HttpRequest;
1843
- &nbsp;
1844
- /**
1845
- * The parameter name (variable name).
1846
- */
1847
- name: any;
1848
- &nbsp;
1849
- /**
1850
- * The raw parameter value from the path, if the parameter is defined in the path (e.g. /user/:name).
1851
- * If not in the path, you have to use `parameters.&lt;name&gt;` instead.
1852
- */
1853
- value: any;
1854
- &nbsp;
1855
- query: HttpRequestQuery;
1856
- parameters: HttpRequestResolvedParameters;
1857
- }
1858
- &nbsp;
1859
- function filterMiddlewaresForRoute<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(m</span></span>iddlewareRawConfigs: MiddlewareRegistryEntry[], routeConfig: RouteConfig, fullPath: string): { config: HttpMiddlewareConfig, module: InjectorModule&lt;any&gt; }[] {
1860
- const middlewares = middlewareRawConfigs.slice(0);
1861
- middlewares.push(...routeConfig.middlewares as any[]);
1862
- &nbsp;
1863
- const middlewareConfigs = middlewares.filter(<span class="fstat-no" title="function not covered" >(v</span>) =&gt; {
1864
- <span class="cstat-no" title="statement not covered" > if (!(v.config instanceof HttpMiddlewareConfig)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1865
- &nbsp;
1866
- <span class="cstat-no" title="statement not covered" > if (v.config.controllers.length &amp;&amp; !v.config.controllers.includes(routeConfig.action.controller)) {</span>
1867
- <span class="cstat-no" title="statement not covered" > return false;</span>
1868
- }
1869
- &nbsp;
1870
- <span class="cstat-no" title="statement not covered" > if (v.config.excludeControllers.length &amp;&amp; v.config.excludeControllers.includes(routeConfig.action.controller)) {</span>
1871
- <span class="cstat-no" title="statement not covered" > return false;</span>
1872
- }
1873
- &nbsp;
1874
- <span class="cstat-no" title="statement not covered" > if (v.config.modules.length &amp;&amp; (!routeConfig.module || !v.config.modules.includes(routeConfig.module))) {</span>
1875
- <span class="cstat-no" title="statement not covered" > if (!routeConfig.module) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1876
- <span class="cstat-no" title="statement not covered" > for (const module of v.config.modules) {</span>
1877
- <span class="cstat-no" title="statement not covered" > if (routeConfig.module.id !== module.id) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1878
- }
1879
- }
1880
- &nbsp;
1881
- <span class="cstat-no" title="statement not covered" > if (v.config.selfModule &amp;&amp; v.module.id !== routeConfig.module?.id) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1882
- &nbsp;
1883
- <span class="cstat-no" title="statement not covered" > if (v.config.routeNames.length) {</span>
1884
- <span class="cstat-no" title="statement not covered" > for (const name of v.config.routeNames) {</span>
1885
- <span class="cstat-no" title="statement not covered" > if (name.includes('*')) {</span>
1886
- const regex = <span class="cstat-no" title="statement not covered" >new RegExp('^' + name.replace(/\*/g, '.*') + '$');</span>
1887
- <span class="cstat-no" title="statement not covered" > if (!regex.test(routeConfig.name)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1888
- } else <span class="cstat-no" title="statement not covered" >if (name !== routeConfig.name) {</span>
1889
- <span class="cstat-no" title="statement not covered" > return false;</span>
1890
- }
1891
- }
1892
- }
1893
- &nbsp;
1894
- <span class="cstat-no" title="statement not covered" > if (v.config.excludeRouteNames.length) {</span>
1895
- <span class="cstat-no" title="statement not covered" > for (const name of v.config.excludeRouteNames) {</span>
1896
- <span class="cstat-no" title="statement not covered" > if (name.includes('*')) {</span>
1897
- const regex = <span class="cstat-no" title="statement not covered" >new RegExp('^' + name.replace(/\*/g, '.*') + '$');</span>
1898
- <span class="cstat-no" title="statement not covered" > if (regex.test(routeConfig.name)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1899
- } else <span class="cstat-no" title="statement not covered" >if (name == routeConfig.name) {</span>
1900
- <span class="cstat-no" title="statement not covered" > return false;</span>
1901
- }
1902
- }
1903
- }
1904
- &nbsp;
1905
- <span class="cstat-no" title="statement not covered" > for (const route of v.config.routes) {</span>
1906
- <span class="cstat-no" title="statement not covered" > if (route.httpMethod &amp;&amp; !routeConfig.httpMethods.includes(route.httpMethod)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1907
- &nbsp;
1908
- <span class="cstat-no" title="statement not covered" > if (route.category &amp;&amp; route.category !== routeConfig.category) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1909
- <span class="cstat-no" title="statement not covered" > if (route.excludeCategory &amp;&amp; route.excludeCategory === routeConfig.category) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1910
- &nbsp;
1911
- <span class="cstat-no" title="statement not covered" > if (route.group &amp;&amp; !routeConfig.groups.includes(route.group)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1912
- <span class="cstat-no" title="statement not covered" > if (route.excludeGroup &amp;&amp; routeConfig.groups.includes(route.excludeGroup)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1913
- &nbsp;
1914
- <span class="cstat-no" title="statement not covered" > if (route.path || route.pathRegExp) {</span>
1915
- <span class="cstat-no" title="statement not covered" > if (!route.pathRegExp &amp;&amp; route.path) <span class="cstat-no" title="statement not covered" >route.pathRegExp = new RegExp('^' + route.path.replace(/\*/g, '.*') + '$');</span></span>
1916
- <span class="cstat-no" title="statement not covered" > if (route.pathRegExp &amp;&amp; !route.pathRegExp.test(fullPath)) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1917
- }
1918
- }
1919
- &nbsp;
1920
- <span class="cstat-no" title="statement not covered" > return true;</span>
1921
- }) as { config: HttpMiddlewareConfig, module: any }[];
1922
- &nbsp;
1923
- middlewareConfigs.sort(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; {
1924
- <span class="cstat-no" title="statement not covered" > return a.config.order - b.config.order;</span>
1925
- });
1926
- &nbsp;
1927
- return middlewareConfigs;
1928
- }
1929
- &nbsp;
1930
- export class Router {
1931
- protected fn?: (request: HttpRequest) =&gt; ResolvedController | undefined;
1932
- protected resolveFn?: (name: string, parameters: { [name: string]: any }) =&gt; string;
1933
- &nbsp;
1934
- protected routes: RouteConfig[] = [];
1935
- &nbsp;
1936
- //todo, move some settings to KernelConfig
1937
- protected form = formidable({
1938
- multiples: true,
1939
- hash: 'sha1',
1940
- enabledPlugins: ['octetstream', 'querystring', 'json'],
1941
- });
1942
- &nbsp;
1943
- constructor(
1944
- controllers: HttpControllers,
1945
- private logger: Logger,
1946
- tagRegistry: TagRegistry,
1947
- private middlewareRegistry: MiddlewareRegistry = <span class="branch-0 cbranch-no" title="branch not covered" >new MiddlewareRegistry,</span>
1948
- ) {
1949
- for (const controller of controllers.controllers) {
1950
- this.addRouteForController(controller.controller, controller.module);
1951
- }
1952
- }
1953
- &nbsp;
1954
- <span class="fstat-no" title="function not covered" > getRoutes(</span>): RouteConfig[] {
1955
- <span class="cstat-no" title="statement not covered" > return this.routes;</span>
1956
- }
1957
- &nbsp;
1958
- static forControllers(
1959
- controllers: (ClassType | { module: InjectorModule&lt;any&gt;, controller: ClassType })[],
1960
- tagRegistry: TagRegistry = new TagRegistry(),
1961
- middlewareRegistry: MiddlewareRegistry = new MiddlewareRegistry(),
1962
- module: InjectorModule&lt;any&gt; = new InjectorModule()
1963
- ): Router {
1964
- return new this(new HttpControllers(controllers.map(v =&gt; {
1965
- return isClass(v) ? { controller: v, module } : <span class="branch-1 cbranch-no" title="branch not covered" >v;</span>
1966
- })), new Logger([], []), tagRegistry, middlewareRegistry);
1967
- }
1968
- &nbsp;
1969
- protected getRouteCode(compiler: CompilerContext, routeConfig: RouteConfig): string {
1970
- const routeConfigVar = compiler.reserveVariable('routeConfigVar', routeConfig);
1971
- const parsedRoute = parseRouteControllerAction(routeConfig);
1972
- const path = routeConfig.getFullPath();
1973
- const prefix = path.substr(0, path.indexOf(':'));
1974
- &nbsp;
1975
- const regexVar = compiler.reserveVariable('regex', new RegExp('^' + parsedRoute.regex + '$'));
1976
- const setParameters: string[] = [];
1977
- const parameterNames: string[] = [];
1978
- const parameterValidator: string[] = [];
1979
- let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
1980
- &nbsp;
1981
- let enableParseBody = false;
1982
- const hasParameters = parsedRoute.getParameters().length &gt; 0;
1983
- let requiresAsyncParameters = false;
1984
- let setParametersFromPath = '';
1985
- &nbsp;
1986
- const fullPath = routeConfig.getFullPath();
1987
- const middlewareConfigs = filterMiddlewaresForRoute(this.middlewareRegistry.configs, routeConfig, fullPath);
1988
- &nbsp;
1989
- for (const parameter of parsedRoute.getParameters()) {
1990
- <span class="missing-if-branch" title="if path not taken" >I</span>if (parameter.body || parameter.bodyValidation) {
1991
- const type = <span class="cstat-no" title="statement not covered" >parameter.getType();</span>
1992
- const validatorVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('argumentValidator', getValidatorFunction(undefined, type));</span>
1993
- const converterVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('argumentConverter', getSerializeFunction(type, serializer.deserializeRegistry));</span>
1994
- &nbsp;
1995
- <span class="cstat-no" title="statement not covered" > enableParseBody = true;</span>
1996
- <span class="cstat-no" title="statement not covered" > setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);</span>
1997
- <span class="cstat-no" title="statement not covered" > parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);</span>
1998
- <span class="cstat-no" title="statement not covered" > if (parameter.bodyValidation) {</span>
1999
- <span class="cstat-no" title="statement not covered" > compiler.context.set('BodyValidation', ValidatedBody);</span>
2000
- <span class="cstat-no" title="statement not covered" > compiler.context.set('BodyValidationError', BodyValidationError);</span>
2001
- <span class="cstat-no" title="statement not covered" > parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);</span>
2002
- <span class="cstat-no" title="statement not covered" > bodyValidationErrorHandling = '';</span>
2003
- } else {
2004
- <span class="cstat-no" title="statement not covered" > parameterNames.push(`parameters.${parameter.parameter.name}`);</span>
2005
- }
2006
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (parameter.query || parameter.queries) {
2007
- const converted = <span class="cstat-no" title="statement not covered" >getSerializeFunction(parameter.parameter.parameter, serializer.deserializeRegistry, undefined, parameter.getName());</span>
2008
- const validator = <span class="cstat-no" title="statement not covered" >getValidatorFunction(undefined, parameter.parameter.parameter,);</span>
2009
- const converterVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('argumentConverter', converted);</span>
2010
- const validatorVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('argumentValidator', validator);</span>
2011
- &nbsp;
2012
- const queryPath = <span class="cstat-no" title="statement not covered" >parameter.typePath === undefined &amp;&amp; parameter.query ? parameter.parameter.name : parameter.typePath;</span>
2013
- const accessor = <span class="cstat-no" title="statement not covered" >queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';</span>
2014
- const queryAccessor = <span class="cstat-no" title="statement not covered" >queryPath ? `_query${accessor}` : '_query';</span>
2015
- &nbsp;
2016
- <span class="cstat-no" title="statement not covered" > setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);</span>
2017
- <span class="cstat-no" title="statement not covered" > parameterNames.push(`parameters.${parameter.parameter.name}`);</span>
2018
- <span class="cstat-no" title="statement not covered" > parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);</span>
2019
- } else {
2020
- parameterNames.push(`parameters.${parameter.parameter.name}`);
2021
- &nbsp;
2022
- <span class="missing-if-branch" title="else path not taken" >E</span>if (parameter.isPartOfPath()) {
2023
- <span class="missing-if-branch" title="else path not taken" >E</span>if (parameter.parameter.type.kind !== ReflectionKind.class) {
2024
- const converted = getSerializeFunction(parameter.parameter.parameter, serializer.deserializeRegistry, undefined, parameter.getName());
2025
- const converterVar = compiler.reserveVariable('argumentConverter', converted);
2026
- setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
2027
- &nbsp;
2028
- const validator = getValidatorFunction(undefined, parameter.parameter.parameter);
2029
- const validatorVar = compiler.reserveVariable('argumentValidator', validator);
2030
- parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
2031
- } else {
2032
- <span class="cstat-no" title="statement not covered" > setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);</span>
2033
- }
2034
- }
2035
- &nbsp;
2036
- const injectorToken = parameter.parameter.type.kind === ReflectionKind.class ? <span class="branch-0 cbranch-no" title="branch not covered" >parameter.parameter.type.classType </span>: undefined;
2037
- const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
2038
- const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
2039
- &nbsp;
2040
- setParameters.push(`${parameterResolverFoundVar} = false;`);
2041
- &nbsp;
2042
- const resolver = routeConfig.resolverForParameterName.get(parameter.getName()) || routeConfig.resolverForToken.get(injectorToken);
2043
- &nbsp;
2044
- //make sure all parameter values from the path are available
2045
- <span class="missing-if-branch" title="if path not taken" >I</span>if (resolver &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!setParametersFromPath)</span> {
2046
- <span class="cstat-no" title="statement not covered" > for (const i in parsedRoute.pathParameterNames) {</span>
2047
- <span class="cstat-no" title="statement not covered" > setParametersFromPath += `parameters.${i} = _match[${1 + parsedRoute.pathParameterNames[i]}];`;</span>
2048
- }
2049
- }
2050
- &nbsp;
2051
- let injector = '_injector';
2052
- const moduleVar = routeConfig.module ? ', ' + compiler.reserveConst(routeConfig.module, 'module') : <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2053
- &nbsp;
2054
- <span class="missing-if-branch" title="if path not taken" >I</span>if (resolver) {
2055
- const resolverProvideTokenVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('resolverProvideToken', resolver);</span>
2056
- <span class="cstat-no" title="statement not covered" > requiresAsyncParameters = true;</span>
2057
- const instance = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('resolverInstance');</span>
2058
- &nbsp;
2059
- <span class="cstat-no" title="statement not covered" > setParameters.push(`</span>
2060
- //resolver ${getClassName(resolver)} for ${parameter.getName()}
2061
- ${instance} = ${injector}.get(${resolverProvideTokenVar}${moduleVar});
2062
- if (!${parameterResolverFoundVar}) {
2063
- ${parameterResolverFoundVar} = true;
2064
- parameters.${parameter.parameter.name} = await ${instance}.resolve({
2065
- token: ${injectorTokenVar},
2066
- routeConfig: ${routeConfigVar},
2067
- request: request,
2068
- name: ${JSON.stringify(parameter.parameter.name)},
2069
- value: parameters.${parameter.parameter.name},
2070
- query: _query,
2071
- parameters: parameters
2072
- });
2073
- }`);
2074
- }
2075
- &nbsp;
2076
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!parameter.isPartOfPath()) {
2077
- let injectorGet = <span class="cstat-no" title="statement not covered" >`parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar});`;</span>
2078
- <span class="cstat-no" title="statement not covered" > if (parameter.parameter.isOptional()) {</span>
2079
- <span class="cstat-no" title="statement not covered" > injectorGet = `try {parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;</span>
2080
- }
2081
- <span class="cstat-no" title="statement not covered" > setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);</span>
2082
- }
2083
- }
2084
- }
2085
- &nbsp;
2086
- let parseBodyLoading = '';
2087
- <span class="missing-if-branch" title="if path not taken" >I</span>if (enableParseBody) {
2088
- const parseBodyVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('parseBody', parseBody);</span>
2089
- const formVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('form', this.form);</span>
2090
- <span class="cstat-no" title="statement not covered" > parseBodyLoading = `</span>
2091
- const bodyParsed = (await ${parseBodyVar}(${formVar}, request, uploadedFiles));
2092
- const bodyFields = {...bodyParsed.fields, ...bodyParsed.files};`;
2093
- <span class="cstat-no" title="statement not covered" > requiresAsyncParameters = true;</span>
2094
- }
2095
- &nbsp;
2096
- let matcher = `_path.startsWith(${JSON.stringify(prefix)}) &amp;&amp; (_match = _path.match(${regexVar}))`;
2097
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!hasParameters) {
2098
- <span class="cstat-no" title="statement not covered" > matcher = `_path === ${JSON.stringify(path)}`;</span>
2099
- }
2100
- &nbsp;
2101
- let middlewares = 'undefined';
2102
- <span class="missing-if-branch" title="if path not taken" >I</span>if (middlewareConfigs.length) {
2103
- const middlewareItems: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2104
- <span class="cstat-no" title="statement not covered" > for (const middlewareConfig of middlewareConfigs) {</span>
2105
- const moduleVar = <span class="cstat-no" title="statement not covered" >middlewareConfig.module ? ', ' + compiler.reserveVariable('module', middlewareConfig.module) : '';</span>
2106
- &nbsp;
2107
- <span class="cstat-no" title="statement not covered" > for (const middleware of middlewareConfig.config.middlewares) {</span>
2108
- <span class="cstat-no" title="statement not covered" > if (isClass(middleware)) {</span>
2109
- const classVar = <span class="cstat-no" title="statement not covered" >compiler.reserveVariable('middlewareClassType', middleware);</span>
2110
- <span class="cstat-no" title="statement not covered" > middlewareItems.push(`{fn: function() {return _injector.get(${classVar}${moduleVar}).execute(...arguments) }, timeout: ${middlewareConfig.config.timeout}}`);</span>
2111
- } else {
2112
- <span class="cstat-no" title="statement not covered" > middlewareItems.push(`{fn: ${compiler.reserveVariable('middlewareFn', middleware)}, timeout: ${middlewareConfig.config.timeout}}`);</span>
2113
- }
2114
- }
2115
- }
2116
- &nbsp;
2117
- <span class="cstat-no" title="statement not covered" > middlewares = `</span>
2118
- function(_injector) {
2119
- return [${middlewareItems.join(', ')}];
2120
- }
2121
- `;
2122
- }
2123
- &nbsp;
2124
- let parameters = '() =&gt; []';
2125
- <span class="missing-if-branch" title="else path not taken" >E</span>if (setParameters.length) {
2126
- parameters = `${requiresAsyncParameters ? <span class="branch-0 cbranch-no" title="branch not covered" >'async' </span>: ''} function(_injector){
2127
- const validationErrors = [];
2128
- const bodyErrors = [];
2129
- const parameters = {};
2130
- ${setParametersFromPath}
2131
- ${parseBodyLoading}
2132
- ${setParameters.join('\n')}
2133
- ${parameterValidator.join('\n')}
2134
- ${bodyValidationErrorHandling}
2135
- if (validationErrors.length) throw new ValidationError(validationErrors);
2136
- return [${parameterNames.join(',')}];
2137
- }`;
2138
- }
2139
- &nbsp;
2140
- let methodCheck = '';
2141
- <span class="missing-if-branch" title="else path not taken" >E</span>if (routeConfig.httpMethods.length) {
2142
- methodCheck = '(' + routeConfig.httpMethods.map(v =&gt; {
2143
- return `_method === '${v.toUpperCase()}'`;
2144
- }).join(' || ') + ') &amp;&amp; ';
2145
- }
2146
- &nbsp;
2147
- return `
2148
- //=&gt; ${routeConfig.httpMethods.join(',')} ${path}
2149
- if (${methodCheck}${matcher}) {
2150
- return {routeConfig: ${routeConfigVar}, parameters: ${parameters}, uploadedFiles: uploadedFiles, middlewares: ${middlewares}};
2151
- }
2152
- `;
2153
- }
2154
- &nbsp;
2155
- protected <span class="fstat-no" title="function not covered" >getRouteUrlResolveCode(</span>compiler: CompilerContext, routeConfig: RouteConfig): string {
2156
- const parsedRoute = <span class="cstat-no" title="statement not covered" >parseRouteControllerAction(routeConfig);</span>
2157
- &nbsp;
2158
- let url = <span class="cstat-no" title="statement not covered" >routeConfig.getFullPath();</span>
2159
- <span class="cstat-no" title="statement not covered" > url = url.replace(/:(\w+)/g, <span class="fstat-no" title="function not covered" >(a</span>, name) =&gt; {</span>
2160
- <span class="cstat-no" title="statement not covered" > return `\${parameters.${name}}`;</span>
2161
- });
2162
- &nbsp;
2163
- const modify: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2164
- <span class="cstat-no" title="statement not covered" > for (const parameter of parsedRoute.getParameters()) {</span>
2165
- <span class="cstat-no" title="statement not covered" > if (parameter.query || parameter.queries) {</span>
2166
- const queryPath = <span class="cstat-no" title="statement not covered" >parameter.typePath === undefined &amp;&amp; parameter.query ? parameter.parameter.name : parameter.typePath || '';</span>
2167
- &nbsp;
2168
- <span class="cstat-no" title="statement not covered" > if (parameter.parameter.type.kind === ReflectionKind.class || parameter.parameter.type.kind === ReflectionKind.objectLiteral) {</span>
2169
- <span class="cstat-no" title="statement not covered" > for (const property of ReflectionClass.from(parameter.parameter.type).getProperties()) {</span>
2170
- const accessor = <span class="cstat-no" title="statement not covered" >`parameters.${parameter.getName()}?.${property.name}`;</span>
2171
- const thisPath = <span class="cstat-no" title="statement not covered" >queryPath ? queryPath + '.' + property.name : property.name;</span>
2172
- <span class="cstat-no" title="statement not covered" > modify.push(`${accessor} !== undefined &amp;&amp; query.push(${JSON.stringify(dotToUrlPath(thisPath))} + '=' + encodeURIComponent(${accessor}))`);</span>
2173
- }
2174
- } else {
2175
- <span class="cstat-no" title="statement not covered" > modify.push(`parameters.${parameter.getName()} !== undefined &amp;&amp; query.push(${JSON.stringify(dotToUrlPath(queryPath))} + '=' + encodeURIComponent(parameters.${parameter.getName()}))`);</span>
2176
- &nbsp;
2177
- }
2178
- }
2179
- }
2180
- &nbsp;
2181
- <span class="cstat-no" title="statement not covered" > return `</span>
2182
- case ${JSON.stringify(routeConfig.name)}: {
2183
- let url = \`${url}\`;
2184
- let query = [];
2185
- ${modify.join('\n')}
2186
- return url + (query.length ? '?'+query.join('&amp;') : '');
2187
- }
2188
- `;
2189
- }
2190
- &nbsp;
2191
- public addRoute(routeConfig: RouteConfig) {
2192
- this.routes.push(routeConfig);
2193
- this.fn = undefined;
2194
- }
2195
- &nbsp;
2196
- public addRouteForController(controller: ClassType, module: InjectorModule&lt;any&gt;) {
2197
- const data = httpClass._fetch(controller);
2198
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!data) <span class="cstat-no" title="statement not covered" >throw new Error(`Http controller class ${getClassName(controller)} has no @http.controller decorator.`);</span>
2199
- const schema = ReflectionClass.from(controller);
2200
- &nbsp;
2201
- for (const action of data.getActions()) {
2202
- const routeConfig = new RouteConfig(action.name, action.httpMethods, action.path, {
2203
- controller,
2204
- module,
2205
- methodName: action.methodName
2206
- });
2207
- routeConfig.module = module;
2208
- routeConfig.responses = action.responses;
2209
- routeConfig.description = action.description;
2210
- routeConfig.category = action.category;
2211
- routeConfig.groups = action.groups;
2212
- routeConfig.data = new Map(action.data);
2213
- routeConfig.baseUrl = data.baseUrl;
2214
- &nbsp;
2215
- routeConfig.middlewares = data.middlewares.map(<span class="fstat-no" title="function not covered" >v </span>=&gt; {
2216
- <span class="cstat-no" title="statement not covered" > return { config: v(), module };</span>
2217
- });
2218
- routeConfig.middlewares.push(...action.middlewares.map(<span class="fstat-no" title="function not covered" >v </span>=&gt; {
2219
- <span class="cstat-no" title="statement not covered" > return { config: v(), module };</span>
2220
- }));
2221
- &nbsp;
2222
- for (const item of action.resolverForToken) <span class="cstat-no" title="statement not covered" >routeConfig.resolverForToken.set(...item);</span>
2223
- &nbsp;
2224
- routeConfig.resolverForToken = new Map(data.resolverForToken);
2225
- for (const item of action.resolverForToken) <span class="cstat-no" title="statement not covered" >routeConfig.resolverForToken.set(...item);</span>
2226
- &nbsp;
2227
- routeConfig.resolverForParameterName = new Map(data.resolverForParameterName);
2228
- for (const item of action.resolverForParameterName) <span class="cstat-no" title="statement not covered" >routeConfig.resolverForParameterName.set(...item);</span>
2229
- &nbsp;
2230
- routeConfig.serializationOptions = action.serializationOptions;
2231
- routeConfig.serializer = action.serializer;
2232
- routeConfig.serializer = action.serializer;
2233
- <span class="missing-if-branch" title="else path not taken" >E</span>if (schema.hasMethod(action.methodName)) routeConfig.returnType = schema.getMethod(action.methodName).getReturnType();
2234
- this.addRoute(routeConfig);
2235
- }
2236
- }
2237
- &nbsp;
2238
- protected build(): (request: HttpRequest) =&gt; ResolvedController | undefined {
2239
- const compiler = new CompilerContext;
2240
- compiler.context.set('ValidationError', ValidationError);
2241
- compiler.context.set('qs', require('qs'));
2242
- &nbsp;
2243
- const code: string[] = [];
2244
- &nbsp;
2245
- for (const route of this.routes) {
2246
- code.push(this.getRouteCode(compiler, route));
2247
- }
2248
- &nbsp;
2249
- return compiler.build(`
2250
- let _match;
2251
- const _method = request.method || 'GET';
2252
- const _url = request.url || '/';
2253
- const _qPosition = _url.indexOf('?');
2254
- let uploadedFiles = {};
2255
- const _path = _qPosition === -1 ? _url : _url.substr(0, _qPosition);
2256
- const _query = _qPosition === -1 ? {} : qs.parse(_url.substr(_qPosition + 1));
2257
- ${code.join('\n')}
2258
- `, 'request') as any;
2259
- }
2260
- &nbsp;
2261
- protected <span class="fstat-no" title="function not covered" >buildUrlResolver(</span>): any {
2262
- const compiler = <span class="cstat-no" title="statement not covered" >new CompilerContext;</span>
2263
- const code: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
2264
- &nbsp;
2265
- <span class="cstat-no" title="statement not covered" > for (const route of this.routes) {</span>
2266
- <span class="cstat-no" title="statement not covered" > code.push(this.getRouteUrlResolveCode(compiler, route));</span>
2267
- }
2268
- &nbsp;
2269
- <span class="cstat-no" title="statement not covered" > return compiler.build(`</span>
2270
- switch (name) {
2271
- ${code.join('\n')}
2272
- }
2273
- throw new Error('No route for name ' + name + ' found');
2274
- `, 'name', 'parameters') as any;
2275
- }
2276
- &nbsp;
2277
- public <span class="fstat-no" title="function not covered" >resolveUrl(</span>routeName: string, parameters: { [name: string]: any } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: string {
2278
- <span class="cstat-no" title="statement not covered" > if (!this.resolveFn) {</span>
2279
- <span class="cstat-no" title="statement not covered" > this.resolveFn = this.buildUrlResolver();</span>
2280
- }
2281
- &nbsp;
2282
- <span class="cstat-no" title="statement not covered" > return this.resolveFn!(routeName, parameters);</span>
2283
- }
2284
- &nbsp;
2285
- public resolveRequest(request: HttpRequest): ResolvedController | undefined {
2286
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!this.fn) {
2287
- this.fn = this.build();
2288
- }
2289
- &nbsp;
2290
- return this.fn(request);
2291
- }
2292
- &nbsp;
2293
- public resolve(method: string, url: string): ResolvedController | undefined {
2294
- method = method.toUpperCase();
2295
- return this.resolveRequest({ url, method } as any);
2296
- }
2297
- }
2298
- &nbsp;</pre></td></tr></table></pre>
2299
-
2300
- <div class='push'></div><!-- for sticky footer -->
2301
- </div><!-- /wrapper -->
2302
- <div class='footer quiet pad2 space-top1 center small'>
2303
- Code coverage generated by
2304
- <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
2305
- at Wed Mar 02 2022 07:23:06 GMT+0100 (Central European Standard Time)
2306
- </div>
2307
- </div>
2308
- <script src="../prettify.js"></script>
2309
- <script>
2310
- window.onload = function () {
2311
- prettyPrint();
2312
- };
2313
- </script>
2314
- <script src="../sorter.js"></script>
2315
- <script src="../block-navigation.js"></script>
2316
- </body>
2317
- </html>
2318
-