a2acalling 0.6.74 → 0.6.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/.a2a-manifest.json +2 -2
  2. package/.c8rc.json +16 -0
  3. package/.node-version +1 -0
  4. package/.serena/project.yml +126 -0
  5. package/ARCHITECTURE.md +11 -0
  6. package/CONVENTIONS.md +9 -0
  7. package/coverage/base.css +224 -0
  8. package/coverage/block-navigation.js +87 -0
  9. package/coverage/favicon.png +0 -0
  10. package/coverage/index.html +146 -0
  11. package/coverage/prettify.css +1 -0
  12. package/coverage/prettify.js +2 -0
  13. package/coverage/sort-arrow-sprite.png +0 -0
  14. package/coverage/sorter.js +210 -0
  15. package/coverage/src/index.html +131 -0
  16. package/coverage/src/index.js.html +313 -0
  17. package/coverage/src/lib/agent-card.js.html +418 -0
  18. package/coverage/src/lib/call-monitor.js.html +700 -0
  19. package/coverage/src/lib/callbook.js.html +1183 -0
  20. package/coverage/src/lib/claude-subagent.js.html +2173 -0
  21. package/coverage/src/lib/client.js.html +2134 -0
  22. package/coverage/src/lib/config.js.html +1525 -0
  23. package/coverage/src/lib/conversation-driver.js.html +1909 -0
  24. package/coverage/src/lib/conversations.js.html +2575 -0
  25. package/coverage/src/lib/crypto.js.html +424 -0
  26. package/coverage/src/lib/dashboard-events.js.html +724 -0
  27. package/coverage/src/lib/disclosure.js.html +2461 -0
  28. package/coverage/src/lib/external-ip.js.html +718 -0
  29. package/coverage/src/lib/index.html +506 -0
  30. package/coverage/src/lib/invite-host.js.html +754 -0
  31. package/coverage/src/lib/local-request.js.html +292 -0
  32. package/coverage/src/lib/logger.js.html +2116 -0
  33. package/coverage/src/lib/openclaw-integration.js.html +1102 -0
  34. package/coverage/src/lib/pid-file.js.html +394 -0
  35. package/coverage/src/lib/port-scanner.js.html +334 -0
  36. package/coverage/src/lib/prompt-template.js.html +1150 -0
  37. package/coverage/src/lib/runtime-adapter.js.html +2188 -0
  38. package/coverage/src/lib/summarizer.js.html +553 -0
  39. package/coverage/src/lib/summary-formatter.js.html +589 -0
  40. package/coverage/src/lib/summary-prompt.js.html +694 -0
  41. package/coverage/src/lib/tokens.js.html +2689 -0
  42. package/coverage/src/lib/turn-timeout.js.html +241 -0
  43. package/coverage/src/lib/update-checker.js.html +364 -0
  44. package/coverage/src/lib/update-manager.js.html +1024 -0
  45. package/coverage/src/routes/a2a.js.html +3724 -0
  46. package/coverage/src/routes/callbook.js.html +511 -0
  47. package/coverage/src/routes/dashboard.js.html +4819 -0
  48. package/coverage/src/routes/index.html +146 -0
  49. package/coverage/src/server.js.html +3622 -0
  50. package/coverage/tmp/coverage-1605378-1772576706365-0.json +1 -0
  51. package/coverage/tmp/coverage-1605384-1772576607459-0.json +1 -0
  52. package/coverage/tmp/coverage-1605410-1772576631155-0.json +1 -0
  53. package/coverage/tmp/coverage-1606942-1772576636869-0.json +1 -0
  54. package/coverage/tmp/coverage-1607004-1772576637454-0.json +1 -0
  55. package/coverage/tmp/coverage-1607044-1772576637876-0.json +1 -0
  56. package/coverage/tmp/coverage-1607096-1772576638356-0.json +1 -0
  57. package/coverage/tmp/coverage-1607145-1772576638777-0.json +1 -0
  58. package/coverage/tmp/coverage-1607201-1772576639277-0.json +1 -0
  59. package/coverage/tmp/coverage-1607247-1772576639755-0.json +1 -0
  60. package/coverage/tmp/coverage-1607317-1772576640083-0.json +1 -0
  61. package/coverage/tmp/coverage-1607381-1772576640465-0.json +1 -0
  62. package/coverage/tmp/coverage-1607446-1772576640868-0.json +1 -0
  63. package/coverage/tmp/coverage-1607501-1772576641662-0.json +1 -0
  64. package/coverage/tmp/coverage-1607534-1772576641565-0.json +1 -0
  65. package/coverage/tmp/coverage-1607627-1772576641871-0.json +1 -0
  66. package/coverage/tmp/coverage-1607665-1772576642172-0.json +1 -0
  67. package/coverage/tmp/coverage-1607714-1772576642577-0.json +1 -0
  68. package/coverage/tmp/coverage-1607788-1772576643466-0.json +1 -0
  69. package/coverage/tmp/coverage-1607924-1772576644678-0.json +1 -0
  70. package/coverage/tmp/coverage-1607978-1772576645154-0.json +1 -0
  71. package/coverage/tmp/coverage-1608035-1772576645564-0.json +1 -0
  72. package/coverage/tmp/coverage-1608106-1772576645967-0.json +1 -0
  73. package/coverage/tmp/coverage-1608179-1772576648656-0.json +1 -0
  74. package/coverage/tmp/coverage-1608196-1772576647367-0.json +1 -0
  75. package/coverage/tmp/coverage-1608217-1772576648557-0.json +1 -0
  76. package/coverage/tmp/coverage-1608256-1772576651378-0.json +1 -0
  77. package/coverage/tmp/coverage-1608265-1772576650058-0.json +1 -0
  78. package/coverage/tmp/coverage-1608289-1772576651358-0.json +1 -0
  79. package/coverage/tmp/coverage-1608591-1772576660465-0.json +1 -0
  80. package/coverage/tmp/coverage-1608648-1772576659272-0.json +1 -0
  81. package/coverage/tmp/coverage-1608665-1772576660374-0.json +1 -0
  82. package/coverage/tmp/coverage-1608677-1772576661268-0.json +1 -0
  83. package/coverage/tmp/coverage-1608684-1772576663968-0.json +1 -0
  84. package/coverage/tmp/coverage-1608692-1772576662575-0.json +1 -0
  85. package/coverage/tmp/coverage-1608701-1772576663873-0.json +1 -0
  86. package/coverage/tmp/coverage-1608718-1772576666674-0.json +1 -0
  87. package/coverage/tmp/coverage-1608725-1772576665463-0.json +1 -0
  88. package/coverage/tmp/coverage-1608738-1772576666577-0.json +1 -0
  89. package/coverage/tmp/coverage-1608753-1772576669664-0.json +1 -0
  90. package/coverage/tmp/coverage-1608763-1772576668275-0.json +1 -0
  91. package/coverage/tmp/coverage-1608771-1772576669563-0.json +1 -0
  92. package/coverage/tmp/coverage-1608828-1772576676574-0.json +1 -0
  93. package/coverage/tmp/coverage-1609244-1772576675272-0.json +1 -0
  94. package/coverage/tmp/coverage-1609342-1772576676478-0.json +1 -0
  95. package/coverage/tmp/coverage-1609450-1772576686954-0.json +1 -0
  96. package/coverage/tmp/coverage-1609841-1772576685466-0.json +1 -0
  97. package/coverage/tmp/coverage-1609925-1772576686855-0.json +1 -0
  98. package/coverage/tmp/coverage-1610399-1772576692469-0.json +1 -0
  99. package/coverage/tmp/coverage-1611283-1772576703062-0.json +1 -0
  100. package/coverage/tmp/coverage-1611294-1772576703755-0.json +1 -0
  101. package/docs/plans/2026-03-03-a2a-91-macos-packaging-plan.md +144 -0
  102. package/docs/signing-setup.md +49 -0
  103. package/native/macos/certs/appldevcert.cer +0 -0
  104. package/native/macos/src-tauri/binaries/.gitkeep +0 -0
  105. package/native/macos/src-tauri/capabilities/default.json +11 -1
  106. package/native/macos/src-tauri/entitlements.plist +14 -0
  107. package/native/macos/src-tauri/src/discovery.rs +14 -3
  108. package/native/macos/src-tauri/src/health.rs +4 -0
  109. package/native/macos/src-tauri/src/lib.rs +52 -11
  110. package/native/macos/src-tauri/src/server.rs +262 -26
  111. package/native/macos/src-tauri/tauri.conf.json +13 -4
  112. package/package.json +7 -2
  113. package/pkg.config.json +14 -0
  114. package/scripts/build-standalone.sh +106 -0
  115. package/scripts/smoke-test-standalone.sh +101 -0
  116. package/scripts/sync-version.sh +28 -0
  117. package/scripts/verify-app-bundle.sh +34 -0
  118. package/.maestro/inbox/release-workflow-spam.md +0 -25
@@ -0,0 +1,3622 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/server.js</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> server.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">25.95% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>306/1179</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">33.33% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>11/33</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">25% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>7/28</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">25.95% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>306/1179</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 low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
1246
+ <span class="cline-any cline-yes">1x</span>
1247
+ <span class="cline-any cline-yes">1x</span>
1248
+ <span class="cline-any cline-yes">1x</span>
1249
+ <span class="cline-any cline-yes">1x</span>
1250
+ <span class="cline-any cline-yes">1x</span>
1251
+ <span class="cline-any cline-yes">1x</span>
1252
+ <span class="cline-any cline-yes">1x</span>
1253
+ <span class="cline-any cline-yes">1x</span>
1254
+ <span class="cline-any cline-yes">1x</span>
1255
+ <span class="cline-any cline-yes">1x</span>
1256
+ <span class="cline-any cline-yes">1x</span>
1257
+ <span class="cline-any cline-yes">1x</span>
1258
+ <span class="cline-any cline-yes">1x</span>
1259
+ <span class="cline-any cline-yes">1x</span>
1260
+ <span class="cline-any cline-yes">1x</span>
1261
+ <span class="cline-any cline-yes">1x</span>
1262
+ <span class="cline-any cline-yes">1x</span>
1263
+ <span class="cline-any cline-yes">1x</span>
1264
+ <span class="cline-any cline-yes">1x</span>
1265
+ <span class="cline-any cline-yes">1x</span>
1266
+ <span class="cline-any cline-yes">1x</span>
1267
+ <span class="cline-any cline-yes">1x</span>
1268
+ <span class="cline-any cline-yes">1x</span>
1269
+ <span class="cline-any cline-yes">1x</span>
1270
+ <span class="cline-any cline-yes">1x</span>
1271
+ <span class="cline-any cline-yes">1x</span>
1272
+ <span class="cline-any cline-yes">1x</span>
1273
+ <span class="cline-any cline-yes">1x</span>
1274
+ <span class="cline-any cline-yes">1x</span>
1275
+ <span class="cline-any cline-yes">1x</span>
1276
+ <span class="cline-any cline-yes">1x</span>
1277
+ <span class="cline-any cline-yes">1x</span>
1278
+ <span class="cline-any cline-yes">1x</span>
1279
+ <span class="cline-any cline-yes">1x</span>
1280
+ <span class="cline-any cline-yes">1x</span>
1281
+ <span class="cline-any cline-yes">1x</span>
1282
+ <span class="cline-any cline-yes">1x</span>
1283
+ <span class="cline-any cline-yes">1x</span>
1284
+ <span class="cline-any cline-yes">1x</span>
1285
+ <span class="cline-any cline-yes">1x</span>
1286
+ <span class="cline-any cline-yes">1x</span>
1287
+ <span class="cline-any cline-yes">1x</span>
1288
+ <span class="cline-any cline-yes">1x</span>
1289
+ <span class="cline-any cline-yes">1x</span>
1290
+ <span class="cline-any cline-yes">1x</span>
1291
+ <span class="cline-any cline-yes">1x</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-yes">1x</span>
1295
+ <span class="cline-any cline-yes">1x</span>
1296
+ <span class="cline-any cline-no">&nbsp;</span>
1297
+ <span class="cline-any cline-no">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-no">&nbsp;</span>
1306
+ <span class="cline-any cline-no">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-yes">1x</span>
1311
+ <span class="cline-any cline-yes">1x</span>
1312
+ <span class="cline-any cline-yes">1x</span>
1313
+ <span class="cline-any cline-yes">1x</span>
1314
+ <span class="cline-any cline-yes">1x</span>
1315
+ <span class="cline-any cline-yes">1x</span>
1316
+ <span class="cline-any cline-yes">1x</span>
1317
+ <span class="cline-any cline-yes">1x</span>
1318
+ <span class="cline-any cline-yes">1x</span>
1319
+ <span class="cline-any cline-yes">1x</span>
1320
+ <span class="cline-any cline-yes">1x</span>
1321
+ <span class="cline-any cline-yes">1x</span>
1322
+ <span class="cline-any cline-yes">1x</span>
1323
+ <span class="cline-any cline-yes">1x</span>
1324
+ <span class="cline-any cline-yes">1x</span>
1325
+ <span class="cline-any cline-yes">1x</span>
1326
+ <span class="cline-any cline-yes">1x</span>
1327
+ <span class="cline-any cline-yes">1x</span>
1328
+ <span class="cline-any cline-yes">1x</span>
1329
+ <span class="cline-any cline-yes">1x</span>
1330
+ <span class="cline-any cline-yes">1x</span>
1331
+ <span class="cline-any cline-yes">1x</span>
1332
+ <span class="cline-any cline-yes">1x</span>
1333
+ <span class="cline-any cline-yes">1x</span>
1334
+ <span class="cline-any cline-yes">1x</span>
1335
+ <span class="cline-any cline-no">&nbsp;</span>
1336
+ <span class="cline-any cline-no">&nbsp;</span>
1337
+ <span class="cline-any cline-no">&nbsp;</span>
1338
+ <span class="cline-any cline-yes">1x</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-no">&nbsp;</span>
1341
+ <span class="cline-any cline-no">&nbsp;</span>
1342
+ <span class="cline-any cline-yes">1x</span>
1343
+ <span class="cline-any cline-yes">1x</span>
1344
+ <span class="cline-any cline-yes">1x</span>
1345
+ <span class="cline-any cline-yes">1x</span>
1346
+ <span class="cline-any cline-yes">1x</span>
1347
+ <span class="cline-any cline-yes">1x</span>
1348
+ <span class="cline-any cline-yes">1x</span>
1349
+ <span class="cline-any cline-yes">1x</span>
1350
+ <span class="cline-any cline-yes">1x</span>
1351
+ <span class="cline-any cline-yes">1x</span>
1352
+ <span class="cline-any cline-yes">1x</span>
1353
+ <span class="cline-any cline-yes">1x</span>
1354
+ <span class="cline-any cline-yes">1x</span>
1355
+ <span class="cline-any cline-yes">1x</span>
1356
+ <span class="cline-any cline-yes">1x</span>
1357
+ <span class="cline-any cline-yes">1x</span>
1358
+ <span class="cline-any cline-yes">1x</span>
1359
+ <span class="cline-any cline-yes">1x</span>
1360
+ <span class="cline-any cline-yes">1x</span>
1361
+ <span class="cline-any cline-no">&nbsp;</span>
1362
+ <span class="cline-any cline-no">&nbsp;</span>
1363
+ <span class="cline-any cline-no">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-no">&nbsp;</span>
1366
+ <span class="cline-any cline-no">&nbsp;</span>
1367
+ <span class="cline-any cline-no">&nbsp;</span>
1368
+ <span class="cline-any cline-yes">1x</span>
1369
+ <span class="cline-any cline-yes">2x</span>
1370
+ <span class="cline-any cline-yes">2x</span>
1371
+ <span class="cline-any cline-yes">2x</span>
1372
+ <span class="cline-any cline-yes">2x</span>
1373
+ <span class="cline-any cline-yes">1x</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-no">&nbsp;</span>
1377
+ <span class="cline-any cline-no">&nbsp;</span>
1378
+ <span class="cline-any cline-no">&nbsp;</span>
1379
+ <span class="cline-any cline-no">&nbsp;</span>
1380
+ <span class="cline-any cline-no">&nbsp;</span>
1381
+ <span class="cline-any cline-no">&nbsp;</span>
1382
+ <span class="cline-any cline-yes">1x</span>
1383
+ <span class="cline-any cline-yes">1x</span>
1384
+ <span class="cline-any cline-yes">1x</span>
1385
+ <span class="cline-any cline-yes">1x</span>
1386
+ <span class="cline-any cline-no">&nbsp;</span>
1387
+ <span class="cline-any cline-no">&nbsp;</span>
1388
+ <span class="cline-any cline-yes">1x</span>
1389
+ <span class="cline-any cline-yes">1x</span>
1390
+ <span class="cline-any cline-yes">1x</span>
1391
+ <span class="cline-any cline-no">&nbsp;</span>
1392
+ <span class="cline-any cline-no">&nbsp;</span>
1393
+ <span class="cline-any cline-no">&nbsp;</span>
1394
+ <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-no">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-yes">1x</span>
1398
+ <span class="cline-any cline-no">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-no">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-no">&nbsp;</span>
1404
+ <span class="cline-any cline-no">&nbsp;</span>
1405
+ <span class="cline-any cline-yes">1x</span>
1406
+ <span class="cline-any cline-no">&nbsp;</span>
1407
+ <span class="cline-any cline-no">&nbsp;</span>
1408
+ <span class="cline-any cline-no">&nbsp;</span>
1409
+ <span class="cline-any cline-no">&nbsp;</span>
1410
+ <span class="cline-any cline-no">&nbsp;</span>
1411
+ <span class="cline-any cline-no">&nbsp;</span>
1412
+ <span class="cline-any cline-no">&nbsp;</span>
1413
+ <span class="cline-any cline-no">&nbsp;</span>
1414
+ <span class="cline-any cline-no">&nbsp;</span>
1415
+ <span class="cline-any cline-no">&nbsp;</span>
1416
+ <span class="cline-any cline-no">&nbsp;</span>
1417
+ <span class="cline-any cline-no">&nbsp;</span>
1418
+ <span class="cline-any cline-no">&nbsp;</span>
1419
+ <span class="cline-any cline-no">&nbsp;</span>
1420
+ <span class="cline-any cline-no">&nbsp;</span>
1421
+ <span class="cline-any cline-no">&nbsp;</span>
1422
+ <span class="cline-any cline-no">&nbsp;</span>
1423
+ <span class="cline-any cline-no">&nbsp;</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-yes">1x</span>
1426
+ <span class="cline-any cline-no">&nbsp;</span>
1427
+ <span class="cline-any cline-no">&nbsp;</span>
1428
+ <span class="cline-any cline-no">&nbsp;</span>
1429
+ <span class="cline-any cline-no">&nbsp;</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-no">&nbsp;</span>
1432
+ <span class="cline-any cline-no">&nbsp;</span>
1433
+ <span class="cline-any cline-no">&nbsp;</span>
1434
+ <span class="cline-any cline-no">&nbsp;</span>
1435
+ <span class="cline-any cline-no">&nbsp;</span>
1436
+ <span class="cline-any cline-no">&nbsp;</span>
1437
+ <span class="cline-any cline-no">&nbsp;</span>
1438
+ <span class="cline-any cline-no">&nbsp;</span>
1439
+ <span class="cline-any cline-no">&nbsp;</span>
1440
+ <span class="cline-any cline-no">&nbsp;</span>
1441
+ <span class="cline-any cline-yes">1x</span>
1442
+ <span class="cline-any cline-no">&nbsp;</span>
1443
+ <span class="cline-any cline-no">&nbsp;</span>
1444
+ <span class="cline-any cline-no">&nbsp;</span>
1445
+ <span class="cline-any cline-no">&nbsp;</span>
1446
+ <span class="cline-any cline-no">&nbsp;</span>
1447
+ <span class="cline-any cline-no">&nbsp;</span>
1448
+ <span class="cline-any cline-no">&nbsp;</span>
1449
+ <span class="cline-any cline-no">&nbsp;</span>
1450
+ <span class="cline-any cline-no">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-no">&nbsp;</span>
1454
+ <span class="cline-any cline-no">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-no">&nbsp;</span>
1457
+ <span class="cline-any cline-no">&nbsp;</span>
1458
+ <span class="cline-any cline-no">&nbsp;</span>
1459
+ <span class="cline-any cline-no">&nbsp;</span>
1460
+ <span class="cline-any cline-no">&nbsp;</span>
1461
+ <span class="cline-any cline-no">&nbsp;</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-no">&nbsp;</span>
1464
+ <span class="cline-any cline-no">&nbsp;</span>
1465
+ <span class="cline-any cline-no">&nbsp;</span>
1466
+ <span class="cline-any cline-no">&nbsp;</span>
1467
+ <span class="cline-any cline-no">&nbsp;</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
1470
+ <span class="cline-any cline-no">&nbsp;</span>
1471
+ <span class="cline-any cline-yes">1x</span>
1472
+ <span class="cline-any cline-no">&nbsp;</span>
1473
+ <span class="cline-any cline-no">&nbsp;</span>
1474
+ <span class="cline-any cline-no">&nbsp;</span>
1475
+ <span class="cline-any cline-no">&nbsp;</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <span class="cline-any cline-no">&nbsp;</span>
1478
+ <span class="cline-any cline-no">&nbsp;</span>
1479
+ <span class="cline-any cline-no">&nbsp;</span>
1480
+ <span class="cline-any cline-no">&nbsp;</span>
1481
+ <span class="cline-any cline-no">&nbsp;</span>
1482
+ <span class="cline-any cline-no">&nbsp;</span>
1483
+ <span class="cline-any cline-no">&nbsp;</span>
1484
+ <span class="cline-any cline-no">&nbsp;</span>
1485
+ <span class="cline-any cline-no">&nbsp;</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-no">&nbsp;</span>
1488
+ <span class="cline-any cline-no">&nbsp;</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-no">&nbsp;</span>
1491
+ <span class="cline-any cline-no">&nbsp;</span>
1492
+ <span class="cline-any cline-no">&nbsp;</span>
1493
+ <span class="cline-any cline-no">&nbsp;</span>
1494
+ <span class="cline-any cline-no">&nbsp;</span>
1495
+ <span class="cline-any cline-no">&nbsp;</span>
1496
+ <span class="cline-any cline-no">&nbsp;</span>
1497
+ <span class="cline-any cline-no">&nbsp;</span>
1498
+ <span class="cline-any cline-no">&nbsp;</span>
1499
+ <span class="cline-any cline-no">&nbsp;</span>
1500
+ <span class="cline-any cline-no">&nbsp;</span>
1501
+ <span class="cline-any cline-no">&nbsp;</span>
1502
+ <span class="cline-any cline-no">&nbsp;</span>
1503
+ <span class="cline-any cline-no">&nbsp;</span>
1504
+ <span class="cline-any cline-no">&nbsp;</span>
1505
+ <span class="cline-any cline-no">&nbsp;</span>
1506
+ <span class="cline-any cline-no">&nbsp;</span>
1507
+ <span class="cline-any cline-no">&nbsp;</span>
1508
+ <span class="cline-any cline-yes">1x</span>
1509
+ <span class="cline-any cline-no">&nbsp;</span>
1510
+ <span class="cline-any cline-no">&nbsp;</span>
1511
+ <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-no">&nbsp;</span>
1513
+ <span class="cline-any cline-no">&nbsp;</span>
1514
+ <span class="cline-any cline-no">&nbsp;</span>
1515
+ <span class="cline-any cline-no">&nbsp;</span>
1516
+ <span class="cline-any cline-no">&nbsp;</span>
1517
+ <span class="cline-any cline-no">&nbsp;</span>
1518
+ <span class="cline-any cline-no">&nbsp;</span>
1519
+ <span class="cline-any cline-no">&nbsp;</span>
1520
+ <span class="cline-any cline-no">&nbsp;</span>
1521
+ <span class="cline-any cline-no">&nbsp;</span>
1522
+ <span class="cline-any cline-no">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-no">&nbsp;</span>
1525
+ <span class="cline-any cline-no">&nbsp;</span>
1526
+ <span class="cline-any cline-no">&nbsp;</span>
1527
+ <span class="cline-any cline-no">&nbsp;</span>
1528
+ <span class="cline-any cline-no">&nbsp;</span>
1529
+ <span class="cline-any cline-yes">1x</span>
1530
+ <span class="cline-any cline-no">&nbsp;</span>
1531
+ <span class="cline-any cline-no">&nbsp;</span>
1532
+ <span class="cline-any cline-no">&nbsp;</span>
1533
+ <span class="cline-any cline-no">&nbsp;</span>
1534
+ <span class="cline-any cline-no">&nbsp;</span>
1535
+ <span class="cline-any cline-no">&nbsp;</span>
1536
+ <span class="cline-any cline-no">&nbsp;</span>
1537
+ <span class="cline-any cline-no">&nbsp;</span>
1538
+ <span class="cline-any cline-no">&nbsp;</span>
1539
+ <span class="cline-any cline-no">&nbsp;</span>
1540
+ <span class="cline-any cline-no">&nbsp;</span>
1541
+ <span class="cline-any cline-no">&nbsp;</span>
1542
+ <span class="cline-any cline-no">&nbsp;</span>
1543
+ <span class="cline-any cline-no">&nbsp;</span>
1544
+ <span class="cline-any cline-no">&nbsp;</span>
1545
+ <span class="cline-any cline-no">&nbsp;</span>
1546
+ <span class="cline-any cline-no">&nbsp;</span>
1547
+ <span class="cline-any cline-no">&nbsp;</span>
1548
+ <span class="cline-any cline-no">&nbsp;</span>
1549
+ <span class="cline-any cline-no">&nbsp;</span>
1550
+ <span class="cline-any cline-no">&nbsp;</span>
1551
+ <span class="cline-any cline-no">&nbsp;</span>
1552
+ <span class="cline-any cline-no">&nbsp;</span>
1553
+ <span class="cline-any cline-no">&nbsp;</span>
1554
+ <span class="cline-any cline-no">&nbsp;</span>
1555
+ <span class="cline-any cline-no">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-no">&nbsp;</span>
1558
+ <span class="cline-any cline-no">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-no">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-no">&nbsp;</span>
1567
+ <span class="cline-any cline-no">&nbsp;</span>
1568
+ <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-no">&nbsp;</span>
1574
+ <span class="cline-any cline-no">&nbsp;</span>
1575
+ <span class="cline-any cline-no">&nbsp;</span>
1576
+ <span class="cline-any cline-no">&nbsp;</span>
1577
+ <span class="cline-any cline-no">&nbsp;</span>
1578
+ <span class="cline-any cline-no">&nbsp;</span>
1579
+ <span class="cline-any cline-no">&nbsp;</span>
1580
+ <span class="cline-any cline-no">&nbsp;</span>
1581
+ <span class="cline-any cline-no">&nbsp;</span>
1582
+ <span class="cline-any cline-no">&nbsp;</span>
1583
+ <span class="cline-any cline-no">&nbsp;</span>
1584
+ <span class="cline-any cline-no">&nbsp;</span>
1585
+ <span class="cline-any cline-no">&nbsp;</span>
1586
+ <span class="cline-any cline-no">&nbsp;</span>
1587
+ <span class="cline-any cline-yes">1x</span>
1588
+ <span class="cline-any cline-no">&nbsp;</span>
1589
+ <span class="cline-any cline-no">&nbsp;</span>
1590
+ <span class="cline-any cline-no">&nbsp;</span>
1591
+ <span class="cline-any cline-no">&nbsp;</span>
1592
+ <span class="cline-any cline-no">&nbsp;</span>
1593
+ <span class="cline-any cline-no">&nbsp;</span>
1594
+ <span class="cline-any cline-no">&nbsp;</span>
1595
+ <span class="cline-any cline-no">&nbsp;</span>
1596
+ <span class="cline-any cline-no">&nbsp;</span>
1597
+ <span class="cline-any cline-no">&nbsp;</span>
1598
+ <span class="cline-any cline-no">&nbsp;</span>
1599
+ <span class="cline-any cline-no">&nbsp;</span>
1600
+ <span class="cline-any cline-no">&nbsp;</span>
1601
+ <span class="cline-any cline-no">&nbsp;</span>
1602
+ <span class="cline-any cline-no">&nbsp;</span>
1603
+ <span class="cline-any cline-yes">1x</span>
1604
+ <span class="cline-any cline-no">&nbsp;</span>
1605
+ <span class="cline-any cline-no">&nbsp;</span>
1606
+ <span class="cline-any cline-no">&nbsp;</span>
1607
+ <span class="cline-any cline-no">&nbsp;</span>
1608
+ <span class="cline-any cline-no">&nbsp;</span>
1609
+ <span class="cline-any cline-no">&nbsp;</span>
1610
+ <span class="cline-any cline-no">&nbsp;</span>
1611
+ <span class="cline-any cline-no">&nbsp;</span>
1612
+ <span class="cline-any cline-no">&nbsp;</span>
1613
+ <span class="cline-any cline-no">&nbsp;</span>
1614
+ <span class="cline-any cline-no">&nbsp;</span>
1615
+ <span class="cline-any cline-no">&nbsp;</span>
1616
+ <span class="cline-any cline-no">&nbsp;</span>
1617
+ <span class="cline-any cline-no">&nbsp;</span>
1618
+ <span class="cline-any cline-no">&nbsp;</span>
1619
+ <span class="cline-any cline-no">&nbsp;</span>
1620
+ <span class="cline-any cline-no">&nbsp;</span>
1621
+ <span class="cline-any cline-no">&nbsp;</span>
1622
+ <span class="cline-any cline-no">&nbsp;</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-no">&nbsp;</span>
1626
+ <span class="cline-any cline-no">&nbsp;</span>
1627
+ <span class="cline-any cline-no">&nbsp;</span>
1628
+ <span class="cline-any cline-no">&nbsp;</span>
1629
+ <span class="cline-any cline-no">&nbsp;</span>
1630
+ <span class="cline-any cline-no">&nbsp;</span>
1631
+ <span class="cline-any cline-no">&nbsp;</span>
1632
+ <span class="cline-any cline-no">&nbsp;</span>
1633
+ <span class="cline-any cline-no">&nbsp;</span>
1634
+ <span class="cline-any cline-no">&nbsp;</span>
1635
+ <span class="cline-any cline-no">&nbsp;</span>
1636
+ <span class="cline-any cline-no">&nbsp;</span>
1637
+ <span class="cline-any cline-no">&nbsp;</span>
1638
+ <span class="cline-any cline-no">&nbsp;</span>
1639
+ <span class="cline-any cline-no">&nbsp;</span>
1640
+ <span class="cline-any cline-no">&nbsp;</span>
1641
+ <span class="cline-any cline-no">&nbsp;</span>
1642
+ <span class="cline-any cline-no">&nbsp;</span>
1643
+ <span class="cline-any cline-no">&nbsp;</span>
1644
+ <span class="cline-any cline-no">&nbsp;</span>
1645
+ <span class="cline-any cline-no">&nbsp;</span>
1646
+ <span class="cline-any cline-no">&nbsp;</span>
1647
+ <span class="cline-any cline-no">&nbsp;</span>
1648
+ <span class="cline-any cline-no">&nbsp;</span>
1649
+ <span class="cline-any cline-no">&nbsp;</span>
1650
+ <span class="cline-any cline-no">&nbsp;</span>
1651
+ <span class="cline-any cline-no">&nbsp;</span>
1652
+ <span class="cline-any cline-no">&nbsp;</span>
1653
+ <span class="cline-any cline-no">&nbsp;</span>
1654
+ <span class="cline-any cline-no">&nbsp;</span>
1655
+ <span class="cline-any cline-no">&nbsp;</span>
1656
+ <span class="cline-any cline-no">&nbsp;</span>
1657
+ <span class="cline-any cline-no">&nbsp;</span>
1658
+ <span class="cline-any cline-no">&nbsp;</span>
1659
+ <span class="cline-any cline-no">&nbsp;</span>
1660
+ <span class="cline-any cline-no">&nbsp;</span>
1661
+ <span class="cline-any cline-no">&nbsp;</span>
1662
+ <span class="cline-any cline-no">&nbsp;</span>
1663
+ <span class="cline-any cline-no">&nbsp;</span>
1664
+ <span class="cline-any cline-no">&nbsp;</span>
1665
+ <span class="cline-any cline-no">&nbsp;</span>
1666
+ <span class="cline-any cline-no">&nbsp;</span>
1667
+ <span class="cline-any cline-no">&nbsp;</span>
1668
+ <span class="cline-any cline-no">&nbsp;</span>
1669
+ <span class="cline-any cline-no">&nbsp;</span>
1670
+ <span class="cline-any cline-no">&nbsp;</span>
1671
+ <span class="cline-any cline-no">&nbsp;</span>
1672
+ <span class="cline-any cline-no">&nbsp;</span>
1673
+ <span class="cline-any cline-no">&nbsp;</span>
1674
+ <span class="cline-any cline-yes">1x</span>
1675
+ <span class="cline-any cline-no">&nbsp;</span>
1676
+ <span class="cline-any cline-no">&nbsp;</span>
1677
+ <span class="cline-any cline-no">&nbsp;</span>
1678
+ <span class="cline-any cline-no">&nbsp;</span>
1679
+ <span class="cline-any cline-no">&nbsp;</span>
1680
+ <span class="cline-any cline-no">&nbsp;</span>
1681
+ <span class="cline-any cline-no">&nbsp;</span>
1682
+ <span class="cline-any cline-no">&nbsp;</span>
1683
+ <span class="cline-any cline-no">&nbsp;</span>
1684
+ <span class="cline-any cline-no">&nbsp;</span>
1685
+ <span class="cline-any cline-no">&nbsp;</span>
1686
+ <span class="cline-any cline-no">&nbsp;</span>
1687
+ <span class="cline-any cline-no">&nbsp;</span>
1688
+ <span class="cline-any cline-no">&nbsp;</span>
1689
+ <span class="cline-any cline-no">&nbsp;</span>
1690
+ <span class="cline-any cline-no">&nbsp;</span>
1691
+ <span class="cline-any cline-no">&nbsp;</span>
1692
+ <span class="cline-any cline-no">&nbsp;</span>
1693
+ <span class="cline-any cline-no">&nbsp;</span>
1694
+ <span class="cline-any cline-no">&nbsp;</span>
1695
+ <span class="cline-any cline-no">&nbsp;</span>
1696
+ <span class="cline-any cline-no">&nbsp;</span>
1697
+ <span class="cline-any cline-no">&nbsp;</span>
1698
+ <span class="cline-any cline-no">&nbsp;</span>
1699
+ <span class="cline-any cline-no">&nbsp;</span>
1700
+ <span class="cline-any cline-no">&nbsp;</span>
1701
+ <span class="cline-any cline-no">&nbsp;</span>
1702
+ <span class="cline-any cline-no">&nbsp;</span>
1703
+ <span class="cline-any cline-no">&nbsp;</span>
1704
+ <span class="cline-any cline-no">&nbsp;</span>
1705
+ <span class="cline-any cline-no">&nbsp;</span>
1706
+ <span class="cline-any cline-no">&nbsp;</span>
1707
+ <span class="cline-any cline-no">&nbsp;</span>
1708
+ <span class="cline-any cline-no">&nbsp;</span>
1709
+ <span class="cline-any cline-no">&nbsp;</span>
1710
+ <span class="cline-any cline-no">&nbsp;</span>
1711
+ <span class="cline-any cline-no">&nbsp;</span>
1712
+ <span class="cline-any cline-no">&nbsp;</span>
1713
+ <span class="cline-any cline-no">&nbsp;</span>
1714
+ <span class="cline-any cline-no">&nbsp;</span>
1715
+ <span class="cline-any cline-no">&nbsp;</span>
1716
+ <span class="cline-any cline-no">&nbsp;</span>
1717
+ <span class="cline-any cline-no">&nbsp;</span>
1718
+ <span class="cline-any cline-no">&nbsp;</span>
1719
+ <span class="cline-any cline-no">&nbsp;</span>
1720
+ <span class="cline-any cline-no">&nbsp;</span>
1721
+ <span class="cline-any cline-no">&nbsp;</span>
1722
+ <span class="cline-any cline-no">&nbsp;</span>
1723
+ <span class="cline-any cline-no">&nbsp;</span>
1724
+ <span class="cline-any cline-no">&nbsp;</span>
1725
+ <span class="cline-any cline-no">&nbsp;</span>
1726
+ <span class="cline-any cline-no">&nbsp;</span>
1727
+ <span class="cline-any cline-no">&nbsp;</span>
1728
+ <span class="cline-any cline-no">&nbsp;</span>
1729
+ <span class="cline-any cline-no">&nbsp;</span>
1730
+ <span class="cline-any cline-no">&nbsp;</span>
1731
+ <span class="cline-any cline-no">&nbsp;</span>
1732
+ <span class="cline-any cline-no">&nbsp;</span>
1733
+ <span class="cline-any cline-no">&nbsp;</span>
1734
+ <span class="cline-any cline-no">&nbsp;</span>
1735
+ <span class="cline-any cline-no">&nbsp;</span>
1736
+ <span class="cline-any cline-no">&nbsp;</span>
1737
+ <span class="cline-any cline-no">&nbsp;</span>
1738
+ <span class="cline-any cline-yes">1x</span>
1739
+ <span class="cline-any cline-yes">1x</span>
1740
+ <span class="cline-any cline-yes">1x</span>
1741
+ <span class="cline-any cline-yes">1x</span>
1742
+ <span class="cline-any cline-no">&nbsp;</span>
1743
+ <span class="cline-any cline-no">&nbsp;</span>
1744
+ <span class="cline-any cline-no">&nbsp;</span>
1745
+ <span class="cline-any cline-no">&nbsp;</span>
1746
+ <span class="cline-any cline-no">&nbsp;</span>
1747
+ <span class="cline-any cline-no">&nbsp;</span>
1748
+ <span class="cline-any cline-no">&nbsp;</span>
1749
+ <span class="cline-any cline-no">&nbsp;</span>
1750
+ <span class="cline-any cline-no">&nbsp;</span>
1751
+ <span class="cline-any cline-no">&nbsp;</span>
1752
+ <span class="cline-any cline-no">&nbsp;</span>
1753
+ <span class="cline-any cline-no">&nbsp;</span>
1754
+ <span class="cline-any cline-no">&nbsp;</span>
1755
+ <span class="cline-any cline-no">&nbsp;</span>
1756
+ <span class="cline-any cline-no">&nbsp;</span>
1757
+ <span class="cline-any cline-no">&nbsp;</span>
1758
+ <span class="cline-any cline-no">&nbsp;</span>
1759
+ <span class="cline-any cline-no">&nbsp;</span>
1760
+ <span class="cline-any cline-no">&nbsp;</span>
1761
+ <span class="cline-any cline-no">&nbsp;</span>
1762
+ <span class="cline-any cline-no">&nbsp;</span>
1763
+ <span class="cline-any cline-no">&nbsp;</span>
1764
+ <span class="cline-any cline-no">&nbsp;</span>
1765
+ <span class="cline-any cline-no">&nbsp;</span>
1766
+ <span class="cline-any cline-no">&nbsp;</span>
1767
+ <span class="cline-any cline-no">&nbsp;</span>
1768
+ <span class="cline-any cline-no">&nbsp;</span>
1769
+ <span class="cline-any cline-no">&nbsp;</span>
1770
+ <span class="cline-any cline-no">&nbsp;</span>
1771
+ <span class="cline-any cline-no">&nbsp;</span>
1772
+ <span class="cline-any cline-yes">1x</span>
1773
+ <span class="cline-any cline-yes">1x</span>
1774
+ <span class="cline-any cline-yes">1x</span>
1775
+ <span class="cline-any cline-yes">1x</span>
1776
+ <span class="cline-any cline-no">&nbsp;</span>
1777
+ <span class="cline-any cline-no">&nbsp;</span>
1778
+ <span class="cline-any cline-no">&nbsp;</span>
1779
+ <span class="cline-any cline-no">&nbsp;</span>
1780
+ <span class="cline-any cline-no">&nbsp;</span>
1781
+ <span class="cline-any cline-no">&nbsp;</span>
1782
+ <span class="cline-any cline-no">&nbsp;</span>
1783
+ <span class="cline-any cline-no">&nbsp;</span>
1784
+ <span class="cline-any cline-no">&nbsp;</span>
1785
+ <span class="cline-any cline-no">&nbsp;</span>
1786
+ <span class="cline-any cline-no">&nbsp;</span>
1787
+ <span class="cline-any cline-no">&nbsp;</span>
1788
+ <span class="cline-any cline-no">&nbsp;</span>
1789
+ <span class="cline-any cline-no">&nbsp;</span>
1790
+ <span class="cline-any cline-no">&nbsp;</span>
1791
+ <span class="cline-any cline-no">&nbsp;</span>
1792
+ <span class="cline-any cline-no">&nbsp;</span>
1793
+ <span class="cline-any cline-no">&nbsp;</span>
1794
+ <span class="cline-any cline-no">&nbsp;</span>
1795
+ <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-no">&nbsp;</span>
1797
+ <span class="cline-any cline-no">&nbsp;</span>
1798
+ <span class="cline-any cline-no">&nbsp;</span>
1799
+ <span class="cline-any cline-no">&nbsp;</span>
1800
+ <span class="cline-any cline-no">&nbsp;</span>
1801
+ <span class="cline-any cline-no">&nbsp;</span>
1802
+ <span class="cline-any cline-no">&nbsp;</span>
1803
+ <span class="cline-any cline-no">&nbsp;</span>
1804
+ <span class="cline-any cline-no">&nbsp;</span>
1805
+ <span class="cline-any cline-no">&nbsp;</span>
1806
+ <span class="cline-any cline-no">&nbsp;</span>
1807
+ <span class="cline-any cline-no">&nbsp;</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1809
+ <span class="cline-any cline-no">&nbsp;</span>
1810
+ <span class="cline-any cline-no">&nbsp;</span>
1811
+ <span class="cline-any cline-no">&nbsp;</span>
1812
+ <span class="cline-any cline-no">&nbsp;</span>
1813
+ <span class="cline-any cline-no">&nbsp;</span>
1814
+ <span class="cline-any cline-no">&nbsp;</span>
1815
+ <span class="cline-any cline-no">&nbsp;</span>
1816
+ <span class="cline-any cline-no">&nbsp;</span>
1817
+ <span class="cline-any cline-no">&nbsp;</span>
1818
+ <span class="cline-any cline-no">&nbsp;</span>
1819
+ <span class="cline-any cline-no">&nbsp;</span>
1820
+ <span class="cline-any cline-no">&nbsp;</span>
1821
+ <span class="cline-any cline-no">&nbsp;</span>
1822
+ <span class="cline-any cline-no">&nbsp;</span>
1823
+ <span class="cline-any cline-no">&nbsp;</span>
1824
+ <span class="cline-any cline-no">&nbsp;</span>
1825
+ <span class="cline-any cline-no">&nbsp;</span>
1826
+ <span class="cline-any cline-no">&nbsp;</span>
1827
+ <span class="cline-any cline-no">&nbsp;</span>
1828
+ <span class="cline-any cline-no">&nbsp;</span>
1829
+ <span class="cline-any cline-no">&nbsp;</span>
1830
+ <span class="cline-any cline-no">&nbsp;</span>
1831
+ <span class="cline-any cline-no">&nbsp;</span>
1832
+ <span class="cline-any cline-no">&nbsp;</span>
1833
+ <span class="cline-any cline-no">&nbsp;</span>
1834
+ <span class="cline-any cline-no">&nbsp;</span>
1835
+ <span class="cline-any cline-no">&nbsp;</span>
1836
+ <span class="cline-any cline-no">&nbsp;</span>
1837
+ <span class="cline-any cline-no">&nbsp;</span>
1838
+ <span class="cline-any cline-no">&nbsp;</span>
1839
+ <span class="cline-any cline-no">&nbsp;</span>
1840
+ <span class="cline-any cline-no">&nbsp;</span>
1841
+ <span class="cline-any cline-no">&nbsp;</span>
1842
+ <span class="cline-any cline-no">&nbsp;</span>
1843
+ <span class="cline-any cline-no">&nbsp;</span>
1844
+ <span class="cline-any cline-no">&nbsp;</span>
1845
+ <span class="cline-any cline-no">&nbsp;</span>
1846
+ <span class="cline-any cline-no">&nbsp;</span>
1847
+ <span class="cline-any cline-no">&nbsp;</span>
1848
+ <span class="cline-any cline-no">&nbsp;</span>
1849
+ <span class="cline-any cline-no">&nbsp;</span>
1850
+ <span class="cline-any cline-no">&nbsp;</span>
1851
+ <span class="cline-any cline-no">&nbsp;</span>
1852
+ <span class="cline-any cline-no">&nbsp;</span>
1853
+ <span class="cline-any cline-no">&nbsp;</span>
1854
+ <span class="cline-any cline-no">&nbsp;</span>
1855
+ <span class="cline-any cline-no">&nbsp;</span>
1856
+ <span class="cline-any cline-no">&nbsp;</span>
1857
+ <span class="cline-any cline-no">&nbsp;</span>
1858
+ <span class="cline-any cline-no">&nbsp;</span>
1859
+ <span class="cline-any cline-no">&nbsp;</span>
1860
+ <span class="cline-any cline-no">&nbsp;</span>
1861
+ <span class="cline-any cline-no">&nbsp;</span>
1862
+ <span class="cline-any cline-no">&nbsp;</span>
1863
+ <span class="cline-any cline-no">&nbsp;</span>
1864
+ <span class="cline-any cline-no">&nbsp;</span>
1865
+ <span class="cline-any cline-no">&nbsp;</span>
1866
+ <span class="cline-any cline-no">&nbsp;</span>
1867
+ <span class="cline-any cline-no">&nbsp;</span>
1868
+ <span class="cline-any cline-no">&nbsp;</span>
1869
+ <span class="cline-any cline-no">&nbsp;</span>
1870
+ <span class="cline-any cline-no">&nbsp;</span>
1871
+ <span class="cline-any cline-no">&nbsp;</span>
1872
+ <span class="cline-any cline-no">&nbsp;</span>
1873
+ <span class="cline-any cline-no">&nbsp;</span>
1874
+ <span class="cline-any cline-no">&nbsp;</span>
1875
+ <span class="cline-any cline-no">&nbsp;</span>
1876
+ <span class="cline-any cline-no">&nbsp;</span>
1877
+ <span class="cline-any cline-no">&nbsp;</span>
1878
+ <span class="cline-any cline-no">&nbsp;</span>
1879
+ <span class="cline-any cline-no">&nbsp;</span>
1880
+ <span class="cline-any cline-no">&nbsp;</span>
1881
+ <span class="cline-any cline-no">&nbsp;</span>
1882
+ <span class="cline-any cline-no">&nbsp;</span>
1883
+ <span class="cline-any cline-no">&nbsp;</span>
1884
+ <span class="cline-any cline-no">&nbsp;</span>
1885
+ <span class="cline-any cline-no">&nbsp;</span>
1886
+ <span class="cline-any cline-no">&nbsp;</span>
1887
+ <span class="cline-any cline-no">&nbsp;</span>
1888
+ <span class="cline-any cline-no">&nbsp;</span>
1889
+ <span class="cline-any cline-no">&nbsp;</span>
1890
+ <span class="cline-any cline-no">&nbsp;</span>
1891
+ <span class="cline-any cline-no">&nbsp;</span>
1892
+ <span class="cline-any cline-no">&nbsp;</span>
1893
+ <span class="cline-any cline-no">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-no">&nbsp;</span>
1898
+ <span class="cline-any cline-no">&nbsp;</span>
1899
+ <span class="cline-any cline-no">&nbsp;</span>
1900
+ <span class="cline-any cline-no">&nbsp;</span>
1901
+ <span class="cline-any cline-no">&nbsp;</span>
1902
+ <span class="cline-any cline-no">&nbsp;</span>
1903
+ <span class="cline-any cline-no">&nbsp;</span>
1904
+ <span class="cline-any cline-no">&nbsp;</span>
1905
+ <span class="cline-any cline-no">&nbsp;</span>
1906
+ <span class="cline-any cline-no">&nbsp;</span>
1907
+ <span class="cline-any cline-no">&nbsp;</span>
1908
+ <span class="cline-any cline-no">&nbsp;</span>
1909
+ <span class="cline-any cline-no">&nbsp;</span>
1910
+ <span class="cline-any cline-no">&nbsp;</span>
1911
+ <span class="cline-any cline-no">&nbsp;</span>
1912
+ <span class="cline-any cline-no">&nbsp;</span>
1913
+ <span class="cline-any cline-no">&nbsp;</span>
1914
+ <span class="cline-any cline-no">&nbsp;</span>
1915
+ <span class="cline-any cline-no">&nbsp;</span>
1916
+ <span class="cline-any cline-no">&nbsp;</span>
1917
+ <span class="cline-any cline-no">&nbsp;</span>
1918
+ <span class="cline-any cline-no">&nbsp;</span>
1919
+ <span class="cline-any cline-no">&nbsp;</span>
1920
+ <span class="cline-any cline-no">&nbsp;</span>
1921
+ <span class="cline-any cline-no">&nbsp;</span>
1922
+ <span class="cline-any cline-no">&nbsp;</span>
1923
+ <span class="cline-any cline-no">&nbsp;</span>
1924
+ <span class="cline-any cline-no">&nbsp;</span>
1925
+ <span class="cline-any cline-no">&nbsp;</span>
1926
+ <span class="cline-any cline-no">&nbsp;</span>
1927
+ <span class="cline-any cline-no">&nbsp;</span>
1928
+ <span class="cline-any cline-no">&nbsp;</span>
1929
+ <span class="cline-any cline-no">&nbsp;</span>
1930
+ <span class="cline-any cline-no">&nbsp;</span>
1931
+ <span class="cline-any cline-no">&nbsp;</span>
1932
+ <span class="cline-any cline-no">&nbsp;</span>
1933
+ <span class="cline-any cline-no">&nbsp;</span>
1934
+ <span class="cline-any cline-no">&nbsp;</span>
1935
+ <span class="cline-any cline-no">&nbsp;</span>
1936
+ <span class="cline-any cline-no">&nbsp;</span>
1937
+ <span class="cline-any cline-no">&nbsp;</span>
1938
+ <span class="cline-any cline-no">&nbsp;</span>
1939
+ <span class="cline-any cline-no">&nbsp;</span>
1940
+ <span class="cline-any cline-no">&nbsp;</span>
1941
+ <span class="cline-any cline-no">&nbsp;</span>
1942
+ <span class="cline-any cline-no">&nbsp;</span>
1943
+ <span class="cline-any cline-no">&nbsp;</span>
1944
+ <span class="cline-any cline-no">&nbsp;</span>
1945
+ <span class="cline-any cline-no">&nbsp;</span>
1946
+ <span class="cline-any cline-no">&nbsp;</span>
1947
+ <span class="cline-any cline-no">&nbsp;</span>
1948
+ <span class="cline-any cline-no">&nbsp;</span>
1949
+ <span class="cline-any cline-no">&nbsp;</span>
1950
+ <span class="cline-any cline-no">&nbsp;</span>
1951
+ <span class="cline-any cline-no">&nbsp;</span>
1952
+ <span class="cline-any cline-no">&nbsp;</span>
1953
+ <span class="cline-any cline-no">&nbsp;</span>
1954
+ <span class="cline-any cline-no">&nbsp;</span>
1955
+ <span class="cline-any cline-no">&nbsp;</span>
1956
+ <span class="cline-any cline-no">&nbsp;</span>
1957
+ <span class="cline-any cline-no">&nbsp;</span>
1958
+ <span class="cline-any cline-no">&nbsp;</span>
1959
+ <span class="cline-any cline-no">&nbsp;</span>
1960
+ <span class="cline-any cline-no">&nbsp;</span>
1961
+ <span class="cline-any cline-no">&nbsp;</span>
1962
+ <span class="cline-any cline-no">&nbsp;</span>
1963
+ <span class="cline-any cline-no">&nbsp;</span>
1964
+ <span class="cline-any cline-no">&nbsp;</span>
1965
+ <span class="cline-any cline-no">&nbsp;</span>
1966
+ <span class="cline-any cline-no">&nbsp;</span>
1967
+ <span class="cline-any cline-no">&nbsp;</span>
1968
+ <span class="cline-any cline-no">&nbsp;</span>
1969
+ <span class="cline-any cline-no">&nbsp;</span>
1970
+ <span class="cline-any cline-no">&nbsp;</span>
1971
+ <span class="cline-any cline-no">&nbsp;</span>
1972
+ <span class="cline-any cline-no">&nbsp;</span>
1973
+ <span class="cline-any cline-no">&nbsp;</span>
1974
+ <span class="cline-any cline-no">&nbsp;</span>
1975
+ <span class="cline-any cline-no">&nbsp;</span>
1976
+ <span class="cline-any cline-no">&nbsp;</span>
1977
+ <span class="cline-any cline-no">&nbsp;</span>
1978
+ <span class="cline-any cline-no">&nbsp;</span>
1979
+ <span class="cline-any cline-no">&nbsp;</span>
1980
+ <span class="cline-any cline-no">&nbsp;</span>
1981
+ <span class="cline-any cline-no">&nbsp;</span>
1982
+ <span class="cline-any cline-no">&nbsp;</span>
1983
+ <span class="cline-any cline-no">&nbsp;</span>
1984
+ <span class="cline-any cline-no">&nbsp;</span>
1985
+ <span class="cline-any cline-no">&nbsp;</span>
1986
+ <span class="cline-any cline-no">&nbsp;</span>
1987
+ <span class="cline-any cline-no">&nbsp;</span>
1988
+ <span class="cline-any cline-no">&nbsp;</span>
1989
+ <span class="cline-any cline-no">&nbsp;</span>
1990
+ <span class="cline-any cline-no">&nbsp;</span>
1991
+ <span class="cline-any cline-no">&nbsp;</span>
1992
+ <span class="cline-any cline-no">&nbsp;</span>
1993
+ <span class="cline-any cline-no">&nbsp;</span>
1994
+ <span class="cline-any cline-no">&nbsp;</span>
1995
+ <span class="cline-any cline-no">&nbsp;</span>
1996
+ <span class="cline-any cline-no">&nbsp;</span>
1997
+ <span class="cline-any cline-no">&nbsp;</span>
1998
+ <span class="cline-any cline-no">&nbsp;</span>
1999
+ <span class="cline-any cline-no">&nbsp;</span>
2000
+ <span class="cline-any cline-yes">1x</span>
2001
+ <span class="cline-any cline-yes">1x</span>
2002
+ <span class="cline-any cline-yes">1x</span>
2003
+ <span class="cline-any cline-yes">1x</span>
2004
+ <span class="cline-any cline-no">&nbsp;</span>
2005
+ <span class="cline-any cline-no">&nbsp;</span>
2006
+ <span class="cline-any cline-no">&nbsp;</span>
2007
+ <span class="cline-any cline-no">&nbsp;</span>
2008
+ <span class="cline-any cline-no">&nbsp;</span>
2009
+ <span class="cline-any cline-no">&nbsp;</span>
2010
+ <span class="cline-any cline-no">&nbsp;</span>
2011
+ <span class="cline-any cline-no">&nbsp;</span>
2012
+ <span class="cline-any cline-no">&nbsp;</span>
2013
+ <span class="cline-any cline-no">&nbsp;</span>
2014
+ <span class="cline-any cline-no">&nbsp;</span>
2015
+ <span class="cline-any cline-no">&nbsp;</span>
2016
+ <span class="cline-any cline-no">&nbsp;</span>
2017
+ <span class="cline-any cline-no">&nbsp;</span>
2018
+ <span class="cline-any cline-no">&nbsp;</span>
2019
+ <span class="cline-any cline-no">&nbsp;</span>
2020
+ <span class="cline-any cline-no">&nbsp;</span>
2021
+ <span class="cline-any cline-no">&nbsp;</span>
2022
+ <span class="cline-any cline-no">&nbsp;</span>
2023
+ <span class="cline-any cline-no">&nbsp;</span>
2024
+ <span class="cline-any cline-no">&nbsp;</span>
2025
+ <span class="cline-any cline-no">&nbsp;</span>
2026
+ <span class="cline-any cline-no">&nbsp;</span>
2027
+ <span class="cline-any cline-no">&nbsp;</span>
2028
+ <span class="cline-any cline-no">&nbsp;</span>
2029
+ <span class="cline-any cline-no">&nbsp;</span>
2030
+ <span class="cline-any cline-no">&nbsp;</span>
2031
+ <span class="cline-any cline-no">&nbsp;</span>
2032
+ <span class="cline-any cline-no">&nbsp;</span>
2033
+ <span class="cline-any cline-no">&nbsp;</span>
2034
+ <span class="cline-any cline-no">&nbsp;</span>
2035
+ <span class="cline-any cline-no">&nbsp;</span>
2036
+ <span class="cline-any cline-no">&nbsp;</span>
2037
+ <span class="cline-any cline-no">&nbsp;</span>
2038
+ <span class="cline-any cline-no">&nbsp;</span>
2039
+ <span class="cline-any cline-no">&nbsp;</span>
2040
+ <span class="cline-any cline-no">&nbsp;</span>
2041
+ <span class="cline-any cline-no">&nbsp;</span>
2042
+ <span class="cline-any cline-no">&nbsp;</span>
2043
+ <span class="cline-any cline-no">&nbsp;</span>
2044
+ <span class="cline-any cline-no">&nbsp;</span>
2045
+ <span class="cline-any cline-no">&nbsp;</span>
2046
+ <span class="cline-any cline-no">&nbsp;</span>
2047
+ <span class="cline-any cline-no">&nbsp;</span>
2048
+ <span class="cline-any cline-no">&nbsp;</span>
2049
+ <span class="cline-any cline-no">&nbsp;</span>
2050
+ <span class="cline-any cline-no">&nbsp;</span>
2051
+ <span class="cline-any cline-no">&nbsp;</span>
2052
+ <span class="cline-any cline-no">&nbsp;</span>
2053
+ <span class="cline-any cline-no">&nbsp;</span>
2054
+ <span class="cline-any cline-no">&nbsp;</span>
2055
+ <span class="cline-any cline-no">&nbsp;</span>
2056
+ <span class="cline-any cline-no">&nbsp;</span>
2057
+ <span class="cline-any cline-no">&nbsp;</span>
2058
+ <span class="cline-any cline-no">&nbsp;</span>
2059
+ <span class="cline-any cline-no">&nbsp;</span>
2060
+ <span class="cline-any cline-no">&nbsp;</span>
2061
+ <span class="cline-any cline-no">&nbsp;</span>
2062
+ <span class="cline-any cline-no">&nbsp;</span>
2063
+ <span class="cline-any cline-no">&nbsp;</span>
2064
+ <span class="cline-any cline-no">&nbsp;</span>
2065
+ <span class="cline-any cline-no">&nbsp;</span>
2066
+ <span class="cline-any cline-no">&nbsp;</span>
2067
+ <span class="cline-any cline-no">&nbsp;</span>
2068
+ <span class="cline-any cline-no">&nbsp;</span>
2069
+ <span class="cline-any cline-no">&nbsp;</span>
2070
+ <span class="cline-any cline-no">&nbsp;</span>
2071
+ <span class="cline-any cline-no">&nbsp;</span>
2072
+ <span class="cline-any cline-no">&nbsp;</span>
2073
+ <span class="cline-any cline-no">&nbsp;</span>
2074
+ <span class="cline-any cline-no">&nbsp;</span>
2075
+ <span class="cline-any cline-no">&nbsp;</span>
2076
+ <span class="cline-any cline-no">&nbsp;</span>
2077
+ <span class="cline-any cline-no">&nbsp;</span>
2078
+ <span class="cline-any cline-no">&nbsp;</span>
2079
+ <span class="cline-any cline-no">&nbsp;</span>
2080
+ <span class="cline-any cline-no">&nbsp;</span>
2081
+ <span class="cline-any cline-no">&nbsp;</span>
2082
+ <span class="cline-any cline-no">&nbsp;</span>
2083
+ <span class="cline-any cline-no">&nbsp;</span>
2084
+ <span class="cline-any cline-no">&nbsp;</span>
2085
+ <span class="cline-any cline-no">&nbsp;</span>
2086
+ <span class="cline-any cline-yes">1x</span>
2087
+ <span class="cline-any cline-yes">1x</span>
2088
+ <span class="cline-any cline-yes">1x</span>
2089
+ <span class="cline-any cline-yes">1x</span>
2090
+ <span class="cline-any cline-no">&nbsp;</span>
2091
+ <span class="cline-any cline-no">&nbsp;</span>
2092
+ <span class="cline-any cline-no">&nbsp;</span>
2093
+ <span class="cline-any cline-no">&nbsp;</span>
2094
+ <span class="cline-any cline-no">&nbsp;</span>
2095
+ <span class="cline-any cline-no">&nbsp;</span>
2096
+ <span class="cline-any cline-no">&nbsp;</span>
2097
+ <span class="cline-any cline-no">&nbsp;</span>
2098
+ <span class="cline-any cline-no">&nbsp;</span>
2099
+ <span class="cline-any cline-no">&nbsp;</span>
2100
+ <span class="cline-any cline-no">&nbsp;</span>
2101
+ <span class="cline-any cline-no">&nbsp;</span>
2102
+ <span class="cline-any cline-no">&nbsp;</span>
2103
+ <span class="cline-any cline-no">&nbsp;</span>
2104
+ <span class="cline-any cline-no">&nbsp;</span>
2105
+ <span class="cline-any cline-no">&nbsp;</span>
2106
+ <span class="cline-any cline-no">&nbsp;</span>
2107
+ <span class="cline-any cline-no">&nbsp;</span>
2108
+ <span class="cline-any cline-no">&nbsp;</span>
2109
+ <span class="cline-any cline-no">&nbsp;</span>
2110
+ <span class="cline-any cline-no">&nbsp;</span>
2111
+ <span class="cline-any cline-no">&nbsp;</span>
2112
+ <span class="cline-any cline-no">&nbsp;</span>
2113
+ <span class="cline-any cline-no">&nbsp;</span>
2114
+ <span class="cline-any cline-no">&nbsp;</span>
2115
+ <span class="cline-any cline-no">&nbsp;</span>
2116
+ <span class="cline-any cline-yes">1x</span>
2117
+ <span class="cline-any cline-yes">1x</span>
2118
+ <span class="cline-any cline-yes">1x</span>
2119
+ <span class="cline-any cline-yes">1x</span>
2120
+ <span class="cline-any cline-yes">1x</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">1x</span>
2124
+ <span class="cline-any cline-yes">1x</span>
2125
+ <span class="cline-any cline-yes">1x</span>
2126
+ <span class="cline-any cline-yes">1x</span>
2127
+ <span class="cline-any cline-yes">1x</span>
2128
+ <span class="cline-any cline-yes">1x</span>
2129
+ <span class="cline-any cline-yes">1x</span>
2130
+ <span class="cline-any cline-yes">1x</span>
2131
+ <span class="cline-any cline-yes">1x</span>
2132
+ <span class="cline-any cline-yes">1x</span>
2133
+ <span class="cline-any cline-yes">1x</span>
2134
+ <span class="cline-any cline-yes">1x</span>
2135
+ <span class="cline-any cline-yes">1x</span>
2136
+ <span class="cline-any cline-yes">1x</span>
2137
+ <span class="cline-any cline-yes">1x</span>
2138
+ <span class="cline-any cline-yes">1x</span>
2139
+ <span class="cline-any cline-yes">1x</span>
2140
+ <span class="cline-any cline-yes">1x</span>
2141
+ <span class="cline-any cline-yes">1x</span>
2142
+ <span class="cline-any cline-yes">1x</span>
2143
+ <span class="cline-any cline-yes">1x</span>
2144
+ <span class="cline-any cline-yes">1x</span>
2145
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
2149
+ <span class="cline-any cline-yes">1x</span>
2150
+ <span class="cline-any cline-yes">1x</span>
2151
+ <span class="cline-any cline-yes">1x</span>
2152
+ <span class="cline-any cline-yes">1x</span>
2153
+ <span class="cline-any cline-yes">1x</span>
2154
+ <span class="cline-any cline-yes">1x</span>
2155
+ <span class="cline-any cline-yes">1x</span>
2156
+ <span class="cline-any cline-yes">1x</span>
2157
+ <span class="cline-any cline-yes">1x</span>
2158
+ <span class="cline-any cline-yes">1x</span>
2159
+ <span class="cline-any cline-yes">1x</span>
2160
+ <span class="cline-any cline-yes">1x</span>
2161
+ <span class="cline-any cline-yes">1x</span>
2162
+ <span class="cline-any cline-yes">1x</span>
2163
+ <span class="cline-any cline-yes">1x</span>
2164
+ <span class="cline-any cline-yes">1x</span>
2165
+ <span class="cline-any cline-no">&nbsp;</span>
2166
+ <span class="cline-any cline-no">&nbsp;</span>
2167
+ <span class="cline-any cline-no">&nbsp;</span>
2168
+ <span class="cline-any cline-no">&nbsp;</span>
2169
+ <span class="cline-any cline-no">&nbsp;</span>
2170
+ <span class="cline-any cline-no">&nbsp;</span>
2171
+ <span class="cline-any cline-no">&nbsp;</span>
2172
+ <span class="cline-any cline-no">&nbsp;</span>
2173
+ <span class="cline-any cline-no">&nbsp;</span>
2174
+ <span class="cline-any cline-no">&nbsp;</span>
2175
+ <span class="cline-any cline-no">&nbsp;</span>
2176
+ <span class="cline-any cline-no">&nbsp;</span>
2177
+ <span class="cline-any cline-no">&nbsp;</span>
2178
+ <span class="cline-any cline-no">&nbsp;</span>
2179
+ <span class="cline-any cline-no">&nbsp;</span>
2180
+ <span class="cline-any cline-no">&nbsp;</span>
2181
+ <span class="cline-any cline-no">&nbsp;</span>
2182
+ <span class="cline-any cline-no">&nbsp;</span>
2183
+ <span class="cline-any cline-no">&nbsp;</span>
2184
+ <span class="cline-any cline-no">&nbsp;</span>
2185
+ <span class="cline-any cline-no">&nbsp;</span>
2186
+ <span class="cline-any cline-no">&nbsp;</span>
2187
+ <span class="cline-any cline-no">&nbsp;</span>
2188
+ <span class="cline-any cline-no">&nbsp;</span>
2189
+ <span class="cline-any cline-no">&nbsp;</span>
2190
+ <span class="cline-any cline-no">&nbsp;</span>
2191
+ <span class="cline-any cline-no">&nbsp;</span>
2192
+ <span class="cline-any cline-no">&nbsp;</span>
2193
+ <span class="cline-any cline-no">&nbsp;</span>
2194
+ <span class="cline-any cline-no">&nbsp;</span>
2195
+ <span class="cline-any cline-no">&nbsp;</span>
2196
+ <span class="cline-any cline-no">&nbsp;</span>
2197
+ <span class="cline-any cline-no">&nbsp;</span>
2198
+ <span class="cline-any cline-no">&nbsp;</span>
2199
+ <span class="cline-any cline-no">&nbsp;</span>
2200
+ <span class="cline-any cline-no">&nbsp;</span>
2201
+ <span class="cline-any cline-no">&nbsp;</span>
2202
+ <span class="cline-any cline-no">&nbsp;</span>
2203
+ <span class="cline-any cline-no">&nbsp;</span>
2204
+ <span class="cline-any cline-no">&nbsp;</span>
2205
+ <span class="cline-any cline-no">&nbsp;</span>
2206
+ <span class="cline-any cline-no">&nbsp;</span>
2207
+ <span class="cline-any cline-no">&nbsp;</span>
2208
+ <span class="cline-any cline-no">&nbsp;</span>
2209
+ <span class="cline-any cline-no">&nbsp;</span>
2210
+ <span class="cline-any cline-yes">1x</span>
2211
+ <span class="cline-any cline-yes">1x</span>
2212
+ <span class="cline-any cline-yes">1x</span>
2213
+ <span class="cline-any cline-yes">1x</span>
2214
+ <span class="cline-any cline-yes">1x</span>
2215
+ <span class="cline-any cline-yes">1x</span>
2216
+ <span class="cline-any cline-yes">1x</span>
2217
+ <span class="cline-any cline-yes">1x</span>
2218
+ <span class="cline-any cline-no">&nbsp;</span>
2219
+ <span class="cline-any cline-no">&nbsp;</span>
2220
+ <span class="cline-any cline-no">&nbsp;</span>
2221
+ <span class="cline-any cline-no">&nbsp;</span>
2222
+ <span class="cline-any cline-no">&nbsp;</span>
2223
+ <span class="cline-any cline-no">&nbsp;</span>
2224
+ <span class="cline-any cline-no">&nbsp;</span>
2225
+ <span class="cline-any cline-no">&nbsp;</span>
2226
+ <span class="cline-any cline-no">&nbsp;</span>
2227
+ <span class="cline-any cline-no">&nbsp;</span>
2228
+ <span class="cline-any cline-no">&nbsp;</span>
2229
+ <span class="cline-any cline-no">&nbsp;</span>
2230
+ <span class="cline-any cline-no">&nbsp;</span>
2231
+ <span class="cline-any cline-no">&nbsp;</span>
2232
+ <span class="cline-any cline-yes">1x</span>
2233
+ <span class="cline-any cline-yes">1x</span>
2234
+ <span class="cline-any cline-yes">1x</span>
2235
+ <span class="cline-any cline-no">&nbsp;</span>
2236
+ <span class="cline-any cline-yes">1x</span>
2237
+ <span class="cline-any cline-yes">1x</span>
2238
+ <span class="cline-any cline-yes">1x</span>
2239
+ <span class="cline-any cline-yes">1x</span>
2240
+ <span class="cline-any cline-yes">1x</span>
2241
+ <span class="cline-any cline-yes">1x</span>
2242
+ <span class="cline-any cline-yes">1x</span>
2243
+ <span class="cline-any cline-yes">1x</span>
2244
+ <span class="cline-any cline-yes">1x</span>
2245
+ <span class="cline-any cline-yes">1x</span>
2246
+ <span class="cline-any cline-yes">1x</span>
2247
+ <span class="cline-any cline-no">&nbsp;</span>
2248
+ <span class="cline-any cline-no">&nbsp;</span>
2249
+ <span class="cline-any cline-no">&nbsp;</span>
2250
+ <span class="cline-any cline-no">&nbsp;</span>
2251
+ <span class="cline-any cline-no">&nbsp;</span>
2252
+ <span class="cline-any cline-no">&nbsp;</span>
2253
+ <span class="cline-any cline-no">&nbsp;</span>
2254
+ <span class="cline-any cline-no">&nbsp;</span>
2255
+ <span class="cline-any cline-yes">1x</span>
2256
+ <span class="cline-any cline-no">&nbsp;</span>
2257
+ <span class="cline-any cline-no">&nbsp;</span>
2258
+ <span class="cline-any cline-yes">1x</span>
2259
+ <span class="cline-any cline-yes">1x</span>
2260
+ <span class="cline-any cline-no">&nbsp;</span>
2261
+ <span class="cline-any cline-no">&nbsp;</span>
2262
+ <span class="cline-any cline-no">&nbsp;</span>
2263
+ <span class="cline-any cline-no">&nbsp;</span>
2264
+ <span class="cline-any cline-no">&nbsp;</span>
2265
+ <span class="cline-any cline-no">&nbsp;</span>
2266
+ <span class="cline-any cline-no">&nbsp;</span>
2267
+ <span class="cline-any cline-no">&nbsp;</span>
2268
+ <span class="cline-any cline-no">&nbsp;</span>
2269
+ <span class="cline-any cline-no">&nbsp;</span>
2270
+ <span class="cline-any cline-no">&nbsp;</span>
2271
+ <span class="cline-any cline-yes">1x</span>
2272
+ <span class="cline-any cline-yes">1x</span>
2273
+ <span class="cline-any cline-yes">1x</span>
2274
+ <span class="cline-any cline-yes">1x</span>
2275
+ <span class="cline-any cline-yes">1x</span>
2276
+ <span class="cline-any cline-yes">1x</span>
2277
+ <span class="cline-any cline-yes">1x</span>
2278
+ <span class="cline-any cline-yes">1x</span>
2279
+ <span class="cline-any cline-yes">1x</span>
2280
+ <span class="cline-any cline-yes">1x</span>
2281
+ <span class="cline-any cline-yes">1x</span>
2282
+ <span class="cline-any cline-yes">1x</span>
2283
+ <span class="cline-any cline-yes">1x</span>
2284
+ <span class="cline-any cline-yes">1x</span>
2285
+ <span class="cline-any cline-yes">1x</span>
2286
+ <span class="cline-any cline-yes">1x</span>
2287
+ <span class="cline-any cline-yes">1x</span>
2288
+ <span class="cline-any cline-yes">1x</span>
2289
+ <span class="cline-any cline-yes">1x</span>
2290
+ <span class="cline-any cline-yes">1x</span>
2291
+ <span class="cline-any cline-yes">1x</span>
2292
+ <span class="cline-any cline-yes">1x</span>
2293
+ <span class="cline-any cline-yes">1x</span>
2294
+ <span class="cline-any cline-yes">1x</span>
2295
+ <span class="cline-any cline-yes">1x</span>
2296
+ <span class="cline-any cline-yes">1x</span>
2297
+ <span class="cline-any cline-yes">1x</span>
2298
+ <span class="cline-any cline-yes">1x</span>
2299
+ <span class="cline-any cline-yes">1x</span>
2300
+ <span class="cline-any cline-yes">1x</span>
2301
+ <span class="cline-any cline-yes">1x</span>
2302
+ <span class="cline-any cline-no">&nbsp;</span>
2303
+ <span class="cline-any cline-no">&nbsp;</span>
2304
+ <span class="cline-any cline-no">&nbsp;</span>
2305
+ <span class="cline-any cline-no">&nbsp;</span>
2306
+ <span class="cline-any cline-no">&nbsp;</span>
2307
+ <span class="cline-any cline-yes">1x</span>
2308
+ <span class="cline-any cline-yes">1x</span>
2309
+ <span class="cline-any cline-yes">1x</span>
2310
+ <span class="cline-any cline-yes">1x</span>
2311
+ <span class="cline-any cline-yes">1x</span>
2312
+ <span class="cline-any cline-yes">1x</span>
2313
+ <span class="cline-any cline-yes">1x</span>
2314
+ <span class="cline-any cline-yes">1x</span>
2315
+ <span class="cline-any cline-yes">1x</span>
2316
+ <span class="cline-any cline-yes">1x</span>
2317
+ <span class="cline-any cline-yes">1x</span>
2318
+ <span class="cline-any cline-no">&nbsp;</span>
2319
+ <span class="cline-any cline-no">&nbsp;</span>
2320
+ <span class="cline-any cline-no">&nbsp;</span>
2321
+ <span class="cline-any cline-no">&nbsp;</span>
2322
+ <span class="cline-any cline-no">&nbsp;</span>
2323
+ <span class="cline-any cline-yes">1x</span>
2324
+ <span class="cline-any cline-yes">1x</span>
2325
+ <span class="cline-any cline-yes">1x</span>
2326
+ <span class="cline-any cline-yes">1x</span>
2327
+ <span class="cline-any cline-yes">1x</span>
2328
+ <span class="cline-any cline-yes">1x</span>
2329
+ <span class="cline-any cline-yes">1x</span>
2330
+ <span class="cline-any cline-yes">1x</span>
2331
+ <span class="cline-any cline-yes">1x</span>
2332
+ <span class="cline-any cline-yes">1x</span>
2333
+ <span class="cline-any cline-yes">1x</span>
2334
+ <span class="cline-any cline-no">&nbsp;</span>
2335
+ <span class="cline-any cline-no">&nbsp;</span>
2336
+ <span class="cline-any cline-no">&nbsp;</span>
2337
+ <span class="cline-any cline-no">&nbsp;</span>
2338
+ <span class="cline-any cline-no">&nbsp;</span>
2339
+ <span class="cline-any cline-yes">1x</span>
2340
+ <span class="cline-any cline-no">&nbsp;</span>
2341
+ <span class="cline-any cline-no">&nbsp;</span>
2342
+ <span class="cline-any cline-no">&nbsp;</span>
2343
+ <span class="cline-any cline-no">&nbsp;</span>
2344
+ <span class="cline-any cline-no">&nbsp;</span>
2345
+ <span class="cline-any cline-yes">1x</span>
2346
+ <span class="cline-any cline-yes">1x</span>
2347
+ <span class="cline-any cline-yes">1x</span>
2348
+ <span class="cline-any cline-yes">1x</span>
2349
+ <span class="cline-any cline-no">&nbsp;</span>
2350
+ <span class="cline-any cline-no">&nbsp;</span>
2351
+ <span class="cline-any cline-no">&nbsp;</span>
2352
+ <span class="cline-any cline-no">&nbsp;</span>
2353
+ <span class="cline-any cline-no">&nbsp;</span>
2354
+ <span class="cline-any cline-no">&nbsp;</span>
2355
+ <span class="cline-any cline-no">&nbsp;</span>
2356
+ <span class="cline-any cline-no">&nbsp;</span>
2357
+ <span class="cline-any cline-no">&nbsp;</span>
2358
+ <span class="cline-any cline-no">&nbsp;</span>
2359
+ <span class="cline-any cline-no">&nbsp;</span>
2360
+ <span class="cline-any cline-no">&nbsp;</span>
2361
+ <span class="cline-any cline-no">&nbsp;</span>
2362
+ <span class="cline-any cline-no">&nbsp;</span>
2363
+ <span class="cline-any cline-no">&nbsp;</span>
2364
+ <span class="cline-any cline-no">&nbsp;</span>
2365
+ <span class="cline-any cline-no">&nbsp;</span>
2366
+ <span class="cline-any cline-no">&nbsp;</span>
2367
+ <span class="cline-any cline-no">&nbsp;</span>
2368
+ <span class="cline-any cline-no">&nbsp;</span>
2369
+ <span class="cline-any cline-no">&nbsp;</span>
2370
+ <span class="cline-any cline-no">&nbsp;</span>
2371
+ <span class="cline-any cline-no">&nbsp;</span>
2372
+ <span class="cline-any cline-yes">1x</span>
2373
+ <span class="cline-any cline-yes">1x</span>
2374
+ <span class="cline-any cline-yes">1x</span>
2375
+ <span class="cline-any cline-yes">1x</span>
2376
+ <span class="cline-any cline-yes">1x</span>
2377
+ <span class="cline-any cline-yes">1x</span>
2378
+ <span class="cline-any cline-yes">1x</span>
2379
+ <span class="cline-any cline-yes">1x</span>
2380
+ <span class="cline-any cline-yes">1x</span>
2381
+ <span class="cline-any cline-yes">1x</span>
2382
+ <span class="cline-any cline-yes">1x</span>
2383
+ <span class="cline-any cline-no">&nbsp;</span>
2384
+ <span class="cline-any cline-no">&nbsp;</span>
2385
+ <span class="cline-any cline-no">&nbsp;</span>
2386
+ <span class="cline-any cline-no">&nbsp;</span>
2387
+ <span class="cline-any cline-yes">1x</span>
2388
+ <span class="cline-any cline-yes">1x</span>
2389
+ <span class="cline-any cline-yes">1x</span>
2390
+ <span class="cline-any cline-yes">1x</span>
2391
+ <span class="cline-any cline-yes">1x</span>
2392
+ <span class="cline-any cline-no">&nbsp;</span>
2393
+ <span class="cline-any cline-no">&nbsp;</span>
2394
+ <span class="cline-any cline-no">&nbsp;</span>
2395
+ <span class="cline-any cline-no">&nbsp;</span>
2396
+ <span class="cline-any cline-no">&nbsp;</span>
2397
+ <span class="cline-any cline-no">&nbsp;</span>
2398
+ <span class="cline-any cline-no">&nbsp;</span>
2399
+ <span class="cline-any cline-no">&nbsp;</span>
2400
+ <span class="cline-any cline-no">&nbsp;</span>
2401
+ <span class="cline-any cline-no">&nbsp;</span>
2402
+ <span class="cline-any cline-yes">1x</span>
2403
+ <span class="cline-any cline-yes">1x</span>
2404
+ <span class="cline-any cline-yes">1x</span>
2405
+ <span class="cline-any cline-yes">1x</span>
2406
+ <span class="cline-any cline-yes">1x</span>
2407
+ <span class="cline-any cline-yes">1x</span>
2408
+ <span class="cline-any cline-yes">1x</span>
2409
+ <span class="cline-any cline-yes">1x</span>
2410
+ <span class="cline-any cline-yes">1x</span>
2411
+ <span class="cline-any cline-yes">1x</span>
2412
+ <span class="cline-any cline-yes">1x</span>
2413
+ <span class="cline-any cline-yes">1x</span>
2414
+ <span class="cline-any cline-yes">1x</span>
2415
+ <span class="cline-any cline-yes">1x</span>
2416
+ <span class="cline-any cline-yes">1x</span>
2417
+ <span class="cline-any cline-yes">1x</span>
2418
+ <span class="cline-any cline-yes">1x</span>
2419
+ <span class="cline-any cline-yes">1x</span>
2420
+ <span class="cline-any cline-yes">1x</span>
2421
+ <span class="cline-any cline-yes">1x</span>
2422
+ <span class="cline-any cline-yes">1x</span>
2423
+ <span class="cline-any cline-yes">1x</span>
2424
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">#!/usr/bin/env node
2425
+ /**
2426
+ * A2A Server
2427
+ *
2428
+ * Routes A2A calls through a runtime adapter (OpenClaw or Claude).
2429
+ * Auto-adds contacts, generates summaries, notifies owner.
2430
+ */
2431
+ &nbsp;
2432
+ const express = require('express');
2433
+ const fs = require('fs');
2434
+ const path = require('path');
2435
+ const { createRoutes } = require('./routes/a2a');
2436
+ const { createDashboardApiRouter, createDashboardUiRouter } = require('./routes/dashboard');
2437
+ const { createCallbookRouter } = require('./routes/callbook');
2438
+ const { TokenStore } = require('./lib/tokens');
2439
+ const { createRuntimeAdapter } = require('./lib/runtime-adapter');
2440
+ const { getTopicsForTier, formatTopicsForPrompt, loadManifest } = require('./lib/disclosure');
2441
+ const {
2442
+ buildConnectionPrompt,
2443
+ buildAdaptiveConnectionPrompt,
2444
+ extractCollaborationState
2445
+ } = require('./lib/prompt-template');
2446
+ const { findAvailablePort } = require('./lib/port-scanner');
2447
+ const { createLogger, closeAllLoggerStores, pruneAllLoggerStores } = require('./lib/logger');
2448
+ const { writePidFile, removePidFile } = require('./lib/pid-file');
2449
+ const { buildUnifiedSummaryPrompt } = require('./lib/summary-prompt');
2450
+ const { A2AConfig } = require('./lib/config');
2451
+ const { UpdateManager } = require('./lib/update-manager');
2452
+ const { DashboardEventStore } = require('./lib/dashboard-events');
2453
+ const { CallbookStore } = require('./lib/callbook');
2454
+ const { buildAgentCard } = require('./lib/agent-card');
2455
+ const { spawn } = require('child_process');
2456
+ const { resolveTurnTimeoutMs } = require('./lib/turn-timeout');
2457
+ &nbsp;
2458
+ const DEFAULT_PORTS = [80, 3001, 8080, 8443, 9001];
2459
+ const requestedPort = process.env.PORT ? parseInt(process.env.PORT, 10)
2460
+ <span class="branch-0 cbranch-no" title="branch not covered" > : process.argv[2] ? parseInt(process.argv[2], 10)</span>
2461
+ : null;
2462
+ const workspaceDir = process.env.A2A_WORKSPACE || process.env.OPENCLAW_WORKSPACE || process.cwd();
2463
+ const logger = createLogger({ component: 'a2a.server' });
2464
+ &nbsp;
2465
+ // Load workspace context for agent identity
2466
+ function loadAgentContext() {
2467
+ let context = {
2468
+ name: process.env.A2A_AGENT_NAME || process.env.AGENT_NAME || 'a2a-agent',
2469
+ owner: process.env.A2A_OWNER_NAME || process.env.USER || 'Agent Owner'
2470
+ };
2471
+
2472
+ try {
2473
+ const userPath = path.join(workspaceDir, 'USER.md');
2474
+ if (fs.existsSync(userPath)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2475
+ <span class="cstat-no" title="statement not covered" > const content = fs.readFileSync(userPath, 'utf8');</span>
2476
+ <span class="cstat-no" title="statement not covered" > const agentMatch = content.match(/\*\*Agent:\*\*\s*([^\n]+)/i);</span>
2477
+ <span class="cstat-no" title="statement not covered" > if (agentMatch &amp;&amp; agentMatch[1]) {</span>
2478
+ <span class="cstat-no" title="statement not covered" > context.name = agentMatch[1].trim().slice(0, 80) || context.name;</span>
2479
+ <span class="cstat-no" title="statement not covered" > }</span>
2480
+ <span class="cstat-no" title="statement not covered" > const nameMatch = content.match(/\*\*Name:\*\*\s*([^\n]+)/);</span>
2481
+ <span class="cstat-no" title="statement not covered" > if (nameMatch) {</span>
2482
+ <span class="cstat-no" title="statement not covered" > const name = nameMatch[1].trim();</span>
2483
+ <span class="cstat-no" title="statement not covered" > if (name &amp;&amp; !name.includes('_') &amp;&amp; !name.includes('(')) {</span>
2484
+ <span class="cstat-no" title="statement not covered" > context.owner = name;</span>
2485
+ <span class="cstat-no" title="statement not covered" > }</span>
2486
+ <span class="cstat-no" title="statement not covered" > }</span>
2487
+ <span class="cstat-no" title="statement not covered" > }</span>
2488
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (e) {}</span>
2489
+
2490
+ return context;
2491
+ }
2492
+ &nbsp;
2493
+ const agentContext = loadAgentContext();
2494
+ const tokenStore = new TokenStore();
2495
+ const config = new A2AConfig();
2496
+ const eventStore = new DashboardEventStore(tokenStore.configDir);
2497
+ // A2A-59: Hoist CallbookStore to server.js so shutdown() can close it
2498
+ const callbookStore = new CallbookStore(tokenStore.configDir);
2499
+ const runtime = createRuntimeAdapter({
2500
+ workspaceDir,
2501
+ agentContext,
2502
+ logger: logger.child({ component: 'a2a.runtime' })
2503
+ });
2504
+ // Lazy-load conversation store for collab state persistence
2505
+ let ConversationStore = null;
2506
+ let serverConvStore = null;
2507
+ function getServerConvStore() {
2508
+ if (serverConvStore === false) <span class="branch-0 cbranch-no" title="branch not covered" >return null;</span>
2509
+ if (!serverConvStore) {
2510
+ try {
2511
+ ConversationStore = require('./lib/conversations').ConversationStore;
2512
+ serverConvStore = new ConversationStore();
2513
+ if (!serverConvStore.isAvailable()) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2514
+ <span class="cstat-no" title="statement not covered" > serverConvStore = false;</span>
2515
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2516
+ <span class="cstat-no" title="statement not covered" > }</span>
2517
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
2518
+ <span class="cstat-no" title="statement not covered" > serverConvStore = false;</span>
2519
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2520
+ <span class="cstat-no" title="statement not covered" > }</span>
2521
+ }
2522
+ return serverConvStore;
2523
+ }
2524
+ &nbsp;
2525
+ const VALID_PHASES = new Set(['handshake', 'explore', 'deep_dive', 'synthesize', 'close']);
2526
+ const collaborationSessions = new Map();
2527
+ const COLLAB_STATE_TTL_MS = readPositiveIntEnv('A2A_COLLAB_STATE_TTL_MS', 6 * 60 * 60 * 1000);
2528
+ const MAX_COLLAB_SESSIONS = readPositiveIntEnv('A2A_COLLAB_MAX_SESSIONS', 500);
2529
+ &nbsp;
2530
+ logger.info('A2A server bootstrapping', {
2531
+ event: 'server_bootstrap',
2532
+ data: {
2533
+ agent_name: agentContext.name,
2534
+ owner_name: agentContext.owner,
2535
+ runtime_mode: runtime.mode,
2536
+ runtime_reason: runtime.reason
2537
+ }
2538
+ });
2539
+ if (runtime.warning) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2540
+ <span class="cstat-no" title="statement not covered" > logger.warn('Runtime warning', {</span>
2541
+ <span class="cstat-no" title="statement not covered" > event: 'runtime_warning',</span>
2542
+ <span class="cstat-no" title="statement not covered" > data: {</span>
2543
+ <span class="cstat-no" title="statement not covered" > warning: runtime.warning</span>
2544
+ <span class="cstat-no" title="statement not covered" > }</span>
2545
+ <span class="cstat-no" title="statement not covered" > });</span>
2546
+ <span class="cstat-no" title="statement not covered" >}</span>
2547
+ &nbsp;
2548
+ function readPositiveIntEnv(name, fallback) {
2549
+ const parsed = Number.parseInt(process.env[name] || '', 10);
2550
+ return Number.isFinite(parsed) <span class="branch-0 cbranch-no" title="branch not covered" >&amp;&amp; parsed &gt; 0 <span class="branch-0 cbranch-no" title="branch not covered" ></span>? parsed </span>: fallback;
2551
+ }
2552
+ &nbsp;
2553
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function resolveConfiguredTurnTimeoutMs() {</span></span>
2554
+ <span class="cstat-no" title="statement not covered" > try {</span>
2555
+ <span class="cstat-no" title="statement not covered" > const defaults = config.getDefaults?.() || {};</span>
2556
+ <span class="cstat-no" title="statement not covered" > return defaults.turnTimeoutMs ?? defaults.turn_timeout_ms ?? null;</span>
2557
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
2558
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2559
+ <span class="cstat-no" title="statement not covered" > }</span>
2560
+ <span class="cstat-no" title="statement not covered" >}</span>
2561
+ &nbsp;
2562
+ function resolveCollabMode() {
2563
+ const raw = String(process.env.A2A_COLLAB_MODE || 'adaptive').trim().toLowerCase();
2564
+ if (raw === 'deep_dive' || raw === 'deep-dive') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
2565
+ <span class="cstat-no" title="statement not covered" > return 'deep_dive';</span>
2566
+ <span class="cstat-no" title="statement not covered" > }</span>
2567
+ return 'adaptive';
2568
+ }
2569
+ &nbsp;
2570
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function cleanText(value, maxLength = 160) {</span></span>
2571
+ <span class="cstat-no" title="statement not covered" > return String(value || '')</span>
2572
+ <span class="cstat-no" title="statement not covered" > .replace(/\s+/g, ' ')</span>
2573
+ <span class="cstat-no" title="statement not covered" > .trim()</span>
2574
+ <span class="cstat-no" title="statement not covered" > .slice(0, maxLength);</span>
2575
+ <span class="cstat-no" title="statement not covered" >}</span>
2576
+ &nbsp;
2577
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function clampNumber(value, min, max, fallback) {</span></span>
2578
+ <span class="cstat-no" title="statement not covered" > const parsed = Number(value);</span>
2579
+ <span class="cstat-no" title="statement not covered" > if (!Number.isFinite(parsed)) {</span>
2580
+ <span class="cstat-no" title="statement not covered" > return fallback;</span>
2581
+ <span class="cstat-no" title="statement not covered" > }</span>
2582
+ <span class="cstat-no" title="statement not covered" > return Math.max(min, Math.min(max, parsed));</span>
2583
+ <span class="cstat-no" title="statement not covered" >}</span>
2584
+ &nbsp;
2585
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function sanitizeList(values, maxItems = 4, itemMaxLength = 160) {</span></span>
2586
+ <span class="cstat-no" title="statement not covered" > if (!Array.isArray(values)) {</span>
2587
+ <span class="cstat-no" title="statement not covered" > return [];</span>
2588
+ <span class="cstat-no" title="statement not covered" > }</span>
2589
+ <span class="cstat-no" title="statement not covered" > const out = [];</span>
2590
+ <span class="cstat-no" title="statement not covered" > const seen = new Set();</span>
2591
+ <span class="cstat-no" title="statement not covered" > for (const value of values) {</span>
2592
+ <span class="cstat-no" title="statement not covered" > const item = cleanText(value, itemMaxLength);</span>
2593
+ <span class="cstat-no" title="statement not covered" > if (!item || seen.has(item)) {</span>
2594
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2595
+ <span class="cstat-no" title="statement not covered" > }</span>
2596
+ <span class="cstat-no" title="statement not covered" > seen.add(item);</span>
2597
+ <span class="cstat-no" title="statement not covered" > out.push(item);</span>
2598
+ <span class="cstat-no" title="statement not covered" > if (out.length &gt;= maxItems) {</span>
2599
+ <span class="cstat-no" title="statement not covered" > break;</span>
2600
+ <span class="cstat-no" title="statement not covered" > }</span>
2601
+ <span class="cstat-no" title="statement not covered" > }</span>
2602
+ <span class="cstat-no" title="statement not covered" > return out;</span>
2603
+ <span class="cstat-no" title="statement not covered" >}</span>
2604
+ &nbsp;
2605
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function mergeUnique(baseList, newList, maxItems = 4) {</span></span>
2606
+ <span class="cstat-no" title="statement not covered" > const merged = [];</span>
2607
+ <span class="cstat-no" title="statement not covered" > const seen = new Set();</span>
2608
+ <span class="cstat-no" title="statement not covered" > for (const item of [...sanitizeList(baseList, maxItems), ...sanitizeList(newList, maxItems)]) {</span>
2609
+ <span class="cstat-no" title="statement not covered" > if (seen.has(item)) {</span>
2610
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2611
+ <span class="cstat-no" title="statement not covered" > }</span>
2612
+ <span class="cstat-no" title="statement not covered" > seen.add(item);</span>
2613
+ <span class="cstat-no" title="statement not covered" > merged.push(item);</span>
2614
+ <span class="cstat-no" title="statement not covered" > if (merged.length &gt;= maxItems) {</span>
2615
+ <span class="cstat-no" title="statement not covered" > break;</span>
2616
+ <span class="cstat-no" title="statement not covered" > }</span>
2617
+ <span class="cstat-no" title="statement not covered" > }</span>
2618
+ <span class="cstat-no" title="statement not covered" > return merged;</span>
2619
+ <span class="cstat-no" title="statement not covered" >}</span>
2620
+ &nbsp;
2621
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function extractSignalPhrases(text, pattern, maxItems = 3) {</span></span>
2622
+ <span class="cstat-no" title="statement not covered" > if (!text) {</span>
2623
+ <span class="cstat-no" title="statement not covered" > return [];</span>
2624
+ <span class="cstat-no" title="statement not covered" > }</span>
2625
+ <span class="cstat-no" title="statement not covered" > const chunks = String(text)</span>
2626
+ <span class="cstat-no" title="statement not covered" > .split(/\n+/)</span>
2627
+ <span class="cstat-no" title="statement not covered" > .flatMap(line =&gt; line.split(/(?&lt;=[.!?])\s+/));</span>
2628
+ <span class="cstat-no" title="statement not covered" ></span>
2629
+ <span class="cstat-no" title="statement not covered" > const picked = [];</span>
2630
+ <span class="cstat-no" title="statement not covered" > const seen = new Set();</span>
2631
+ <span class="cstat-no" title="statement not covered" > for (const chunk of chunks) {</span>
2632
+ <span class="cstat-no" title="statement not covered" > const cleaned = cleanText(chunk, 180);</span>
2633
+ <span class="cstat-no" title="statement not covered" > if (!cleaned || cleaned.length &lt; 8) {</span>
2634
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2635
+ <span class="cstat-no" title="statement not covered" > }</span>
2636
+ <span class="cstat-no" title="statement not covered" > if (!pattern.test(cleaned)) {</span>
2637
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2638
+ <span class="cstat-no" title="statement not covered" > }</span>
2639
+ <span class="cstat-no" title="statement not covered" > if (seen.has(cleaned)) {</span>
2640
+ <span class="cstat-no" title="statement not covered" > continue;</span>
2641
+ <span class="cstat-no" title="statement not covered" > }</span>
2642
+ <span class="cstat-no" title="statement not covered" > seen.add(cleaned);</span>
2643
+ <span class="cstat-no" title="statement not covered" > picked.push(cleaned);</span>
2644
+ <span class="cstat-no" title="statement not covered" > if (picked.length &gt;= maxItems) {</span>
2645
+ <span class="cstat-no" title="statement not covered" > break;</span>
2646
+ <span class="cstat-no" title="statement not covered" > }</span>
2647
+ <span class="cstat-no" title="statement not covered" > }</span>
2648
+ <span class="cstat-no" title="statement not covered" > return picked;</span>
2649
+ <span class="cstat-no" title="statement not covered" >}</span>
2650
+ &nbsp;
2651
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function collectTopicKeywords(tierTopics) {</span></span>
2652
+ <span class="cstat-no" title="statement not covered" > const keywords = new Set();</span>
2653
+ <span class="cstat-no" title="statement not covered" > </span>
2654
+ <span class="cstat-no" title="statement not covered" > const topicsList = tierTopics?.topics || [];</span>
2655
+ <span class="cstat-no" title="statement not covered" > const objectivesList = tierTopics?.objectives || [];</span>
2656
+ <span class="cstat-no" title="statement not covered" ></span>
2657
+ <span class="cstat-no" title="statement not covered" > for (const item of topicsList) {</span>
2658
+ <span class="cstat-no" title="statement not covered" > for (const part of [item?.topic, item?.description]) {</span>
2659
+ <span class="cstat-no" title="statement not covered" > if (!part) continue;</span>
2660
+ <span class="cstat-no" title="statement not covered" > const terms = String(part)</span>
2661
+ <span class="cstat-no" title="statement not covered" > .toLowerCase()</span>
2662
+ <span class="cstat-no" title="statement not covered" > .split(/[^a-z0-9]+/)</span>
2663
+ <span class="cstat-no" title="statement not covered" > .filter(term =&gt; term.length &gt;= 4);</span>
2664
+ <span class="cstat-no" title="statement not covered" > for (const term of terms.slice(0, 6)) {</span>
2665
+ <span class="cstat-no" title="statement not covered" > keywords.add(term);</span>
2666
+ <span class="cstat-no" title="statement not covered" > if (keywords.size &gt;= 48) return Array.from(keywords);</span>
2667
+ <span class="cstat-no" title="statement not covered" > }</span>
2668
+ <span class="cstat-no" title="statement not covered" > }</span>
2669
+ <span class="cstat-no" title="statement not covered" > }</span>
2670
+ <span class="cstat-no" title="statement not covered" ></span>
2671
+ <span class="cstat-no" title="statement not covered" > for (const item of objectivesList) {</span>
2672
+ <span class="cstat-no" title="statement not covered" > for (const part of [item?.objective, item?.description]) {</span>
2673
+ <span class="cstat-no" title="statement not covered" > if (!part) continue;</span>
2674
+ <span class="cstat-no" title="statement not covered" > const terms = String(part)</span>
2675
+ <span class="cstat-no" title="statement not covered" > .toLowerCase()</span>
2676
+ <span class="cstat-no" title="statement not covered" > .split(/[^a-z0-9]+/)</span>
2677
+ <span class="cstat-no" title="statement not covered" > .filter(term =&gt; term.length &gt;= 4);</span>
2678
+ <span class="cstat-no" title="statement not covered" > for (const term of terms.slice(0, 6)) {</span>
2679
+ <span class="cstat-no" title="statement not covered" > keywords.add(term);</span>
2680
+ <span class="cstat-no" title="statement not covered" > if (keywords.size &gt;= 48) return Array.from(keywords);</span>
2681
+ <span class="cstat-no" title="statement not covered" > }</span>
2682
+ <span class="cstat-no" title="statement not covered" > }</span>
2683
+ <span class="cstat-no" title="statement not covered" > }</span>
2684
+ <span class="cstat-no" title="statement not covered" ></span>
2685
+ <span class="cstat-no" title="statement not covered" > return Array.from(keywords);</span>
2686
+ <span class="cstat-no" title="statement not covered" >}</span>
2687
+ &nbsp;
2688
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function pruneCollaborationSessions() {</span></span>
2689
+ <span class="cstat-no" title="statement not covered" > const now = Date.now();</span>
2690
+ <span class="cstat-no" title="statement not covered" > for (const [conversationId, state] of collaborationSessions.entries()) {</span>
2691
+ <span class="cstat-no" title="statement not covered" > const updatedAt = Number(state?.updatedAt || 0);</span>
2692
+ <span class="cstat-no" title="statement not covered" > if (!updatedAt || now - updatedAt &gt; COLLAB_STATE_TTL_MS) {</span>
2693
+ <span class="cstat-no" title="statement not covered" > collaborationSessions.delete(conversationId);</span>
2694
+ <span class="cstat-no" title="statement not covered" > }</span>
2695
+ <span class="cstat-no" title="statement not covered" > }</span>
2696
+ <span class="cstat-no" title="statement not covered" ></span>
2697
+ <span class="cstat-no" title="statement not covered" > if (collaborationSessions.size &lt;= MAX_COLLAB_SESSIONS) {</span>
2698
+ <span class="cstat-no" title="statement not covered" > return;</span>
2699
+ <span class="cstat-no" title="statement not covered" > }</span>
2700
+ <span class="cstat-no" title="statement not covered" ></span>
2701
+ <span class="cstat-no" title="statement not covered" > const oldest = Array.from(collaborationSessions.entries())</span>
2702
+ <span class="cstat-no" title="statement not covered" > .sort((a, b) =&gt; (a[1]?.updatedAt || 0) - (b[1]?.updatedAt || 0));</span>
2703
+ <span class="cstat-no" title="statement not covered" > const toDelete = collaborationSessions.size - MAX_COLLAB_SESSIONS;</span>
2704
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; toDelete; i++) {</span>
2705
+ <span class="cstat-no" title="statement not covered" > collaborationSessions.delete(oldest[i][0]);</span>
2706
+ <span class="cstat-no" title="statement not covered" > }</span>
2707
+ <span class="cstat-no" title="statement not covered" >}</span>
2708
+ &nbsp;
2709
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function getOrCreateCollaborationState(conversationId, context = {}) {</span></span>
2710
+ <span class="cstat-no" title="statement not covered" > pruneCollaborationSessions();</span>
2711
+ <span class="cstat-no" title="statement not covered" ></span>
2712
+ <span class="cstat-no" title="statement not covered" > const existing = collaborationSessions.get(conversationId);</span>
2713
+ <span class="cstat-no" title="statement not covered" > if (existing) {</span>
2714
+ <span class="cstat-no" title="statement not covered" > existing.updatedAt = Date.now();</span>
2715
+ <span class="cstat-no" title="statement not covered" > return existing;</span>
2716
+ <span class="cstat-no" title="statement not covered" > }</span>
2717
+ <span class="cstat-no" title="statement not covered" ></span>
2718
+ <span class="cstat-no" title="statement not covered" > // Check DB for persisted state (enables restart recovery)</span>
2719
+ <span class="cstat-no" title="statement not covered" > const convStore = getServerConvStore();</span>
2720
+ <span class="cstat-no" title="statement not covered" > if (convStore) {</span>
2721
+ <span class="cstat-no" title="statement not covered" > const dbState = convStore.loadCollabState(conversationId);</span>
2722
+ <span class="cstat-no" title="statement not covered" > if (dbState) {</span>
2723
+ <span class="cstat-no" title="statement not covered" > const now = Date.now();</span>
2724
+ <span class="cstat-no" title="statement not covered" > const restored = {</span>
2725
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
2726
+ <span class="cstat-no" title="statement not covered" > phase: dbState.phase,</span>
2727
+ <span class="cstat-no" title="statement not covered" > turnCount: dbState.turnCount,</span>
2728
+ <span class="cstat-no" title="statement not covered" > overlapScore: dbState.overlapScore,</span>
2729
+ <span class="cstat-no" title="statement not covered" > activeThreads: dbState.activeThreads,</span>
2730
+ <span class="cstat-no" title="statement not covered" > candidateCollaborations: dbState.candidateCollaborations,</span>
2731
+ <span class="cstat-no" title="statement not covered" > openQuestions: dbState.openQuestions,</span>
2732
+ <span class="cstat-no" title="statement not covered" > closeSignal: dbState.closeSignal,</span>
2733
+ <span class="cstat-no" title="statement not covered" > confidence: dbState.confidence,</span>
2734
+ <span class="cstat-no" title="statement not covered" > callerName: cleanText(context.callerName, 80),</span>
2735
+ <span class="cstat-no" title="statement not covered" > callerOwner: cleanText(context.callerOwner, 80),</span>
2736
+ <span class="cstat-no" title="statement not covered" > tier: context.tier || 'public',</span>
2737
+ <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
2738
+ <span class="cstat-no" title="statement not covered" > updatedAt: now</span>
2739
+ <span class="cstat-no" title="statement not covered" > };</span>
2740
+ <span class="cstat-no" title="statement not covered" > collaborationSessions.set(conversationId, restored);</span>
2741
+ <span class="cstat-no" title="statement not covered" > return restored;</span>
2742
+ <span class="cstat-no" title="statement not covered" > }</span>
2743
+ <span class="cstat-no" title="statement not covered" > }</span>
2744
+ <span class="cstat-no" title="statement not covered" ></span>
2745
+ <span class="cstat-no" title="statement not covered" > const now = Date.now();</span>
2746
+ <span class="cstat-no" title="statement not covered" > const state = {</span>
2747
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
2748
+ <span class="cstat-no" title="statement not covered" > phase: 'handshake',</span>
2749
+ <span class="cstat-no" title="statement not covered" > turnCount: 0,</span>
2750
+ <span class="cstat-no" title="statement not covered" > overlapScore: 0.15,</span>
2751
+ <span class="cstat-no" title="statement not covered" > activeThreads: [],</span>
2752
+ <span class="cstat-no" title="statement not covered" > candidateCollaborations: [],</span>
2753
+ <span class="cstat-no" title="statement not covered" > openQuestions: [],</span>
2754
+ <span class="cstat-no" title="statement not covered" > closeSignal: false,</span>
2755
+ <span class="cstat-no" title="statement not covered" > confidence: 0.25,</span>
2756
+ <span class="cstat-no" title="statement not covered" > callerName: cleanText(context.callerName, 80),</span>
2757
+ <span class="cstat-no" title="statement not covered" > callerOwner: cleanText(context.callerOwner, 80),</span>
2758
+ <span class="cstat-no" title="statement not covered" > tier: context.tier || 'public',</span>
2759
+ <span class="cstat-no" title="statement not covered" > createdAt: now,</span>
2760
+ <span class="cstat-no" title="statement not covered" > updatedAt: now</span>
2761
+ <span class="cstat-no" title="statement not covered" > };</span>
2762
+ <span class="cstat-no" title="statement not covered" ></span>
2763
+ <span class="cstat-no" title="statement not covered" > collaborationSessions.set(conversationId, state);</span>
2764
+ <span class="cstat-no" title="statement not covered" > return state;</span>
2765
+ <span class="cstat-no" title="statement not covered" >}</span>
2766
+ &nbsp;
2767
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function inferPhaseFromState(state, signals) {</span></span>
2768
+ <span class="cstat-no" title="statement not covered" > if (signals.closeSignal &amp;&amp; state.turnCount &gt;= 5) {</span>
2769
+ <span class="cstat-no" title="statement not covered" > return 'close';</span>
2770
+ <span class="cstat-no" title="statement not covered" > }</span>
2771
+ <span class="cstat-no" title="statement not covered" > if (state.turnCount &gt;= 5 &amp;&amp; (state.candidateCollaborations.length &gt; 0 || state.overlapScore &gt;= 0.65)) {</span>
2772
+ <span class="cstat-no" title="statement not covered" > return 'synthesize';</span>
2773
+ <span class="cstat-no" title="statement not covered" > }</span>
2774
+ <span class="cstat-no" title="statement not covered" > if (state.turnCount &gt;= 3 &amp;&amp; state.overlapScore &gt;= 0.4) {</span>
2775
+ <span class="cstat-no" title="statement not covered" > return 'deep_dive';</span>
2776
+ <span class="cstat-no" title="statement not covered" > }</span>
2777
+ <span class="cstat-no" title="statement not covered" > if (state.turnCount &gt;= 1) {</span>
2778
+ <span class="cstat-no" title="statement not covered" > return 'explore';</span>
2779
+ <span class="cstat-no" title="statement not covered" > }</span>
2780
+ <span class="cstat-no" title="statement not covered" > return 'handshake';</span>
2781
+ <span class="cstat-no" title="statement not covered" >}</span>
2782
+ &nbsp;
2783
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function applyCollaborationPatch(state, patch) {</span></span>
2784
+ <span class="cstat-no" title="statement not covered" > if (!patch || typeof patch !== 'object' || Array.isArray(patch)) {</span>
2785
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2786
+ <span class="cstat-no" title="statement not covered" > }</span>
2787
+ <span class="cstat-no" title="statement not covered" ></span>
2788
+ <span class="cstat-no" title="statement not covered" > let applied = false;</span>
2789
+ <span class="cstat-no" title="statement not covered" ></span>
2790
+ <span class="cstat-no" title="statement not covered" > if (typeof patch.phase === 'string') {</span>
2791
+ <span class="cstat-no" title="statement not covered" > const phase = patch.phase.trim();</span>
2792
+ <span class="cstat-no" title="statement not covered" > if (VALID_PHASES.has(phase)) {</span>
2793
+ <span class="cstat-no" title="statement not covered" > state.phase = phase;</span>
2794
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2795
+ <span class="cstat-no" title="statement not covered" > }</span>
2796
+ <span class="cstat-no" title="statement not covered" > }</span>
2797
+ <span class="cstat-no" title="statement not covered" ></span>
2798
+ <span class="cstat-no" title="statement not covered" > if (patch.turnCount !== undefined) {</span>
2799
+ <span class="cstat-no" title="statement not covered" > const nextTurn = clampNumber(patch.turnCount, 0, 500, state.turnCount + 1);</span>
2800
+ <span class="cstat-no" title="statement not covered" > state.turnCount = Math.max(state.turnCount + 1, nextTurn);</span>
2801
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2802
+ <span class="cstat-no" title="statement not covered" > }</span>
2803
+ <span class="cstat-no" title="statement not covered" ></span>
2804
+ <span class="cstat-no" title="statement not covered" > if (patch.overlapScore !== undefined) {</span>
2805
+ <span class="cstat-no" title="statement not covered" > state.overlapScore = Number(clampNumber(</span>
2806
+ <span class="cstat-no" title="statement not covered" > patch.overlapScore,</span>
2807
+ <span class="cstat-no" title="statement not covered" > 0,</span>
2808
+ <span class="cstat-no" title="statement not covered" > 1,</span>
2809
+ <span class="cstat-no" title="statement not covered" > state.overlapScore</span>
2810
+ <span class="cstat-no" title="statement not covered" > ).toFixed(2));</span>
2811
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2812
+ <span class="cstat-no" title="statement not covered" > }</span>
2813
+ <span class="cstat-no" title="statement not covered" ></span>
2814
+ <span class="cstat-no" title="statement not covered" > const activeThreads = sanitizeList(patch.activeThreads, 4);</span>
2815
+ <span class="cstat-no" title="statement not covered" > if (activeThreads.length &gt; 0) {</span>
2816
+ <span class="cstat-no" title="statement not covered" > state.activeThreads = activeThreads;</span>
2817
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2818
+ <span class="cstat-no" title="statement not covered" > }</span>
2819
+ <span class="cstat-no" title="statement not covered" ></span>
2820
+ <span class="cstat-no" title="statement not covered" > const candidateCollaborations = sanitizeList(patch.candidateCollaborations, 4);</span>
2821
+ <span class="cstat-no" title="statement not covered" > if (candidateCollaborations.length &gt; 0) {</span>
2822
+ <span class="cstat-no" title="statement not covered" > state.candidateCollaborations = candidateCollaborations;</span>
2823
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2824
+ <span class="cstat-no" title="statement not covered" > }</span>
2825
+ <span class="cstat-no" title="statement not covered" ></span>
2826
+ <span class="cstat-no" title="statement not covered" > const openQuestions = sanitizeList(patch.openQuestions, 4);</span>
2827
+ <span class="cstat-no" title="statement not covered" > if (openQuestions.length &gt; 0) {</span>
2828
+ <span class="cstat-no" title="statement not covered" > state.openQuestions = openQuestions;</span>
2829
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2830
+ <span class="cstat-no" title="statement not covered" > }</span>
2831
+ <span class="cstat-no" title="statement not covered" ></span>
2832
+ <span class="cstat-no" title="statement not covered" > if (patch.closeSignal !== undefined) {</span>
2833
+ <span class="cstat-no" title="statement not covered" > state.closeSignal = Boolean(patch.closeSignal);</span>
2834
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2835
+ <span class="cstat-no" title="statement not covered" > } else if (patch.shouldClose !== undefined) {</span>
2836
+ <span class="cstat-no" title="statement not covered" > state.closeSignal = Boolean(patch.shouldClose);</span>
2837
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2838
+ <span class="cstat-no" title="statement not covered" > }</span>
2839
+ <span class="cstat-no" title="statement not covered" ></span>
2840
+ <span class="cstat-no" title="statement not covered" > if (patch.confidence !== undefined) {</span>
2841
+ <span class="cstat-no" title="statement not covered" > state.confidence = Number(clampNumber(</span>
2842
+ <span class="cstat-no" title="statement not covered" > patch.confidence,</span>
2843
+ <span class="cstat-no" title="statement not covered" > 0,</span>
2844
+ <span class="cstat-no" title="statement not covered" > 1,</span>
2845
+ <span class="cstat-no" title="statement not covered" > state.confidence</span>
2846
+ <span class="cstat-no" title="statement not covered" > ).toFixed(2));</span>
2847
+ <span class="cstat-no" title="statement not covered" > applied = true;</span>
2848
+ <span class="cstat-no" title="statement not covered" > }</span>
2849
+ <span class="cstat-no" title="statement not covered" ></span>
2850
+ <span class="cstat-no" title="statement not covered" > state.updatedAt = Date.now();</span>
2851
+ <span class="cstat-no" title="statement not covered" > return applied;</span>
2852
+ <span class="cstat-no" title="statement not covered" >}</span>
2853
+ &nbsp;
2854
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function fallbackCollaborationUpdate(state, inboundMessage, responseText, tierTopics) {</span></span>
2855
+ <span class="cstat-no" title="statement not covered" > const inbound = String(inboundMessage || '');</span>
2856
+ <span class="cstat-no" title="statement not covered" > const outbound = String(responseText || '');</span>
2857
+ <span class="cstat-no" title="statement not covered" > const combined = `${inbound}\n${outbound}`.toLowerCase();</span>
2858
+ <span class="cstat-no" title="statement not covered" ></span>
2859
+ <span class="cstat-no" title="statement not covered" > const keywordList = collectTopicKeywords(tierTopics);</span>
2860
+ <span class="cstat-no" title="statement not covered" > let keywordHits = 0;</span>
2861
+ <span class="cstat-no" title="statement not covered" > for (const keyword of keywordList) {</span>
2862
+ <span class="cstat-no" title="statement not covered" > if (combined.includes(keyword)) {</span>
2863
+ <span class="cstat-no" title="statement not covered" > keywordHits += 1;</span>
2864
+ <span class="cstat-no" title="statement not covered" > }</span>
2865
+ <span class="cstat-no" title="statement not covered" > }</span>
2866
+ <span class="cstat-no" title="statement not covered" ></span>
2867
+ <span class="cstat-no" title="statement not covered" > const collaborationSignal =</span>
2868
+ <span class="cstat-no" title="statement not covered" > /(collaborat|partner|integrat|co-?build|joint|pilot|next step|follow[ -]?up|introduc)/i.test(combined);</span>
2869
+ <span class="cstat-no" title="statement not covered" > const depthSignal =</span>
2870
+ <span class="cstat-no" title="statement not covered" > /(constraint|timeline|resource|owner|deliverable|scope|risk|tradeoff|metric)/i.test(combined);</span>
2871
+ <span class="cstat-no" title="statement not covered" > const closeSignal =</span>
2872
+ <span class="cstat-no" title="statement not covered" > /(wrap up|summary|conclude|close this|next call|owners should connect|handoff)/i.test(combined);</span>
2873
+ <span class="cstat-no" title="statement not covered" ></span>
2874
+ <span class="cstat-no" title="statement not covered" > const questionCount = (outbound.match(/\?/g) || []).length;</span>
2875
+ <span class="cstat-no" title="statement not covered" > const keywordScore = keywordList.length ? keywordHits / Math.max(keywordList.length, 8) : 0.05;</span>
2876
+ <span class="cstat-no" title="statement not covered" > const overlapDelta =</span>
2877
+ <span class="cstat-no" title="statement not covered" > (keywordScore * 0.45) +</span>
2878
+ <span class="cstat-no" title="statement not covered" > (collaborationSignal ? 0.12 : 0) +</span>
2879
+ <span class="cstat-no" title="statement not covered" > (depthSignal ? 0.08 : 0) +</span>
2880
+ <span class="cstat-no" title="statement not covered" > (questionCount &gt; 0 ? 0.03 : -0.03);</span>
2881
+ <span class="cstat-no" title="statement not covered" ></span>
2882
+ <span class="cstat-no" title="statement not covered" > state.turnCount += 1;</span>
2883
+ <span class="cstat-no" title="statement not covered" > state.overlapScore = Number(clampNumber(</span>
2884
+ <span class="cstat-no" title="statement not covered" > state.overlapScore + overlapDelta,</span>
2885
+ <span class="cstat-no" title="statement not covered" > 0,</span>
2886
+ <span class="cstat-no" title="statement not covered" > 1,</span>
2887
+ <span class="cstat-no" title="statement not covered" > state.overlapScore</span>
2888
+ <span class="cstat-no" title="statement not covered" > ).toFixed(2));</span>
2889
+ <span class="cstat-no" title="statement not covered" ></span>
2890
+ <span class="cstat-no" title="statement not covered" > const threadSeeds = mergeUnique(</span>
2891
+ <span class="cstat-no" title="statement not covered" > extractSignalPhrases(</span>
2892
+ <span class="cstat-no" title="statement not covered" > `${inbound}\n${outbound}`,</span>
2893
+ <span class="cstat-no" title="statement not covered" > /(working|building|focus|interested|goal|problem|need|challenge|opportunit)/i,</span>
2894
+ <span class="cstat-no" title="statement not covered" > 4</span>
2895
+ <span class="cstat-no" title="statement not covered" > ),</span>
2896
+ <span class="cstat-no" title="statement not covered" > state.activeThreads,</span>
2897
+ <span class="cstat-no" title="statement not covered" > 4</span>
2898
+ <span class="cstat-no" title="statement not covered" > );</span>
2899
+ <span class="cstat-no" title="statement not covered" > state.activeThreads = threadSeeds;</span>
2900
+ <span class="cstat-no" title="statement not covered" ></span>
2901
+ <span class="cstat-no" title="statement not covered" > const candidateIdeas = extractSignalPhrases(</span>
2902
+ <span class="cstat-no" title="statement not covered" > outbound,</span>
2903
+ <span class="cstat-no" title="statement not covered" > /(collaborat|integrat|pilot|joint|co-?build|follow[ -]?up|introduc|next step)/i,</span>
2904
+ <span class="cstat-no" title="statement not covered" > 4</span>
2905
+ <span class="cstat-no" title="statement not covered" > );</span>
2906
+ <span class="cstat-no" title="statement not covered" > state.candidateCollaborations = mergeUnique(state.candidateCollaborations, candidateIdeas, 4);</span>
2907
+ <span class="cstat-no" title="statement not covered" ></span>
2908
+ <span class="cstat-no" title="statement not covered" > const questionPhrases = extractSignalPhrases(outbound, /\?/, 4).map(q =&gt; {</span>
2909
+ <span class="cstat-no" title="statement not covered" > return q.endsWith('?') ? q : `${q}?`;</span>
2910
+ <span class="cstat-no" title="statement not covered" > });</span>
2911
+ <span class="cstat-no" title="statement not covered" > state.openQuestions = mergeUnique(state.openQuestions, questionPhrases, 4);</span>
2912
+ <span class="cstat-no" title="statement not covered" ></span>
2913
+ <span class="cstat-no" title="statement not covered" > state.closeSignal = Boolean(state.closeSignal || closeSignal);</span>
2914
+ <span class="cstat-no" title="statement not covered" > state.phase = inferPhaseFromState(state, { closeSignal });</span>
2915
+ <span class="cstat-no" title="statement not covered" > state.updatedAt = Date.now();</span>
2916
+ <span class="cstat-no" title="statement not covered" >}</span>
2917
+ &nbsp;
2918
+ /**
2919
+ * Auto-add caller as contact if new
2920
+ */
2921
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function ensureContact(caller, tokenId) {</span></span>
2922
+ <span class="cstat-no" title="statement not covered" > if (!caller?.name) return null;</span>
2923
+ <span class="cstat-no" title="statement not covered" ></span>
2924
+ <span class="cstat-no" title="statement not covered" > try {</span>
2925
+ <span class="cstat-no" title="statement not covered" > const contact = tokenStore.ensureInboundContact(caller, tokenId);</span>
2926
+ <span class="cstat-no" title="statement not covered" > if (contact) {</span>
2927
+ <span class="cstat-no" title="statement not covered" > logger.info('Contact ensured from inbound call', {</span>
2928
+ <span class="cstat-no" title="statement not covered" > event: 'contact_ensured',</span>
2929
+ <span class="cstat-no" title="statement not covered" > tokenId,</span>
2930
+ <span class="cstat-no" title="statement not covered" > data: {</span>
2931
+ <span class="cstat-no" title="statement not covered" > caller_name: caller.name,</span>
2932
+ <span class="cstat-no" title="statement not covered" > caller_owner: caller.owner || null</span>
2933
+ <span class="cstat-no" title="statement not covered" > }</span>
2934
+ <span class="cstat-no" title="statement not covered" > });</span>
2935
+ <span class="cstat-no" title="statement not covered" > }</span>
2936
+ <span class="cstat-no" title="statement not covered" > return contact;</span>
2937
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
2938
+ <span class="cstat-no" title="statement not covered" > logger.error('Failed to ensure contact', {</span>
2939
+ <span class="cstat-no" title="statement not covered" > event: 'contact_ensure_failed',</span>
2940
+ <span class="cstat-no" title="statement not covered" > tokenId,</span>
2941
+ <span class="cstat-no" title="statement not covered" > error_code: 'CONTACT_ENSURE_FAILED',</span>
2942
+ <span class="cstat-no" title="statement not covered" > hint: 'Validate token/contact store files and write permissions.',</span>
2943
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
2944
+ <span class="cstat-no" title="statement not covered" > data: {</span>
2945
+ <span class="cstat-no" title="statement not covered" > caller_name: caller?.name || null</span>
2946
+ <span class="cstat-no" title="statement not covered" > }</span>
2947
+ <span class="cstat-no" title="statement not covered" > });</span>
2948
+ <span class="cstat-no" title="statement not covered" > return null;</span>
2949
+ <span class="cstat-no" title="statement not covered" > }</span>
2950
+ <span class="cstat-no" title="statement not covered" >}</span>
2951
+ &nbsp;
2952
+ /**
2953
+ * Spawn OpenClaw sub-agent to handle the call
2954
+ */
2955
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function callAgent(message, a2aContext) {</span></span>
2956
+ <span class="cstat-no" title="statement not covered" > const callerName = a2aContext.caller?.name || 'Unknown Agent';</span>
2957
+ <span class="cstat-no" title="statement not covered" > const callerOwner = a2aContext.caller?.owner || '';</span>
2958
+ <span class="cstat-no" title="statement not covered" > const tierInfo = a2aContext.tier || 'public';</span>
2959
+ <span class="cstat-no" title="statement not covered" > const conversationId = a2aContext.conversation_id || `conv_${Date.now()}`;</span>
2960
+ <span class="cstat-no" title="statement not covered" > const traceId = a2aContext.trace_id || null;</span>
2961
+ <span class="cstat-no" title="statement not covered" > const requestId = a2aContext.request_id || null;</span>
2962
+ <span class="cstat-no" title="statement not covered" > const callLogger = logger.child({</span>
2963
+ <span class="cstat-no" title="statement not covered" > traceId,</span>
2964
+ <span class="cstat-no" title="statement not covered" > requestId,</span>
2965
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
2966
+ <span class="cstat-no" title="statement not covered" > tokenId: a2aContext.token_id</span>
2967
+ <span class="cstat-no" title="statement not covered" > });</span>
2968
+ <span class="cstat-no" title="statement not covered" > const collabMode = resolveCollabMode();</span>
2969
+ <span class="cstat-no" title="statement not covered" > const collabState = getOrCreateCollaborationState(conversationId, {</span>
2970
+ <span class="cstat-no" title="statement not covered" > callerName,</span>
2971
+ <span class="cstat-no" title="statement not covered" > callerOwner,</span>
2972
+ <span class="cstat-no" title="statement not covered" > tier: tierInfo</span>
2973
+ <span class="cstat-no" title="statement not covered" > });</span>
2974
+ <span class="cstat-no" title="statement not covered" ></span>
2975
+ <span class="cstat-no" title="statement not covered" > // Auto-add caller as contact</span>
2976
+ <span class="cstat-no" title="statement not covered" > ensureContact(a2aContext.caller, a2aContext.token_id);</span>
2977
+ <span class="cstat-no" title="statement not covered" ></span>
2978
+ <span class="cstat-no" title="statement not covered" > // Build prompt from disclosure manifest</span>
2979
+ <span class="cstat-no" title="statement not covered" > const manifest = loadManifest();</span>
2980
+ <span class="cstat-no" title="statement not covered" > const tierTopics = getTopicsForTier(tierInfo);</span>
2981
+ <span class="cstat-no" title="statement not covered" > const formattedTopics = formatTopicsForPrompt(tierTopics);</span>
2982
+ <span class="cstat-no" title="statement not covered" ></span>
2983
+ <span class="cstat-no" title="statement not covered" > // Load tier goals from config (merged up the hierarchy like disclosure topics)</span>
2984
+ <span class="cstat-no" title="statement not covered" > let tierGoals = [];</span>
2985
+ <span class="cstat-no" title="statement not covered" > try {</span>
2986
+ <span class="cstat-no" title="statement not covered" > const configDir = process.env.A2A_CONFIG_DIR || process.env.OPENCLAW_CONFIG_DIR ||</span>
2987
+ <span class="cstat-no" title="statement not covered" > path.join(process.env.HOME || '/tmp', '.config', 'openclaw');</span>
2988
+ <span class="cstat-no" title="statement not covered" > const configPath = path.join(configDir, 'a2a-config.json');</span>
2989
+ <span class="cstat-no" title="statement not covered" > if (fs.existsSync(configPath)) {</span>
2990
+ <span class="cstat-no" title="statement not covered" > const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));</span>
2991
+ <span class="cstat-no" title="statement not covered" > const tierHierarchy = ['public', 'friends', 'family'];</span>
2992
+ <span class="cstat-no" title="statement not covered" > const tierIndex = tierHierarchy.indexOf(tierInfo);</span>
2993
+ <span class="cstat-no" title="statement not covered" > const tiersToMerge = tierIndex &gt;= 0</span>
2994
+ <span class="cstat-no" title="statement not covered" > ? tierHierarchy.slice(0, tierIndex + 1)</span>
2995
+ <span class="cstat-no" title="statement not covered" > : ['public'];</span>
2996
+ <span class="cstat-no" title="statement not covered" > for (const t of tiersToMerge) {</span>
2997
+ <span class="cstat-no" title="statement not covered" > const tGoals = config.tiers?.[t]?.goals || [];</span>
2998
+ <span class="cstat-no" title="statement not covered" > tierGoals.push(...tGoals);</span>
2999
+ <span class="cstat-no" title="statement not covered" > }</span>
3000
+ <span class="cstat-no" title="statement not covered" > tierGoals = [...new Set(tierGoals)];</span>
3001
+ <span class="cstat-no" title="statement not covered" > }</span>
3002
+ <span class="cstat-no" title="statement not covered" > } catch (e) {}</span>
3003
+ <span class="cstat-no" title="statement not covered" ></span>
3004
+ <span class="cstat-no" title="statement not covered" > const promptOptions = {</span>
3005
+ <span class="cstat-no" title="statement not covered" > agentName: agentContext.name,</span>
3006
+ <span class="cstat-no" title="statement not covered" > ownerName: agentContext.owner,</span>
3007
+ <span class="cstat-no" title="statement not covered" > otherAgentName: callerName,</span>
3008
+ <span class="cstat-no" title="statement not covered" > otherOwnerName: callerOwner || 'their owner',</span>
3009
+ <span class="cstat-no" title="statement not covered" > roleContext: 'They called you.',</span>
3010
+ <span class="cstat-no" title="statement not covered" > accessTier: tierInfo,</span>
3011
+ <span class="cstat-no" title="statement not covered" > tierTopics: formattedTopics,</span>
3012
+ <span class="cstat-no" title="statement not covered" > tierGoals,</span>
3013
+ <span class="cstat-no" title="statement not covered" > otherAgentGreeting: message,</span>
3014
+ <span class="cstat-no" title="statement not covered" > personalityNotes: manifest.personality_notes || ''</span>
3015
+ <span class="cstat-no" title="statement not covered" > };</span>
3016
+ <span class="cstat-no" title="statement not covered" ></span>
3017
+ <span class="cstat-no" title="statement not covered" > const prompt = collabMode === 'adaptive'</span>
3018
+ <span class="cstat-no" title="statement not covered" > ? buildAdaptiveConnectionPrompt({</span>
3019
+ <span class="cstat-no" title="statement not covered" > ...promptOptions,</span>
3020
+ <span class="cstat-no" title="statement not covered" > conversationState: collabState</span>
3021
+ <span class="cstat-no" title="statement not covered" > })</span>
3022
+ <span class="cstat-no" title="statement not covered" > : buildConnectionPrompt(promptOptions);</span>
3023
+ <span class="cstat-no" title="statement not covered" ></span>
3024
+ <span class="cstat-no" title="statement not covered" > const sessionId = `a2a-${conversationId}`;</span>
3025
+ <span class="cstat-no" title="statement not covered" > const claudeTurnTimeoutMs = resolveTurnTimeoutMs({</span>
3026
+ <span class="cstat-no" title="statement not covered" > tokenTimeoutMs: a2aContext.timeout_ms,</span>
3027
+ <span class="cstat-no" title="statement not covered" > configTimeoutMs: resolveConfiguredTurnTimeoutMs()</span>
3028
+ <span class="cstat-no" title="statement not covered" > });</span>
3029
+ <span class="cstat-no" title="statement not covered" > </span>
3030
+ <span class="cstat-no" title="statement not covered" > try {</span>
3031
+ <span class="cstat-no" title="statement not covered" > callLogger.info('Handling inbound call turn', {</span>
3032
+ <span class="cstat-no" title="statement not covered" > event: 'call_turn_start',</span>
3033
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3034
+ <span class="cstat-no" title="statement not covered" > caller_name: callerName,</span>
3035
+ <span class="cstat-no" title="statement not covered" > caller_owner: callerOwner || null,</span>
3036
+ <span class="cstat-no" title="statement not covered" > tier: tierInfo,</span>
3037
+ <span class="cstat-no" title="statement not covered" > collab_mode: collabMode</span>
3038
+ <span class="cstat-no" title="statement not covered" > }</span>
3039
+ <span class="cstat-no" title="statement not covered" > });</span>
3040
+ <span class="cstat-no" title="statement not covered" ></span>
3041
+ <span class="cstat-no" title="statement not covered" > const rawResponse = await runtime.runTurn({</span>
3042
+ <span class="cstat-no" title="statement not covered" > sessionId,</span>
3043
+ <span class="cstat-no" title="statement not covered" > prompt,</span>
3044
+ <span class="cstat-no" title="statement not covered" > message,</span>
3045
+ <span class="cstat-no" title="statement not covered" > caller: a2aContext.caller || {},</span>
3046
+ <span class="cstat-no" title="statement not covered" > timeoutMs: runtime.mode === 'claude' ? claudeTurnTimeoutMs : 65000,</span>
3047
+ <span class="cstat-no" title="statement not covered" > context: {</span>
3048
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3049
+ <span class="cstat-no" title="statement not covered" > tier: tierInfo,</span>
3050
+ <span class="cstat-no" title="statement not covered" > ownerName: agentContext.owner,</span>
3051
+ <span class="cstat-no" title="statement not covered" > capabilities: Array.isArray(a2aContext.capabilities) ? a2aContext.capabilities : [],</span>
3052
+ <span class="cstat-no" title="statement not covered" > allowedTopics: a2aContext.allowed_topics || [],</span>
3053
+ <span class="cstat-no" title="statement not covered" > allowed_topics: a2aContext.allowed_topics || [],</span>
3054
+ <span class="cstat-no" title="statement not covered" > allowedGoals: a2aContext.allowed_goals || [],</span>
3055
+ <span class="cstat-no" title="statement not covered" > allowed_goals: a2aContext.allowed_goals || [],</span>
3056
+ <span class="cstat-no" title="statement not covered" > allowedTools: a2aContext.allowed_tools || [],</span>
3057
+ <span class="cstat-no" title="statement not covered" > allowed_tools: a2aContext.allowed_tools || [],</span>
3058
+ <span class="cstat-no" title="statement not covered" > timeoutMs: runtime.mode === 'claude' ? claudeTurnTimeoutMs : 65000,</span>
3059
+ <span class="cstat-no" title="statement not covered" > traceId,</span>
3060
+ <span class="cstat-no" title="statement not covered" > requestId</span>
3061
+ <span class="cstat-no" title="statement not covered" > }</span>
3062
+ <span class="cstat-no" title="statement not covered" > });</span>
3063
+ <span class="cstat-no" title="statement not covered" ></span>
3064
+ <span class="cstat-no" title="statement not covered" > // Claude mode returns structured metadata (statePatch + flags) via side channel.</span>
3065
+ <span class="cstat-no" title="statement not covered" > // We persist owner-facing flags so permission questions (e.g. blocked tool requests)</span>
3066
+ <span class="cstat-no" title="statement not covered" > // are visible in call history even though the remote only sees conversational text.</span>
3067
+ <span class="cstat-no" title="statement not covered" > const turnMeta = runtime.mode === 'claude' &amp;&amp; typeof runtime.getLastTurnMeta === 'function'</span>
3068
+ <span class="cstat-no" title="statement not covered" > ? runtime.getLastTurnMeta(sessionId)</span>
3069
+ <span class="cstat-no" title="statement not covered" > : null;</span>
3070
+ <span class="cstat-no" title="statement not covered" > if (turnMeta?.flags?.length &gt; 0) {</span>
3071
+ <span class="cstat-no" title="statement not covered" > const convStoreForFlags = getServerConvStore();</span>
3072
+ <span class="cstat-no" title="statement not covered" > if (convStoreForFlags) {</span>
3073
+ <span class="cstat-no" title="statement not covered" > try {</span>
3074
+ <span class="cstat-no" title="statement not covered" > convStoreForFlags.addMessage(conversationId, {</span>
3075
+ <span class="cstat-no" title="statement not covered" > direction: 'outbound',</span>
3076
+ <span class="cstat-no" title="statement not covered" > role: 'system',</span>
3077
+ <span class="cstat-no" title="statement not covered" > content: `[flags] ${turnMeta.flags.map(f =&gt; f.content || f.type).join('; ')}`,</span>
3078
+ <span class="cstat-no" title="statement not covered" > metadata: JSON.stringify({ flags: turnMeta.flags, phase: collabState.phase })</span>
3079
+ <span class="cstat-no" title="statement not covered" > });</span>
3080
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
3081
+ <span class="cstat-no" title="statement not covered" > callLogger.warn('Failed to persist owner flags for turn', {</span>
3082
+ <span class="cstat-no" title="statement not covered" > event: 'call_turn_flags_persist_failed',</span>
3083
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3084
+ <span class="cstat-no" title="statement not covered" > });</span>
3085
+ <span class="cstat-no" title="statement not covered" > }</span>
3086
+ <span class="cstat-no" title="statement not covered" > }</span>
3087
+ <span class="cstat-no" title="statement not covered" > }</span>
3088
+ <span class="cstat-no" title="statement not covered" ></span>
3089
+ <span class="cstat-no" title="statement not covered" > if (collabMode !== 'adaptive') {</span>
3090
+ <span class="cstat-no" title="statement not covered" > return rawResponse;</span>
3091
+ <span class="cstat-no" title="statement not covered" > }</span>
3092
+ <span class="cstat-no" title="statement not covered" ></span>
3093
+ <span class="cstat-no" title="statement not covered" > const parsed = extractCollaborationState(rawResponse);</span>
3094
+ <span class="cstat-no" title="statement not covered" > const cleanResponse = parsed.cleanText || rawResponse;</span>
3095
+ <span class="cstat-no" title="statement not covered" > const beforeTurn = collabState.turnCount;</span>
3096
+ <span class="cstat-no" title="statement not covered" > let usedMetadata = false;</span>
3097
+ <span class="cstat-no" title="statement not covered" ></span>
3098
+ <span class="cstat-no" title="statement not covered" > // Prefer explicit Claude metadata side channel in claude mode.</span>
3099
+ <span class="cstat-no" title="statement not covered" > if (turnMeta?.statePatch) {</span>
3100
+ <span class="cstat-no" title="statement not covered" > usedMetadata = applyCollaborationPatch(collabState, turnMeta.statePatch);</span>
3101
+ <span class="cstat-no" title="statement not covered" > if (!usedMetadata) {</span>
3102
+ <span class="cstat-no" title="statement not covered" > callLogger.warn('Invalid collaboration patch; applying fallback heuristics', {</span>
3103
+ <span class="cstat-no" title="statement not covered" > event: 'collaboration_patch_invalid',</span>
3104
+ <span class="cstat-no" title="statement not covered" > error_code: 'COLLABORATION_PATCH_INVALID',</span>
3105
+ <span class="cstat-no" title="statement not covered" > hint: 'Ensure assistant emits valid collaboration metadata JSON block.'</span>
3106
+ <span class="cstat-no" title="statement not covered" > });</span>
3107
+ <span class="cstat-no" title="statement not covered" > }</span>
3108
+ <span class="cstat-no" title="statement not covered" > } else if (parsed.hasState &amp;&amp; parsed.statePatch) {</span>
3109
+ <span class="cstat-no" title="statement not covered" > usedMetadata = applyCollaborationPatch(collabState, parsed.statePatch);</span>
3110
+ <span class="cstat-no" title="statement not covered" > if (!usedMetadata) {</span>
3111
+ <span class="cstat-no" title="statement not covered" > callLogger.warn('Invalid collaboration patch; applying fallback heuristics', {</span>
3112
+ <span class="cstat-no" title="statement not covered" > event: 'collaboration_patch_invalid',</span>
3113
+ <span class="cstat-no" title="statement not covered" > error_code: 'COLLABORATION_PATCH_INVALID',</span>
3114
+ <span class="cstat-no" title="statement not covered" > hint: 'Ensure assistant emits valid collaboration metadata JSON block.'</span>
3115
+ <span class="cstat-no" title="statement not covered" > });</span>
3116
+ <span class="cstat-no" title="statement not covered" > }</span>
3117
+ <span class="cstat-no" title="statement not covered" > } else if (parsed.parseError) {</span>
3118
+ <span class="cstat-no" title="statement not covered" > callLogger.warn('Could not parse collaboration metadata; applying fallback heuristics', {</span>
3119
+ <span class="cstat-no" title="statement not covered" > event: 'collaboration_metadata_parse_failed',</span>
3120
+ <span class="cstat-no" title="statement not covered" > error_code: 'COLLABORATION_METADATA_PARSE_FAILED',</span>
3121
+ <span class="cstat-no" title="statement not covered" > hint: 'Inspect response format and ensure metadata wrapper markers are intact.',</span>
3122
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3123
+ <span class="cstat-no" title="statement not covered" > parse_error: parsed.parseError</span>
3124
+ <span class="cstat-no" title="statement not covered" > }</span>
3125
+ <span class="cstat-no" title="statement not covered" > });</span>
3126
+ <span class="cstat-no" title="statement not covered" > }</span>
3127
+ <span class="cstat-no" title="statement not covered" ></span>
3128
+ <span class="cstat-no" title="statement not covered" > if (!usedMetadata) {</span>
3129
+ <span class="cstat-no" title="statement not covered" > fallbackCollaborationUpdate(collabState, message, cleanResponse, tierTopics);</span>
3130
+ <span class="cstat-no" title="statement not covered" > }</span>
3131
+ <span class="cstat-no" title="statement not covered" ></span>
3132
+ <span class="cstat-no" title="statement not covered" > if (collabState.turnCount &lt;= beforeTurn) {</span>
3133
+ <span class="cstat-no" title="statement not covered" > collabState.turnCount = beforeTurn + 1;</span>
3134
+ <span class="cstat-no" title="statement not covered" > }</span>
3135
+ <span class="cstat-no" title="statement not covered" ></span>
3136
+ <span class="cstat-no" title="statement not covered" > if (!VALID_PHASES.has(collabState.phase)) {</span>
3137
+ <span class="cstat-no" title="statement not covered" > collabState.phase = inferPhaseFromState(collabState, { closeSignal: collabState.closeSignal });</span>
3138
+ <span class="cstat-no" title="statement not covered" > }</span>
3139
+ <span class="cstat-no" title="statement not covered" > collabState.updatedAt = Date.now();</span>
3140
+ <span class="cstat-no" title="statement not covered" > collaborationSessions.set(conversationId, collabState);</span>
3141
+ <span class="cstat-no" title="statement not covered" ></span>
3142
+ <span class="cstat-no" title="statement not covered" > // Write-through to DB for restart recovery</span>
3143
+ <span class="cstat-no" title="statement not covered" > const convStoreForPersist = getServerConvStore();</span>
3144
+ <span class="cstat-no" title="statement not covered" > if (convStoreForPersist) {</span>
3145
+ <span class="cstat-no" title="statement not covered" > try {</span>
3146
+ <span class="cstat-no" title="statement not covered" > convStoreForPersist.saveCollabState(conversationId, collabState);</span>
3147
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
3148
+ <span class="cstat-no" title="statement not covered" > callLogger.warn('Failed to persist collab state to DB', {</span>
3149
+ <span class="cstat-no" title="statement not covered" > event: 'collab_state_persist_failed',</span>
3150
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3151
+ <span class="cstat-no" title="statement not covered" > });</span>
3152
+ <span class="cstat-no" title="statement not covered" > }</span>
3153
+ <span class="cstat-no" title="statement not covered" > }</span>
3154
+ <span class="cstat-no" title="statement not covered" ></span>
3155
+ <span class="cstat-no" title="statement not covered" > callLogger.info('Call turn completed', {</span>
3156
+ <span class="cstat-no" title="statement not covered" > event: 'call_turn_complete',</span>
3157
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3158
+ <span class="cstat-no" title="statement not covered" > phase: collabState.phase,</span>
3159
+ <span class="cstat-no" title="statement not covered" > overlap_score: collabState.overlapScore,</span>
3160
+ <span class="cstat-no" title="statement not covered" > turn_count: collabState.turnCount</span>
3161
+ <span class="cstat-no" title="statement not covered" > }</span>
3162
+ <span class="cstat-no" title="statement not covered" > });</span>
3163
+ <span class="cstat-no" title="statement not covered" ></span>
3164
+ <span class="cstat-no" title="statement not covered" > return cleanResponse || '[Sub-agent returned empty response]';</span>
3165
+ <span class="cstat-no" title="statement not covered" > </span>
3166
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
3167
+ <span class="cstat-no" title="statement not covered" > callLogger.error('Runtime turn handling failed', {</span>
3168
+ <span class="cstat-no" title="statement not covered" > event: 'call_turn_failed',</span>
3169
+ <span class="cstat-no" title="statement not covered" > error_code: 'RUNTIME_TURN_FAILED',</span>
3170
+ <span class="cstat-no" title="statement not covered" > hint: 'Inspect runtime adapter logs in this trace to identify CLI/bridge failure.',</span>
3171
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3172
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3173
+ <span class="cstat-no" title="statement not covered" > phase: 'runtime_turn'</span>
3174
+ <span class="cstat-no" title="statement not covered" > }</span>
3175
+ <span class="cstat-no" title="statement not covered" > });</span>
3176
+ <span class="cstat-no" title="statement not covered" > throw err;</span>
3177
+ <span class="cstat-no" title="statement not covered" > }</span>
3178
+ <span class="cstat-no" title="statement not covered" >}</span>
3179
+ &nbsp;
3180
+ /**
3181
+ * Generate strategic summary via sub-agent
3182
+ */
3183
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function generateSummary(messages, callerInfo) {</span></span>
3184
+ <span class="cstat-no" title="statement not covered" > // Look up collaboration state if we have a conversation_id</span>
3185
+ <span class="cstat-no" title="statement not covered" > const conversationId = callerInfo?.conversation_id || callerInfo?.conversationId;</span>
3186
+ <span class="cstat-no" title="statement not covered" > let collaborationState = null;</span>
3187
+ <span class="cstat-no" title="statement not covered" > if (conversationId) {</span>
3188
+ <span class="cstat-no" title="statement not covered" > const collabSession = collaborationSessions.get(conversationId);</span>
3189
+ <span class="cstat-no" title="statement not covered" > if (collabSession) {</span>
3190
+ <span class="cstat-no" title="statement not covered" > collaborationState = {</span>
3191
+ <span class="cstat-no" title="statement not covered" > phase: collabSession.phase,</span>
3192
+ <span class="cstat-no" title="statement not covered" > overlapScore: collabSession.overlapScore,</span>
3193
+ <span class="cstat-no" title="statement not covered" > turnCount: collabSession.turnCount,</span>
3194
+ <span class="cstat-no" title="statement not covered" > activeThreads: collabSession.activeThreads,</span>
3195
+ <span class="cstat-no" title="statement not covered" > candidateCollaborations: collabSession.candidateCollaborations,</span>
3196
+ <span class="cstat-no" title="statement not covered" > closeSignal: collabSession.closeSignal</span>
3197
+ <span class="cstat-no" title="statement not covered" > };</span>
3198
+ <span class="cstat-no" title="statement not covered" > }</span>
3199
+ <span class="cstat-no" title="statement not covered" > }</span>
3200
+ <span class="cstat-no" title="statement not covered" ></span>
3201
+ <span class="cstat-no" title="statement not covered" > // Load disclosure manifest for the caller's tier</span>
3202
+ <span class="cstat-no" title="statement not covered" > const tier = callerInfo?.tier || 'public';</span>
3203
+ <span class="cstat-no" title="statement not covered" > let disclosure = null;</span>
3204
+ <span class="cstat-no" title="statement not covered" > try {</span>
3205
+ <span class="cstat-no" title="statement not covered" > const tierTopics = getTopicsForTier(tier);</span>
3206
+ <span class="cstat-no" title="statement not covered" > if (tierTopics) {</span>
3207
+ <span class="cstat-no" title="statement not covered" > disclosure = {</span>
3208
+ <span class="cstat-no" title="statement not covered" > topics: tierTopics.topics || [],</span>
3209
+ <span class="cstat-no" title="statement not covered" > objectives: tierTopics.objectives || [],</span>
3210
+ <span class="cstat-no" title="statement not covered" > doNotDiscuss: tierTopics.do_not_discuss || [],</span>
3211
+ <span class="cstat-no" title="statement not covered" > neverDisclose: tierTopics.never_disclose || []</span>
3212
+ <span class="cstat-no" title="statement not covered" > };</span>
3213
+ <span class="cstat-no" title="statement not covered" > }</span>
3214
+ <span class="cstat-no" title="statement not covered" > } catch (e) {</span>
3215
+ <span class="cstat-no" title="statement not covered" > // Disclosure is optional — continue without it</span>
3216
+ <span class="cstat-no" title="statement not covered" > }</span>
3217
+ <span class="cstat-no" title="statement not covered" ></span>
3218
+ <span class="cstat-no" title="statement not covered" > // Build transcript in unified format</span>
3219
+ <span class="cstat-no" title="statement not covered" > const transcript = messages.map(m =&gt; ({</span>
3220
+ <span class="cstat-no" title="statement not covered" > direction: m.direction,</span>
3221
+ <span class="cstat-no" title="statement not covered" > content: m.content</span>
3222
+ <span class="cstat-no" title="statement not covered" > }));</span>
3223
+ <span class="cstat-no" title="statement not covered" ></span>
3224
+ <span class="cstat-no" title="statement not covered" > const prompt = buildUnifiedSummaryPrompt({</span>
3225
+ <span class="cstat-no" title="statement not covered" > transcript,</span>
3226
+ <span class="cstat-no" title="statement not covered" > callerInfo: {</span>
3227
+ <span class="cstat-no" title="statement not covered" > name: callerInfo?.name || null,</span>
3228
+ <span class="cstat-no" title="statement not covered" > owner: callerInfo?.owner || null,</span>
3229
+ <span class="cstat-no" title="statement not covered" > context: callerInfo?.context || null</span>
3230
+ <span class="cstat-no" title="statement not covered" > },</span>
3231
+ <span class="cstat-no" title="statement not covered" > disclosure,</span>
3232
+ <span class="cstat-no" title="statement not covered" > collaborationState,</span>
3233
+ <span class="cstat-no" title="statement not covered" > ownerContext: {</span>
3234
+ <span class="cstat-no" title="statement not covered" > agentName: agentContext.name,</span>
3235
+ <span class="cstat-no" title="statement not covered" > ownerName: agentContext.owner,</span>
3236
+ <span class="cstat-no" title="statement not covered" > goals: []</span>
3237
+ <span class="cstat-no" title="statement not covered" > }</span>
3238
+ <span class="cstat-no" title="statement not covered" > });</span>
3239
+ <span class="cstat-no" title="statement not covered" ></span>
3240
+ <span class="cstat-no" title="statement not covered" > try {</span>
3241
+ <span class="cstat-no" title="statement not covered" > const summarySessionId = conversationId ? `a2a-${conversationId}` : `summary-${Date.now()}`;</span>
3242
+ <span class="cstat-no" title="statement not covered" > return await runtime.summarize({</span>
3243
+ <span class="cstat-no" title="statement not covered" > sessionId: summarySessionId,</span>
3244
+ <span class="cstat-no" title="statement not covered" > prompt,</span>
3245
+ <span class="cstat-no" title="statement not covered" > messages,</span>
3246
+ <span class="cstat-no" title="statement not covered" > callerInfo,</span>
3247
+ <span class="cstat-no" title="statement not covered" > traceId: callerInfo?.trace_id || callerInfo?.traceId,</span>
3248
+ <span class="cstat-no" title="statement not covered" > conversationId</span>
3249
+ <span class="cstat-no" title="statement not covered" > });</span>
3250
+ <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
3251
+ <span class="cstat-no" title="statement not covered" > logger.error('Summary generation failed', {</span>
3252
+ <span class="cstat-no" title="statement not covered" > event: 'summary_generation_failed',</span>
3253
+ <span class="cstat-no" title="statement not covered" > traceId: callerInfo?.trace_id || callerInfo?.traceId,</span>
3254
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3255
+ <span class="cstat-no" title="statement not covered" > error_code: 'SUMMARY_GENERATION_FAILED',</span>
3256
+ <span class="cstat-no" title="statement not covered" > hint: 'Check summarizer runtime and command configuration for summary stage.',</span>
3257
+ <span class="cstat-no" title="statement not covered" > error: err,</span>
3258
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3259
+ <span class="cstat-no" title="statement not covered" > phase: 'summary'</span>
3260
+ <span class="cstat-no" title="statement not covered" > }</span>
3261
+ <span class="cstat-no" title="statement not covered" > });</span>
3262
+ <span class="cstat-no" title="statement not covered" > return null;</span>
3263
+ <span class="cstat-no" title="statement not covered" > }</span>
3264
+ <span class="cstat-no" title="statement not covered" >}</span>
3265
+ &nbsp;
3266
+ /**
3267
+ * Notify owner via Telegram
3268
+ */
3269
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >async function notifyOwner({ level, token, caller, message, conversation_id, trace_id }) {</span></span>
3270
+ <span class="cstat-no" title="statement not covered" > const callerName = caller?.name || 'Unknown';</span>
3271
+ <span class="cstat-no" title="statement not covered" > const callerOwner = caller?.owner ? ` (${caller.owner})` : '';</span>
3272
+ <span class="cstat-no" title="statement not covered" > const messageText = String(message || '');</span>
3273
+ <span class="cstat-no" title="statement not covered" > </span>
3274
+ <span class="cstat-no" title="statement not covered" > logger.info('Owner notification requested', {</span>
3275
+ <span class="cstat-no" title="statement not covered" > event: 'owner_notify_requested',</span>
3276
+ <span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
3277
+ <span class="cstat-no" title="statement not covered" > tokenId: token?.id,</span>
3278
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3279
+ <span class="cstat-no" title="statement not covered" > caller_name: callerName,</span>
3280
+ <span class="cstat-no" title="statement not covered" > caller_owner: caller?.owner || null,</span>
3281
+ <span class="cstat-no" title="statement not covered" > token_name: token?.name || 'unknown',</span>
3282
+ <span class="cstat-no" title="statement not covered" > level</span>
3283
+ <span class="cstat-no" title="statement not covered" > }</span>
3284
+ <span class="cstat-no" title="statement not covered" > });</span>
3285
+ <span class="cstat-no" title="statement not covered" ></span>
3286
+ <span class="cstat-no" title="statement not covered" > await runtime.notify({</span>
3287
+ <span class="cstat-no" title="statement not covered" > level,</span>
3288
+ <span class="cstat-no" title="statement not covered" > token,</span>
3289
+ <span class="cstat-no" title="statement not covered" > caller,</span>
3290
+ <span class="cstat-no" title="statement not covered" > message: messageText,</span>
3291
+ <span class="cstat-no" title="statement not covered" > conversationId: conversation_id,</span>
3292
+ <span class="cstat-no" title="statement not covered" > traceId: trace_id || null</span>
3293
+ <span class="cstat-no" title="statement not covered" > });</span>
3294
+ <span class="cstat-no" title="statement not covered" >}</span>
3295
+ &nbsp;
3296
+ const app = express();
3297
+ app.use(express.json());
3298
+ let activeCallMonitor = null;
3299
+ let updateManager = null;
3300
+ &nbsp;
3301
+ // Minimal owner dashboard (local by default unless A2A_ADMIN_TOKEN is provided)
3302
+ // All routes under /api/a2a/* so reverse proxy config stays simple.
3303
+ app.use('/api/a2a/dashboard', createDashboardApiRouter({
3304
+ tokenStore,
3305
+ agentContext,
3306
+ config,
3307
+ eventStore,
3308
+ callbookStore,
3309
+ getUpdateManager: <span class="fstat-no" title="function not covered" >() =&gt; updateManager,</span>
3310
+ logger: logger.child({ component: 'a2a.dashboard' })
3311
+ }));
3312
+ app.use('/api/a2a/dashboard', createDashboardUiRouter({
3313
+ tokenStore,
3314
+ agentContext,
3315
+ config,
3316
+ getUpdateManager: <span class="fstat-no" title="function not covered" >() =&gt; updateManager,</span>
3317
+ logger: logger.child({ component: 'a2a.dashboard' })
3318
+ }));
3319
+ &nbsp;
3320
+ // Callbook Remote pairing flow (public install page).
3321
+ // Mounted under /api/a2a/ for reverse proxy compatibility.
3322
+ app.use('/api/a2a/callbook', createCallbookRouter());
3323
+ &nbsp;
3324
+ // Legacy routes for backwards compatibility (direct access without reverse proxy)
3325
+ app.use('/dashboard', createDashboardUiRouter({
3326
+ tokenStore,
3327
+ agentContext,
3328
+ logger: logger.child({ component: 'a2a.dashboard' })
3329
+ }));
3330
+ app.use('/callbook', createCallbookRouter());
3331
+ &nbsp;
3332
+ // A2A-52: pass agent's public key so /status can advertise it
3333
+ const _a2aKeypair = config.getKeypair();
3334
+ app.use('/api/a2a', createRoutes({
3335
+ tokenStore,
3336
+ eventStore,
3337
+ publicKey: _a2aKeypair <span class="branch-0 cbranch-no" title="branch not covered" >? _a2aKeypair.publicKey </span>: null,
3338
+ logger: logger.child({ component: 'a2a.routes' }),
3339
+ onCallMonitor: (monitor) =&gt; {
3340
+ activeCallMonitor = monitor;
3341
+ },
3342
+
3343
+ <span class="fstat-no" title="function not covered" > async handleMessage(message, context, options) {</span>
3344
+ <span class="cstat-no" title="statement not covered" > const traceId = context.trace_id || null;</span>
3345
+ <span class="cstat-no" title="statement not covered" > const conversationId = context.conversation_id;</span>
3346
+ <span class="cstat-no" title="statement not covered" > const requestLogger = logger.child({</span>
3347
+ <span class="cstat-no" title="statement not covered" > traceId,</span>
3348
+ <span class="cstat-no" title="statement not covered" > conversationId,</span>
3349
+ <span class="cstat-no" title="statement not covered" > tokenId: context.token_id</span>
3350
+ <span class="cstat-no" title="statement not covered" > });</span>
3351
+ <span class="cstat-no" title="statement not covered" > requestLogger.info('Inbound message accepted for handling', {</span>
3352
+ <span class="cstat-no" title="statement not covered" > event: 'handle_message_start',</span>
3353
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3354
+ <span class="cstat-no" title="statement not covered" > caller_name: context.caller?.name || 'unknown'</span>
3355
+ <span class="cstat-no" title="statement not covered" > }</span>
3356
+ <span class="cstat-no" title="statement not covered" > });</span>
3357
+ <span class="cstat-no" title="statement not covered" ></span>
3358
+ <span class="cstat-no" title="statement not covered" > const response = await callAgent(message, context);</span>
3359
+ <span class="cstat-no" title="statement not covered" ></span>
3360
+ <span class="cstat-no" title="statement not covered" > // Check close conditions from collab state</span>
3361
+ <span class="cstat-no" title="statement not covered" > const collabState = collaborationSessions.get(conversationId);</span>
3362
+ <span class="cstat-no" title="statement not covered" > let canContinue = true;</span>
3363
+ <span class="cstat-no" title="statement not covered" > let collaboration = null;</span>
3364
+ <span class="cstat-no" title="statement not covered" ></span>
3365
+ <span class="cstat-no" title="statement not covered" > if (collabState) {</span>
3366
+ <span class="cstat-no" title="statement not covered" > collaboration = {</span>
3367
+ <span class="cstat-no" title="statement not covered" > phase: collabState.phase,</span>
3368
+ <span class="cstat-no" title="statement not covered" > turnCount: collabState.turnCount,</span>
3369
+ <span class="cstat-no" title="statement not covered" > overlapScore: collabState.overlapScore,</span>
3370
+ <span class="cstat-no" title="statement not covered" > activeThreads: collabState.activeThreads,</span>
3371
+ <span class="cstat-no" title="statement not covered" > candidateCollaborations: collabState.candidateCollaborations,</span>
3372
+ <span class="cstat-no" title="statement not covered" > closeSignal: collabState.closeSignal</span>
3373
+ <span class="cstat-no" title="statement not covered" > };</span>
3374
+ <span class="cstat-no" title="statement not covered" ></span>
3375
+ <span class="cstat-no" title="statement not covered" > if (collabState.closeSignal &amp;&amp; collabState.turnCount &gt;= 8) {</span>
3376
+ <span class="cstat-no" title="statement not covered" > canContinue = false;</span>
3377
+ <span class="cstat-no" title="statement not covered" > }</span>
3378
+ <span class="cstat-no" title="statement not covered" > }</span>
3379
+ <span class="cstat-no" title="statement not covered" ></span>
3380
+ <span class="cstat-no" title="statement not covered" > requestLogger.info('Outbound response generated', {</span>
3381
+ <span class="cstat-no" title="statement not covered" > event: 'handle_message_complete',</span>
3382
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3383
+ <span class="cstat-no" title="statement not covered" > response_length: String(response || '').length,</span>
3384
+ <span class="cstat-no" title="statement not covered" > can_continue: canContinue</span>
3385
+ <span class="cstat-no" title="statement not covered" > }</span>
3386
+ <span class="cstat-no" title="statement not covered" > });</span>
3387
+ <span class="cstat-no" title="statement not covered" ></span>
3388
+ <span class="cstat-no" title="statement not covered" > return { text: response, canContinue, collaboration };</span>
3389
+ },
3390
+
3391
+ summarizer: generateSummary,
3392
+ notifyOwner
3393
+ }));
3394
+ &nbsp;
3395
+ // A2A-76: Google A2A Agent Card — dynamically generated from config + disclosure
3396
+ app.get('/.well-known/a2a-agent-card', (req, res) =&gt; {
3397
+ <span class="cstat-no" title="statement not covered" > const agent = config.getAgent();</span>
3398
+ <span class="cstat-no" title="statement not covered" > const manifest = getTopicsForTier('public');</span>
3399
+ <span class="cstat-no" title="statement not covered" > const keypair = config.getKeypair();</span>
3400
+ <span class="cstat-no" title="statement not covered" > const hostname = (agent &amp;&amp; agent.hostname) || process.env.A2A_HOSTNAME || req.headers.host || 'localhost';</span>
3401
+ <span class="cstat-no" title="statement not covered" > const protocol = req.protocol || 'https';</span>
3402
+ <span class="cstat-no" title="statement not covered" > const card = buildAgentCard({</span>
3403
+ <span class="cstat-no" title="statement not covered" > config: { ...agent, owner: agentContext.owner },</span>
3404
+ <span class="cstat-no" title="statement not covered" > manifest,</span>
3405
+ <span class="cstat-no" title="statement not covered" > publicKey: keypair ? keypair.publicKey : null,</span>
3406
+ <span class="cstat-no" title="statement not covered" > serverUrl: `${protocol}://${hostname}`,</span>
3407
+ <span class="cstat-no" title="statement not covered" > version: require('../package.json').version</span>
3408
+ <span class="cstat-no" title="statement not covered" > });</span>
3409
+ <span class="cstat-no" title="statement not covered" > res.set('Cache-Control', 'public, max-age=3600');</span>
3410
+ <span class="cstat-no" title="statement not covered" > res.json(card);</span>
3411
+ });
3412
+ &nbsp;
3413
+ app.get('/', (req, res) =&gt; {
3414
+ <span class="cstat-no" title="statement not covered" > res.json({ service: 'a2a', status: 'ok', agent: agentContext.name });</span>
3415
+ });
3416
+ &nbsp;
3417
+ async function startServer() {
3418
+ let port;
3419
+ &nbsp;
3420
+ if (requestedPort) {
3421
+ // Explicit port requested — try it first, fall back to defaults if busy
3422
+ const { isPortAvailable } = require('./lib/port-scanner');
3423
+ if (await isPortAvailable(requestedPort)) {
3424
+ port = requestedPort;
3425
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
3426
+ <span class="cstat-no" title="statement not covered" > logger.warn('Requested port is in use, scanning for alternatives', {</span>
3427
+ <span class="cstat-no" title="statement not covered" > event: 'requested_port_in_use',</span>
3428
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3429
+ <span class="cstat-no" title="statement not covered" > requested_port: requestedPort</span>
3430
+ <span class="cstat-no" title="statement not covered" > }</span>
3431
+ <span class="cstat-no" title="statement not covered" > });</span>
3432
+ <span class="cstat-no" title="statement not covered" > port = await findAvailablePort(DEFAULT_PORTS);</span>
3433
+ <span class="cstat-no" title="statement not covered" > }</span>
3434
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
3435
+ <span class="cstat-no" title="statement not covered" > port = await findAvailablePort(DEFAULT_PORTS);</span>
3436
+ <span class="cstat-no" title="statement not covered" > }</span>
3437
+ &nbsp;
3438
+ if (!port) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
3439
+ <span class="cstat-no" title="statement not covered" > logger.error('No available port found', {</span>
3440
+ <span class="cstat-no" title="statement not covered" > event: 'port_unavailable',</span>
3441
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3442
+ <span class="cstat-no" title="statement not covered" > tried_ports: requestedPort ? [requestedPort, ...DEFAULT_PORTS] : DEFAULT_PORTS</span>
3443
+ <span class="cstat-no" title="statement not covered" > }</span>
3444
+ <span class="cstat-no" title="statement not covered" > });</span>
3445
+ <span class="cstat-no" title="statement not covered" > logger.error('Set PORT env or free one of the default ports.', {</span>
3446
+ <span class="cstat-no" title="statement not covered" > event: 'port_unavailable_hint'</span>
3447
+ <span class="cstat-no" title="statement not covered" > });</span>
3448
+ <span class="cstat-no" title="statement not covered" > process.exit(1);</span>
3449
+ <span class="cstat-no" title="statement not covered" > }</span>
3450
+ &nbsp;
3451
+ const server = app.listen(port, () =&gt; {
3452
+ logger.info('A2A server listening', {
3453
+ event: 'server_started',
3454
+ data: {
3455
+ port,
3456
+ agent_name: agentContext.name,
3457
+ runtime_mode: runtime.mode,
3458
+ collaboration_mode: resolveCollabMode(),
3459
+ features: ['adaptive collaboration', 'auto-contacts', 'summaries', 'dashboard']
3460
+ }
3461
+ });
3462
+ writePidFile(process.pid);
3463
+ &nbsp;
3464
+ // A2A-65: Run retention cleanup on startup (best effort — failures must not prevent server startup)
3465
+ try {
3466
+ const retention = config.getRetention();
3467
+ &nbsp;
3468
+ // Conversations retention
3469
+ const convStore = getServerConvStore();
3470
+ if (convStore) {
3471
+ try {
3472
+ const convResult = convStore.pruneOld({
3473
+ conversations_days: retention.conversations_days,
3474
+ compress_after_days: retention.compress_after_days
3475
+ });
3476
+ logger.info('Startup retention: conversations pruned', {
3477
+ event: 'startup_retention_conversations',
3478
+ data: convResult
3479
+ });
3480
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3481
+ <span class="cstat-no" title="statement not covered" > logger.warn('Startup retention: conversations prune failed', {</span>
3482
+ <span class="cstat-no" title="statement not covered" > event: 'startup_retention_conversations_failed',</span>
3483
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3484
+ <span class="cstat-no" title="statement not covered" > });</span>
3485
+ <span class="cstat-no" title="statement not covered" > }</span>
3486
+ }
3487
+ &nbsp;
3488
+ // Logger retention
3489
+ try {
3490
+ const logResults = pruneAllLoggerStores({ days: retention.logs_days });
3491
+ const totalDeleted = logResults.reduce((sum, r) =&gt; sum + (r.deleted || 0), 0);
3492
+ logger.info('Startup retention: logs pruned', {
3493
+ event: 'startup_retention_logs',
3494
+ data: { total_deleted: totalDeleted, stores_pruned: logResults.length }
3495
+ });
3496
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3497
+ <span class="cstat-no" title="statement not covered" > logger.warn('Startup retention: logs prune failed', {</span>
3498
+ <span class="cstat-no" title="statement not covered" > event: 'startup_retention_logs_failed',</span>
3499
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3500
+ <span class="cstat-no" title="statement not covered" > });</span>
3501
+ <span class="cstat-no" title="statement not covered" > }</span>
3502
+ &nbsp;
3503
+ // Token retention
3504
+ try {
3505
+ const tokenResult = tokenStore.cleanupExpired({
3506
+ token_expiry_grace_days: retention.token_expiry_grace_days
3507
+ });
3508
+ logger.info('Startup retention: tokens cleaned', {
3509
+ event: 'startup_retention_tokens',
3510
+ data: tokenResult
3511
+ });
3512
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3513
+ <span class="cstat-no" title="statement not covered" > logger.warn('Startup retention: token cleanup failed', {</span>
3514
+ <span class="cstat-no" title="statement not covered" > event: 'startup_retention_tokens_failed',</span>
3515
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3516
+ <span class="cstat-no" title="statement not covered" > });</span>
3517
+ <span class="cstat-no" title="statement not covered" > }</span>
3518
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
3519
+ <span class="cstat-no" title="statement not covered" > logger.warn('Startup retention failed', {</span>
3520
+ <span class="cstat-no" title="statement not covered" > event: 'startup_retention_failed',</span>
3521
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3522
+ <span class="cstat-no" title="statement not covered" > });</span>
3523
+ <span class="cstat-no" title="statement not covered" > }</span>
3524
+ &nbsp;
3525
+ if (!updateManager) {
3526
+ const pkg = require('../package.json');
3527
+ const restartFn = <span class="fstat-no" title="function not covered" >async () =&gt; {</span>
3528
+ <span class="cstat-no" title="statement not covered" > const cliPath = path.join(__dirname, '..', 'bin', 'cli.js');</span>
3529
+ <span class="cstat-no" title="statement not covered" > const helperScript = `</span>
3530
+ <span class="cstat-no" title="statement not covered" > const { spawn } = require('child_process');</span>
3531
+ <span class="cstat-no" title="statement not covered" > const startNext = () =&gt; {</span>
3532
+ <span class="cstat-no" title="statement not covered" > const child = spawn(process.execPath, [${JSON.stringify(cliPath)}, 'server', '--port', ${JSON.stringify(String(port))}], {</span>
3533
+ <span class="cstat-no" title="statement not covered" > detached: true,</span>
3534
+ <span class="cstat-no" title="statement not covered" > stdio: 'ignore',</span>
3535
+ <span class="cstat-no" title="statement not covered" > env: process.env</span>
3536
+ <span class="cstat-no" title="statement not covered" > });</span>
3537
+ <span class="cstat-no" title="statement not covered" > child.unref();</span>
3538
+ <span class="cstat-no" title="statement not covered" > process.exit(0);</span>
3539
+ <span class="cstat-no" title="statement not covered" > };</span>
3540
+ <span class="cstat-no" title="statement not covered" > setTimeout(startNext, 1500);</span>
3541
+ <span class="cstat-no" title="statement not covered" > `;</span>
3542
+ <span class="cstat-no" title="statement not covered" > const helper = spawn(process.execPath, ['-e', helperScript], {</span>
3543
+ <span class="cstat-no" title="statement not covered" > detached: true,</span>
3544
+ <span class="cstat-no" title="statement not covered" > stdio: 'ignore',</span>
3545
+ <span class="cstat-no" title="statement not covered" > env: process.env</span>
3546
+ <span class="cstat-no" title="statement not covered" > });</span>
3547
+ <span class="cstat-no" title="statement not covered" > helper.unref();</span>
3548
+ <span class="cstat-no" title="statement not covered" > setTimeout(() =&gt; {</span>
3549
+ <span class="cstat-no" title="statement not covered" > process.kill(process.pid, 'SIGTERM');</span>
3550
+ <span class="cstat-no" title="statement not covered" > }, 150);</span>
3551
+ };
3552
+ &nbsp;
3553
+ updateManager = new UpdateManager({
3554
+ currentVersion: pkg.version,
3555
+ config,
3556
+ logger: logger.child({ component: 'a2a.updater' }),
3557
+ getCallMonitor: <span class="fstat-no" title="function not covered" >() =&gt; activeCallMonitor,</span>
3558
+ restartFn
3559
+ });
3560
+ updateManager.start();
3561
+ updateManager.triggerCheck({ reason: 'startup' }).catch((err) =&gt; {
3562
+ <span class="cstat-no" title="statement not covered" > logger.warn('Initial auto-update check failed', {</span>
3563
+ <span class="cstat-no" title="statement not covered" > event: 'updater_startup_check_failed',</span>
3564
+ <span class="cstat-no" title="statement not covered" > error: err</span>
3565
+ <span class="cstat-no" title="statement not covered" > });</span>
3566
+ });
3567
+ }
3568
+ });
3569
+ &nbsp;
3570
+ server.on('error', (err) =&gt; {
3571
+ <span class="cstat-no" title="statement not covered" > if (err.code === 'EADDRINUSE') {</span>
3572
+ <span class="cstat-no" title="statement not covered" > logger.error('Bound port became unavailable (EADDRINUSE)', {</span>
3573
+ <span class="cstat-no" title="statement not covered" > event: 'server_port_lost',</span>
3574
+ <span class="cstat-no" title="statement not covered" > data: {</span>
3575
+ <span class="cstat-no" title="statement not covered" > port</span>
3576
+ <span class="cstat-no" title="statement not covered" > }</span>
3577
+ <span class="cstat-no" title="statement not covered" > });</span>
3578
+ <span class="cstat-no" title="statement not covered" > process.exit(1);</span>
3579
+ <span class="cstat-no" title="statement not covered" > }</span>
3580
+ <span class="cstat-no" title="statement not covered" > throw err;</span>
3581
+ });
3582
+ &nbsp;
3583
+ // A2A-57: Close all SQLite stores before shutting down the HTTP server
3584
+ function shutdown() {
3585
+ if (updateManager) updateManager.stop();
3586
+ removePidFile();
3587
+ if (serverConvStore &amp;&amp; serverConvStore.close) {
3588
+ try { serverConvStore.close(); } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
3589
+ }
3590
+ try { eventStore.close(); } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
3591
+ // A2A-59: Close CallbookStore to flush WAL on shutdown
3592
+ try { callbookStore.close(); } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
3593
+ try { closeAllLoggerStores(); } <span class="branch-0 cbranch-no" title="branch not covered" >catch (_) {}</span>
3594
+ server.close(() =&gt; process.exit(0));
3595
+ // Force exit after 5s if connections won't close
3596
+ setTimeout(() =&gt; process.exit(0), 5000).unref();
3597
+ }
3598
+ process.on('SIGTERM', shutdown);
3599
+ process.on('SIGINT', shutdown);
3600
+ }
3601
+ &nbsp;
3602
+ startServer();
3603
+ &nbsp;</pre></td></tr></table></pre>
3604
+
3605
+ <div class='push'></div><!-- for sticky footer -->
3606
+ </div><!-- /wrapper -->
3607
+ <div class='footer quiet pad2 space-top1 center small'>
3608
+ Code coverage generated by
3609
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3610
+ at 2026-03-03T22:25:10.857Z
3611
+ </div>
3612
+ <script src="../prettify.js"></script>
3613
+ <script>
3614
+ window.onload = function () {
3615
+ prettyPrint();
3616
+ };
3617
+ </script>
3618
+ <script src="../sorter.js"></script>
3619
+ <script src="../block-navigation.js"></script>
3620
+ </body>
3621
+ </html>
3622
+