@contractkit/plugin-typescript 0.27.0 → 0.28.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build$colon$ci.log +3 -3
- package/.turbo/turbo-test$colon$ci.log +19 -18
- package/CHANGELOG.md +14 -0
- package/dist/codegen-contract.d.ts.map +1 -1
- package/dist/codegen-sdk.d.ts.map +1 -1
- package/dist/index.js +239 -215
- package/dist/index.js.map +1 -1
- package/dist/path-utils.d.ts.map +1 -1
- package/dist/ts-render.d.ts +6 -0
- package/dist/ts-render.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/codegen-contract.ts +7 -4
- package/src/codegen-operation.ts +9 -9
- package/src/codegen-plain-types.ts +17 -14
- package/src/codegen-sdk.ts +5 -4
- package/src/path-utils.ts +37 -20
- package/src/ts-render.ts +21 -6
- package/tests/codegen-contract.test.ts +4 -0
- package/tests/codegen-operation.test.ts +5 -5
- package/tests/codegen-sdk.test.ts +8 -0
- package/tests/escaping-security.test.ts +143 -0
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -2213
- package/coverage/coverage-final.json +0 -9
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -131
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/codegen-contract.ts.html +0 -3661
- package/coverage/src/codegen-operation.ts.html +0 -2584
- package/coverage/src/codegen-plain-types.ts.html +0 -997
- package/coverage/src/codegen-sdk.ts.html +0 -3901
- package/coverage/src/index.html +0 -206
- package/coverage/src/index.ts.html +0 -2761
- package/coverage/src/path-utils.ts.html +0 -745
- package/coverage/src/ts-render.ts.html +0 -592
- package/coverage/tests/helpers.ts.html +0 -826
- package/coverage/tests/index.html +0 -116
|
@@ -1,3661 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for src/codegen-contract.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> codegen-contract.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">87.92% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>597/679</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">82.7% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>392/474</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">90.08% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>109/121</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">89.06% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>497/558</span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</div>
|
|
54
|
-
<p class="quiet">
|
|
55
|
-
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
-
</p>
|
|
57
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line high'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
-
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
-
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
-
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
-
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
-
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
-
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
-
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
-
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
-
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
-
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
-
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
-
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
-
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
-
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
-
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
-
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
-
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
-
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
-
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
-
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
-
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
-
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
-
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
-
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
-
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
-
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
-
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
-
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
-
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
-
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
-
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
-
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
-
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
-
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
-
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
-
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
-
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
-
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
-
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
-
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
-
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
-
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
-
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
-
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
-
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
-
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
-
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
-
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
-
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
-
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
-
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
-
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
-
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
-
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
-
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
-
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
-
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
-
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
-
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
-
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
-
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
-
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
-
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
-
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
-
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
-
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
-
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
-
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
-
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
-
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
-
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
-
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
-
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
-
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
-
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
-
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
-
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
-
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
-
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
-
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
-
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
-
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
-
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
-
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
-
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
-
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
-
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
-
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
-
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
-
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
-
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
-
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
-
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
-
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
-
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
-
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
-
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
-
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
-
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
-
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
-
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
-
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
-
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
-
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
-
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
-
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
-
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
-
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
-
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
-
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
-
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
-
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
-
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
-
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
-
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
-
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
-
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
-
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
-
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
-
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
-
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
-
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
-
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
-
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
-
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
-
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
-
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
-
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
-
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
-
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
-
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
-
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
-
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
-
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
-
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
-
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
-
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
-
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
-
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
-
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
-
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
-
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
-
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
-
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
-
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
-
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
-
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
-
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
-
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
-
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
-
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
-
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
-
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
-
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
-
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
-
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
-
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
-
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
-
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
-
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
-
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
-
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
-
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
-
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
-
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
-
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
-
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
-
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
-
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
-
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
-
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
-
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
-
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
-
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
-
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
-
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
-
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
-
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
-
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
-
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
-
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
-
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
-
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
-
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
-
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
-
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
-
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
-
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
-
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
-
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
-
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
-
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
-
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
-
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
-
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
-
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
-
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
-
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
-
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
-
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
-
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
-
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
-
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
-
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
-
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
-
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
-
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
-
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
-
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
-
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
-
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
-
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
-
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
-
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
-
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
-
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
-
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
-
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
-
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
-
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
-
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
-
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
-
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
-
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
-
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
-
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
-
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
-
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
-
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
-
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
-
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
-
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
-
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
-
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
-
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
-
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
-
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
-
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
-
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
-
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
-
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
-
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
-
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
-
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
-
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
-
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
-
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
-
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
-
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
-
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
-
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
-
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
-
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
-
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
-
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
-
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
-
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
-
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
-
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
-
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
-
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
-
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
-
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
-
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
-
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
-
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
-
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
-
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
-
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
-
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
-
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
-
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
-
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
-
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
-
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
-
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
-
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
-
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
-
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
-
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
-
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
-
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
-
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
-
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
-
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
-
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
-
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
-
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
-
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
-
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
-
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
-
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
-
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
-
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
-
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
-
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
-
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
-
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
-
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
-
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
-
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
-
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
-
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
-
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
-
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
-
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
-
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
-
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
-
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
-
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
-
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
-
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
-
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
-
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
-
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
-
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
-
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
-
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
-
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
-
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
-
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
-
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
-
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
-
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
-
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
-
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
-
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
-
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
-
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
-
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
-
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
-
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
-
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
-
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
-
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
-
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
-
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
-
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
-
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
-
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
-
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
-
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
-
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
-
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
-
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
-
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
-
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
-
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
-
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
-
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
-
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
-
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
-
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
-
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
-
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
-
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
-
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
-
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
-
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
-
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
-
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
-
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
-
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
-
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
-
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
-
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
-
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
-
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
-
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
-
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
-
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
-
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
-
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
-
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
-
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
-
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
-
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
-
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
-
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
-
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
-
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
-
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
-
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
-
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
-
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
-
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
-
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
-
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
-
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
-
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
-
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
-
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
-
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
-
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
-
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
-
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
-
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
-
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
-
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
-
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
-
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
-
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
-
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
-
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
-
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
-
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
-
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
-
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
-
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
-
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
-
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
-
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
-
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
-
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
-
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
-
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
-
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
-
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
-
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
-
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
-
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
-
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
-
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
-
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
-
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
-
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
-
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
-
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
-
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
-
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
-
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
-
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
-
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
-
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
-
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
-
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
-
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
-
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
-
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
-
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
-
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
-
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
-
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
-
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
-
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
-
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
-
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
-
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
-
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
-
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
-
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
-
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
-
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
-
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
-
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
-
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
-
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
-
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
-
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
-
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
-
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
-
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
-
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
-
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
-
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
-
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
-
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
-
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
-
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
-
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
-
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
-
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
-
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
-
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
-
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
-
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
-
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
-
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
-
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
-
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
-
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
-
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
-
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
-
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
-
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
-
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
-
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
-
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
-
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
-
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
-
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
-
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
-
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
-
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
-
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
-
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
-
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
-
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
-
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
-
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
-
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
-
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
-
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
-
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
-
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
-
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
-
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
-
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
-
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
-
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
-
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
-
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
-
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
-
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
-
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
-
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
-
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
-
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
-
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
-
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
-
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
-
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
-
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
-
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
-
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
-
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
-
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
-
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
-
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
-
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
-
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
-
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
-
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
-
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
-
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
-
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
-
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
-
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
-
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
-
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
-
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
-
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
-
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
-
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
-
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
-
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
-
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
-
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
-
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
-
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
-
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
-
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
-
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
-
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
-
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
-
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
-
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
-
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
-
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
-
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
-
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
-
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
-
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
-
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
-
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
-
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
-
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
-
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
-
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
-
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
-
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
-
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
-
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
-
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
-
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
-
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
-
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
-
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
-
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
-
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
-
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
-
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
-
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
-
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
-
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
-
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
-
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
-
<a name='L854'></a><a href='#L854'>854</a>
|
|
920
|
-
<a name='L855'></a><a href='#L855'>855</a>
|
|
921
|
-
<a name='L856'></a><a href='#L856'>856</a>
|
|
922
|
-
<a name='L857'></a><a href='#L857'>857</a>
|
|
923
|
-
<a name='L858'></a><a href='#L858'>858</a>
|
|
924
|
-
<a name='L859'></a><a href='#L859'>859</a>
|
|
925
|
-
<a name='L860'></a><a href='#L860'>860</a>
|
|
926
|
-
<a name='L861'></a><a href='#L861'>861</a>
|
|
927
|
-
<a name='L862'></a><a href='#L862'>862</a>
|
|
928
|
-
<a name='L863'></a><a href='#L863'>863</a>
|
|
929
|
-
<a name='L864'></a><a href='#L864'>864</a>
|
|
930
|
-
<a name='L865'></a><a href='#L865'>865</a>
|
|
931
|
-
<a name='L866'></a><a href='#L866'>866</a>
|
|
932
|
-
<a name='L867'></a><a href='#L867'>867</a>
|
|
933
|
-
<a name='L868'></a><a href='#L868'>868</a>
|
|
934
|
-
<a name='L869'></a><a href='#L869'>869</a>
|
|
935
|
-
<a name='L870'></a><a href='#L870'>870</a>
|
|
936
|
-
<a name='L871'></a><a href='#L871'>871</a>
|
|
937
|
-
<a name='L872'></a><a href='#L872'>872</a>
|
|
938
|
-
<a name='L873'></a><a href='#L873'>873</a>
|
|
939
|
-
<a name='L874'></a><a href='#L874'>874</a>
|
|
940
|
-
<a name='L875'></a><a href='#L875'>875</a>
|
|
941
|
-
<a name='L876'></a><a href='#L876'>876</a>
|
|
942
|
-
<a name='L877'></a><a href='#L877'>877</a>
|
|
943
|
-
<a name='L878'></a><a href='#L878'>878</a>
|
|
944
|
-
<a name='L879'></a><a href='#L879'>879</a>
|
|
945
|
-
<a name='L880'></a><a href='#L880'>880</a>
|
|
946
|
-
<a name='L881'></a><a href='#L881'>881</a>
|
|
947
|
-
<a name='L882'></a><a href='#L882'>882</a>
|
|
948
|
-
<a name='L883'></a><a href='#L883'>883</a>
|
|
949
|
-
<a name='L884'></a><a href='#L884'>884</a>
|
|
950
|
-
<a name='L885'></a><a href='#L885'>885</a>
|
|
951
|
-
<a name='L886'></a><a href='#L886'>886</a>
|
|
952
|
-
<a name='L887'></a><a href='#L887'>887</a>
|
|
953
|
-
<a name='L888'></a><a href='#L888'>888</a>
|
|
954
|
-
<a name='L889'></a><a href='#L889'>889</a>
|
|
955
|
-
<a name='L890'></a><a href='#L890'>890</a>
|
|
956
|
-
<a name='L891'></a><a href='#L891'>891</a>
|
|
957
|
-
<a name='L892'></a><a href='#L892'>892</a>
|
|
958
|
-
<a name='L893'></a><a href='#L893'>893</a>
|
|
959
|
-
<a name='L894'></a><a href='#L894'>894</a>
|
|
960
|
-
<a name='L895'></a><a href='#L895'>895</a>
|
|
961
|
-
<a name='L896'></a><a href='#L896'>896</a>
|
|
962
|
-
<a name='L897'></a><a href='#L897'>897</a>
|
|
963
|
-
<a name='L898'></a><a href='#L898'>898</a>
|
|
964
|
-
<a name='L899'></a><a href='#L899'>899</a>
|
|
965
|
-
<a name='L900'></a><a href='#L900'>900</a>
|
|
966
|
-
<a name='L901'></a><a href='#L901'>901</a>
|
|
967
|
-
<a name='L902'></a><a href='#L902'>902</a>
|
|
968
|
-
<a name='L903'></a><a href='#L903'>903</a>
|
|
969
|
-
<a name='L904'></a><a href='#L904'>904</a>
|
|
970
|
-
<a name='L905'></a><a href='#L905'>905</a>
|
|
971
|
-
<a name='L906'></a><a href='#L906'>906</a>
|
|
972
|
-
<a name='L907'></a><a href='#L907'>907</a>
|
|
973
|
-
<a name='L908'></a><a href='#L908'>908</a>
|
|
974
|
-
<a name='L909'></a><a href='#L909'>909</a>
|
|
975
|
-
<a name='L910'></a><a href='#L910'>910</a>
|
|
976
|
-
<a name='L911'></a><a href='#L911'>911</a>
|
|
977
|
-
<a name='L912'></a><a href='#L912'>912</a>
|
|
978
|
-
<a name='L913'></a><a href='#L913'>913</a>
|
|
979
|
-
<a name='L914'></a><a href='#L914'>914</a>
|
|
980
|
-
<a name='L915'></a><a href='#L915'>915</a>
|
|
981
|
-
<a name='L916'></a><a href='#L916'>916</a>
|
|
982
|
-
<a name='L917'></a><a href='#L917'>917</a>
|
|
983
|
-
<a name='L918'></a><a href='#L918'>918</a>
|
|
984
|
-
<a name='L919'></a><a href='#L919'>919</a>
|
|
985
|
-
<a name='L920'></a><a href='#L920'>920</a>
|
|
986
|
-
<a name='L921'></a><a href='#L921'>921</a>
|
|
987
|
-
<a name='L922'></a><a href='#L922'>922</a>
|
|
988
|
-
<a name='L923'></a><a href='#L923'>923</a>
|
|
989
|
-
<a name='L924'></a><a href='#L924'>924</a>
|
|
990
|
-
<a name='L925'></a><a href='#L925'>925</a>
|
|
991
|
-
<a name='L926'></a><a href='#L926'>926</a>
|
|
992
|
-
<a name='L927'></a><a href='#L927'>927</a>
|
|
993
|
-
<a name='L928'></a><a href='#L928'>928</a>
|
|
994
|
-
<a name='L929'></a><a href='#L929'>929</a>
|
|
995
|
-
<a name='L930'></a><a href='#L930'>930</a>
|
|
996
|
-
<a name='L931'></a><a href='#L931'>931</a>
|
|
997
|
-
<a name='L932'></a><a href='#L932'>932</a>
|
|
998
|
-
<a name='L933'></a><a href='#L933'>933</a>
|
|
999
|
-
<a name='L934'></a><a href='#L934'>934</a>
|
|
1000
|
-
<a name='L935'></a><a href='#L935'>935</a>
|
|
1001
|
-
<a name='L936'></a><a href='#L936'>936</a>
|
|
1002
|
-
<a name='L937'></a><a href='#L937'>937</a>
|
|
1003
|
-
<a name='L938'></a><a href='#L938'>938</a>
|
|
1004
|
-
<a name='L939'></a><a href='#L939'>939</a>
|
|
1005
|
-
<a name='L940'></a><a href='#L940'>940</a>
|
|
1006
|
-
<a name='L941'></a><a href='#L941'>941</a>
|
|
1007
|
-
<a name='L942'></a><a href='#L942'>942</a>
|
|
1008
|
-
<a name='L943'></a><a href='#L943'>943</a>
|
|
1009
|
-
<a name='L944'></a><a href='#L944'>944</a>
|
|
1010
|
-
<a name='L945'></a><a href='#L945'>945</a>
|
|
1011
|
-
<a name='L946'></a><a href='#L946'>946</a>
|
|
1012
|
-
<a name='L947'></a><a href='#L947'>947</a>
|
|
1013
|
-
<a name='L948'></a><a href='#L948'>948</a>
|
|
1014
|
-
<a name='L949'></a><a href='#L949'>949</a>
|
|
1015
|
-
<a name='L950'></a><a href='#L950'>950</a>
|
|
1016
|
-
<a name='L951'></a><a href='#L951'>951</a>
|
|
1017
|
-
<a name='L952'></a><a href='#L952'>952</a>
|
|
1018
|
-
<a name='L953'></a><a href='#L953'>953</a>
|
|
1019
|
-
<a name='L954'></a><a href='#L954'>954</a>
|
|
1020
|
-
<a name='L955'></a><a href='#L955'>955</a>
|
|
1021
|
-
<a name='L956'></a><a href='#L956'>956</a>
|
|
1022
|
-
<a name='L957'></a><a href='#L957'>957</a>
|
|
1023
|
-
<a name='L958'></a><a href='#L958'>958</a>
|
|
1024
|
-
<a name='L959'></a><a href='#L959'>959</a>
|
|
1025
|
-
<a name='L960'></a><a href='#L960'>960</a>
|
|
1026
|
-
<a name='L961'></a><a href='#L961'>961</a>
|
|
1027
|
-
<a name='L962'></a><a href='#L962'>962</a>
|
|
1028
|
-
<a name='L963'></a><a href='#L963'>963</a>
|
|
1029
|
-
<a name='L964'></a><a href='#L964'>964</a>
|
|
1030
|
-
<a name='L965'></a><a href='#L965'>965</a>
|
|
1031
|
-
<a name='L966'></a><a href='#L966'>966</a>
|
|
1032
|
-
<a name='L967'></a><a href='#L967'>967</a>
|
|
1033
|
-
<a name='L968'></a><a href='#L968'>968</a>
|
|
1034
|
-
<a name='L969'></a><a href='#L969'>969</a>
|
|
1035
|
-
<a name='L970'></a><a href='#L970'>970</a>
|
|
1036
|
-
<a name='L971'></a><a href='#L971'>971</a>
|
|
1037
|
-
<a name='L972'></a><a href='#L972'>972</a>
|
|
1038
|
-
<a name='L973'></a><a href='#L973'>973</a>
|
|
1039
|
-
<a name='L974'></a><a href='#L974'>974</a>
|
|
1040
|
-
<a name='L975'></a><a href='#L975'>975</a>
|
|
1041
|
-
<a name='L976'></a><a href='#L976'>976</a>
|
|
1042
|
-
<a name='L977'></a><a href='#L977'>977</a>
|
|
1043
|
-
<a name='L978'></a><a href='#L978'>978</a>
|
|
1044
|
-
<a name='L979'></a><a href='#L979'>979</a>
|
|
1045
|
-
<a name='L980'></a><a href='#L980'>980</a>
|
|
1046
|
-
<a name='L981'></a><a href='#L981'>981</a>
|
|
1047
|
-
<a name='L982'></a><a href='#L982'>982</a>
|
|
1048
|
-
<a name='L983'></a><a href='#L983'>983</a>
|
|
1049
|
-
<a name='L984'></a><a href='#L984'>984</a>
|
|
1050
|
-
<a name='L985'></a><a href='#L985'>985</a>
|
|
1051
|
-
<a name='L986'></a><a href='#L986'>986</a>
|
|
1052
|
-
<a name='L987'></a><a href='#L987'>987</a>
|
|
1053
|
-
<a name='L988'></a><a href='#L988'>988</a>
|
|
1054
|
-
<a name='L989'></a><a href='#L989'>989</a>
|
|
1055
|
-
<a name='L990'></a><a href='#L990'>990</a>
|
|
1056
|
-
<a name='L991'></a><a href='#L991'>991</a>
|
|
1057
|
-
<a name='L992'></a><a href='#L992'>992</a>
|
|
1058
|
-
<a name='L993'></a><a href='#L993'>993</a>
|
|
1059
|
-
<a name='L994'></a><a href='#L994'>994</a>
|
|
1060
|
-
<a name='L995'></a><a href='#L995'>995</a>
|
|
1061
|
-
<a name='L996'></a><a href='#L996'>996</a>
|
|
1062
|
-
<a name='L997'></a><a href='#L997'>997</a>
|
|
1063
|
-
<a name='L998'></a><a href='#L998'>998</a>
|
|
1064
|
-
<a name='L999'></a><a href='#L999'>999</a>
|
|
1065
|
-
<a name='L1000'></a><a href='#L1000'>1000</a>
|
|
1066
|
-
<a name='L1001'></a><a href='#L1001'>1001</a>
|
|
1067
|
-
<a name='L1002'></a><a href='#L1002'>1002</a>
|
|
1068
|
-
<a name='L1003'></a><a href='#L1003'>1003</a>
|
|
1069
|
-
<a name='L1004'></a><a href='#L1004'>1004</a>
|
|
1070
|
-
<a name='L1005'></a><a href='#L1005'>1005</a>
|
|
1071
|
-
<a name='L1006'></a><a href='#L1006'>1006</a>
|
|
1072
|
-
<a name='L1007'></a><a href='#L1007'>1007</a>
|
|
1073
|
-
<a name='L1008'></a><a href='#L1008'>1008</a>
|
|
1074
|
-
<a name='L1009'></a><a href='#L1009'>1009</a>
|
|
1075
|
-
<a name='L1010'></a><a href='#L1010'>1010</a>
|
|
1076
|
-
<a name='L1011'></a><a href='#L1011'>1011</a>
|
|
1077
|
-
<a name='L1012'></a><a href='#L1012'>1012</a>
|
|
1078
|
-
<a name='L1013'></a><a href='#L1013'>1013</a>
|
|
1079
|
-
<a name='L1014'></a><a href='#L1014'>1014</a>
|
|
1080
|
-
<a name='L1015'></a><a href='#L1015'>1015</a>
|
|
1081
|
-
<a name='L1016'></a><a href='#L1016'>1016</a>
|
|
1082
|
-
<a name='L1017'></a><a href='#L1017'>1017</a>
|
|
1083
|
-
<a name='L1018'></a><a href='#L1018'>1018</a>
|
|
1084
|
-
<a name='L1019'></a><a href='#L1019'>1019</a>
|
|
1085
|
-
<a name='L1020'></a><a href='#L1020'>1020</a>
|
|
1086
|
-
<a name='L1021'></a><a href='#L1021'>1021</a>
|
|
1087
|
-
<a name='L1022'></a><a href='#L1022'>1022</a>
|
|
1088
|
-
<a name='L1023'></a><a href='#L1023'>1023</a>
|
|
1089
|
-
<a name='L1024'></a><a href='#L1024'>1024</a>
|
|
1090
|
-
<a name='L1025'></a><a href='#L1025'>1025</a>
|
|
1091
|
-
<a name='L1026'></a><a href='#L1026'>1026</a>
|
|
1092
|
-
<a name='L1027'></a><a href='#L1027'>1027</a>
|
|
1093
|
-
<a name='L1028'></a><a href='#L1028'>1028</a>
|
|
1094
|
-
<a name='L1029'></a><a href='#L1029'>1029</a>
|
|
1095
|
-
<a name='L1030'></a><a href='#L1030'>1030</a>
|
|
1096
|
-
<a name='L1031'></a><a href='#L1031'>1031</a>
|
|
1097
|
-
<a name='L1032'></a><a href='#L1032'>1032</a>
|
|
1098
|
-
<a name='L1033'></a><a href='#L1033'>1033</a>
|
|
1099
|
-
<a name='L1034'></a><a href='#L1034'>1034</a>
|
|
1100
|
-
<a name='L1035'></a><a href='#L1035'>1035</a>
|
|
1101
|
-
<a name='L1036'></a><a href='#L1036'>1036</a>
|
|
1102
|
-
<a name='L1037'></a><a href='#L1037'>1037</a>
|
|
1103
|
-
<a name='L1038'></a><a href='#L1038'>1038</a>
|
|
1104
|
-
<a name='L1039'></a><a href='#L1039'>1039</a>
|
|
1105
|
-
<a name='L1040'></a><a href='#L1040'>1040</a>
|
|
1106
|
-
<a name='L1041'></a><a href='#L1041'>1041</a>
|
|
1107
|
-
<a name='L1042'></a><a href='#L1042'>1042</a>
|
|
1108
|
-
<a name='L1043'></a><a href='#L1043'>1043</a>
|
|
1109
|
-
<a name='L1044'></a><a href='#L1044'>1044</a>
|
|
1110
|
-
<a name='L1045'></a><a href='#L1045'>1045</a>
|
|
1111
|
-
<a name='L1046'></a><a href='#L1046'>1046</a>
|
|
1112
|
-
<a name='L1047'></a><a href='#L1047'>1047</a>
|
|
1113
|
-
<a name='L1048'></a><a href='#L1048'>1048</a>
|
|
1114
|
-
<a name='L1049'></a><a href='#L1049'>1049</a>
|
|
1115
|
-
<a name='L1050'></a><a href='#L1050'>1050</a>
|
|
1116
|
-
<a name='L1051'></a><a href='#L1051'>1051</a>
|
|
1117
|
-
<a name='L1052'></a><a href='#L1052'>1052</a>
|
|
1118
|
-
<a name='L1053'></a><a href='#L1053'>1053</a>
|
|
1119
|
-
<a name='L1054'></a><a href='#L1054'>1054</a>
|
|
1120
|
-
<a name='L1055'></a><a href='#L1055'>1055</a>
|
|
1121
|
-
<a name='L1056'></a><a href='#L1056'>1056</a>
|
|
1122
|
-
<a name='L1057'></a><a href='#L1057'>1057</a>
|
|
1123
|
-
<a name='L1058'></a><a href='#L1058'>1058</a>
|
|
1124
|
-
<a name='L1059'></a><a href='#L1059'>1059</a>
|
|
1125
|
-
<a name='L1060'></a><a href='#L1060'>1060</a>
|
|
1126
|
-
<a name='L1061'></a><a href='#L1061'>1061</a>
|
|
1127
|
-
<a name='L1062'></a><a href='#L1062'>1062</a>
|
|
1128
|
-
<a name='L1063'></a><a href='#L1063'>1063</a>
|
|
1129
|
-
<a name='L1064'></a><a href='#L1064'>1064</a>
|
|
1130
|
-
<a name='L1065'></a><a href='#L1065'>1065</a>
|
|
1131
|
-
<a name='L1066'></a><a href='#L1066'>1066</a>
|
|
1132
|
-
<a name='L1067'></a><a href='#L1067'>1067</a>
|
|
1133
|
-
<a name='L1068'></a><a href='#L1068'>1068</a>
|
|
1134
|
-
<a name='L1069'></a><a href='#L1069'>1069</a>
|
|
1135
|
-
<a name='L1070'></a><a href='#L1070'>1070</a>
|
|
1136
|
-
<a name='L1071'></a><a href='#L1071'>1071</a>
|
|
1137
|
-
<a name='L1072'></a><a href='#L1072'>1072</a>
|
|
1138
|
-
<a name='L1073'></a><a href='#L1073'>1073</a>
|
|
1139
|
-
<a name='L1074'></a><a href='#L1074'>1074</a>
|
|
1140
|
-
<a name='L1075'></a><a href='#L1075'>1075</a>
|
|
1141
|
-
<a name='L1076'></a><a href='#L1076'>1076</a>
|
|
1142
|
-
<a name='L1077'></a><a href='#L1077'>1077</a>
|
|
1143
|
-
<a name='L1078'></a><a href='#L1078'>1078</a>
|
|
1144
|
-
<a name='L1079'></a><a href='#L1079'>1079</a>
|
|
1145
|
-
<a name='L1080'></a><a href='#L1080'>1080</a>
|
|
1146
|
-
<a name='L1081'></a><a href='#L1081'>1081</a>
|
|
1147
|
-
<a name='L1082'></a><a href='#L1082'>1082</a>
|
|
1148
|
-
<a name='L1083'></a><a href='#L1083'>1083</a>
|
|
1149
|
-
<a name='L1084'></a><a href='#L1084'>1084</a>
|
|
1150
|
-
<a name='L1085'></a><a href='#L1085'>1085</a>
|
|
1151
|
-
<a name='L1086'></a><a href='#L1086'>1086</a>
|
|
1152
|
-
<a name='L1087'></a><a href='#L1087'>1087</a>
|
|
1153
|
-
<a name='L1088'></a><a href='#L1088'>1088</a>
|
|
1154
|
-
<a name='L1089'></a><a href='#L1089'>1089</a>
|
|
1155
|
-
<a name='L1090'></a><a href='#L1090'>1090</a>
|
|
1156
|
-
<a name='L1091'></a><a href='#L1091'>1091</a>
|
|
1157
|
-
<a name='L1092'></a><a href='#L1092'>1092</a>
|
|
1158
|
-
<a name='L1093'></a><a href='#L1093'>1093</a>
|
|
1159
|
-
<a name='L1094'></a><a href='#L1094'>1094</a>
|
|
1160
|
-
<a name='L1095'></a><a href='#L1095'>1095</a>
|
|
1161
|
-
<a name='L1096'></a><a href='#L1096'>1096</a>
|
|
1162
|
-
<a name='L1097'></a><a href='#L1097'>1097</a>
|
|
1163
|
-
<a name='L1098'></a><a href='#L1098'>1098</a>
|
|
1164
|
-
<a name='L1099'></a><a href='#L1099'>1099</a>
|
|
1165
|
-
<a name='L1100'></a><a href='#L1100'>1100</a>
|
|
1166
|
-
<a name='L1101'></a><a href='#L1101'>1101</a>
|
|
1167
|
-
<a name='L1102'></a><a href='#L1102'>1102</a>
|
|
1168
|
-
<a name='L1103'></a><a href='#L1103'>1103</a>
|
|
1169
|
-
<a name='L1104'></a><a href='#L1104'>1104</a>
|
|
1170
|
-
<a name='L1105'></a><a href='#L1105'>1105</a>
|
|
1171
|
-
<a name='L1106'></a><a href='#L1106'>1106</a>
|
|
1172
|
-
<a name='L1107'></a><a href='#L1107'>1107</a>
|
|
1173
|
-
<a name='L1108'></a><a href='#L1108'>1108</a>
|
|
1174
|
-
<a name='L1109'></a><a href='#L1109'>1109</a>
|
|
1175
|
-
<a name='L1110'></a><a href='#L1110'>1110</a>
|
|
1176
|
-
<a name='L1111'></a><a href='#L1111'>1111</a>
|
|
1177
|
-
<a name='L1112'></a><a href='#L1112'>1112</a>
|
|
1178
|
-
<a name='L1113'></a><a href='#L1113'>1113</a>
|
|
1179
|
-
<a name='L1114'></a><a href='#L1114'>1114</a>
|
|
1180
|
-
<a name='L1115'></a><a href='#L1115'>1115</a>
|
|
1181
|
-
<a name='L1116'></a><a href='#L1116'>1116</a>
|
|
1182
|
-
<a name='L1117'></a><a href='#L1117'>1117</a>
|
|
1183
|
-
<a name='L1118'></a><a href='#L1118'>1118</a>
|
|
1184
|
-
<a name='L1119'></a><a href='#L1119'>1119</a>
|
|
1185
|
-
<a name='L1120'></a><a href='#L1120'>1120</a>
|
|
1186
|
-
<a name='L1121'></a><a href='#L1121'>1121</a>
|
|
1187
|
-
<a name='L1122'></a><a href='#L1122'>1122</a>
|
|
1188
|
-
<a name='L1123'></a><a href='#L1123'>1123</a>
|
|
1189
|
-
<a name='L1124'></a><a href='#L1124'>1124</a>
|
|
1190
|
-
<a name='L1125'></a><a href='#L1125'>1125</a>
|
|
1191
|
-
<a name='L1126'></a><a href='#L1126'>1126</a>
|
|
1192
|
-
<a name='L1127'></a><a href='#L1127'>1127</a>
|
|
1193
|
-
<a name='L1128'></a><a href='#L1128'>1128</a>
|
|
1194
|
-
<a name='L1129'></a><a href='#L1129'>1129</a>
|
|
1195
|
-
<a name='L1130'></a><a href='#L1130'>1130</a>
|
|
1196
|
-
<a name='L1131'></a><a href='#L1131'>1131</a>
|
|
1197
|
-
<a name='L1132'></a><a href='#L1132'>1132</a>
|
|
1198
|
-
<a name='L1133'></a><a href='#L1133'>1133</a>
|
|
1199
|
-
<a name='L1134'></a><a href='#L1134'>1134</a>
|
|
1200
|
-
<a name='L1135'></a><a href='#L1135'>1135</a>
|
|
1201
|
-
<a name='L1136'></a><a href='#L1136'>1136</a>
|
|
1202
|
-
<a name='L1137'></a><a href='#L1137'>1137</a>
|
|
1203
|
-
<a name='L1138'></a><a href='#L1138'>1138</a>
|
|
1204
|
-
<a name='L1139'></a><a href='#L1139'>1139</a>
|
|
1205
|
-
<a name='L1140'></a><a href='#L1140'>1140</a>
|
|
1206
|
-
<a name='L1141'></a><a href='#L1141'>1141</a>
|
|
1207
|
-
<a name='L1142'></a><a href='#L1142'>1142</a>
|
|
1208
|
-
<a name='L1143'></a><a href='#L1143'>1143</a>
|
|
1209
|
-
<a name='L1144'></a><a href='#L1144'>1144</a>
|
|
1210
|
-
<a name='L1145'></a><a href='#L1145'>1145</a>
|
|
1211
|
-
<a name='L1146'></a><a href='#L1146'>1146</a>
|
|
1212
|
-
<a name='L1147'></a><a href='#L1147'>1147</a>
|
|
1213
|
-
<a name='L1148'></a><a href='#L1148'>1148</a>
|
|
1214
|
-
<a name='L1149'></a><a href='#L1149'>1149</a>
|
|
1215
|
-
<a name='L1150'></a><a href='#L1150'>1150</a>
|
|
1216
|
-
<a name='L1151'></a><a href='#L1151'>1151</a>
|
|
1217
|
-
<a name='L1152'></a><a href='#L1152'>1152</a>
|
|
1218
|
-
<a name='L1153'></a><a href='#L1153'>1153</a>
|
|
1219
|
-
<a name='L1154'></a><a href='#L1154'>1154</a>
|
|
1220
|
-
<a name='L1155'></a><a href='#L1155'>1155</a>
|
|
1221
|
-
<a name='L1156'></a><a href='#L1156'>1156</a>
|
|
1222
|
-
<a name='L1157'></a><a href='#L1157'>1157</a>
|
|
1223
|
-
<a name='L1158'></a><a href='#L1158'>1158</a>
|
|
1224
|
-
<a name='L1159'></a><a href='#L1159'>1159</a>
|
|
1225
|
-
<a name='L1160'></a><a href='#L1160'>1160</a>
|
|
1226
|
-
<a name='L1161'></a><a href='#L1161'>1161</a>
|
|
1227
|
-
<a name='L1162'></a><a href='#L1162'>1162</a>
|
|
1228
|
-
<a name='L1163'></a><a href='#L1163'>1163</a>
|
|
1229
|
-
<a name='L1164'></a><a href='#L1164'>1164</a>
|
|
1230
|
-
<a name='L1165'></a><a href='#L1165'>1165</a>
|
|
1231
|
-
<a name='L1166'></a><a href='#L1166'>1166</a>
|
|
1232
|
-
<a name='L1167'></a><a href='#L1167'>1167</a>
|
|
1233
|
-
<a name='L1168'></a><a href='#L1168'>1168</a>
|
|
1234
|
-
<a name='L1169'></a><a href='#L1169'>1169</a>
|
|
1235
|
-
<a name='L1170'></a><a href='#L1170'>1170</a>
|
|
1236
|
-
<a name='L1171'></a><a href='#L1171'>1171</a>
|
|
1237
|
-
<a name='L1172'></a><a href='#L1172'>1172</a>
|
|
1238
|
-
<a name='L1173'></a><a href='#L1173'>1173</a>
|
|
1239
|
-
<a name='L1174'></a><a href='#L1174'>1174</a>
|
|
1240
|
-
<a name='L1175'></a><a href='#L1175'>1175</a>
|
|
1241
|
-
<a name='L1176'></a><a href='#L1176'>1176</a>
|
|
1242
|
-
<a name='L1177'></a><a href='#L1177'>1177</a>
|
|
1243
|
-
<a name='L1178'></a><a href='#L1178'>1178</a>
|
|
1244
|
-
<a name='L1179'></a><a href='#L1179'>1179</a>
|
|
1245
|
-
<a name='L1180'></a><a href='#L1180'>1180</a>
|
|
1246
|
-
<a name='L1181'></a><a href='#L1181'>1181</a>
|
|
1247
|
-
<a name='L1182'></a><a href='#L1182'>1182</a>
|
|
1248
|
-
<a name='L1183'></a><a href='#L1183'>1183</a>
|
|
1249
|
-
<a name='L1184'></a><a href='#L1184'>1184</a>
|
|
1250
|
-
<a name='L1185'></a><a href='#L1185'>1185</a>
|
|
1251
|
-
<a name='L1186'></a><a href='#L1186'>1186</a>
|
|
1252
|
-
<a name='L1187'></a><a href='#L1187'>1187</a>
|
|
1253
|
-
<a name='L1188'></a><a href='#L1188'>1188</a>
|
|
1254
|
-
<a name='L1189'></a><a href='#L1189'>1189</a>
|
|
1255
|
-
<a name='L1190'></a><a href='#L1190'>1190</a>
|
|
1256
|
-
<a name='L1191'></a><a href='#L1191'>1191</a>
|
|
1257
|
-
<a name='L1192'></a><a href='#L1192'>1192</a>
|
|
1258
|
-
<a name='L1193'></a><a href='#L1193'>1193</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
1259
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1261
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1263
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1268
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1269
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1272
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1276
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1277
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1278
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1280
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1282
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1286
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1287
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
-
<span class="cline-any cline-yes">131x</span>
|
|
1289
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1290
|
-
<span class="cline-any cline-yes">124x</span>
|
|
1291
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1292
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1293
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1294
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1295
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1296
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1297
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1298
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1299
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1301
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1302
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1303
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1304
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1305
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1307
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1309
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1310
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1311
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1312
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1313
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1316
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1317
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1318
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1319
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1320
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1321
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
-
<span class="cline-any cline-yes">149x</span>
|
|
1323
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1324
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1325
|
-
<span class="cline-any cline-yes">149x</span>
|
|
1326
|
-
<span class="cline-any cline-yes">235x</span>
|
|
1327
|
-
<span class="cline-any cline-yes">30x</span>
|
|
1328
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1329
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1330
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1331
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1332
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1333
|
-
<span class="cline-any cline-yes">149x</span>
|
|
1334
|
-
<span class="cline-any cline-yes">149x</span>
|
|
1335
|
-
<span class="cline-any cline-yes">168x</span>
|
|
1336
|
-
<span class="cline-any cline-yes">168x</span>
|
|
1337
|
-
<span class="cline-any cline-yes">227x</span>
|
|
1338
|
-
<span class="cline-any cline-yes">161x</span>
|
|
1339
|
-
<span class="cline-any cline-yes">161x</span>
|
|
1340
|
-
<span class="cline-any cline-yes">203x</span>
|
|
1341
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1342
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1344
|
-
<span class="cline-any cline-yes">161x</span>
|
|
1345
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1346
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1347
|
-
<span class="cline-any cline-yes">161x</span>
|
|
1348
|
-
<span class="cline-any cline-yes">161x</span>
|
|
1349
|
-
<span class="cline-any cline-yes">71x</span>
|
|
1350
|
-
<span class="cline-any cline-yes">21x</span>
|
|
1351
|
-
<span class="cline-any cline-yes">21x</span>
|
|
1352
|
-
<span class="cline-any cline-yes">21x</span>
|
|
1353
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
-
<span class="cline-any cline-yes">149x</span>
|
|
1359
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1360
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1361
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1362
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1363
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1364
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1365
|
-
<span class="cline-any cline-no"> </span>
|
|
1366
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1367
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1368
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1369
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1372
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1373
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1374
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1375
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1376
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1377
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1378
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1380
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1381
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1382
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1383
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1384
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1386
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1387
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1388
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1389
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1390
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1391
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1392
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1393
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1394
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1395
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1396
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1399
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1400
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1401
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1402
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1404
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1405
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1406
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1408
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1409
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1410
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1411
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1412
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1413
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1414
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1415
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1416
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1417
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1418
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1419
|
-
<span class="cline-any cline-yes">19x</span>
|
|
1420
|
-
<span class="cline-any cline-yes">19x</span>
|
|
1421
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1422
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1423
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1424
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1425
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1426
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1427
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1428
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1429
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1431
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1432
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1433
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1434
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1435
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1436
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1437
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1438
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1439
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1440
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1441
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1443
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1444
|
-
<span class="cline-any cline-yes">151x</span>
|
|
1445
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1446
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1447
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1448
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1449
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1450
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1451
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
-
<span class="cline-any cline-yes">84x</span>
|
|
1453
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1454
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1455
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1457
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1458
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1459
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1460
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1461
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1463
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1464
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1465
|
-
<span class="cline-any cline-yes">115x</span>
|
|
1466
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1467
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1469
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1470
|
-
<span class="cline-any cline-yes">15x</span>
|
|
1471
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1472
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1473
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1474
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1475
|
-
<span class="cline-any cline-yes">115x</span>
|
|
1476
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1478
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1479
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1480
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1481
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1482
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1484
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1485
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1486
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1488
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1489
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1490
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1491
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1492
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1495
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1496
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1497
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1499
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1500
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1501
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1502
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1504
|
-
<span class="cline-any cline-yes">104x</span>
|
|
1505
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1507
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1508
|
-
<span class="cline-any cline-yes">135x</span>
|
|
1509
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1510
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1511
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1512
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1515
|
-
<span class="cline-any cline-yes">109x</span>
|
|
1516
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1517
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
-
<span class="cline-any cline-yes">104x</span>
|
|
1520
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1521
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1522
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1523
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1524
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1525
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1526
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1527
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1528
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1529
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1530
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1531
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1532
|
-
<span class="cline-any cline-no"> </span>
|
|
1533
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1535
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1536
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1537
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1538
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1539
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1540
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1541
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1542
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1544
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1545
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1546
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1548
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1549
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1550
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1551
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1555
|
-
<span class="cline-any cline-yes">23x</span>
|
|
1556
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1557
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1558
|
-
<span class="cline-any cline-yes">23x</span>
|
|
1559
|
-
<span class="cline-any cline-yes">23x</span>
|
|
1560
|
-
<span class="cline-any cline-yes">23x</span>
|
|
1561
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1562
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1563
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1564
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1565
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1566
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1567
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1568
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1569
|
-
<span class="cline-any cline-yes">20x</span>
|
|
1570
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1571
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1572
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1573
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1574
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1576
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1577
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1578
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1579
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1580
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1581
|
-
<span class="cline-any cline-yes">65x</span>
|
|
1582
|
-
<span class="cline-any cline-yes">65x</span>
|
|
1583
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1584
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1585
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1586
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1588
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1589
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1590
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1591
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1592
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1593
|
-
<span class="cline-any cline-yes">59x</span>
|
|
1594
|
-
<span class="cline-any cline-yes">76x</span>
|
|
1595
|
-
<span class="cline-any cline-yes">59x</span>
|
|
1596
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1597
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1598
|
-
<span class="cline-any cline-yes">65x</span>
|
|
1599
|
-
<span class="cline-any cline-yes">65x</span>
|
|
1600
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1601
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1602
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1603
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1604
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
-
<span class="cline-any cline-yes">14x</span>
|
|
1606
|
-
<span class="cline-any cline-yes">14x</span>
|
|
1607
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1609
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
-
<span class="cline-any cline-yes">14x</span>
|
|
1611
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1615
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1616
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1617
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1618
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1619
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1620
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1621
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1622
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1623
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1625
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1626
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1628
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1635
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1636
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1638
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1640
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1642
|
-
<span class="cline-any cline-yes">47x</span>
|
|
1643
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1644
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1645
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1649
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1650
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1651
|
-
<span class="cline-any cline-no"> </span>
|
|
1652
|
-
<span class="cline-any cline-no"> </span>
|
|
1653
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1655
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
-
<span class="cline-any cline-yes">10x</span>
|
|
1657
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1658
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1659
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
-
<span class="cline-any cline-yes">48x</span>
|
|
1663
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1664
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1665
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1666
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1667
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
-
<span class="cline-any cline-yes">21x</span>
|
|
1669
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
-
<span class="cline-any cline-yes">44x</span>
|
|
1671
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1672
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1673
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1674
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
-
<span class="cline-any cline-yes">48x</span>
|
|
1678
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1679
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1680
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1681
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1682
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1683
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1684
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1685
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1686
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1687
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1688
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1689
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1690
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1693
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1694
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1695
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1696
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1697
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1699
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1700
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1701
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
-
<span class="cline-any cline-yes">21x</span>
|
|
1703
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1704
|
-
<span class="cline-any cline-yes">31x</span>
|
|
1705
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1706
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1707
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
-
<span class="cline-any cline-yes">28x</span>
|
|
1709
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1710
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1711
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1713
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
-
<span class="cline-any cline-yes">26x</span>
|
|
1715
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1717
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
-
<span class="cline-any cline-yes">24x</span>
|
|
1719
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
-
<span class="cline-any cline-yes">46x</span>
|
|
1723
|
-
<span class="cline-any cline-yes">25x</span>
|
|
1724
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1725
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1727
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
-
<span class="cline-any cline-yes">141x</span>
|
|
1729
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1733
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1734
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1735
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1736
|
-
<span class="cline-any cline-no"> </span>
|
|
1737
|
-
<span class="cline-any cline-no"> </span>
|
|
1738
|
-
<span class="cline-any cline-no"> </span>
|
|
1739
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1740
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1741
|
-
<span class="cline-any cline-yes">11x</span>
|
|
1742
|
-
<span class="cline-any cline-no"> </span>
|
|
1743
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1744
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1745
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1746
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1749
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1750
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1751
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1752
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1753
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1754
|
-
<span class="cline-any cline-no"> </span>
|
|
1755
|
-
<span class="cline-any cline-no"> </span>
|
|
1756
|
-
<span class="cline-any cline-no"> </span>
|
|
1757
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1758
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1759
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1760
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1761
|
-
<span class="cline-any cline-no"> </span>
|
|
1762
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1763
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1764
|
-
<span class="cline-any cline-yes">9x</span>
|
|
1765
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1766
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1767
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1769
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1770
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1771
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1772
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1773
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1774
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1775
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1776
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1777
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1778
|
-
<span class="cline-any cline-yes">141x</span>
|
|
1779
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1780
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1781
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1782
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1783
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1784
|
-
<span class="cline-any cline-yes">147x</span>
|
|
1785
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1786
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1787
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1788
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1789
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1790
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1791
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1792
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1793
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1794
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1795
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1796
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1797
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1798
|
-
<span class="cline-any cline-yes">284x</span>
|
|
1799
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1800
|
-
<span class="cline-any cline-yes">219x</span>
|
|
1801
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1802
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1803
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1804
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1805
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1806
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1807
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1808
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1809
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1810
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1811
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1812
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1813
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1814
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1815
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1816
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1817
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1818
|
-
<span class="cline-any cline-yes">26x</span>
|
|
1819
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1820
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1821
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1822
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1823
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1824
|
-
<span class="cline-any cline-no"> </span>
|
|
1825
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1826
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1827
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1828
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1829
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1830
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1831
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1832
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1833
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1834
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1835
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1836
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1837
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1838
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1839
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1840
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1841
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1842
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1843
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1844
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1845
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1846
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1847
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1848
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1849
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1850
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1851
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1852
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1853
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1854
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1855
|
-
<span class="cline-any cline-yes">248x</span>
|
|
1856
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1857
|
-
<span class="cline-any cline-yes">122x</span>
|
|
1858
|
-
<span class="cline-any cline-yes">122x</span>
|
|
1859
|
-
<span class="cline-any cline-yes">121x</span>
|
|
1860
|
-
<span class="cline-any cline-yes">120x</span>
|
|
1861
|
-
<span class="cline-any cline-yes">122x</span>
|
|
1862
|
-
<span class="cline-any cline-yes">122x</span>
|
|
1863
|
-
<span class="cline-any cline-yes">122x</span>
|
|
1864
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1865
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1866
|
-
<span class="cline-any cline-yes">17x</span>
|
|
1867
|
-
<span class="cline-any cline-yes">17x</span>
|
|
1868
|
-
<span class="cline-any cline-yes">17x</span>
|
|
1869
|
-
<span class="cline-any cline-yes">17x</span>
|
|
1870
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1871
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1872
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1873
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1874
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1875
|
-
<span class="cline-any cline-yes">16x</span>
|
|
1876
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1877
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1878
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1879
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1880
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1881
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1882
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1883
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1884
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1885
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1886
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1887
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1888
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1889
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1890
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1891
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1892
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1893
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1894
|
-
<span class="cline-any cline-yes">8x</span>
|
|
1895
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1896
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1897
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1898
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1899
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1900
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1901
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1902
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1903
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1904
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1905
|
-
<span class="cline-any cline-yes">5x</span>
|
|
1906
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1907
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1908
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1909
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1910
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1911
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1912
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1913
|
-
<span class="cline-any cline-yes">41x</span>
|
|
1914
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1915
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1916
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1917
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1918
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1919
|
-
<span class="cline-any cline-yes">1x</span>
|
|
1920
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1921
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1922
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1923
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1924
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1925
|
-
<span class="cline-any cline-no"> </span>
|
|
1926
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1927
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1928
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1929
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1930
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1931
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1932
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1933
|
-
<span class="cline-any cline-yes">12x</span>
|
|
1934
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1935
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1936
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1937
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1938
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1939
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1940
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1941
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1942
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1943
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1944
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1945
|
-
<span class="cline-any cline-yes">7x</span>
|
|
1946
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1947
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1948
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1949
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1950
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1951
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1952
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1953
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1954
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1955
|
-
<span class="cline-any cline-yes">6x</span>
|
|
1956
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1957
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1958
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1959
|
-
<span class="cline-any cline-yes">3x</span>
|
|
1960
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1961
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1962
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1963
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1964
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1965
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1966
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1967
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1968
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1969
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1970
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1971
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1972
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1973
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1974
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1975
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1976
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1977
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1978
|
-
<span class="cline-any cline-no"> </span>
|
|
1979
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1980
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1981
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1982
|
-
<span class="cline-any cline-no"> </span>
|
|
1983
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1984
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1985
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1986
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1987
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1988
|
-
<span class="cline-any cline-yes">2x</span>
|
|
1989
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1990
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1991
|
-
<span class="cline-any cline-yes">4x</span>
|
|
1992
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1993
|
-
<span class="cline-any cline-no"> </span>
|
|
1994
|
-
<span class="cline-any cline-no"> </span>
|
|
1995
|
-
<span class="cline-any cline-no"> </span>
|
|
1996
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1997
|
-
<span class="cline-any cline-no"> </span>
|
|
1998
|
-
<span class="cline-any cline-neutral"> </span>
|
|
1999
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2000
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2001
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2002
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2003
|
-
<span class="cline-any cline-no"> </span>
|
|
2004
|
-
<span class="cline-any cline-no"> </span>
|
|
2005
|
-
<span class="cline-any cline-no"> </span>
|
|
2006
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2007
|
-
<span class="cline-any cline-no"> </span>
|
|
2008
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2009
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2010
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2011
|
-
<span class="cline-any cline-no"> </span>
|
|
2012
|
-
<span class="cline-any cline-no"> </span>
|
|
2013
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2014
|
-
<span class="cline-any cline-no"> </span>
|
|
2015
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2016
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2017
|
-
<span class="cline-any cline-no"> </span>
|
|
2018
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2019
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2020
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2021
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2022
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2023
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2024
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2025
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2026
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2027
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2028
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2029
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2030
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2031
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2032
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2033
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2034
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2035
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2036
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2037
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2038
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2039
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2040
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2041
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2042
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2043
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2044
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2045
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2046
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2047
|
-
<span class="cline-any cline-yes">29x</span>
|
|
2048
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2049
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2050
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2051
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2052
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2053
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2054
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2055
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2056
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2057
|
-
<span class="cline-any cline-yes">62x</span>
|
|
2058
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2059
|
-
<span class="cline-any cline-yes">29x</span>
|
|
2060
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2061
|
-
<span class="cline-any cline-yes">26x</span>
|
|
2062
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2063
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2064
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2065
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2066
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2067
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2068
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2069
|
-
<span class="cline-any cline-no"> </span>
|
|
2070
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2071
|
-
<span class="cline-any cline-no"> </span>
|
|
2072
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2073
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2074
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2075
|
-
<span class="cline-any cline-no"> </span>
|
|
2076
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2077
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2078
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2079
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2080
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2081
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2082
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2083
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2084
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2085
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2086
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2087
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2088
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2089
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2090
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2091
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2092
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2093
|
-
<span class="cline-any cline-no"> </span>
|
|
2094
|
-
<span class="cline-any cline-no"> </span>
|
|
2095
|
-
<span class="cline-any cline-no"> </span>
|
|
2096
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2097
|
-
<span class="cline-any cline-no"> </span>
|
|
2098
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2099
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2100
|
-
<span class="cline-any cline-no"> </span>
|
|
2101
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2102
|
-
<span class="cline-any cline-no"> </span>
|
|
2103
|
-
<span class="cline-any cline-no"> </span>
|
|
2104
|
-
<span class="cline-any cline-no"> </span>
|
|
2105
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2106
|
-
<span class="cline-any cline-no"> </span>
|
|
2107
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2108
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2109
|
-
<span class="cline-any cline-no"> </span>
|
|
2110
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2111
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2112
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2113
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2114
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2115
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2116
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2117
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2118
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2119
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2120
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2121
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2122
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2123
|
-
<span class="cline-any cline-yes">32x</span>
|
|
2124
|
-
<span class="cline-any cline-yes">3x</span>
|
|
2125
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2126
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2127
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2128
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2129
|
-
<span class="cline-any cline-yes">33x</span>
|
|
2130
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2131
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2132
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2133
|
-
<span class="cline-any cline-yes">31x</span>
|
|
2134
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2135
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2136
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2137
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2138
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2139
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2140
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2141
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2142
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2143
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2144
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2145
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2146
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2147
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2148
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2149
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2150
|
-
<span class="cline-any cline-no"> </span>
|
|
2151
|
-
<span class="cline-any cline-no"> </span>
|
|
2152
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2153
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2154
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2155
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2156
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2157
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2158
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2159
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2160
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2161
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2162
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2163
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2164
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2165
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2166
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2167
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2168
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2169
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2170
|
-
<span class="cline-any cline-no"> </span>
|
|
2171
|
-
<span class="cline-any cline-no"> </span>
|
|
2172
|
-
<span class="cline-any cline-no"> </span>
|
|
2173
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2174
|
-
<span class="cline-any cline-no"> </span>
|
|
2175
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2176
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2177
|
-
<span class="cline-any cline-no"> </span>
|
|
2178
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2179
|
-
<span class="cline-any cline-no"> </span>
|
|
2180
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2181
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2182
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2183
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2184
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2185
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2186
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2187
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2188
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2189
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2190
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2191
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2192
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2193
|
-
<span class="cline-any cline-no"> </span>
|
|
2194
|
-
<span class="cline-any cline-no"> </span>
|
|
2195
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2196
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2197
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2198
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2199
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2200
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2201
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2202
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2203
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2204
|
-
<span class="cline-any cline-yes">232x</span>
|
|
2205
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2206
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2207
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2208
|
-
<span class="cline-any cline-yes">232x</span>
|
|
2209
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2210
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2211
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2212
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2213
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2214
|
-
<span class="cline-any cline-yes">25x</span>
|
|
2215
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2216
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2217
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2218
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2219
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2220
|
-
<span class="cline-any cline-yes">148x</span>
|
|
2221
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2222
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2223
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2224
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2225
|
-
<span class="cline-any cline-yes">1527x</span>
|
|
2226
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2227
|
-
<span class="cline-any cline-yes">906x</span>
|
|
2228
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2229
|
-
<span class="cline-any cline-yes">76x</span>
|
|
2230
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2231
|
-
<span class="cline-any cline-yes">12x</span>
|
|
2232
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2233
|
-
<span class="cline-any cline-yes">6x</span>
|
|
2234
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2235
|
-
<span class="cline-any cline-yes">24x</span>
|
|
2236
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2237
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2238
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2239
|
-
<span class="cline-any cline-yes">68x</span>
|
|
2240
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2241
|
-
<span class="cline-any cline-yes">6x</span>
|
|
2242
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2243
|
-
<span class="cline-any cline-yes">56x</span>
|
|
2244
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2245
|
-
<span class="cline-any cline-yes">442x</span>
|
|
2246
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2247
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2248
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2249
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2250
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2251
|
-
<span class="cline-any cline-yes">874x</span>
|
|
2252
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2253
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2254
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2255
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2256
|
-
<span class="cline-any cline-yes">274x</span>
|
|
2257
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2258
|
-
<span class="cline-any cline-yes">158x</span>
|
|
2259
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2260
|
-
<span class="cline-any cline-yes">14x</span>
|
|
2261
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2262
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2263
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2264
|
-
<span class="cline-any cline-no"> </span>
|
|
2265
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2266
|
-
<span class="cline-any cline-yes">8x</span>
|
|
2267
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2268
|
-
<span class="cline-any cline-yes">10x</span>
|
|
2269
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2270
|
-
<span class="cline-any cline-yes">85x</span>
|
|
2271
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2272
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2273
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2274
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2275
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2276
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2277
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2278
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2279
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2280
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2281
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2282
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2283
|
-
<span class="cline-any cline-yes">264x</span>
|
|
2284
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2285
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2286
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2287
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2288
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2289
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2290
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2291
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2292
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2293
|
-
<span class="cline-any cline-yes">57x</span>
|
|
2294
|
-
<span class="cline-any cline-yes">34x</span>
|
|
2295
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2296
|
-
<span class="cline-any cline-yes">34x</span>
|
|
2297
|
-
<span class="cline-any cline-yes">57x</span>
|
|
2298
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2299
|
-
<span class="cline-any cline-yes">51x</span>
|
|
2300
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2301
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2302
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2303
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2304
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2305
|
-
<span class="cline-any cline-yes">46x</span>
|
|
2306
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2307
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2308
|
-
<span class="cline-any cline-yes">80x</span>
|
|
2309
|
-
<span class="cline-any cline-yes">46x</span>
|
|
2310
|
-
<span class="cline-any cline-yes">52x</span>
|
|
2311
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2312
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2313
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2314
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2315
|
-
<span class="cline-any cline-yes">34x</span>
|
|
2316
|
-
<span class="cline-any cline-yes">57x</span>
|
|
2317
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2318
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2319
|
-
<span class="cline-any cline-yes">34x</span>
|
|
2320
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2321
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2322
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2323
|
-
<span class="cline-any cline-yes">79x</span>
|
|
2324
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2325
|
-
<span class="cline-any cline-yes">17x</span>
|
|
2326
|
-
<span class="cline-any cline-yes">17x</span>
|
|
2327
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2328
|
-
<span class="cline-any cline-yes">6x</span>
|
|
2329
|
-
<span class="cline-any cline-yes">6x</span>
|
|
2330
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2331
|
-
<span class="cline-any cline-no"> </span>
|
|
2332
|
-
<span class="cline-any cline-no"> </span>
|
|
2333
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2334
|
-
<span class="cline-any cline-no"> </span>
|
|
2335
|
-
<span class="cline-any cline-no"> </span>
|
|
2336
|
-
<span class="cline-any cline-no"> </span>
|
|
2337
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2338
|
-
<span class="cline-any cline-yes">2x</span>
|
|
2339
|
-
<span class="cline-any cline-yes">1x</span>
|
|
2340
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2341
|
-
<span class="cline-any cline-no"> </span>
|
|
2342
|
-
<span class="cline-any cline-no"> </span>
|
|
2343
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2344
|
-
<span class="cline-any cline-yes">10x</span>
|
|
2345
|
-
<span class="cline-any cline-yes">5x</span>
|
|
2346
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2347
|
-
<span class="cline-any cline-no"> </span>
|
|
2348
|
-
<span class="cline-any cline-no"> </span>
|
|
2349
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2350
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2351
|
-
<span class="cline-any cline-yes">4x</span>
|
|
2352
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2353
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2354
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2355
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2356
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2357
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2358
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2359
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2360
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2361
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2362
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2363
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2364
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2365
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2366
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2367
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2368
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2369
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2370
|
-
<span class="cline-any cline-yes">264x</span>
|
|
2371
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2372
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2373
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2374
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2375
|
-
<span class="cline-any cline-yes">60x</span>
|
|
2376
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2377
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2378
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2379
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2380
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2381
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2382
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2383
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2384
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2385
|
-
<span class="cline-any cline-yes">37x</span>
|
|
2386
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2387
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2388
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2389
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2390
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2391
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2392
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2393
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2394
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2395
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2396
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2397
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2398
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2399
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2400
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2401
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2402
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2403
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2404
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2405
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2406
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2407
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2408
|
-
<span class="cline-any cline-yes">297x</span>
|
|
2409
|
-
<span class="cline-any cline-yes">35x</span>
|
|
2410
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2411
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2412
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2413
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2414
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2415
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2416
|
-
<span class="cline-any cline-yes">189x</span>
|
|
2417
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2418
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2419
|
-
<span class="cline-any cline-yes">149x</span>
|
|
2420
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2421
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2422
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2423
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2424
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2425
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2426
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2427
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2428
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2429
|
-
<span class="cline-any cline-yes">38x</span>
|
|
2430
|
-
<span class="cline-any cline-yes">21x</span>
|
|
2431
|
-
<span class="cline-any cline-yes">21x</span>
|
|
2432
|
-
<span class="cline-any cline-yes">15x</span>
|
|
2433
|
-
<span class="cline-any cline-yes">15x</span>
|
|
2434
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2435
|
-
<span class="cline-any cline-yes">15x</span>
|
|
2436
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2437
|
-
<span class="cline-any cline-yes">15x</span>
|
|
2438
|
-
<span class="cline-any cline-yes">15x</span>
|
|
2439
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2440
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2441
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2442
|
-
<span class="cline-any cline-yes">23x</span>
|
|
2443
|
-
<span class="cline-any cline-yes">23x</span>
|
|
2444
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2445
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2446
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2447
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2448
|
-
<span class="cline-any cline-yes">26x</span>
|
|
2449
|
-
<span class="cline-any cline-neutral"> </span>
|
|
2450
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { relative, dirname } from 'node:path';
|
|
2451
|
-
import type {
|
|
2452
|
-
ContractRootNode,
|
|
2453
|
-
ModelNode,
|
|
2454
|
-
FieldNode,
|
|
2455
|
-
ContractTypeNode,
|
|
2456
|
-
ScalarTypeNode,
|
|
2457
|
-
ArrayTypeNode,
|
|
2458
|
-
TupleTypeNode,
|
|
2459
|
-
RecordTypeNode,
|
|
2460
|
-
EnumTypeNode,
|
|
2461
|
-
LiteralTypeNode,
|
|
2462
|
-
UnionTypeNode,
|
|
2463
|
-
DiscriminatedUnionTypeNode,
|
|
2464
|
-
InlineObjectTypeNode,
|
|
2465
|
-
IntersectionTypeNode,
|
|
2466
|
-
ObjectMode,
|
|
2467
|
-
} from '@contractkit/core';
|
|
2468
|
-
import {
|
|
2469
|
-
collectTypeRefs,
|
|
2470
|
-
computeModelsWithOutput as ckComputeModelsWithOutput,
|
|
2471
|
-
collectExternalOutputRefs as ckCollectExternalOutputRefs,
|
|
2472
|
-
} from '@contractkit/core';
|
|
2473
|
-
|
|
2474
|
-
/**
|
|
2475
|
-
* Maps a ContractKit object mode to its Zod constructor name.
|
|
2476
|
-
*
|
|
2477
|
-
* @returns `"z.strictObject"` | `"z.object"` | `"z.looseObject"`
|
|
2478
|
-
*/
|
|
2479
|
-
export function modeToWrapper(mode: ObjectMode): string {
|
|
2480
|
-
switch (mode) {
|
|
2481
|
-
case 'strict':
|
|
2482
|
-
return 'z.strictObject';
|
|
2483
|
-
case 'strip':
|
|
2484
|
-
return 'z.object';
|
|
2485
|
-
case 'loose':
|
|
2486
|
-
return 'z.looseObject';
|
|
2487
|
-
}
|
|
2488
|
-
}
|
|
2489
|
-
|
|
2490
|
-
// ─── Cross-file import resolution ─────────────────────────────────────────
|
|
2491
|
-
|
|
2492
|
-
/** Cross-file context passed to `generateContract` to wire up imports and Input/Output variant tracking. */
|
|
2493
|
-
export interface ContractCodegenContext {
|
|
2494
|
-
/** Map from model name → absolute output file path */
|
|
2495
|
-
modelOutPaths: Map<string, string>;
|
|
2496
|
-
/** Absolute output file path for the current contract file */
|
|
2497
|
-
currentOutPath: string;
|
|
2498
|
-
/** Set of model names that have Input variants (models with visibility modifiers) */
|
|
2499
|
-
modelsWithInput?: Set<string>;
|
|
2500
|
-
/** Set of model names that have Output variants (models with format(output=...)) */
|
|
2501
|
-
modelsWithOutput?: Set<string>;
|
|
2502
|
-
/** If set, import JsonValue from this path instead of re-declaring it (avoids barrel re-export conflicts) */
|
|
2503
|
-
jsonValueImportPath?: string;
|
|
2504
|
-
}
|
|
2505
|
-
|
|
2506
|
-
// ─── Public entry point ────────────────────────────────────────────────────
|
|
2507
|
-
|
|
2508
|
-
/**
|
|
2509
|
-
* Compute which models need Input variants, including transitive dependencies.
|
|
2510
|
-
* A model needs an Input variant if it has visibility-modified fields, OR if
|
|
2511
|
-
* any of its field types (recursively) reference a model that has an Input variant.
|
|
2512
|
-
*/
|
|
2513
|
-
export function computeModelsWithInput(models: ModelNode[], externalModelsWithInput: Set<string> = new Set()): Set<string> {
|
|
2514
|
-
const result = new Set<string>();
|
|
2515
|
-
|
|
2516
|
-
// Initial pass: direct visibility modifiers
|
|
2517
|
-
for (const model of models) {
|
|
2518
|
-
if (model.fields.some(f => f.visibility !== 'normal')) {
|
|
2519
|
-
result.add(model.name);
|
|
2520
|
-
}
|
|
2521
|
-
}
|
|
2522
|
-
|
|
2523
|
-
// Transitive closure: add models that reference models with Input variants,
|
|
2524
|
-
// including through base model inheritance.
|
|
2525
|
-
let changed = true;
|
|
2526
|
-
while (changed) {
|
|
2527
|
-
changed = false;
|
|
2528
|
-
for (const model of models) {
|
|
2529
|
-
if (result.has(model.name)) continue;
|
|
2530
|
-
const refs = new Set<string>();
|
|
2531
|
-
for (const field of model.fields) {
|
|
2532
|
-
collectTypeRefs(field.type, refs);
|
|
2533
|
-
}
|
|
2534
|
-
// A model that extends a parent with Input variants also needs an Input variant,
|
|
2535
|
-
// so that the write schema can extend ParentInput instead of Parent.
|
|
2536
|
-
if (model.bases) for (const b of model.bases) refs.add(b);
|
|
2537
|
-
// A type alias (model.type set) that references a model with Input variants
|
|
2538
|
-
// also needs an Input variant.
|
|
2539
|
-
if (model.type) collectTypeRefs(model.type, refs);
|
|
2540
|
-
for (const ref of refs) {
|
|
2541
|
-
if (result.has(ref) || externalModelsWithInput.has(ref)) {
|
|
2542
|
-
result.add(model.name);
|
|
2543
|
-
changed = true;
|
|
2544
|
-
break;
|
|
2545
|
-
}
|
|
2546
|
-
}
|
|
2547
|
-
}
|
|
2548
|
-
}
|
|
2549
|
-
|
|
2550
|
-
return result;
|
|
2551
|
-
}
|
|
2552
|
-
|
|
2553
|
-
function generateComments(model: ModelNode, outPath?: string): string[] {
|
|
2554
|
-
const lines: string[] = [];
|
|
2555
|
-
lines.push('/**');
|
|
2556
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (model.deprecated) {
|
|
2557
|
-
<span class="cstat-no" title="statement not covered" > lines.push(` * @deprecated`);</span>
|
|
2558
|
-
}
|
|
2559
|
-
if (model.description) {
|
|
2560
|
-
lines.push(` * ${model.description}`);
|
|
2561
|
-
}
|
|
2562
|
-
|
|
2563
|
-
const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file;
|
|
2564
|
-
lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`);
|
|
2565
|
-
lines.push('*/');
|
|
2566
|
-
return lines;
|
|
2567
|
-
}
|
|
2568
|
-
|
|
2569
|
-
/**
|
|
2570
|
-
* Generate a TypeScript module containing Zod schemas for every model in `root`.
|
|
2571
|
-
*
|
|
2572
|
-
* Emits up to three schemas per model when visibility modifiers are present:
|
|
2573
|
-
* `ModelBase` (all fields), `Model` (read — no writeonly), `ModelInput` (write — no readonly).
|
|
2574
|
-
*
|
|
2575
|
-
* @param root - The parsed contract root node.
|
|
2576
|
-
* @param context - Optional cross-file context for import resolution and Input/Output variant tracking.
|
|
2577
|
-
* @returns The full TypeScript source as a string.
|
|
2578
|
-
*/
|
|
2579
|
-
export function generateContract(root: ContractRootNode, context?: ContractCodegenContext): string {
|
|
2580
|
-
const needsDateTime = rootNeedsDateTime(root);
|
|
2581
|
-
const needsDuration = rootNeedsScalar(root, 'duration');
|
|
2582
|
-
const needsInterval = rootNeedsScalar(root, 'interval');
|
|
2583
|
-
const needsBinary = rootNeedsScalar(root, 'binary');
|
|
2584
|
-
const needsDatetime = rootNeedsScalar(root, 'datetime');
|
|
2585
|
-
const needsJson = rootNeedsScalar(root, 'json');
|
|
2586
|
-
const externalRefs = collectExternalRefs(root);
|
|
2587
|
-
const lines: string[] = [];
|
|
2588
|
-
|
|
2589
|
-
// Compute which models have Input variants (local, incl. transitive deps + external)
|
|
2590
|
-
const externalModelsWithInput = context?.modelsWithInput ?? new Set<string>();
|
|
2591
|
-
const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput);
|
|
2592
|
-
const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]);
|
|
2593
|
-
|
|
2594
|
-
// Compute which models have Output variants (post-transform wire shape)
|
|
2595
|
-
const externalModelsWithOutput = context?.modelsWithOutput ?? new Set<string>();
|
|
2596
|
-
const localModelsWithOutput = ckComputeModelsWithOutput(root.models, externalModelsWithOutput);
|
|
2597
|
-
const allModelsWithOutput = new Set([...localModelsWithOutput, ...externalModelsWithOutput]);
|
|
2598
|
-
|
|
2599
|
-
// Collect additional external Input refs needed for Input schema fields
|
|
2600
|
-
const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : [];
|
|
2601
|
-
const externalOutputRefs = allModelsWithOutput.size > 0 ? ckCollectExternalOutputRefs(root, allModelsWithOutput) : [];
|
|
2602
|
-
const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs, ...externalOutputRefs])].sort();
|
|
2603
|
-
|
|
2604
|
-
lines.push(`import { z } from 'zod';`);
|
|
2605
|
-
const luxonImports: string[] = [];
|
|
2606
|
-
if (needsDateTime) luxonImports.push('DateTime');
|
|
2607
|
-
if (needsDuration) luxonImports.push('Duration');
|
|
2608
|
-
if (needsInterval) luxonImports.push('Interval');
|
|
2609
|
-
if (luxonImports.length > 0) lines.push(`import { ${luxonImports.join(', ')} } from 'luxon';`);
|
|
2610
|
-
for (const ref of allExternalRefs) {
|
|
2611
|
-
const importPath = resolveImportPath(ref, context);
|
|
2612
|
-
lines.push(`import { ${ref} } from '${importPath}';`);
|
|
2613
|
-
}
|
|
2614
|
-
lines.push('');
|
|
2615
|
-
if (needsBinary) {
|
|
2616
|
-
lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`);
|
|
2617
|
-
}
|
|
2618
|
-
if (needsDatetime) {
|
|
2619
|
-
lines.push(
|
|
2620
|
-
`const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`,
|
|
2621
|
-
);
|
|
2622
|
-
}
|
|
2623
|
-
if (needsInterval) {
|
|
2624
|
-
lines.push(
|
|
2625
|
-
`const _ZodInterval = z.preprocess((val) => typeof val === 'string' ? Interval.fromISO(val) : val, z.custom<Interval>((val) => val instanceof Interval && val.isValid, { message: 'Must be an ISO 8601 interval' })).transform(val => val.toISO()!);`,
|
|
2626
|
-
);
|
|
2627
|
-
}
|
|
2628
|
-
if (needsJson) {
|
|
2629
|
-
lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`);
|
|
2630
|
-
lines.push(
|
|
2631
|
-
`const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`,
|
|
2632
|
-
);
|
|
2633
|
-
}
|
|
2634
|
-
if (needsBinary || needsDatetime || needsInterval || needsJson) lines.push('');
|
|
2635
|
-
|
|
2636
|
-
const modelsWithWriteonly = new Set(root.models.filter(m => m.fields.some(f => f.visibility === 'writeonly')).map(m => m.name));
|
|
2637
|
-
const modelMap = new Map(root.models.map(m => [m.name, m]));
|
|
2638
|
-
|
|
2639
|
-
for (const model of topoSortModels(root.models)) {
|
|
2640
|
-
lines.push(...generateModel(model, context?.currentOutPath, allModelsWithInput, modelsWithWriteonly, modelMap, allModelsWithOutput));
|
|
2641
|
-
lines.push('');
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
return lines.join('\n');
|
|
2645
|
-
}
|
|
2646
|
-
|
|
2647
|
-
// ─── Model ─────────────────────────────────────────────────────────────────
|
|
2648
|
-
|
|
2649
|
-
/**
|
|
2650
|
-
* If any ancestor in the base chain has a format(input=)/format(output=) transform,
|
|
2651
|
-
* the parent schema compiles to a `ZodPipe` (object().transform()) which has no `.extend()`.
|
|
2652
|
-
* To keep extension working, inline the parent's fields into the child and inherit format/mode
|
|
2653
|
-
* so the child re-applies the transform on the merged shape. Returns the model unchanged when
|
|
2654
|
-
* no ancestor has format, preserving the existing `.extend()`-based output.
|
|
2655
|
-
*/
|
|
2656
|
-
function flattenFormatChain(model: ModelNode, modelMap: Map<string, ModelNode>): ModelNode {
|
|
2657
|
-
if (!model.bases || model.bases.length === 0) return model;
|
|
2658
|
-
// TODO(multi-base): currently only the first base is followed for format inheritance.
|
|
2659
|
-
// Multi-base format flattening will need a topological merge across all bases.
|
|
2660
|
-
const firstBase = model.bases[0]!;
|
|
2661
|
-
const parent = modelMap.get(firstBase);
|
|
2662
|
-
if (!parent) return model;
|
|
2663
|
-
const flatParent = flattenFormatChain(parent, modelMap);
|
|
2664
|
-
const parentHasFormat =
|
|
2665
|
-
(flatParent.inputCase !== undefined && flatParent.inputCase !== 'camel') ||
|
|
2666
|
-
(flatParent.outputCase !== undefined && <span class="branch-3 cbranch-no" title="branch not covered" >flatParent.outputCase !== 'camel');</span>
|
|
2667
|
-
if (!parentHasFormat) return model;
|
|
2668
|
-
|
|
2669
|
-
const merged = new Map<string, FieldNode>();
|
|
2670
|
-
for (const f of flatParent.fields) merged.set(f.name, f);
|
|
2671
|
-
for (const f of model.fields) merged.set(f.name, f);
|
|
2672
|
-
|
|
2673
|
-
return {
|
|
2674
|
-
...model,
|
|
2675
|
-
bases: undefined,
|
|
2676
|
-
fields: [...merged.values()],
|
|
2677
|
-
inputCase: model.inputCase ?? flatParent.inputCase,
|
|
2678
|
-
outputCase: model.outputCase ?? flatParent.outputCase,
|
|
2679
|
-
mode: model.mode ?? flatParent.mode,
|
|
2680
|
-
};
|
|
2681
|
-
}
|
|
2682
|
-
|
|
2683
|
-
function generateModel(
|
|
2684
|
-
model: ModelNode,
|
|
2685
|
-
outPath?: string,
|
|
2686
|
-
modelsWithInput?: Set<string>,
|
|
2687
|
-
modelsWithWriteonly?: Set<string>,
|
|
2688
|
-
modelMap?: Map<string, ModelNode>,
|
|
2689
|
-
modelsWithOutput?: Set<string>,
|
|
2690
|
-
): string[] {
|
|
2691
|
-
// Type alias: Name : typeExpression
|
|
2692
|
-
if (model.type) {
|
|
2693
|
-
return generateTypeAlias(model, outPath, modelsWithInput, modelsWithOutput);
|
|
2694
|
-
}
|
|
2695
|
-
|
|
2696
|
-
const effective = modelMap ? flattenFormatChain(model, modelMap) : <span class="branch-1 cbranch-no" title="branch not covered" >model;</span>
|
|
2697
|
-
|
|
2698
|
-
// A model needs Input/read split if it has visibility-modified fields OR if it
|
|
2699
|
-
// transitively references models that have Input variants (captured in modelsWithInput).
|
|
2700
|
-
const needsInputSplit = effective.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(effective.name) ?? <span class="branch-2 cbranch-no" title="branch not covered" >false</span>);
|
|
2701
|
-
|
|
2702
|
-
const lines = needsInputSplit
|
|
2703
|
-
? generateThreeSchemaModel(effective, outPath, modelsWithInput, modelsWithWriteonly, modelMap)
|
|
2704
|
-
: generateSimpleModel(effective, outPath);
|
|
2705
|
-
|
|
2706
|
-
// Emit Output type alias when this model (transitively) has format(output=...)
|
|
2707
|
-
if (modelsWithOutput?.has(effective.name)) {
|
|
2708
|
-
lines.push(`export type ${effective.name}Output = z.output<typeof ${effective.name}>;`);
|
|
2709
|
-
}
|
|
2710
|
-
|
|
2711
|
-
return lines;
|
|
2712
|
-
}
|
|
2713
|
-
|
|
2714
|
-
function generateTypeAlias(model: ModelNode, outPath?: string, modelsWithInput?: Set<string>, modelsWithOutput?: Set<string>): string[] {
|
|
2715
|
-
const lines: string[] = [];
|
|
2716
|
-
lines.push(...generateComments(model, outPath));
|
|
2717
|
-
lines.push(`export const ${model.name} = ${renderType(model.type!)};`);
|
|
2718
|
-
lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);
|
|
2719
|
-
if (modelsWithInput?.has(model.name)) {
|
|
2720
|
-
lines.push(`export const ${model.name}Input = ${renderInputType(model.type!, modelsWithInput)};`);
|
|
2721
|
-
lines.push(`export type ${model.name}Input = z.infer<typeof ${model.name}Input>;`);
|
|
2722
|
-
}
|
|
2723
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithOutput?.has(model.name)) {
|
|
2724
|
-
<span class="cstat-no" title="statement not covered" > lines.push(`export type ${model.name}Output = z.output<typeof ${model.name}>;`);</span>
|
|
2725
|
-
}
|
|
2726
|
-
return lines;
|
|
2727
|
-
}
|
|
2728
|
-
|
|
2729
|
-
function generateSimpleModel(model: ModelNode, outPath?: string): string[] {
|
|
2730
|
-
const lines: string[] = [];
|
|
2731
|
-
lines.push(...generateComments(model, outPath));
|
|
2732
|
-
|
|
2733
|
-
const wrapper = modeToWrapper(model.mode ?? 'strict');
|
|
2734
|
-
|
|
2735
|
-
const { inputCase, outputCase } = model;
|
|
2736
|
-
const hasInputTransform = !!inputCase && inputCase !== 'camel';
|
|
2737
|
-
const hasOutputTransform = !!outputCase && outputCase !== 'camel';
|
|
2738
|
-
|
|
2739
|
-
if (hasInputTransform || hasOutputTransform) {
|
|
2740
|
-
const inputBody =
|
|
2741
|
-
inputCase === 'snake'
|
|
2742
|
-
? renderFieldsAsSnakeCase(model.fields, model.mode)
|
|
2743
|
-
: inputCase === 'pascal'
|
|
2744
|
-
? renderFieldsAsPascalCase(model.fields, model.mode)
|
|
2745
|
-
: renderFields(model.fields, model.mode);
|
|
2746
|
-
lines.push(`export const ${model.name} = ${wrapper}({`);
|
|
2747
|
-
lines.push(...inputBody.map(l => ` ${l}`));
|
|
2748
|
-
lines.push(`}).transform(data => ({`);
|
|
2749
|
-
for (const field of model.fields) {
|
|
2750
|
-
const inputKey = applyCase(field.name, inputCase);
|
|
2751
|
-
const outputKey = applyCase(field.name, outputCase);
|
|
2752
|
-
if (field.optional) {
|
|
2753
|
-
// Conditional spread keeps the field optional (`k?: T`) in the inferred
|
|
2754
|
-
// z.output / z.input type, instead of widening to required-nullable (`k: T | undefined`).
|
|
2755
|
-
// Consumer code built with `...(x ? { k: x } : {})` is only assignable to the optional form.
|
|
2756
|
-
// When inputCase is set, the input schema uses `.nullish()` so the guard must reject both
|
|
2757
|
-
// null and undefined; otherwise `.optional()` only allows undefined.
|
|
2758
|
-
const guard = hasInputTransform ? `data.${inputKey} != null` : `data.${inputKey} !== undefined`;
|
|
2759
|
-
lines.push(` ...(${guard} ? { ${quoteKey(outputKey)}: data.${inputKey} } : {}),`);
|
|
2760
|
-
} else {
|
|
2761
|
-
lines.push(` ${quoteKey(outputKey)}: data.${inputKey},`);
|
|
2762
|
-
}
|
|
2763
|
-
}
|
|
2764
|
-
lines.push(`}));`);
|
|
2765
|
-
// When only outputCase is set, the developer-facing type is the schema's
|
|
2766
|
-
// pre-transform shape (camelCase). With inputCase, the post-transform
|
|
2767
|
-
// shape is what consumers work with.
|
|
2768
|
-
const typeSource = hasOutputTransform && !hasInputTransform ? 'input' : 'output';
|
|
2769
|
-
lines.push(`export type ${model.name} = z.${typeSource}<typeof ${model.name}>;`);
|
|
2770
|
-
return lines;
|
|
2771
|
-
}
|
|
2772
|
-
|
|
2773
|
-
const body = renderFields(model.fields, model.mode);
|
|
2774
|
-
const bases = model.bases ?? [];
|
|
2775
|
-
if (bases.length > 0) {
|
|
2776
|
-
const head = bases[0]!;
|
|
2777
|
-
const tail = bases
|
|
2778
|
-
.slice(1)
|
|
2779
|
-
.map(b => `.extend(${b}.shape)`)
|
|
2780
|
-
.join('');
|
|
2781
|
-
lines.push(`export const ${model.name} = ${head}${tail}.extend({`);
|
|
2782
|
-
lines.push(...body.map(l => ` ${l}`));
|
|
2783
|
-
lines.push(`});`);
|
|
2784
|
-
} else {
|
|
2785
|
-
lines.push(`export const ${model.name} = ${wrapper}({`);
|
|
2786
|
-
lines.push(...body.map(l => ` ${l}`));
|
|
2787
|
-
lines.push(`});`);
|
|
2788
|
-
}
|
|
2789
|
-
|
|
2790
|
-
lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`);
|
|
2791
|
-
return lines;
|
|
2792
|
-
}
|
|
2793
|
-
|
|
2794
|
-
/** Builds a Zod extension chain "Head.extend(B.shape).extend(C.shape)..." for a list of base names,
|
|
2795
|
-
* applying a per-base name resolver (e.g. choosing "BaseInput" for bases that have an Input variant). */
|
|
2796
|
-
function buildExtendChain(bases: string[], resolveName: (b: string) => string): { head: string; tail: string } {
|
|
2797
|
-
const head = resolveName(bases[0]!);
|
|
2798
|
-
const tail = bases
|
|
2799
|
-
.slice(1)
|
|
2800
|
-
.map(b => `.extend(${resolveName(b)}.shape)`)
|
|
2801
|
-
.join('');
|
|
2802
|
-
return { head, tail };
|
|
2803
|
-
}
|
|
2804
|
-
|
|
2805
|
-
function collectEffectiveWritableFieldNames(modelName: string, modelMap: Map<string, ModelNode>): Set<string> {
|
|
2806
|
-
const model = modelMap.get(modelName);
|
|
2807
|
-
if (!model || model.type) return new Set();
|
|
2808
|
-
const result = new Set<string>();
|
|
2809
|
-
for (const base of model.bases ?? []) {
|
|
2810
|
-
for (const f of collectEffectiveWritableFieldNames(base, modelMap)) result.add(f);
|
|
2811
|
-
}
|
|
2812
|
-
for (const field of model.fields) {
|
|
2813
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.visibility === 'readonly') <span class="cstat-no" title="statement not covered" >result.delete(field.name);</span>
|
|
2814
|
-
else result.add(field.name);
|
|
2815
|
-
}
|
|
2816
|
-
return result;
|
|
2817
|
-
}
|
|
2818
|
-
|
|
2819
|
-
function generateThreeSchemaModel(
|
|
2820
|
-
model: ModelNode,
|
|
2821
|
-
outPath?: string,
|
|
2822
|
-
modelsWithInput?: Set<string>,
|
|
2823
|
-
modelsWithWriteonly?: Set<string>,
|
|
2824
|
-
modelMap?: Map<string, ModelNode>,
|
|
2825
|
-
): string[] {
|
|
2826
|
-
const lines: string[] = [];
|
|
2827
|
-
const name = model.name;
|
|
2828
|
-
|
|
2829
|
-
lines.push(...generateComments(model, outPath));
|
|
2830
|
-
|
|
2831
|
-
const wrapper = modeToWrapper(model.mode ?? 'strict');
|
|
2832
|
-
|
|
2833
|
-
const allFields = model.fields;
|
|
2834
|
-
const hasWriteonly = allFields.some(f => f.visibility === 'writeonly');
|
|
2835
|
-
|
|
2836
|
-
const bases = model.bases ?? [];
|
|
2837
|
-
|
|
2838
|
-
// Base schema — all fields (used internally when a submodel extends this one).
|
|
2839
|
-
// Only needed when this model has writeonly fields; otherwise Base === Read.
|
|
2840
|
-
if (hasWriteonly) {
|
|
2841
|
-
const baseBody = renderFields(allFields, model.mode);
|
|
2842
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (bases.length > 0) {
|
|
2843
|
-
const { head, tail } = <span class="cstat-no" title="statement not covered" >buildExtendChain(bases, <span class="fstat-no" title="function not covered" >b => (<span class="cstat-no" title="statement not covered" >m</span>odelsWithWriteonly?.has(b) ? `${b}Base` : b));</span></span>
|
|
2844
|
-
<span class="cstat-no" title="statement not covered" > lines.push(`const ${name}Base = ${head}${tail}.extend({`);</span>
|
|
2845
|
-
} else {
|
|
2846
|
-
lines.push(`const ${name}Base = ${wrapper}({`);
|
|
2847
|
-
}
|
|
2848
|
-
lines.push(...baseBody.map(l => ` ${l}`));
|
|
2849
|
-
lines.push(`});`);
|
|
2850
|
-
lines.push('');
|
|
2851
|
-
}
|
|
2852
|
-
|
|
2853
|
-
// Read schema — omit writeonly fields; extends parent read schema
|
|
2854
|
-
const readFields = allFields.filter(f => f.visibility !== 'writeonly');
|
|
2855
|
-
const readBody = renderFields(readFields, model.mode);
|
|
2856
|
-
if (bases.length > 0) {
|
|
2857
|
-
const { head, tail } = buildExtendChain(bases, b => b);
|
|
2858
|
-
lines.push(`export const ${name} = ${head}${tail}.extend({`);
|
|
2859
|
-
} else {
|
|
2860
|
-
lines.push(`export const ${name} = ${wrapper}({`);
|
|
2861
|
-
}
|
|
2862
|
-
lines.push(...readBody.map(l => ` ${l}`));
|
|
2863
|
-
lines.push(`});`);
|
|
2864
|
-
lines.push(`export type ${name} = z.infer<typeof ${name}>;`);
|
|
2865
|
-
lines.push('');
|
|
2866
|
-
|
|
2867
|
-
// Write schema — omit readonly fields (use Input variants for sub-type refs);
|
|
2868
|
-
// extends ParentInput if parent has an Input variant, else extends parent read schema
|
|
2869
|
-
const writeFields = allFields.filter(f => f.visibility !== 'readonly');
|
|
2870
|
-
const writeBody = modelsWithInput ? renderInputFields(writeFields, modelsWithInput, model.mode) : <span class="branch-1 cbranch-no" title="branch not covered" >renderFields(writeFields, model.mode);</span>
|
|
2871
|
-
// Fields that become readonly in this model but were writable in a base must be omitted from
|
|
2872
|
-
// the base Input schema — Zod's .extend() cannot remove inherited fields.
|
|
2873
|
-
const fieldsToOmit = new Set<string>();
|
|
2874
|
-
if (bases.length > 0 && modelMap) {
|
|
2875
|
-
for (const field of allFields) {
|
|
2876
|
-
if (field.visibility === 'readonly') {
|
|
2877
|
-
for (const base of bases) {
|
|
2878
|
-
if (collectEffectiveWritableFieldNames(base, modelMap).has(field.name)) {
|
|
2879
|
-
fieldsToOmit.add(field.name);
|
|
2880
|
-
break;
|
|
2881
|
-
}
|
|
2882
|
-
}
|
|
2883
|
-
}
|
|
2884
|
-
}
|
|
2885
|
-
}
|
|
2886
|
-
const omitClause =
|
|
2887
|
-
fieldsToOmit.size > 0
|
|
2888
|
-
? `.omit({ ${[...fieldsToOmit].map(f => `${quoteKey(f)}: true`).join(', ')} })`
|
|
2889
|
-
: '';
|
|
2890
|
-
if (bases.length > 0) {
|
|
2891
|
-
const { head, tail } = buildExtendChain(bases, b => (modelsWithInput?.has(b) ? `${b}Input` : b));
|
|
2892
|
-
lines.push(`export const ${name}Input = ${head}${tail}${omitClause}.extend({`);
|
|
2893
|
-
} else {
|
|
2894
|
-
lines.push(`export const ${name}Input = ${wrapper}({`);
|
|
2895
|
-
}
|
|
2896
|
-
lines.push(...writeBody.map(l => ` ${l}`));
|
|
2897
|
-
lines.push(`});`);
|
|
2898
|
-
lines.push(`export type ${name}Input = z.infer<typeof ${name}Input>;`);
|
|
2899
|
-
|
|
2900
|
-
return lines;
|
|
2901
|
-
}
|
|
2902
|
-
|
|
2903
|
-
// ─── Fields ────────────────────────────────────────────────────────────────
|
|
2904
|
-
|
|
2905
|
-
function camelToSnake(s: string): string {
|
|
2906
|
-
return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`);
|
|
2907
|
-
}
|
|
2908
|
-
|
|
2909
|
-
function camelToPascal(s: string): string {
|
|
2910
|
-
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
2911
|
-
}
|
|
2912
|
-
|
|
2913
|
-
function applyCase(name: string, caseTransform: 'camel' | 'snake' | 'pascal' | undefined): string {
|
|
2914
|
-
if (!caseTransform || caseTransform === 'camel') return name;
|
|
2915
|
-
if (caseTransform === 'snake') return camelToSnake(name);
|
|
2916
|
-
return camelToPascal(name);
|
|
2917
|
-
}
|
|
2918
|
-
|
|
2919
|
-
function renderFields(fields: FieldNode[], defaultMode?: ObjectMode): string[] {
|
|
2920
|
-
return fields.flatMap(f => renderField(f, defaultMode));
|
|
2921
|
-
}
|
|
2922
|
-
|
|
2923
|
-
function renderFieldsAsPascalCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {
|
|
2924
|
-
return fields.map(f => {
|
|
2925
|
-
const pascalKey = camelToPascal(f.name);
|
|
2926
|
-
let expr = renderType(f.type, 'pascal', defaultMode);
|
|
2927
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (f.default !== undefined) {
|
|
2928
|
-
<span class="cstat-no" title="statement not covered" > if (f.nullable) <span class="cstat-no" title="statement not covered" >expr += '.nullable()';</span></span>
|
|
2929
|
-
const dv = <span class="cstat-no" title="statement not covered" >typeof f.default === 'string' ? `"${escapeString(f.default)}"` : String(f.default);</span>
|
|
2930
|
-
<span class="cstat-no" title="statement not covered" > expr += `.default(${dv})`;</span>
|
|
2931
|
-
} else if (f.optional) {
|
|
2932
|
-
expr += '.nullish()';
|
|
2933
|
-
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (f.nullable) {
|
|
2934
|
-
<span class="cstat-no" title="statement not covered" > expr += '.nullable()';</span>
|
|
2935
|
-
}
|
|
2936
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (f.description) <span class="cstat-no" title="statement not covered" >expr += `.describe("${escapeString(f.description)}")`;</span>
|
|
2937
|
-
return `${quoteKey(pascalKey)}: ${expr},`;
|
|
2938
|
-
});
|
|
2939
|
-
}
|
|
2940
|
-
|
|
2941
|
-
function renderFieldsAsSnakeCase(fields: FieldNode[], defaultMode?: ObjectMode): string[] {
|
|
2942
|
-
return fields.map(f => {
|
|
2943
|
-
const snakeKey = camelToSnake(f.name);
|
|
2944
|
-
let expr = renderType(f.type, 'snake', defaultMode);
|
|
2945
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (f.default !== undefined) {
|
|
2946
|
-
<span class="cstat-no" title="statement not covered" > if (f.nullable) <span class="cstat-no" title="statement not covered" >expr += '.nullable()';</span></span>
|
|
2947
|
-
const dv = <span class="cstat-no" title="statement not covered" >typeof f.default === 'string' ? `"${escapeString(f.default)}"` : String(f.default);</span>
|
|
2948
|
-
<span class="cstat-no" title="statement not covered" > expr += `.default(${dv})`;</span>
|
|
2949
|
-
} else if (f.optional) {
|
|
2950
|
-
// .nullish() accepts null or undefined from the API; the transform coerces null → undefined
|
|
2951
|
-
expr += '.nullish()';
|
|
2952
|
-
} else <span class="missing-if-branch" title="if path not taken" >I</span>if (f.nullable) {
|
|
2953
|
-
<span class="cstat-no" title="statement not covered" > expr += '.nullable()';</span>
|
|
2954
|
-
}
|
|
2955
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (f.description) <span class="cstat-no" title="statement not covered" >expr += `.describe("${escapeString(f.description)}")`;</span>
|
|
2956
|
-
return `${quoteKey(snakeKey)}: ${expr},`;
|
|
2957
|
-
});
|
|
2958
|
-
}
|
|
2959
|
-
|
|
2960
|
-
function renderField(field: FieldNode, defaultMode?: ObjectMode): string[] {
|
|
2961
|
-
const lines: string[] = [];
|
|
2962
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.deprecated) <span class="cstat-no" title="statement not covered" >lines.push('/** @deprecated */');</span>
|
|
2963
|
-
|
|
2964
|
-
let expr = renderType(field.type, undefined, defaultMode);
|
|
2965
|
-
|
|
2966
|
-
if (field.nullable) expr += '.nullable()';
|
|
2967
|
-
if (field.default !== undefined) {
|
|
2968
|
-
const dv = typeof field.default === 'string' ? `"${escapeString(field.default)}"` : String(field.default);
|
|
2969
|
-
expr += `.default(${dv})`;
|
|
2970
|
-
} else if (field.optional) {
|
|
2971
|
-
expr += '.optional()';
|
|
2972
|
-
}
|
|
2973
|
-
if (field.description) expr += `.describe("${escapeString(field.description)}")`;
|
|
2974
|
-
|
|
2975
|
-
lines.push(`${quoteKey(field.name)}: ${expr},`);
|
|
2976
|
-
return lines;
|
|
2977
|
-
}
|
|
2978
|
-
|
|
2979
|
-
// ─── Type rendering ────────────────────────────────────────────────────────
|
|
2980
|
-
|
|
2981
|
-
/**
|
|
2982
|
-
* Render a ContractKit AST type node as a Zod schema expression string.
|
|
2983
|
-
*
|
|
2984
|
-
* @param parseCaseTransform - When set, generates a `.transform()` that remaps incoming keys from
|
|
2985
|
-
* the given casing (`'snake'` | `'pascal'`) to camelCase for `inlineObject` types.
|
|
2986
|
-
* @param defaultMode - Fallback object mode (`'strict'` | `'strip'` | `'loose'`) when the node
|
|
2987
|
-
* doesn't specify its own mode.
|
|
2988
|
-
*/
|
|
2989
|
-
export function renderType(type: ContractTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
2990
|
-
switch (type.kind) {
|
|
2991
|
-
case 'scalar':
|
|
2992
|
-
return renderScalar(type);
|
|
2993
|
-
case 'array':
|
|
2994
|
-
return renderArray(type, parseCaseTransform, defaultMode);
|
|
2995
|
-
case 'tuple':
|
|
2996
|
-
return renderTuple(type);
|
|
2997
|
-
case 'record':
|
|
2998
|
-
return renderRecord(type);
|
|
2999
|
-
case 'enum':
|
|
3000
|
-
return renderEnum(type);
|
|
3001
|
-
case 'literal':
|
|
3002
|
-
return renderLiteral(type);
|
|
3003
|
-
case 'union':
|
|
3004
|
-
return renderUnion(type, parseCaseTransform, defaultMode);
|
|
3005
|
-
case 'discriminatedUnion':
|
|
3006
|
-
return renderDiscriminatedUnion(type, parseCaseTransform, defaultMode);
|
|
3007
|
-
case 'intersection':
|
|
3008
|
-
return renderIntersection(type, parseCaseTransform, defaultMode);
|
|
3009
|
-
case 'ref':
|
|
3010
|
-
return type.name;
|
|
3011
|
-
case 'lazy':
|
|
3012
|
-
return `z.lazy(() => ${renderType(type.inner, parseCaseTransform, defaultMode)})`;
|
|
3013
|
-
case 'inlineObject':
|
|
3014
|
-
return renderInlineObject(type, parseCaseTransform, defaultMode);
|
|
3015
|
-
<span class="branch-12 cbranch-no" title="branch not covered" > default:</span>
|
|
3016
|
-
<span class="cstat-no" title="statement not covered" > return 'z.unknown()';</span>
|
|
3017
|
-
}
|
|
3018
|
-
}
|
|
3019
|
-
|
|
3020
|
-
/**
|
|
3021
|
-
* Render a regex source as a JS regex literal for `.regex(...)`. If the source already has
|
|
3022
|
-
* anchors (`^` at the start and/or an unescaped `$` at the end) we trust the user's intent
|
|
3023
|
-
* and emit it as-is; otherwise we wrap with `^...$` so contracts default to full-match
|
|
3024
|
-
* semantics. Forward slashes are always escaped since `/` is the literal delimiter.
|
|
3025
|
-
*/
|
|
3026
|
-
function renderRegexLiteral(source: string): string {
|
|
3027
|
-
const body = source.replace(/\//g, '\\/');
|
|
3028
|
-
if (regexHasAnchor(source)) return `/${body}/`;
|
|
3029
|
-
return `/^${body}$/`;
|
|
3030
|
-
}
|
|
3031
|
-
|
|
3032
|
-
function regexHasAnchor(source: string): boolean {
|
|
3033
|
-
if (source.startsWith('^')) return true;
|
|
3034
|
-
if (!source.endsWith('$')) return false;
|
|
3035
|
-
// The trailing `$` is an anchor only if it isn't escaped — count immediately preceding
|
|
3036
|
-
// backslashes; an even count (including zero) means `$` is unescaped.
|
|
3037
|
-
let i = source.length - 2;
|
|
3038
|
-
let backslashes = 0;
|
|
3039
|
-
while (i >= 0 && source[i] === '\\') {
|
|
3040
|
-
backslashes++;
|
|
3041
|
-
i--;
|
|
3042
|
-
}
|
|
3043
|
-
return backslashes % 2 === 0;
|
|
3044
|
-
}
|
|
3045
|
-
|
|
3046
|
-
function renderScalar(s: ScalarTypeNode): string {
|
|
3047
|
-
switch (s.name) {
|
|
3048
|
-
case 'string': {
|
|
3049
|
-
let e = 'z.string()';
|
|
3050
|
-
if (s.min !== undefined && s.max !== undefined) e += `.min(${s.min}).max(${s.max})`;
|
|
3051
|
-
else if (s.min !== undefined) e += `.min(${s.min})`;
|
|
3052
|
-
else if (s.max !== undefined) e += `.max(${s.max})`;
|
|
3053
|
-
if (s.len !== undefined) e += `.length(${s.len})`;
|
|
3054
|
-
if (s.regex) e += `.regex(${renderRegexLiteral(s.regex)})`;
|
|
3055
|
-
return e;
|
|
3056
|
-
}
|
|
3057
|
-
case 'number': {
|
|
3058
|
-
let e = 'z.coerce.number()';
|
|
3059
|
-
if (s.min !== undefined) e += `.min(${s.min})`;
|
|
3060
|
-
if (s.max !== undefined) e += `.max(${s.max})`;
|
|
3061
|
-
return e;
|
|
3062
|
-
}
|
|
3063
|
-
case 'int': {
|
|
3064
|
-
let e = 'z.coerce.number().int()';
|
|
3065
|
-
if (s.min !== undefined) e += `.min(${s.min})`;
|
|
3066
|
-
if (s.max !== undefined) e += `.max(${s.max})`;
|
|
3067
|
-
return e;
|
|
3068
|
-
}
|
|
3069
|
-
case 'bigint': {
|
|
3070
|
-
let inner = 'z.bigint()';
|
|
3071
|
-
if (s.min !== undefined) inner += `.min(${s.min}n)`;
|
|
3072
|
-
if (s.max !== undefined) inner += `.max(${s.max}n)`;
|
|
3073
|
-
return `z.preprocess((val) => typeof val === 'string' ? BigInt(val.replace(/n$/, '')) : val, ${inner})`;
|
|
3074
|
-
}
|
|
3075
|
-
case 'boolean':
|
|
3076
|
-
return `z.preprocess((v) => v === 'true' ? true : v === 'false' ? false : v, z.boolean())`;
|
|
3077
|
-
case 'date': {
|
|
3078
|
-
const fmt = s.format ?? 'yyyy-MM-dd';
|
|
3079
|
-
return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a date in format ${escapeString(fmt)}' }))`;
|
|
3080
|
-
}
|
|
3081
|
-
case 'time': {
|
|
3082
|
-
const fmt = s.format ?? 'HH:mm:ss';
|
|
3083
|
-
return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a time in format ${escapeString(fmt)}' }))`;
|
|
3084
|
-
}
|
|
3085
|
-
case 'datetime':
|
|
3086
|
-
return '_ZodDatetime';
|
|
3087
|
-
case 'interval':
|
|
3088
|
-
return '_ZodInterval';
|
|
3089
|
-
case 'duration': {
|
|
3090
|
-
const validParts = [`val instanceof Duration && val.isValid`];
|
|
3091
|
-
if (s.min !== undefined) validParts.push(`val.toMillis() >= Duration.fromISO('${s.min}').toMillis()`);
|
|
3092
|
-
if (s.max !== undefined) validParts.push(`val.toMillis() <= Duration.fromISO('${s.max}').toMillis()`);
|
|
3093
|
-
const validation = validParts.join(' && ');
|
|
3094
|
-
let message = 'Must be an ISO 8601 duration';
|
|
3095
|
-
if (s.min !== undefined && s.max !== undefined) message += ` between ${s.min} and ${s.max}`;
|
|
3096
|
-
else if (s.min !== undefined) message += ` of at least ${s.min}`;
|
|
3097
|
-
else if (s.max !== undefined) message += ` of at most ${s.max}`;
|
|
3098
|
-
return `z.preprocess((val) => typeof val === 'string' ? Duration.fromISO(val) : val, z.custom<Duration>((val) => ${validation}, { message: '${message}' }))`;
|
|
3099
|
-
}
|
|
3100
|
-
case 'email':
|
|
3101
|
-
return 'z.email()';
|
|
3102
|
-
case 'url':
|
|
3103
|
-
return 'z.url()';
|
|
3104
|
-
case 'uuid':
|
|
3105
|
-
return 'z.uuid()';
|
|
3106
|
-
case 'unknown':
|
|
3107
|
-
return 'z.unknown()';
|
|
3108
|
-
case 'null':
|
|
3109
|
-
return 'z.null()';
|
|
3110
|
-
case 'object':
|
|
3111
|
-
return 'z.record(z.string(), z.unknown())';
|
|
3112
|
-
case 'binary':
|
|
3113
|
-
return '_ZodBinary';
|
|
3114
|
-
case 'json':
|
|
3115
|
-
return '_ZodJson';
|
|
3116
|
-
<span class="branch-18 cbranch-no" title="branch not covered" > default:</span>
|
|
3117
|
-
<span class="cstat-no" title="statement not covered" > return 'z.unknown()';</span>
|
|
3118
|
-
}
|
|
3119
|
-
}
|
|
3120
|
-
|
|
3121
|
-
function renderArray(a: ArrayTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
3122
|
-
let e = `z.array(${renderType(a.item, parseCaseTransform, defaultMode)})`;
|
|
3123
|
-
if (a.min !== undefined) e += `.min(${a.min})`;
|
|
3124
|
-
if (a.max !== undefined) e += `.max(${a.max})`;
|
|
3125
|
-
return e;
|
|
3126
|
-
}
|
|
3127
|
-
|
|
3128
|
-
function renderTuple(t: TupleTypeNode): string {
|
|
3129
|
-
return `z.tuple([${t.items.map(i => renderType(i)).join(', ')}])`;
|
|
3130
|
-
}
|
|
3131
|
-
|
|
3132
|
-
function renderRecord(r: RecordTypeNode): string {
|
|
3133
|
-
return `z.record(${renderType(r.key)}, ${renderType(r.value)})`;
|
|
3134
|
-
}
|
|
3135
|
-
|
|
3136
|
-
function renderEnum(e: EnumTypeNode): string {
|
|
3137
|
-
const vals = e.values.map(v => `"${v}"`).join(', ');
|
|
3138
|
-
return `z.enum([${vals}])`;
|
|
3139
|
-
}
|
|
3140
|
-
|
|
3141
|
-
function renderLiteral(l: LiteralTypeNode): string {
|
|
3142
|
-
if (typeof l.value === 'string') return `z.literal("${escapeString(l.value)}")`;
|
|
3143
|
-
return `z.literal(${l.value})`;
|
|
3144
|
-
}
|
|
3145
|
-
|
|
3146
|
-
function renderUnion(u: UnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
3147
|
-
return `z.union([${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;
|
|
3148
|
-
}
|
|
3149
|
-
|
|
3150
|
-
function renderDiscriminatedUnion(u: DiscriminatedUnionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
3151
|
-
return `z.discriminatedUnion("${escapeString(u.discriminator)}", [${u.members.map(m => renderType(m, parseCaseTransform, defaultMode)).join(', ')}])`;
|
|
3152
|
-
}
|
|
3153
|
-
|
|
3154
|
-
function renderIntersection(i: IntersectionTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
3155
|
-
const [first, ...rest] = i.members;
|
|
3156
|
-
// When the pattern is ref & (ref | inlineObject)*, use .extend() chains to
|
|
3157
|
-
// produce a single ZodObject. .and() breaks strict objects — each strict side
|
|
3158
|
-
// rejects the other side's keys during intersection parsing, and ZodIntersection
|
|
3159
|
-
// has no .strict() method.
|
|
3160
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {
|
|
3161
|
-
let expr = first.name;
|
|
3162
|
-
for (const member of rest) {
|
|
3163
|
-
if (member.kind === 'ref') {
|
|
3164
|
-
expr += `.extend(${member.name}.shape)`;
|
|
3165
|
-
} else {
|
|
3166
|
-
const m = member as InlineObjectTypeNode;
|
|
3167
|
-
const fieldLines =
|
|
3168
|
-
parseCaseTransform === 'snake'
|
|
3169
|
-
? <span class="branch-0 cbranch-no" title="branch not covered" >renderFieldsAsSnakeCase(m.fields, defaultMode)</span>
|
|
3170
|
-
.map(<span class="fstat-no" title="function not covered" >l => <span class="cstat-no" title="statement not covered" >`</span> ${l}`)</span>
|
|
3171
|
-
.join('\n')
|
|
3172
|
-
: parseCaseTransform === 'pascal'
|
|
3173
|
-
? <span class="branch-0 cbranch-no" title="branch not covered" >renderFieldsAsPascalCase(m.fields, defaultMode)</span>
|
|
3174
|
-
.map(<span class="fstat-no" title="function not covered" >l => <span class="cstat-no" title="statement not covered" >`</span> ${l}`)</span>
|
|
3175
|
-
.join('\n')
|
|
3176
|
-
: m.fields
|
|
3177
|
-
.flatMap(f => renderField(f, defaultMode))
|
|
3178
|
-
.map(l => ` ${l}`)
|
|
3179
|
-
.join('\n');
|
|
3180
|
-
expr += `.extend({\n${fieldLines}\n})`;
|
|
3181
|
-
}
|
|
3182
|
-
}
|
|
3183
|
-
return expr;
|
|
3184
|
-
}
|
|
3185
|
-
let expr = <span class="cstat-no" title="statement not covered" >renderType(first!, parseCaseTransform, defaultMode);</span>
|
|
3186
|
-
<span class="cstat-no" title="statement not covered" > for (const member of rest) {</span>
|
|
3187
|
-
<span class="cstat-no" title="statement not covered" > expr += `.and(${renderType(member, parseCaseTransform, defaultMode)})`;</span>
|
|
3188
|
-
}
|
|
3189
|
-
<span class="cstat-no" title="statement not covered" > return expr;</span>
|
|
3190
|
-
}
|
|
3191
|
-
|
|
3192
|
-
function renderInlineObject(o: InlineObjectTypeNode, parseCaseTransform?: 'snake' | 'pascal', defaultMode?: ObjectMode): string {
|
|
3193
|
-
const wrapper = modeToWrapper(o.mode ?? defaultMode ?? 'strict');
|
|
3194
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (parseCaseTransform === 'snake') {
|
|
3195
|
-
const snakeLines = <span class="cstat-no" title="statement not covered" >renderFieldsAsSnakeCase(o.fields, defaultMode);</span>
|
|
3196
|
-
const joined = <span class="cstat-no" title="statement not covered" >snakeLines.map(<span class="fstat-no" title="function not covered" >l => <span class="cstat-no" title="statement not covered" >`</span> ${l}`)</span>.join('\n');</span>
|
|
3197
|
-
const transformEntries = <span class="cstat-no" title="statement not covered" >o.fields</span>
|
|
3198
|
-
.map(<span class="fstat-no" title="function not covered" >f => {</span>
|
|
3199
|
-
const snakeKey = <span class="cstat-no" title="statement not covered" >camelToSnake(f.name);</span>
|
|
3200
|
-
// Optional fields use .nullish() on input. Conditional spread (instead of `?? undefined`)
|
|
3201
|
-
// keeps the key optional in the inferred output type (`k?: T`) rather than widening to
|
|
3202
|
-
// required-nullable (`k: T | undefined`).
|
|
3203
|
-
<span class="cstat-no" title="statement not covered" > if (f.optional) {</span>
|
|
3204
|
-
<span class="cstat-no" title="statement not covered" > return ` ...(data.${snakeKey} != null ? { ${quoteKey(f.name)}: data.${snakeKey} } : {}),`;</span>
|
|
3205
|
-
}
|
|
3206
|
-
<span class="cstat-no" title="statement not covered" > return ` ${quoteKey(f.name)}: data.${snakeKey},`;</span>
|
|
3207
|
-
})
|
|
3208
|
-
.join('\n');
|
|
3209
|
-
<span class="cstat-no" title="statement not covered" > return `${wrapper}({\n${joined}\n}).transform(data => ({\n${transformEntries}\n}))`;</span>
|
|
3210
|
-
}
|
|
3211
|
-
if (parseCaseTransform === 'pascal') {
|
|
3212
|
-
const pascalLines = renderFieldsAsPascalCase(o.fields, defaultMode);
|
|
3213
|
-
const joined = pascalLines.map(l => ` ${l}`).join('\n');
|
|
3214
|
-
const transformEntries = o.fields
|
|
3215
|
-
.map(f => {
|
|
3216
|
-
const pascalKey = camelToPascal(f.name);
|
|
3217
|
-
if (f.optional) {
|
|
3218
|
-
return ` ...(data.${pascalKey} != null ? { ${quoteKey(f.name)}: data.${pascalKey} } : {}),`;
|
|
3219
|
-
}
|
|
3220
|
-
return ` ${quoteKey(f.name)}: data.${pascalKey},`;
|
|
3221
|
-
})
|
|
3222
|
-
.join('\n');
|
|
3223
|
-
return `${wrapper}({\n${joined}\n}).transform(data => ({\n${transformEntries}\n}))`;
|
|
3224
|
-
}
|
|
3225
|
-
const fields = o.fields
|
|
3226
|
-
.flatMap(f => renderField(f, defaultMode))
|
|
3227
|
-
.map(l => ` ${l}`)
|
|
3228
|
-
.join('\n');
|
|
3229
|
-
return `${wrapper}({\n${fields}\n})`;
|
|
3230
|
-
}
|
|
3231
|
-
|
|
3232
|
-
// ─── Input type rendering ─────────────────────────────────────────────────
|
|
3233
|
-
|
|
3234
|
-
/**
|
|
3235
|
-
* Like renderScalar, but coerces from string input (JSON wire format).
|
|
3236
|
-
* Used for Input (write) schemas where data arrives as JSON strings.
|
|
3237
|
-
*/
|
|
3238
|
-
function renderInputScalar(s: ScalarTypeNode): string {
|
|
3239
|
-
return renderScalar(s);
|
|
3240
|
-
}
|
|
3241
|
-
|
|
3242
|
-
/**
|
|
3243
|
-
* Like renderType, but substitutes model refs with their Input variant
|
|
3244
|
-
* when the model has visibility modifiers, and coerces scalars from strings.
|
|
3245
|
-
* Used for Input (write) schema fields so that sub-type references also
|
|
3246
|
-
* point to their Input variants.
|
|
3247
|
-
*/
|
|
3248
|
-
export function renderInputType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {
|
|
3249
|
-
switch (type.kind) {
|
|
3250
|
-
case 'scalar':
|
|
3251
|
-
return renderInputScalar(type);
|
|
3252
|
-
case 'ref':
|
|
3253
|
-
return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;
|
|
3254
|
-
case 'array': {
|
|
3255
|
-
let e = `z.array(${renderInputType(type.item, modelsWithInput, defaultMode)})`;
|
|
3256
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (type.min !== undefined) <span class="cstat-no" title="statement not covered" >e += `.min(${type.min})`;</span>
|
|
3257
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (type.max !== undefined) <span class="cstat-no" title="statement not covered" >e += `.max(${type.max})`;</span>
|
|
3258
|
-
return e;
|
|
3259
|
-
}
|
|
3260
|
-
<span class="branch-3 cbranch-no" title="branch not covered" > case 'tuple':</span>
|
|
3261
|
-
<span class="cstat-no" title="statement not covered" > return `z.tuple([${type.items.map(<span class="fstat-no" title="function not covered" >i => <span class="cstat-no" title="statement not covered" >r</span>enderInputType(i, modelsWithInput, defaultMode)).j</span>oin(', ')}])`;</span>
|
|
3262
|
-
<span class="branch-4 cbranch-no" title="branch not covered" > case 'record':</span>
|
|
3263
|
-
<span class="cstat-no" title="statement not covered" > return `z.record(${renderInputType(type.key, modelsWithInput, defaultMode)}, ${renderInputType(type.value, modelsWithInput, defaultMode)})`;</span>
|
|
3264
|
-
case 'union':
|
|
3265
|
-
return `z.union([${type.members.map(m => renderInputType(m, modelsWithInput, defaultMode)).join(', ')}])`;
|
|
3266
|
-
<span class="branch-6 cbranch-no" title="branch not covered" > case 'discriminatedUnion':</span>
|
|
3267
|
-
<span class="cstat-no" title="statement not covered" > return `z.discriminatedUnion("${escapeString(type.discriminator)}", [${type.members.map(<span class="fstat-no" title="function not covered" >m => <span class="cstat-no" title="statement not covered" >r</span>enderInputType(m, modelsWithInput, defaultMode)).j</span>oin(', ')}])`;</span>
|
|
3268
|
-
case 'intersection': {
|
|
3269
|
-
const [first, ...rest] = type.members;
|
|
3270
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {
|
|
3271
|
-
let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : <span class="branch-1 cbranch-no" title="branch not covered" >first.name;</span>
|
|
3272
|
-
for (const member of rest) {
|
|
3273
|
-
if (member.kind === 'ref') {
|
|
3274
|
-
const name = modelsWithInput?.has(member.name) ? <span class="branch-0 cbranch-no" title="branch not covered" >`${member.name}Input` </span>: member.name;
|
|
3275
|
-
expr += `.extend(${name}.shape)`;
|
|
3276
|
-
} else {
|
|
3277
|
-
const fieldLines = (member as InlineObjectTypeNode).fields
|
|
3278
|
-
.map(f => ` ${renderInputField(f, modelsWithInput ?? <span class="branch-1 cbranch-no" title="branch not covered" >new Set(), d</span>efaultMode)}`)
|
|
3279
|
-
.join('\n');
|
|
3280
|
-
expr += `.extend({\n${fieldLines}\n})`;
|
|
3281
|
-
}
|
|
3282
|
-
}
|
|
3283
|
-
return expr;
|
|
3284
|
-
}
|
|
3285
|
-
let expr = <span class="cstat-no" title="statement not covered" >renderInputType(first!, modelsWithInput, defaultMode);</span>
|
|
3286
|
-
<span class="cstat-no" title="statement not covered" > for (const member of rest) {</span>
|
|
3287
|
-
<span class="cstat-no" title="statement not covered" > expr += `.and(${renderInputType(member, modelsWithInput, defaultMode)})`;</span>
|
|
3288
|
-
}
|
|
3289
|
-
<span class="cstat-no" title="statement not covered" > return expr;</span>
|
|
3290
|
-
}
|
|
3291
|
-
<span class="branch-8 cbranch-no" title="branch not covered" > case 'lazy':</span>
|
|
3292
|
-
<span class="cstat-no" title="statement not covered" > return `z.lazy(() => ${renderInputType(type.inner, modelsWithInput, defaultMode)})`;</span>
|
|
3293
|
-
<span class="branch-9 cbranch-no" title="branch not covered" > case 'inlineObject': {</span>
|
|
3294
|
-
const fields = <span class="cstat-no" title="statement not covered" >type.fields</span>
|
|
3295
|
-
.flatMap(<span class="fstat-no" title="function not covered" >f => <span class="cstat-no" title="statement not covered" >r</span>enderInputField(f, modelsWithInput ?? new Set(), defaultMode))</span>
|
|
3296
|
-
.map(<span class="fstat-no" title="function not covered" >l => <span class="cstat-no" title="statement not covered" >`</span> ${l}`)</span>
|
|
3297
|
-
.join('\n');
|
|
3298
|
-
<span class="cstat-no" title="statement not covered" > return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\n${fields}\n})`;</span>
|
|
3299
|
-
}
|
|
3300
|
-
<span class="branch-10 cbranch-no" title="branch not covered" > default:</span>
|
|
3301
|
-
<span class="cstat-no" title="statement not covered" > return renderType(type, undefined, defaultMode);</span>
|
|
3302
|
-
}
|
|
3303
|
-
}
|
|
3304
|
-
|
|
3305
|
-
function renderInputField(field: FieldNode, modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {
|
|
3306
|
-
const lines: string[] = [];
|
|
3307
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.deprecated) <span class="cstat-no" title="statement not covered" >lines.push('/** @deprecated */');</span>
|
|
3308
|
-
|
|
3309
|
-
let expr = renderInputType(field.type, modelsWithInput, defaultMode);
|
|
3310
|
-
|
|
3311
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.nullable) <span class="cstat-no" title="statement not covered" >expr += '.nullable()';</span>
|
|
3312
|
-
if (field.default !== undefined) {
|
|
3313
|
-
const dv = typeof field.default === 'string' ? <span class="branch-0 cbranch-no" title="branch not covered" >`"${escapeString(field.default)}"` </span>: String(field.default);
|
|
3314
|
-
expr += `.default(${dv})`;
|
|
3315
|
-
} else if (field.optional) {
|
|
3316
|
-
expr += '.optional()';
|
|
3317
|
-
}
|
|
3318
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.description) <span class="cstat-no" title="statement not covered" >expr += `.describe("${escapeString(field.description)}")`;</span>
|
|
3319
|
-
|
|
3320
|
-
lines.push(`${quoteKey(field.name)}: ${expr},`);
|
|
3321
|
-
return lines;
|
|
3322
|
-
}
|
|
3323
|
-
|
|
3324
|
-
function renderInputFields(fields: FieldNode[], modelsWithInput: Set<string>, defaultMode?: ObjectMode): string[] {
|
|
3325
|
-
return fields.flatMap(f => renderInputField(f, modelsWithInput, defaultMode));
|
|
3326
|
-
}
|
|
3327
|
-
|
|
3328
|
-
// ─── Query type rendering ─────────────────────────────────────────────────
|
|
3329
|
-
|
|
3330
|
-
/**
|
|
3331
|
-
* Like renderType, but wraps array types with z.preprocess to handle
|
|
3332
|
-
* query strings where a single value arrives as a string instead of a string[].
|
|
3333
|
-
* Also uses Input variants for model refs when modelsWithInput is provided.
|
|
3334
|
-
*/
|
|
3335
|
-
export function renderQueryType(type: ContractTypeNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {
|
|
3336
|
-
switch (type.kind) {
|
|
3337
|
-
case 'array': {
|
|
3338
|
-
const inner = modelsWithInput ? <span class="branch-0 cbranch-no" title="branch not covered" >renderInputType(type, modelsWithInput, defaultMode) : r</span>enderType(type, undefined, defaultMode);
|
|
3339
|
-
return `z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner})`;
|
|
3340
|
-
}
|
|
3341
|
-
<span class="branch-1 cbranch-no" title="branch not covered" > case 'inlineObject': {</span>
|
|
3342
|
-
const fields = <span class="cstat-no" title="statement not covered" >type.fields.map(<span class="fstat-no" title="function not covered" >f => <span class="cstat-no" title="statement not covered" >`</span> ${renderQueryField(f, modelsWithInput, defaultMode)}`)</span>.join('\n');</span>
|
|
3343
|
-
<span class="cstat-no" title="statement not covered" > return `${modeToWrapper(type.mode ?? defaultMode ?? 'strict')}({\n${fields}\n})`;</span>
|
|
3344
|
-
}
|
|
3345
|
-
case 'intersection': {
|
|
3346
|
-
const [first, ...rest] = type.members;
|
|
3347
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'ref' || m.kind === 'inlineObject')) {
|
|
3348
|
-
let expr = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name;
|
|
3349
|
-
for (const member of rest) {
|
|
3350
|
-
if (member.kind === 'ref') {
|
|
3351
|
-
const name = modelsWithInput?.has(member.name) ? <span class="branch-0 cbranch-no" title="branch not covered" >`${member.name}Input` </span>: member.name;
|
|
3352
|
-
expr += `.extend(${name}.shape)`;
|
|
3353
|
-
} else {
|
|
3354
|
-
const fieldLines = (member as InlineObjectTypeNode).fields
|
|
3355
|
-
.map(f => ` ${renderQueryField(f, modelsWithInput, defaultMode)}`)
|
|
3356
|
-
.join('\n');
|
|
3357
|
-
expr += `.extend({\n${fieldLines}\n})`;
|
|
3358
|
-
}
|
|
3359
|
-
}
|
|
3360
|
-
return expr;
|
|
3361
|
-
}
|
|
3362
|
-
let expr = <span class="cstat-no" title="statement not covered" >renderQueryType(first!, modelsWithInput, defaultMode);</span>
|
|
3363
|
-
<span class="cstat-no" title="statement not covered" > for (const member of rest) {</span>
|
|
3364
|
-
<span class="cstat-no" title="statement not covered" > expr += `.and(${renderQueryType(member, modelsWithInput, defaultMode)})`;</span>
|
|
3365
|
-
}
|
|
3366
|
-
<span class="cstat-no" title="statement not covered" > return expr;</span>
|
|
3367
|
-
}
|
|
3368
|
-
<span class="branch-3 cbranch-no" title="branch not covered" > case 'ref':</span>
|
|
3369
|
-
<span class="cstat-no" title="statement not covered" > return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name;</span>
|
|
3370
|
-
<span class="branch-4 cbranch-no" title="branch not covered" > default:</span>
|
|
3371
|
-
<span class="cstat-no" title="statement not covered" > return modelsWithInput ? renderInputType(type, modelsWithInput, defaultMode) : renderType(type, undefined, defaultMode);</span>
|
|
3372
|
-
}
|
|
3373
|
-
}
|
|
3374
|
-
|
|
3375
|
-
function renderQueryField(field: FieldNode, modelsWithInput?: Set<string>, defaultMode?: ObjectMode): string {
|
|
3376
|
-
let expr =
|
|
3377
|
-
field.type.kind === 'array'
|
|
3378
|
-
? renderQueryType(field.type, modelsWithInput, defaultMode)
|
|
3379
|
-
: modelsWithInput
|
|
3380
|
-
? renderInputType(field.type, modelsWithInput, defaultMode)
|
|
3381
|
-
: <span class="branch-1 cbranch-no" title="branch not covered" >renderType(field.type, undefined, defaultMode);</span>
|
|
3382
|
-
|
|
3383
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.nullable) <span class="cstat-no" title="statement not covered" >expr += '.nullable()';</span>
|
|
3384
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.default !== undefined) {
|
|
3385
|
-
const dv = <span class="cstat-no" title="statement not covered" >typeof field.default === 'string' ? `"${escapeString(field.default)}"` : String(field.default);</span>
|
|
3386
|
-
<span class="cstat-no" title="statement not covered" > expr += `.default(${dv})`;</span>
|
|
3387
|
-
} else <span class="missing-if-branch" title="else path not taken" >E</span>if (field.optional) {
|
|
3388
|
-
expr += '.optional()';
|
|
3389
|
-
}
|
|
3390
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (field.description) <span class="cstat-no" title="statement not covered" >expr += `.describe("${escapeString(field.description)}")`;</span>
|
|
3391
|
-
|
|
3392
|
-
return `${quoteKey(field.name)}: ${expr},`;
|
|
3393
|
-
}
|
|
3394
|
-
|
|
3395
|
-
function isValidIdentifier(name: string): boolean {
|
|
3396
|
-
return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);
|
|
3397
|
-
}
|
|
3398
|
-
|
|
3399
|
-
function quoteKey(name: string): string {
|
|
3400
|
-
return isValidIdentifier(name) ? name : <span class="branch-1 cbranch-no" title="branch not covered" >`'${name}'`;</span>
|
|
3401
|
-
}
|
|
3402
|
-
|
|
3403
|
-
// ─── String escaping ──────────────────────────────────────────────────────
|
|
3404
|
-
|
|
3405
|
-
function escapeString(s: string): string {
|
|
3406
|
-
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
|
|
3407
|
-
}
|
|
3408
|
-
|
|
3409
|
-
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
3410
|
-
|
|
3411
|
-
function rootNeedsDateTime(root: ContractRootNode): boolean {
|
|
3412
|
-
return root.models.some(m => (m.type && typeNeedsDateTime(m.type)) || m.fields.some(f => typeNeedsDateTime(f.type)));
|
|
3413
|
-
}
|
|
3414
|
-
|
|
3415
|
-
/** Returns true if `type` (recursively) contains a scalar with the given `name`. */
|
|
3416
|
-
export function typeNeedsScalar(type: ContractTypeNode, name: string): boolean {
|
|
3417
|
-
switch (type.kind) {
|
|
3418
|
-
case 'scalar':
|
|
3419
|
-
return type.name === name;
|
|
3420
|
-
case 'array':
|
|
3421
|
-
return typeNeedsScalar(type.item, name);
|
|
3422
|
-
case 'tuple':
|
|
3423
|
-
return type.items.some(i => typeNeedsScalar(i, name));
|
|
3424
|
-
case 'record':
|
|
3425
|
-
return typeNeedsScalar(type.key, name) || typeNeedsScalar(type.value, name);
|
|
3426
|
-
case 'union':
|
|
3427
|
-
return type.members.some(m => typeNeedsScalar(m, name));
|
|
3428
|
-
case 'discriminatedUnion':
|
|
3429
|
-
return type.members.some(m => typeNeedsScalar(m, name));
|
|
3430
|
-
case 'intersection':
|
|
3431
|
-
return type.members.some(m => typeNeedsScalar(m, name));
|
|
3432
|
-
case 'lazy':
|
|
3433
|
-
return typeNeedsScalar(type.inner, name);
|
|
3434
|
-
case 'inlineObject':
|
|
3435
|
-
return type.fields.some(f => typeNeedsScalar(f.type, name));
|
|
3436
|
-
default:
|
|
3437
|
-
return false;
|
|
3438
|
-
}
|
|
3439
|
-
}
|
|
3440
|
-
|
|
3441
|
-
/** Returns true if any model in `root` uses a scalar with the given `name`. */
|
|
3442
|
-
export function rootNeedsScalar(root: ContractRootNode, name: string): boolean {
|
|
3443
|
-
return root.models.some(m => (m.type && typeNeedsScalar(m.type, name)) || m.fields.some(f => typeNeedsScalar(f.type, name)));
|
|
3444
|
-
}
|
|
3445
|
-
|
|
3446
|
-
/** Returns true if `type` (recursively) contains a `date`, `time`, or `datetime` scalar. */
|
|
3447
|
-
export function typeNeedsDateTime(type: ContractTypeNode): boolean {
|
|
3448
|
-
switch (type.kind) {
|
|
3449
|
-
case 'scalar':
|
|
3450
|
-
return type.name === 'date' || type.name === 'time' || type.name === 'datetime';
|
|
3451
|
-
case 'array':
|
|
3452
|
-
return typeNeedsDateTime(type.item);
|
|
3453
|
-
case 'union':
|
|
3454
|
-
return type.members.some(typeNeedsDateTime);
|
|
3455
|
-
<span class="branch-3 cbranch-no" title="branch not covered" > case 'discriminatedUnion':</span>
|
|
3456
|
-
<span class="cstat-no" title="statement not covered" > return type.members.some(typeNeedsDateTime);</span>
|
|
3457
|
-
case 'intersection':
|
|
3458
|
-
return type.members.some(typeNeedsDateTime);
|
|
3459
|
-
case 'inlineObject':
|
|
3460
|
-
return type.fields.some(f => typeNeedsDateTime(f.type));
|
|
3461
|
-
default:
|
|
3462
|
-
return false;
|
|
3463
|
-
}
|
|
3464
|
-
}
|
|
3465
|
-
|
|
3466
|
-
/** Collect model names referenced in `root` that are not defined locally (need to be imported). */
|
|
3467
|
-
export function collectExternalRefs(root: ContractRootNode): string[] {
|
|
3468
|
-
const localNames = new Set(root.models.map(m => m.name));
|
|
3469
|
-
const refs = new Set<string>();
|
|
3470
|
-
|
|
3471
|
-
for (const model of root.models) {
|
|
3472
|
-
if (model.bases?.[0] && !localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);
|
|
3473
|
-
if (model.type) collectTypeRefs(model.type, refs);
|
|
3474
|
-
for (const field of model.fields) {
|
|
3475
|
-
collectTypeRefs(field.type, refs);
|
|
3476
|
-
}
|
|
3477
|
-
}
|
|
3478
|
-
|
|
3479
|
-
for (const name of localNames) refs.delete(name);
|
|
3480
|
-
return [...refs].sort();
|
|
3481
|
-
}
|
|
3482
|
-
|
|
3483
|
-
/** Collect external Input variant refs needed for Input schema fields. */
|
|
3484
|
-
export function collectExternalInputRefs(root: ContractRootNode, modelsWithInput: Set<string>): string[] {
|
|
3485
|
-
const localNames = new Set(root.models.map(m => m.name));
|
|
3486
|
-
const refs = new Set<string>();
|
|
3487
|
-
|
|
3488
|
-
for (const model of root.models) {
|
|
3489
|
-
if (!modelsWithInput.has(model.name)) continue;
|
|
3490
|
-
// Type alias: collect Input refs from the aliased type expression.
|
|
3491
|
-
if (model.type) {
|
|
3492
|
-
collectInputTypeRefs(model.type, refs, modelsWithInput);
|
|
3493
|
-
continue;
|
|
3494
|
-
}
|
|
3495
|
-
// When a model extends an external parent that has an Input variant,
|
|
3496
|
-
// the write schema extends ParentInput — so we need to import it.
|
|
3497
|
-
if (model.bases?.[0] && modelsWithInput.has(model.bases?.[0]) && !localNames.has(model.bases?.[0])) {
|
|
3498
|
-
refs.add(`${model.bases?.[0]}Input`);
|
|
3499
|
-
}
|
|
3500
|
-
const writeFields = model.fields.filter(f => f.visibility !== 'readonly');
|
|
3501
|
-
for (const field of writeFields) {
|
|
3502
|
-
collectInputTypeRefs(field.type, refs, modelsWithInput);
|
|
3503
|
-
}
|
|
3504
|
-
}
|
|
3505
|
-
|
|
3506
|
-
// Remove locally defined Input variants (generated in this file)
|
|
3507
|
-
for (const name of localNames) {
|
|
3508
|
-
refs.delete(`${name}Input`);
|
|
3509
|
-
}
|
|
3510
|
-
|
|
3511
|
-
return [...refs].sort();
|
|
3512
|
-
}
|
|
3513
|
-
|
|
3514
|
-
function collectInputTypeRefs(type: ContractTypeNode, out: Set<string>, modelsWithInput: Set<string>): void {
|
|
3515
|
-
switch (type.kind) {
|
|
3516
|
-
case 'ref':
|
|
3517
|
-
if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`);
|
|
3518
|
-
break;
|
|
3519
|
-
case 'array':
|
|
3520
|
-
collectInputTypeRefs(type.item, out, modelsWithInput);
|
|
3521
|
-
break;
|
|
3522
|
-
<span class="branch-2 cbranch-no" title="branch not covered" > case 'tuple':</span>
|
|
3523
|
-
<span class="cstat-no" title="statement not covered" > type.items.forEach(<span class="fstat-no" title="function not covered" >i => <span class="cstat-no" title="statement not covered" >c</span>ollectInputTypeRefs(i, out, modelsWithInput));</span></span>
|
|
3524
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3525
|
-
<span class="branch-3 cbranch-no" title="branch not covered" > case 'record':</span>
|
|
3526
|
-
<span class="cstat-no" title="statement not covered" > collectInputTypeRefs(type.key, out, modelsWithInput);</span>
|
|
3527
|
-
<span class="cstat-no" title="statement not covered" > collectInputTypeRefs(type.value, out, modelsWithInput);</span>
|
|
3528
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3529
|
-
case 'union':
|
|
3530
|
-
type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));
|
|
3531
|
-
break;
|
|
3532
|
-
<span class="branch-5 cbranch-no" title="branch not covered" > case 'discriminatedUnion':</span>
|
|
3533
|
-
<span class="cstat-no" title="statement not covered" > type.members.forEach(<span class="fstat-no" title="function not covered" >m => <span class="cstat-no" title="statement not covered" >c</span>ollectInputTypeRefs(m, out, modelsWithInput));</span></span>
|
|
3534
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3535
|
-
case 'intersection':
|
|
3536
|
-
type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput));
|
|
3537
|
-
break;
|
|
3538
|
-
<span class="branch-7 cbranch-no" title="branch not covered" > case 'lazy':</span>
|
|
3539
|
-
<span class="cstat-no" title="statement not covered" > collectInputTypeRefs(type.inner, out, modelsWithInput);</span>
|
|
3540
|
-
<span class="cstat-no" title="statement not covered" > break;</span>
|
|
3541
|
-
case 'inlineObject':
|
|
3542
|
-
type.fields.forEach(f => collectInputTypeRefs(f.type, out, modelsWithInput));
|
|
3543
|
-
break;
|
|
3544
|
-
}
|
|
3545
|
-
}
|
|
3546
|
-
|
|
3547
|
-
/**
|
|
3548
|
-
* Topologically sort models so dependencies are emitted before dependents.
|
|
3549
|
-
* Falls back to source order for cycles (which would need z.lazy at runtime).
|
|
3550
|
-
*/
|
|
3551
|
-
export function topoSortModels(models: ModelNode[]): ModelNode[] {
|
|
3552
|
-
const localNames = new Set(models.map(m => m.name));
|
|
3553
|
-
const modelMap = new Map(models.map(m => [m.name, m]));
|
|
3554
|
-
|
|
3555
|
-
// Build adjacency: model name → set of local model names it depends on
|
|
3556
|
-
const deps = new Map<string, Set<string>>();
|
|
3557
|
-
for (const model of models) {
|
|
3558
|
-
const refs = new Set<string>();
|
|
3559
|
-
if (model.bases?.[0] && localNames.has(model.bases?.[0])) refs.add(model.bases?.[0]);
|
|
3560
|
-
if (model.type) collectTypeRefs(model.type, refs);
|
|
3561
|
-
for (const field of model.fields) {
|
|
3562
|
-
collectTypeRefs(field.type, refs);
|
|
3563
|
-
}
|
|
3564
|
-
// Keep only local dependencies
|
|
3565
|
-
const localDeps = new Set<string>();
|
|
3566
|
-
for (const r of refs) {
|
|
3567
|
-
if (localNames.has(r) && r !== model.name) localDeps.add(r);
|
|
3568
|
-
}
|
|
3569
|
-
deps.set(model.name, localDeps);
|
|
3570
|
-
}
|
|
3571
|
-
|
|
3572
|
-
// Kahn's algorithm
|
|
3573
|
-
const inDegree = new Map<string, number>();
|
|
3574
|
-
for (const name of localNames) inDegree.set(name, 0);
|
|
3575
|
-
for (const [, d] of deps) {
|
|
3576
|
-
for (const dep of d) {
|
|
3577
|
-
inDegree.set(dep, (inDegree.get(dep) ?? <span class="branch-1 cbranch-no" title="branch not covered" >0) + 1</span>);
|
|
3578
|
-
}
|
|
3579
|
-
}
|
|
3580
|
-
|
|
3581
|
-
// Note: inDegree counts how many models *depend on* this model,
|
|
3582
|
-
// but for Kahn's we need how many dependencies each model has.
|
|
3583
|
-
// Re-do: inDegree = number of unresolved deps for each model.
|
|
3584
|
-
const remaining = new Map<string, Set<string>>();
|
|
3585
|
-
for (const [name, d] of deps) {
|
|
3586
|
-
remaining.set(name, new Set(d));
|
|
3587
|
-
}
|
|
3588
|
-
|
|
3589
|
-
const queue: string[] = [];
|
|
3590
|
-
for (const name of localNames) {
|
|
3591
|
-
if (remaining.get(name)!.size === 0) queue.push(name);
|
|
3592
|
-
}
|
|
3593
|
-
|
|
3594
|
-
const sorted: ModelNode[] = [];
|
|
3595
|
-
while (queue.length > 0) {
|
|
3596
|
-
const name = queue.shift()!;
|
|
3597
|
-
sorted.push(modelMap.get(name)!);
|
|
3598
|
-
// Remove this model from all dependents' remaining sets
|
|
3599
|
-
for (const [other, rem] of remaining) {
|
|
3600
|
-
if (rem.delete(name) && rem.size === 0) {
|
|
3601
|
-
queue.push(other);
|
|
3602
|
-
}
|
|
3603
|
-
}
|
|
3604
|
-
}
|
|
3605
|
-
|
|
3606
|
-
// Append any models not yet emitted (cycles)
|
|
3607
|
-
for (const model of models) {
|
|
3608
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!sorted.includes(model)) <span class="cstat-no" title="statement not covered" >sorted.push(model);</span>
|
|
3609
|
-
}
|
|
3610
|
-
|
|
3611
|
-
return sorted;
|
|
3612
|
-
}
|
|
3613
|
-
|
|
3614
|
-
/**
|
|
3615
|
-
* Resolve the import path for an external model reference.
|
|
3616
|
-
* When a codegen context is available, computes the correct relative path
|
|
3617
|
-
* from the current file to the referenced model's output file.
|
|
3618
|
-
* Falls back to same-directory PascalCase → dot.case convention.
|
|
3619
|
-
*/
|
|
3620
|
-
export function resolveImportPath(refName: string, context?: ContractCodegenContext): string {
|
|
3621
|
-
if (context) {
|
|
3622
|
-
const refOutPath = context.modelOutPaths.get(refName);
|
|
3623
|
-
if (refOutPath) {
|
|
3624
|
-
const fromDir = dirname(context.currentOutPath);
|
|
3625
|
-
let rel = relative(fromDir, refOutPath);
|
|
3626
|
-
// Replace .ts extension with .js for ESM imports
|
|
3627
|
-
rel = rel.replace(/\.ts$/, '.js');
|
|
3628
|
-
// Ensure relative path starts with ./ or ../
|
|
3629
|
-
if (!rel.startsWith('.')) rel = './' + rel;
|
|
3630
|
-
return rel;
|
|
3631
|
-
}
|
|
3632
|
-
}
|
|
3633
|
-
// Fallback: assume same directory, use PascalCase → dot.case convention
|
|
3634
|
-
const moduleName = pascalToDotCase(refName);
|
|
3635
|
-
return `./${moduleName}.js`;
|
|
3636
|
-
}
|
|
3637
|
-
|
|
3638
|
-
/** Convert PascalCase to dot-separated lowercase: CounterpartyAccount → counterparty.account */
|
|
3639
|
-
export function pascalToDotCase(name: string): string {
|
|
3640
|
-
return name.replace(/([a-z0-9])([A-Z])/g, '$1.$2').toLowerCase();
|
|
3641
|
-
}
|
|
3642
|
-
</pre></td></tr></table></pre>
|
|
3643
|
-
|
|
3644
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
3645
|
-
</div><!-- /wrapper -->
|
|
3646
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
3647
|
-
Code coverage generated by
|
|
3648
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
3649
|
-
at 2026-06-16T15:55:46.002Z
|
|
3650
|
-
</div>
|
|
3651
|
-
<script src="../prettify.js"></script>
|
|
3652
|
-
<script>
|
|
3653
|
-
window.onload = function () {
|
|
3654
|
-
prettyPrint();
|
|
3655
|
-
};
|
|
3656
|
-
</script>
|
|
3657
|
-
<script src="../sorter.js"></script>
|
|
3658
|
-
<script src="../block-navigation.js"></script>
|
|
3659
|
-
</body>
|
|
3660
|
-
</html>
|
|
3661
|
-
|