a2acalling 0.6.73 → 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.
- package/.a2a-manifest.json +2 -2
- package/.c8rc.json +16 -0
- package/.node-version +1 -0
- package/.serena/project.yml +126 -0
- package/ARCHITECTURE.md +40 -16
- package/CONVENTIONS.md +39 -6
- package/biome.json +27 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.js.html +313 -0
- package/coverage/src/lib/agent-card.js.html +418 -0
- package/coverage/src/lib/call-monitor.js.html +700 -0
- package/coverage/src/lib/callbook.js.html +1183 -0
- package/coverage/src/lib/claude-subagent.js.html +2173 -0
- package/coverage/src/lib/client.js.html +2134 -0
- package/coverage/src/lib/config.js.html +1525 -0
- package/coverage/src/lib/conversation-driver.js.html +1909 -0
- package/coverage/src/lib/conversations.js.html +2575 -0
- package/coverage/src/lib/crypto.js.html +424 -0
- package/coverage/src/lib/dashboard-events.js.html +724 -0
- package/coverage/src/lib/disclosure.js.html +2461 -0
- package/coverage/src/lib/external-ip.js.html +718 -0
- package/coverage/src/lib/index.html +506 -0
- package/coverage/src/lib/invite-host.js.html +754 -0
- package/coverage/src/lib/local-request.js.html +292 -0
- package/coverage/src/lib/logger.js.html +2116 -0
- package/coverage/src/lib/openclaw-integration.js.html +1102 -0
- package/coverage/src/lib/pid-file.js.html +394 -0
- package/coverage/src/lib/port-scanner.js.html +334 -0
- package/coverage/src/lib/prompt-template.js.html +1150 -0
- package/coverage/src/lib/runtime-adapter.js.html +2188 -0
- package/coverage/src/lib/summarizer.js.html +553 -0
- package/coverage/src/lib/summary-formatter.js.html +589 -0
- package/coverage/src/lib/summary-prompt.js.html +694 -0
- package/coverage/src/lib/tokens.js.html +2689 -0
- package/coverage/src/lib/turn-timeout.js.html +241 -0
- package/coverage/src/lib/update-checker.js.html +364 -0
- package/coverage/src/lib/update-manager.js.html +1024 -0
- package/coverage/src/routes/a2a.js.html +3724 -0
- package/coverage/src/routes/callbook.js.html +511 -0
- package/coverage/src/routes/dashboard.js.html +4819 -0
- package/coverage/src/routes/index.html +146 -0
- package/coverage/src/server.js.html +3622 -0
- package/coverage/tmp/coverage-1605378-1772576706365-0.json +1 -0
- package/coverage/tmp/coverage-1605384-1772576607459-0.json +1 -0
- package/coverage/tmp/coverage-1605410-1772576631155-0.json +1 -0
- package/coverage/tmp/coverage-1606942-1772576636869-0.json +1 -0
- package/coverage/tmp/coverage-1607004-1772576637454-0.json +1 -0
- package/coverage/tmp/coverage-1607044-1772576637876-0.json +1 -0
- package/coverage/tmp/coverage-1607096-1772576638356-0.json +1 -0
- package/coverage/tmp/coverage-1607145-1772576638777-0.json +1 -0
- package/coverage/tmp/coverage-1607201-1772576639277-0.json +1 -0
- package/coverage/tmp/coverage-1607247-1772576639755-0.json +1 -0
- package/coverage/tmp/coverage-1607317-1772576640083-0.json +1 -0
- package/coverage/tmp/coverage-1607381-1772576640465-0.json +1 -0
- package/coverage/tmp/coverage-1607446-1772576640868-0.json +1 -0
- package/coverage/tmp/coverage-1607501-1772576641662-0.json +1 -0
- package/coverage/tmp/coverage-1607534-1772576641565-0.json +1 -0
- package/coverage/tmp/coverage-1607627-1772576641871-0.json +1 -0
- package/coverage/tmp/coverage-1607665-1772576642172-0.json +1 -0
- package/coverage/tmp/coverage-1607714-1772576642577-0.json +1 -0
- package/coverage/tmp/coverage-1607788-1772576643466-0.json +1 -0
- package/coverage/tmp/coverage-1607924-1772576644678-0.json +1 -0
- package/coverage/tmp/coverage-1607978-1772576645154-0.json +1 -0
- package/coverage/tmp/coverage-1608035-1772576645564-0.json +1 -0
- package/coverage/tmp/coverage-1608106-1772576645967-0.json +1 -0
- package/coverage/tmp/coverage-1608179-1772576648656-0.json +1 -0
- package/coverage/tmp/coverage-1608196-1772576647367-0.json +1 -0
- package/coverage/tmp/coverage-1608217-1772576648557-0.json +1 -0
- package/coverage/tmp/coverage-1608256-1772576651378-0.json +1 -0
- package/coverage/tmp/coverage-1608265-1772576650058-0.json +1 -0
- package/coverage/tmp/coverage-1608289-1772576651358-0.json +1 -0
- package/coverage/tmp/coverage-1608591-1772576660465-0.json +1 -0
- package/coverage/tmp/coverage-1608648-1772576659272-0.json +1 -0
- package/coverage/tmp/coverage-1608665-1772576660374-0.json +1 -0
- package/coverage/tmp/coverage-1608677-1772576661268-0.json +1 -0
- package/coverage/tmp/coverage-1608684-1772576663968-0.json +1 -0
- package/coverage/tmp/coverage-1608692-1772576662575-0.json +1 -0
- package/coverage/tmp/coverage-1608701-1772576663873-0.json +1 -0
- package/coverage/tmp/coverage-1608718-1772576666674-0.json +1 -0
- package/coverage/tmp/coverage-1608725-1772576665463-0.json +1 -0
- package/coverage/tmp/coverage-1608738-1772576666577-0.json +1 -0
- package/coverage/tmp/coverage-1608753-1772576669664-0.json +1 -0
- package/coverage/tmp/coverage-1608763-1772576668275-0.json +1 -0
- package/coverage/tmp/coverage-1608771-1772576669563-0.json +1 -0
- package/coverage/tmp/coverage-1608828-1772576676574-0.json +1 -0
- package/coverage/tmp/coverage-1609244-1772576675272-0.json +1 -0
- package/coverage/tmp/coverage-1609342-1772576676478-0.json +1 -0
- package/coverage/tmp/coverage-1609450-1772576686954-0.json +1 -0
- package/coverage/tmp/coverage-1609841-1772576685466-0.json +1 -0
- package/coverage/tmp/coverage-1609925-1772576686855-0.json +1 -0
- package/coverage/tmp/coverage-1610399-1772576692469-0.json +1 -0
- package/coverage/tmp/coverage-1611283-1772576703062-0.json +1 -0
- package/coverage/tmp/coverage-1611294-1772576703755-0.json +1 -0
- package/docs/assessments/2026-02-27-google-a2a-protocol-assessment.md +292 -0
- package/docs/plans/2026-03-01-a2a-68-openclaw-integration-tests.md +676 -0
- package/docs/plans/2026-03-01-a2a-77-invoke-security-tests.md +661 -0
- package/docs/plans/2026-03-03-a2a-91-macos-packaging-plan.md +144 -0
- package/docs/signing-setup.md +49 -0
- package/eslint.config.js +16 -0
- package/knip.json +17 -0
- package/native/macos/certs/appldevcert.cer +0 -0
- package/native/macos/src-tauri/binaries/.gitkeep +0 -0
- package/native/macos/src-tauri/capabilities/default.json +11 -1
- package/native/macos/src-tauri/entitlements.plist +14 -0
- package/native/macos/src-tauri/src/discovery.rs +14 -3
- package/native/macos/src-tauri/src/health.rs +4 -0
- package/native/macos/src-tauri/src/lib.rs +52 -11
- package/native/macos/src-tauri/src/server.rs +262 -26
- package/native/macos/src-tauri/tauri.conf.json +13 -4
- package/package.json +16 -2
- package/pkg.config.json +14 -0
- package/scripts/build-standalone.sh +106 -0
- package/scripts/install-openclaw.js +3 -5
- package/scripts/smoke-test-standalone.sh +101 -0
- package/scripts/sync-version.sh +28 -0
- package/scripts/verify-app-bundle.sh +34 -0
- package/src/lib/agent-card.js +111 -0
- package/src/lib/client.js +290 -49
- package/src/lib/conversations.js +2 -0
- package/src/lib/local-request.js +69 -0
- package/src/lib/logger.js +2 -0
- package/src/lib/runtime-adapter.js +41 -1
- package/src/routes/a2a.js +393 -66
- package/src/routes/dashboard.js +1 -27
- package/src/server.js +19 -0
- package/.maestro/inbox/release-workflow-spam.md +0 -25
|
@@ -0,0 +1,2461 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/lib/disclosure.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/lib</a> disclosure.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">81.81% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>648/792</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">70.7% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>111/157</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">78.26% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>18/23</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">81.81% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>648/792</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">80x</span>
|
|
859
|
+
<span class="cline-any cline-yes">80x</span>
|
|
860
|
+
<span class="cline-any cline-yes">80x</span>
|
|
861
|
+
<span class="cline-any cline-yes">80x</span>
|
|
862
|
+
<span class="cline-any cline-yes">80x</span>
|
|
863
|
+
<span class="cline-any cline-yes">80x</span>
|
|
864
|
+
<span class="cline-any cline-yes">80x</span>
|
|
865
|
+
<span class="cline-any cline-yes">80x</span>
|
|
866
|
+
<span class="cline-any cline-yes">80x</span>
|
|
867
|
+
<span class="cline-any cline-yes">80x</span>
|
|
868
|
+
<span class="cline-any cline-yes">80x</span>
|
|
869
|
+
<span class="cline-any cline-yes">80x</span>
|
|
870
|
+
<span class="cline-any cline-yes">80x</span>
|
|
871
|
+
<span class="cline-any cline-yes">80x</span>
|
|
872
|
+
<span class="cline-any cline-yes">80x</span>
|
|
873
|
+
<span class="cline-any cline-yes">80x</span>
|
|
874
|
+
<span class="cline-any cline-yes">80x</span>
|
|
875
|
+
<span class="cline-any cline-yes">80x</span>
|
|
876
|
+
<span class="cline-any cline-yes">80x</span>
|
|
877
|
+
<span class="cline-any cline-yes">80x</span>
|
|
878
|
+
<span class="cline-any cline-yes">80x</span>
|
|
879
|
+
<span class="cline-any cline-yes">80x</span>
|
|
880
|
+
<span class="cline-any cline-yes">80x</span>
|
|
881
|
+
<span class="cline-any cline-yes">80x</span>
|
|
882
|
+
<span class="cline-any cline-yes">80x</span>
|
|
883
|
+
<span class="cline-any cline-yes">80x</span>
|
|
884
|
+
<span class="cline-any cline-yes">80x</span>
|
|
885
|
+
<span class="cline-any cline-yes">80x</span>
|
|
886
|
+
<span class="cline-any cline-yes">80x</span>
|
|
887
|
+
<span class="cline-any cline-yes">80x</span>
|
|
888
|
+
<span class="cline-any cline-yes">80x</span>
|
|
889
|
+
<span class="cline-any cline-yes">80x</span>
|
|
890
|
+
<span class="cline-any cline-yes">711x</span>
|
|
891
|
+
<span class="cline-any cline-yes">711x</span>
|
|
892
|
+
<span class="cline-any cline-yes">711x</span>
|
|
893
|
+
<span class="cline-any cline-yes">80x</span>
|
|
894
|
+
<span class="cline-any cline-yes">67x</span>
|
|
895
|
+
<span class="cline-any cline-yes">67x</span>
|
|
896
|
+
<span class="cline-any cline-yes">67x</span>
|
|
897
|
+
<span class="cline-any cline-yes">67x</span>
|
|
898
|
+
<span class="cline-any cline-yes">141x</span>
|
|
899
|
+
<span class="cline-any cline-yes">141x</span>
|
|
900
|
+
<span class="cline-any cline-yes">141x</span>
|
|
901
|
+
<span class="cline-any cline-yes">141x</span>
|
|
902
|
+
<span class="cline-any cline-yes">141x</span>
|
|
903
|
+
<span class="cline-any cline-yes">141x</span>
|
|
904
|
+
<span class="cline-any cline-yes">141x</span>
|
|
905
|
+
<span class="cline-any cline-yes">141x</span>
|
|
906
|
+
<span class="cline-any cline-yes">67x</span>
|
|
907
|
+
<span class="cline-any cline-yes">67x</span>
|
|
908
|
+
<span class="cline-any cline-yes">80x</span>
|
|
909
|
+
<span class="cline-any cline-yes">64x</span>
|
|
910
|
+
<span class="cline-any cline-yes">64x</span>
|
|
911
|
+
<span class="cline-any cline-yes">64x</span>
|
|
912
|
+
<span class="cline-any cline-yes">64x</span>
|
|
913
|
+
<span class="cline-any cline-yes">113x</span>
|
|
914
|
+
<span class="cline-any cline-yes">113x</span>
|
|
915
|
+
<span class="cline-any cline-yes">113x</span>
|
|
916
|
+
<span class="cline-any cline-yes">113x</span>
|
|
917
|
+
<span class="cline-any cline-yes">113x</span>
|
|
918
|
+
<span class="cline-any cline-yes">113x</span>
|
|
919
|
+
<span class="cline-any cline-yes">113x</span>
|
|
920
|
+
<span class="cline-any cline-yes">113x</span>
|
|
921
|
+
<span class="cline-any cline-yes">64x</span>
|
|
922
|
+
<span class="cline-any cline-yes">64x</span>
|
|
923
|
+
<span class="cline-any cline-yes">80x</span>
|
|
924
|
+
<span class="cline-any cline-yes">64x</span>
|
|
925
|
+
<span class="cline-any cline-yes">64x</span>
|
|
926
|
+
<span class="cline-any cline-yes">64x</span>
|
|
927
|
+
<span class="cline-any cline-yes">64x</span>
|
|
928
|
+
<span class="cline-any cline-yes">58x</span>
|
|
929
|
+
<span class="cline-any cline-yes">58x</span>
|
|
930
|
+
<span class="cline-any cline-yes">58x</span>
|
|
931
|
+
<span class="cline-any cline-yes">58x</span>
|
|
932
|
+
<span class="cline-any cline-yes">58x</span>
|
|
933
|
+
<span class="cline-any cline-yes">58x</span>
|
|
934
|
+
<span class="cline-any cline-yes">58x</span>
|
|
935
|
+
<span class="cline-any cline-yes">58x</span>
|
|
936
|
+
<span class="cline-any cline-yes">64x</span>
|
|
937
|
+
<span class="cline-any cline-yes">64x</span>
|
|
938
|
+
<span class="cline-any cline-yes">80x</span>
|
|
939
|
+
<span class="cline-any cline-yes">91x</span>
|
|
940
|
+
<span class="cline-any cline-yes">91x</span>
|
|
941
|
+
<span class="cline-any cline-yes">91x</span>
|
|
942
|
+
<span class="cline-any cline-yes">91x</span>
|
|
943
|
+
<span class="cline-any cline-yes">91x</span>
|
|
944
|
+
<span class="cline-any cline-yes">87x</span>
|
|
945
|
+
<span class="cline-any cline-yes">87x</span>
|
|
946
|
+
<span class="cline-any cline-yes">87x</span>
|
|
947
|
+
<span class="cline-any cline-yes">87x</span>
|
|
948
|
+
<span class="cline-any cline-yes">63x</span>
|
|
949
|
+
<span class="cline-any cline-yes">63x</span>
|
|
950
|
+
<span class="cline-any cline-yes">63x</span>
|
|
951
|
+
<span class="cline-any cline-yes">91x</span>
|
|
952
|
+
<span class="cline-any cline-yes">91x</span>
|
|
953
|
+
<span class="cline-any cline-yes">80x</span>
|
|
954
|
+
<span class="cline-any cline-no"> </span>
|
|
955
|
+
<span class="cline-any cline-no"> </span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-no"> </span>
|
|
958
|
+
<span class="cline-any cline-yes">80x</span>
|
|
959
|
+
<span class="cline-any cline-no"> </span>
|
|
960
|
+
<span class="cline-any cline-no"> </span>
|
|
961
|
+
<span class="cline-any cline-no"> </span>
|
|
962
|
+
<span class="cline-any cline-no"> </span>
|
|
963
|
+
<span class="cline-any cline-no"> </span>
|
|
964
|
+
<span class="cline-any cline-no"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-no"> </span>
|
|
967
|
+
<span class="cline-any cline-no"> </span>
|
|
968
|
+
<span class="cline-any cline-no"> </span>
|
|
969
|
+
<span class="cline-any cline-no"> </span>
|
|
970
|
+
<span class="cline-any cline-no"> </span>
|
|
971
|
+
<span class="cline-any cline-no"> </span>
|
|
972
|
+
<span class="cline-any cline-yes">80x</span>
|
|
973
|
+
<span class="cline-any cline-no"> </span>
|
|
974
|
+
<span class="cline-any cline-no"> </span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-no"> </span>
|
|
977
|
+
<span class="cline-any cline-no"> </span>
|
|
978
|
+
<span class="cline-any cline-no"> </span>
|
|
979
|
+
<span class="cline-any cline-no"> </span>
|
|
980
|
+
<span class="cline-any cline-no"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-no"> </span>
|
|
985
|
+
<span class="cline-any cline-yes">80x</span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-yes">80x</span>
|
|
995
|
+
<span class="cline-any cline-yes">80x</span>
|
|
996
|
+
<span class="cline-any cline-yes">80x</span>
|
|
997
|
+
<span class="cline-any cline-yes">80x</span>
|
|
998
|
+
<span class="cline-any cline-yes">133x</span>
|
|
999
|
+
<span class="cline-any cline-yes">133x</span>
|
|
1000
|
+
<span class="cline-any cline-yes">133x</span>
|
|
1001
|
+
<span class="cline-any cline-yes">54x</span>
|
|
1002
|
+
<span class="cline-any cline-yes">54x</span>
|
|
1003
|
+
<span class="cline-any cline-yes">133x</span>
|
|
1004
|
+
<span class="cline-any cline-no"> </span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-yes">79x</span>
|
|
1015
|
+
<span class="cline-any cline-yes">133x</span>
|
|
1016
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1026
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1027
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1028
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1029
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1030
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-yes">25x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1036
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1037
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1038
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1039
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1040
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1041
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1042
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1047
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1048
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1052
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1055
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1056
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1057
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1058
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1059
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1060
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1061
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1062
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1063
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1064
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1065
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1067
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1068
|
+
<span class="cline-any cline-yes">84x</span>
|
|
1069
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1070
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1071
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1072
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1073
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1074
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1075
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1076
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1077
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1078
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1079
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1080
|
+
<span class="cline-any cline-yes">64x</span>
|
|
1081
|
+
<span class="cline-any cline-yes">65x</span>
|
|
1082
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1083
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1084
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1085
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1086
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1087
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1088
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1089
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1090
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1091
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1092
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1093
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1094
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1095
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1096
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1097
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1098
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1099
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1100
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1101
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1102
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1103
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1104
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1105
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1107
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1108
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1109
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1110
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1111
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1112
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1113
|
+
<span class="cline-any cline-yes">55x</span>
|
|
1114
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1115
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1117
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1118
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1119
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1120
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1121
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1122
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1123
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1124
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1125
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1126
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1131
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1132
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1133
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1134
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1135
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1136
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1137
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1138
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1139
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1140
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1141
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1142
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1145
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1146
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1147
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1148
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1149
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1150
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1151
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1155
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1156
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1157
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1158
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1159
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1160
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1161
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1162
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1163
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1164
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1165
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1166
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1167
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1168
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1169
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1170
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1171
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1172
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1173
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1174
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1175
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1176
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1177
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1178
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1179
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1180
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1219
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1220
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1221
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1223
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1224
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1225
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1226
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1227
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1228
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1229
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1230
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1231
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1232
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1233
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1234
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1235
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1236
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1237
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1238
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1239
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1240
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1241
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1242
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1243
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1252
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1253
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1254
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1255
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1256
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1257
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1258
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1259
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1260
|
+
<span class="cline-any cline-yes">18x</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">17x</span>
|
|
1264
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1265
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1266
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1267
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1268
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1269
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1270
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1271
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1272
|
+
<span class="cline-any cline-yes">45x</span>
|
|
1273
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1274
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1275
|
+
<span class="cline-any cline-yes">45x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">17x</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">14x</span>
|
|
1280
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1281
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1282
|
+
<span class="cline-any cline-yes">17x</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">14x</span>
|
|
1286
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1287
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1288
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1289
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1290
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1291
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1292
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1293
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1296
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1297
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1298
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1299
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1300
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1301
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1302
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1303
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1304
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1305
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1306
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1307
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1308
|
+
<span class="cline-any cline-yes">40x</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">40x</span>
|
|
1312
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-yes">40x</span>
|
|
1316
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1317
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1318
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1319
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1320
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1321
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1324
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1328
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1329
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1342
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1345
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1349
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1350
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1354
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1355
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1356
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1357
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1358
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-yes">42x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1385
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1389
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-yes">7x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1397
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1398
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1399
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1400
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1406
|
+
<span class="cline-any cline-yes">14x</span>
|
|
1407
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1408
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1409
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1410
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1411
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1412
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1413
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1419
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1420
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1421
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1422
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1423
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1424
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1427
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1428
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1430
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1431
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1432
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1433
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1434
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1435
|
+
<span class="cline-any cline-yes">27x</span>
|
|
1436
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1437
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1438
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1439
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1440
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1441
|
+
<span class="cline-any cline-yes">9x</span>
|
|
1442
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1443
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1444
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1445
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">18x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">20x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">16x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1468
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1469
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1470
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1471
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1472
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1473
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1474
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1475
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1476
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1477
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1478
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1479
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1480
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1481
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1482
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1483
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1484
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1485
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1486
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1487
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1488
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1489
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1490
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1491
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1492
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1493
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1494
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1495
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1496
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1497
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1498
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1499
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1500
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1501
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1502
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1503
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1504
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1505
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1506
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1507
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1508
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1509
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1510
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1511
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1512
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1513
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1514
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1515
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1516
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1517
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1518
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1519
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1520
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1521
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1522
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1523
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1524
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1525
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1526
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1527
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1528
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1529
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1530
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1531
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1532
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1533
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1534
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1535
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1536
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1537
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1538
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1539
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1540
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1541
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1542
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1543
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1544
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1545
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1546
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1547
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1548
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1549
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1550
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1551
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1552
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1553
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1554
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1555
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1556
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1557
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1558
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1559
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1560
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1561
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1562
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1563
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1564
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1565
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1566
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1567
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1568
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1569
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1570
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1571
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1572
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1573
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1574
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1575
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1576
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1577
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1578
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1579
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1580
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1581
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1582
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1583
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1584
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1585
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1586
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1587
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1588
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1589
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1590
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1591
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1592
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1593
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1594
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1595
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1596
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1597
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1598
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1599
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1600
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1601
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1602
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1603
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1604
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1605
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1606
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1607
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1608
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1609
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1610
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1611
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1612
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1613
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1614
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1615
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1616
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1617
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1618
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1619
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1620
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1621
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1622
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1623
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1624
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1625
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1626
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1627
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1628
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1629
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1630
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1631
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1632
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1633
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1634
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1635
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1636
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1637
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1638
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1639
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1640
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1641
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1642
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1643
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1644
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1645
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1646
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1647
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1648
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1649
|
+
<span class="cline-any cline-yes">80x</span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1651
|
+
* Disclosure Manifest System
|
|
1652
|
+
*
|
|
1653
|
+
* Manages a structured list of topics the owner wants to discuss
|
|
1654
|
+
* at each access tier. Stored as JSON at ~/.config/openclaw/a2a-disclosure.json.
|
|
1655
|
+
*/
|
|
1656
|
+
|
|
1657
|
+
const fs = require('fs');
|
|
1658
|
+
const path = require('path');
|
|
1659
|
+
const { createLogger } = require('./logger');
|
|
1660
|
+
|
|
1661
|
+
const CONFIG_DIR = process.env.A2A_CONFIG_DIR ||
|
|
1662
|
+
process.env.OPENCLAW_CONFIG_DIR ||
|
|
1663
|
+
path.join(process.env.HOME <span class="branch-0 cbranch-no" title="branch not covered" >|| '/tmp',</span> '.config', 'openclaw');
|
|
1664
|
+
|
|
1665
|
+
const MANIFEST_FILE = path.join(CONFIG_DIR, 'a2a-disclosure.json');
|
|
1666
|
+
|
|
1667
|
+
const TIER_HIERARCHY = ['public', 'friends', 'family'];
|
|
1668
|
+
const logger = createLogger({ component: 'a2a.disclosure' });
|
|
1669
|
+
const SKIP_FILES = new Set(['heartbeat', 'skill', 'claude']);
|
|
1670
|
+
const CANONICAL_TOOL_NAMES = ['Bash', 'Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'];
|
|
1671
|
+
const TOOL_NAME_MAP = {
|
|
1672
|
+
bash: 'Bash',
|
|
1673
|
+
'bash(readonly)': 'Bash(readonly)',
|
|
1674
|
+
'bash-readonly': 'Bash(readonly)',
|
|
1675
|
+
read: 'Read',
|
|
1676
|
+
grep: 'Grep',
|
|
1677
|
+
glob: 'Glob',
|
|
1678
|
+
websearch: 'WebSearch',
|
|
1679
|
+
webfetch: 'WebFetch'
|
|
1680
|
+
};
|
|
1681
|
+
|
|
1682
|
+
function normalizeTopic(raw) {
|
|
1683
|
+
return String(raw <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.trim();
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
function dedupeByTopic(items) {
|
|
1687
|
+
const seen = new Set();
|
|
1688
|
+
const out = [];
|
|
1689
|
+
for (const item of items) {
|
|
1690
|
+
const topic = normalizeTopic(item && item.topic);
|
|
1691
|
+
if (!topic || seen.has(topic.toLowerCase())) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
|
|
1692
|
+
seen.add(topic.toLowerCase());
|
|
1693
|
+
out.push({
|
|
1694
|
+
topic,
|
|
1695
|
+
description: normalizeTopic(item && item.description)
|
|
1696
|
+
});
|
|
1697
|
+
}
|
|
1698
|
+
return out;
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
function dedupeByObjective(items) {
|
|
1702
|
+
const seen = new Set();
|
|
1703
|
+
const out = [];
|
|
1704
|
+
for (const item of items) {
|
|
1705
|
+
const objective = normalizeTopic(item && item.objective);
|
|
1706
|
+
if (!objective || seen.has(objective.toLowerCase())) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
|
|
1707
|
+
seen.add(objective.toLowerCase());
|
|
1708
|
+
out.push({
|
|
1709
|
+
objective,
|
|
1710
|
+
description: normalizeTopic(item && item.description)
|
|
1711
|
+
});
|
|
1712
|
+
}
|
|
1713
|
+
return out;
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
function dedupeDoNotDiscuss(items) {
|
|
1717
|
+
const seen = new Set();
|
|
1718
|
+
const out = [];
|
|
1719
|
+
for (const item of items) {
|
|
1720
|
+
const topic = normalizeTopic(item && item.topic);
|
|
1721
|
+
if (!topic || seen.has(topic.toLowerCase())) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
|
|
1722
|
+
seen.add(topic.toLowerCase());
|
|
1723
|
+
out.push({
|
|
1724
|
+
topic,
|
|
1725
|
+
reason: normalizeTopic(item && item.reason)
|
|
1726
|
+
});
|
|
1727
|
+
}
|
|
1728
|
+
return out;
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
function dedupeStringList(items, maxLength = 80) {
|
|
1732
|
+
if (!Array.isArray(items)) <span class="branch-0 cbranch-no" title="branch not covered" >return [];</span>
|
|
1733
|
+
const seen = new Set();
|
|
1734
|
+
const out = [];
|
|
1735
|
+
for (const item of items) {
|
|
1736
|
+
const normalized = normalizeTopic(item).slice(0, maxLength);
|
|
1737
|
+
if (!normalized) <span class="branch-0 cbranch-no" title="branch not covered" >continue;</span>
|
|
1738
|
+
const key = normalized.toLowerCase();
|
|
1739
|
+
if (seen.has(key)) continue;
|
|
1740
|
+
seen.add(key);
|
|
1741
|
+
out.push(normalized);
|
|
1742
|
+
}
|
|
1743
|
+
return out;
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function normalizeToolName(value) {</span></span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" > const key = normalizeTopic(value).toLowerCase();</span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" > return TOOL_NAME_MAP[key] || null;</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1750
|
+
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function parseTopicLine(rawLine) {</span></span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > const line = normalizeTopic(rawLine);</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > if (!line) return null;</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" > const splitPoint = line.search(/\s+[-–—:]\s+/);</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" > if (splitPoint > 10) {</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" > const topic = normalizeTopic(line.slice(0, splitPoint));</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" > const detail = normalizeTopic(line.slice(splitPoint + 3));</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" > return { topic, detail };</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > return { topic: line, detail: '' };</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1764
|
+
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function isValidTopic(line) {</span></span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" > if (!line || line.length < 5) return false;</span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('`')) return false;</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('http')) return false;</span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('**:')) return false;</span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" > if (line.startsWith('//')) return false;</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('()')) return false;</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" > if (/\d{4}-\d{2}-\d{2}/.test(line)) return false;</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > if (line.toLowerCase().includes('todo')) return false;</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" > if (line.toLowerCase().includes('fixme')) return false;</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1777
|
+
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function truncateAtWordBoundary(text, max = 60) {</span></span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" > const normalized = normalizeTopic(text);</span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" > if (normalized.length <= max) return normalized;</span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > const truncated = normalized.slice(0, max);</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > const lastSpace = truncated.lastIndexOf(' ');</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > return (lastSpace > 20 ? truncated.slice(0, lastSpace) : truncated) + '...';</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1786
|
+
|
|
1787
|
+
/**
|
|
1788
|
+
* Load manifest from disk. Returns {} if not found.
|
|
1789
|
+
*/
|
|
1790
|
+
function loadManifest() {
|
|
1791
|
+
try {
|
|
1792
|
+
if (fs.existsSync(MANIFEST_FILE)) {
|
|
1793
|
+
return JSON.parse(fs.readFileSync(MANIFEST_FILE, 'utf8'));
|
|
1794
|
+
}
|
|
1795
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (e) {</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Failed to load disclosure manifest', {</span>
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" > event: 'disclosure_manifest_load_failed',</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > error: e,</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'DISCLOSURE_MANIFEST_LOAD_FAILED',</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Fix invalid JSON or file permissions in a2a-disclosure.json.',</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" > manifest_file: MANIFEST_FILE</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1804
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1806
|
+
return {};
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
/**
|
|
1810
|
+
* Save manifest to disk.
|
|
1811
|
+
*/
|
|
1812
|
+
function saveManifest(manifest) {
|
|
1813
|
+
if (!fs.existsSync(CONFIG_DIR)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1814
|
+
<span class="cstat-no" title="statement not covered" > fs.mkdirSync(CONFIG_DIR, { recursive: true });</span>
|
|
1815
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1816
|
+
manifest.updated_at = new Date().toISOString();
|
|
1817
|
+
const tmpPath = `${MANIFEST_FILE}.tmp`;
|
|
1818
|
+
fs.writeFileSync(tmpPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });
|
|
1819
|
+
fs.renameSync(tmpPath, MANIFEST_FILE);
|
|
1820
|
+
try {
|
|
1821
|
+
fs.chmodSync(MANIFEST_FILE, 0o600);
|
|
1822
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
1823
|
+
<span class="cstat-no" title="statement not covered" > // Best effort - ignore on platforms without chmod support.</span>
|
|
1824
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
/**
|
|
1828
|
+
* Get topics for a given tier, merged down the hierarchy.
|
|
1829
|
+
* family gets everything, friends gets friends+public, public gets public only.
|
|
1830
|
+
*
|
|
1831
|
+
* Returns { topics, objectives, do_not_discuss, never_disclose, allowed_tools }
|
|
1832
|
+
*/
|
|
1833
|
+
function getTopicsForTier(tier) {
|
|
1834
|
+
const manifest = loadManifest();
|
|
1835
|
+
const tiers = manifest.tiers || {};
|
|
1836
|
+
|
|
1837
|
+
const tierIndex = TIER_HIERARCHY.indexOf(tier);
|
|
1838
|
+
if (tierIndex === -1) {
|
|
1839
|
+
// Unknown tier, treat as public
|
|
1840
|
+
return getTopicsForTier('public');
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
// Merge tiers from public up to the requested tier
|
|
1844
|
+
const tiersToMerge = TIER_HIERARCHY.slice(0, tierIndex + 1);
|
|
1845
|
+
|
|
1846
|
+
const merged = {
|
|
1847
|
+
topics: [],
|
|
1848
|
+
objectives: [],
|
|
1849
|
+
do_not_discuss: [],
|
|
1850
|
+
never_disclose: manifest.never_disclose || [],
|
|
1851
|
+
allowed_tools: []
|
|
1852
|
+
};
|
|
1853
|
+
|
|
1854
|
+
for (const t of tiersToMerge) {
|
|
1855
|
+
const tierData = tiers[t] || {};
|
|
1856
|
+
if (tierData.topics) merged.topics.push(...tierData.topics);
|
|
1857
|
+
if (tierData.objectives) merged.objectives.push(...tierData.objectives);
|
|
1858
|
+
if (tierData.do_not_discuss) merged.do_not_discuss.push(...tierData.do_not_discuss);
|
|
1859
|
+
if (tierData.allowed_tools) merged.allowed_tools.push(...tierData.allowed_tools);
|
|
1860
|
+
}
|
|
1861
|
+
|
|
1862
|
+
// Remove do_not_discuss items that appear in topics (higher tiers promote them)
|
|
1863
|
+
const promoted = new Set(merged.topics.map(t => (t.topic <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.toLowerCase()));
|
|
1864
|
+
merged.do_not_discuss = merged.do_not_discuss.filter(t => !promoted.has((t.topic <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>.toLowerCase()));
|
|
1865
|
+
|
|
1866
|
+
// Dedupe
|
|
1867
|
+
merged.topics = dedupeByTopic(merged.topics);
|
|
1868
|
+
merged.objectives = dedupeByObjective(merged.objectives);
|
|
1869
|
+
merged.do_not_discuss = dedupeDoNotDiscuss(merged.do_not_discuss);
|
|
1870
|
+
merged.allowed_tools = dedupeStringList(merged.allowed_tools, 80);
|
|
1871
|
+
|
|
1872
|
+
return merged;
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
/**
|
|
1876
|
+
* Format topic lists into readable bullet points for prompt injection.
|
|
1877
|
+
*/
|
|
1878
|
+
function formatTopicsForPrompt(tierTopics) {
|
|
1879
|
+
const formatTopicList = (items) => {
|
|
1880
|
+
if (!items || items.length === 0) return ' (none specified)';
|
|
1881
|
+
return items.map(item => ` - ${item.topic}: ${item.description <span class="branch-0 cbranch-no" title="branch not covered" >|| ''}</span>`).join('\n');
|
|
1882
|
+
};
|
|
1883
|
+
|
|
1884
|
+
const formatObjectiveList = (items) => {
|
|
1885
|
+
if (!items || items.length === 0) return ' (none specified)';
|
|
1886
|
+
return items.map(item => ` - ${item.objective}: ${item.description <span class="branch-0 cbranch-no" title="branch not covered" >|| ''}</span>`).join('\n');
|
|
1887
|
+
};
|
|
1888
|
+
|
|
1889
|
+
const formatDoNotDiscuss = (items) => {
|
|
1890
|
+
if (!items || items.length === 0) return ' (none specified)';
|
|
1891
|
+
return items.map(item => ` - ${item.topic}: ${item.reason <span class="branch-0 cbranch-no" title="branch not covered" >|| ''}</span>`).join('\n');
|
|
1892
|
+
};
|
|
1893
|
+
|
|
1894
|
+
return {
|
|
1895
|
+
topics: formatTopicList(tierTopics.topics),
|
|
1896
|
+
objectives: formatObjectiveList(tierTopics.objectives),
|
|
1897
|
+
doNotDiscuss: formatDoNotDiscuss(tierTopics.do_not_discuss),
|
|
1898
|
+
allowedTools: tierTopics.allowed_tools?.length
|
|
1899
|
+
? tierTopics.allowed_tools.map(item => ` - ${item}`).join('\n')
|
|
1900
|
+
: ' (none specified)',
|
|
1901
|
+
neverDisclose: tierTopics.never_disclose?.length
|
|
1902
|
+
? tierTopics.never_disclose.map(item => ` - ${item}`).join('\n')
|
|
1903
|
+
: ' (none specified)'
|
|
1904
|
+
};
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
/**
|
|
1908
|
+
* Generate a minimal starter manifest. This provides safe defaults when
|
|
1909
|
+
* no agent-driven extraction has been performed yet.
|
|
1910
|
+
*
|
|
1911
|
+
* For proper topic extraction, use buildExtractionPrompt() to instruct
|
|
1912
|
+
* an agent, then validate the result with validateDisclosureSubmission().
|
|
1913
|
+
*/
|
|
1914
|
+
function generateDefaultManifest(contextFiles = {}) {
|
|
1915
|
+
const now = new Date().toISOString();
|
|
1916
|
+
const source = {};
|
|
1917
|
+
const raw = contextFiles <span class="branch-0 cbranch-no" title="branch not covered" >|| {};</span>
|
|
1918
|
+
Object.keys(raw).forEach((key) => {
|
|
1919
|
+
<span class="cstat-no" title="statement not covered" > if (!SKIP_FILES.has(key.toLowerCase())) {</span>
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" > source[key] = raw[key];</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1922
|
+
});
|
|
1923
|
+
|
|
1924
|
+
const userContent = String(source.user || '');
|
|
1925
|
+
const soulContent = String(source.soul || '');
|
|
1926
|
+
function extractFromSource(content, sectionNames) {
|
|
1927
|
+
const sectionPattern = new RegExp(
|
|
1928
|
+
`##\\s*(?:${sectionNames.map(name => name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|')})[^\\n]*\\n([\\s\\S]*?)(?=\\n##|$)`,
|
|
1929
|
+
'i'
|
|
1930
|
+
);
|
|
1931
|
+
const match = String(content || '').match(sectionPattern);
|
|
1932
|
+
if (!match) {
|
|
1933
|
+
return [];
|
|
1934
|
+
}
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1936
|
+
return String(match[1] || '')
|
|
1937
|
+
.split('\n')
|
|
1938
|
+
.map(line => normalizeTopic(line))
|
|
1939
|
+
.filter(line => line.startsWith('-') || line.startsWith('*'))
|
|
1940
|
+
.map(line => normalizeTopic(line.replace(/^[\s\-\*]+/, '')))
|
|
1941
|
+
.map(parseTopicLine)
|
|
1942
|
+
.filter(topic => topic && isValidTopic(topic.topic))
|
|
1943
|
+
.map(topic => ({
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > topic: truncateAtWordBoundary(topic.topic, 60),</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > detail: truncateAtWordBoundary(topic.detail || '', 120)</span>
|
|
1946
|
+
}));
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
const candidateTopics = dedupeByTopic([
|
|
1950
|
+
...extractFromSource(userContent, ['Goals', 'Interests', 'Projects', 'Current']),
|
|
1951
|
+
...extractFromSource(soulContent, ['Goals', 'Interests', 'Projects', 'Current', 'Values', 'Personal'])
|
|
1952
|
+
]);
|
|
1953
|
+
|
|
1954
|
+
if (candidateTopics.length === 0) {
|
|
1955
|
+
return {
|
|
1956
|
+
version: 2,
|
|
1957
|
+
generated_at: now,
|
|
1958
|
+
updated_at: now,
|
|
1959
|
+
tiers: {
|
|
1960
|
+
public: {
|
|
1961
|
+
topics: [{ topic: 'What I do', description: 'Brief professional description' }],
|
|
1962
|
+
objectives: [{ objective: 'Networking', description: 'Connect with others in the field' }],
|
|
1963
|
+
do_not_discuss: [{ topic: 'Personal details', reason: 'Redirect to direct owner contact' }],
|
|
1964
|
+
allowed_tools: ['Read', 'Grep', 'Glob']
|
|
1965
|
+
},
|
|
1966
|
+
friends: { topics: [], objectives: [], do_not_discuss: [], allowed_tools: ['Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'] },
|
|
1967
|
+
family: { topics: [], objectives: [], do_not_discuss: [], allowed_tools: ['Bash', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch'] }
|
|
1968
|
+
},
|
|
1969
|
+
never_disclose: ['API keys', 'Other users\' data', 'Financial figures'],
|
|
1970
|
+
personality_notes: 'Direct and technical. Prefers depth over breadth.'
|
|
1971
|
+
};
|
|
1972
|
+
}
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > const publicTopics = [];</span>
|
|
1975
|
+
<span class="cstat-no" title="statement not covered" > const publicObjectives = [];</span>
|
|
1976
|
+
<span class="cstat-no" title="statement not covered" > const friendsTopics = [];</span>
|
|
1977
|
+
<span class="cstat-no" title="statement not covered" > const friendsObjectives = [];</span>
|
|
1978
|
+
<span class="cstat-no" title="statement not covered" > const familyTopics = [];</span>
|
|
1979
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1980
|
+
<span class="cstat-no" title="statement not covered" > candidateTopics.forEach((entry, index) => {</span>
|
|
1981
|
+
<span class="cstat-no" title="statement not covered" > const topic = truncateAtWordBoundary(entry.topic || '', 160);</span>
|
|
1982
|
+
<span class="cstat-no" title="statement not covered" > const description = truncateAtWordBoundary(entry.description || entry.detail || 'Open discussion topic.', 500);</span>
|
|
1983
|
+
<span class="cstat-no" title="statement not covered" > if (!topic) return;</span>
|
|
1984
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" > const node = { topic, description };</span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > if (index < 5) {</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > publicTopics.push(node);</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" > if (index < 10) {</span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" > friendsTopics.push(node);</span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1994
|
+
<span class="cstat-no" title="statement not covered" > familyTopics.push(node);</span>
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" > if (publicTopics.length === 0) {</span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" > publicTopics.push({ topic: 'Open source', description: 'General product and engineering topics.' });</span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > version: 2,</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" > generated_at: now,</span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > updated_at: now,</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" > tiers: {</span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" > public: {</span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > topics: publicTopics,</span>
|
|
2008
|
+
objectives: publicObjectives.length > 0 ? publicObjectives <span class="branch-0 cbranch-no" title="branch not covered" >: [</span>
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > { objective: 'Grow network', description: 'Connect with others working on similar problems' }</span>
|
|
2010
|
+
],
|
|
2011
|
+
do_not_discuss: [{ topic: 'Personal details', reason: 'Redirect to direct owner contact' }],
|
|
2012
|
+
allowed_tools: ['Read', 'Grep', 'Glob']
|
|
2013
|
+
},
|
|
2014
|
+
friends: {
|
|
2015
|
+
topics: friendsTopics,
|
|
2016
|
+
objectives: friendsObjectives,
|
|
2017
|
+
do_not_discuss: [],
|
|
2018
|
+
allowed_tools: ['Bash(readonly)', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch']
|
|
2019
|
+
},
|
|
2020
|
+
family: {
|
|
2021
|
+
topics: familyTopics,
|
|
2022
|
+
objectives: [],
|
|
2023
|
+
do_not_discuss: [],
|
|
2024
|
+
allowed_tools: ['Bash', 'Read', 'Grep', 'Glob', 'WebSearch', 'WebFetch']
|
|
2025
|
+
}
|
|
2026
|
+
},
|
|
2027
|
+
never_disclose: ['API keys', 'Other users\' data', 'Financial figures'],
|
|
2028
|
+
personality_notes: 'Direct and practical. Open to collaboration with clear boundaries.'
|
|
2029
|
+
};
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
/**
|
|
2033
|
+
* Check if a string contains technical content that shouldn't appear in
|
|
2034
|
+
* disclosure topics (code snippets, URLs, markdown formatting, camelCase identifiers).
|
|
2035
|
+
*/
|
|
2036
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function isTechnicalContent(line) {</span></span>
|
|
2037
|
+
<span class="cstat-no" title="statement not covered" > return /`/.test(line) ||</span>
|
|
2038
|
+
<span class="cstat-no" title="statement not covered" > /https?:\/\//.test(line) ||</span>
|
|
2039
|
+
<span class="cstat-no" title="statement not covered" > /\*\*:/.test(line) ||</span>
|
|
2040
|
+
<span class="cstat-no" title="statement not covered" > /:\*\*/.test(line) ||</span>
|
|
2041
|
+
<span class="cstat-no" title="statement not covered" > /\b[a-z]{3,}[A-Z][a-z]{3,}/.test(line);</span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
2043
|
+
|
|
2044
|
+
/**
|
|
2045
|
+
* Validate an agent-submitted disclosure submission against the expected schema.
|
|
2046
|
+
* Returns { valid: boolean, manifest: object|null, errors: string[] }.
|
|
2047
|
+
*/
|
|
2048
|
+
function validateDisclosureSubmission(data) {
|
|
2049
|
+
const errors = [];
|
|
2050
|
+
|
|
2051
|
+
// Must be a non-null object
|
|
2052
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
2053
|
+
return { valid: false, manifest: null, errors: ['Submission must be a non-null object'] };
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
const tiersData = data.tiers;
|
|
2057
|
+
if (!tiersData || typeof tiersData !== 'object' || Array.isArray(tiersData)) {
|
|
2058
|
+
errors.push('Submission must include a "tiers" object');
|
|
2059
|
+
return { valid: false, manifest: null, errors };
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
// Require all three tiers
|
|
2063
|
+
for (const tier of TIER_HIERARCHY) {
|
|
2064
|
+
if (!tiersData[tier] || typeof tiersData[tier] !== 'object') {
|
|
2065
|
+
errors.push(`Missing required tier: "${tier}"`);
|
|
2066
|
+
}
|
|
2067
|
+
}
|
|
2068
|
+
if (errors.length > 0) {
|
|
2069
|
+
return { valid: false, manifest: null, errors };
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
// Reject extra tiers beyond the known hierarchy
|
|
2073
|
+
const extraTiers = Object.keys(tiersData).filter(t => !TIER_HIERARCHY.includes(t));
|
|
2074
|
+
if (extraTiers.length > 0) {
|
|
2075
|
+
errors.push(`Unknown tiers: ${extraTiers.join(', ')} — only public, friends, family are allowed`);
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
const LIST_LIMITS = { topics: 15, objectives: 8, do_not_discuss: 10, allowed_tools: 12 };
|
|
2079
|
+
|
|
2080
|
+
for (const tier of TIER_HIERARCHY) {
|
|
2081
|
+
const tierData = tiersData[tier];
|
|
2082
|
+
|
|
2083
|
+
// Validate topics array
|
|
2084
|
+
if (tierData.topics !== undefined) {
|
|
2085
|
+
if (!Array.isArray(tierData.topics)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.topics must be an array`);</span>
|
|
2087
|
+
} else {
|
|
2088
|
+
if (tierData.topics.length > LIST_LIMITS.topics) {
|
|
2089
|
+
errors.push(`tiers.${tier}.topics has ${tierData.topics.length} items — max ${LIST_LIMITS.topics}`);
|
|
2090
|
+
}
|
|
2091
|
+
for (let i = 0; i < tierData.topics.length; i++) {
|
|
2092
|
+
const item = tierData.topics[i];
|
|
2093
|
+
if (!item || typeof item !== 'object' || typeof item.topic !== 'string') {
|
|
2094
|
+
errors.push(`tiers.${tier}.topics[${i}]: must have "topic" (string) and "description" (string)`);
|
|
2095
|
+
continue;
|
|
2096
|
+
}
|
|
2097
|
+
if (item.topic.trim().length === 0) {
|
|
2098
|
+
errors.push(`tiers.${tier}.topics[${i}].topic must not be empty`);
|
|
2099
|
+
}
|
|
2100
|
+
if (item.topic.length > 160) {
|
|
2101
|
+
errors.push(`tiers.${tier}.topics[${i}]: topic exceeds 160 chars`);
|
|
2102
|
+
}
|
|
2103
|
+
const desc = item.description <span class="branch-0 cbranch-no" title="branch not covered" >|| '';</span>
|
|
2104
|
+
if (desc.length > 500) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.topics[${i}]: description exceeds 500 chars`);</span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
// Validate objectives array
|
|
2112
|
+
if (tierData.objectives !== undefined) {
|
|
2113
|
+
if (!Array.isArray(tierData.objectives)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.objectives must be an array`);</span>
|
|
2115
|
+
} else {
|
|
2116
|
+
if (tierData.objectives.length > LIST_LIMITS.objectives) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.objectives has ${tierData.objectives.length} items — max ${LIST_LIMITS.objectives}`);</span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2119
|
+
for (let i = 0; i < tierData.objectives.length; i++) {
|
|
2120
|
+
const item = tierData.objectives[i];
|
|
2121
|
+
if (!item || typeof item !== 'object' || typeof item.objective !== 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.objectives[${i}]: must have "objective" (string) and "description" (string)`);</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > continue;</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2125
|
+
if (item.objective.trim().length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.objectives[${i}].objective must not be empty`);</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
|
|
2132
|
+
// Validate do_not_discuss array
|
|
2133
|
+
if (tierData.do_not_discuss !== undefined) {
|
|
2134
|
+
if (!Array.isArray(tierData.do_not_discuss)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.do_not_discuss must be an array`);</span>
|
|
2136
|
+
} else {
|
|
2137
|
+
if (tierData.do_not_discuss.length > LIST_LIMITS.do_not_discuss) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.do_not_discuss has ${tierData.do_not_discuss.length} items — max ${LIST_LIMITS.do_not_discuss}`);</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2140
|
+
for (let i = 0; i < tierData.do_not_discuss.length; i++) {
|
|
2141
|
+
const item = tierData.do_not_discuss[i];
|
|
2142
|
+
if (!item || typeof item !== 'object' || typeof item.topic !== 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.do_not_discuss[${i}]: must have "topic" (string) and "reason" (string)`);</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2145
|
+
}
|
|
2146
|
+
}
|
|
2147
|
+
}
|
|
2148
|
+
|
|
2149
|
+
// Validate allowed_tools array
|
|
2150
|
+
if (tierData.allowed_tools !== undefined) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(tierData.allowed_tools)) {</span>
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.allowed_tools must be an array`);</span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" > if (tierData.allowed_tools.length > LIST_LIMITS.allowed_tools) {</span>
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.allowed_tools has ${tierData.allowed_tools.length} items — max ${LIST_LIMITS.allowed_tools}`);</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < tierData.allowed_tools.length; i++) {</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > const raw = tierData.allowed_tools[i];</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" > if (typeof raw !== 'string') {</span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.allowed_tools[${i}] must be a string`);</span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" > continue;</span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" > const canonical = normalizeToolName(raw);</span>
|
|
2164
|
+
<span class="cstat-no" title="statement not covered" > if (!canonical) {</span>
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`tiers.${tier}.allowed_tools[${i}] invalid tool "${raw}" (allowed: ${CANONICAL_TOOL_NAMES.join(', ')})`);</span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2170
|
+
}
|
|
2171
|
+
|
|
2172
|
+
// Validate never_disclose (optional, defaults to sensible list)
|
|
2173
|
+
if (data.never_disclose !== undefined) {
|
|
2174
|
+
if (!Array.isArray(data.never_disclose)) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" > errors.push('"never_disclose" must be an array of strings');</span>
|
|
2176
|
+
} else {
|
|
2177
|
+
if (data.never_disclose.length > 20) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" > errors.push('never_disclose has too many items — max 20');</span>
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2180
|
+
for (let i = 0; i < data.never_disclose.length; i++) {
|
|
2181
|
+
if (typeof data.never_disclose[i] !== 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`never_disclose[${i}] must be a string`);</span>
|
|
2183
|
+
} else if (data.never_disclose[i].length > 200) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" > errors.push(`never_disclose[${i}] exceeds 200 chars`);</span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
}
|
|
2189
|
+
|
|
2190
|
+
// Validate personality_notes (optional)
|
|
2191
|
+
if (data.personality_notes !== undefined) {
|
|
2192
|
+
if (typeof data.personality_notes !== 'string') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > errors.push('"personality_notes" must be a string');</span>
|
|
2194
|
+
} else if (data.personality_notes.length > 500) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" > errors.push('"personality_notes" exceeds 500 chars');</span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2197
|
+
}
|
|
2198
|
+
|
|
2199
|
+
if (errors.length > 0) {
|
|
2200
|
+
return { valid: false, manifest: null, errors };
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
// Rebuild clean structure
|
|
2204
|
+
const now = new Date().toISOString();
|
|
2205
|
+
|
|
2206
|
+
// Build clean manifest with new format only
|
|
2207
|
+
const cleanTiers = {};
|
|
2208
|
+
for (const tier of TIER_HIERARCHY) {
|
|
2209
|
+
cleanTiers[tier] = {
|
|
2210
|
+
topics: (tiersData[tier].topics <span class="branch-0 cbranch-no" title="branch not covered" >|| [])</span>.map(item => ({
|
|
2211
|
+
topic: item.topic,
|
|
2212
|
+
description: item.description <span class="branch-0 cbranch-no" title="branch not covered" >|| ''</span>
|
|
2213
|
+
})),
|
|
2214
|
+
objectives: (tiersData[tier].objectives <span class="branch-0 cbranch-no" title="branch not covered" >|| [])</span>.map(item => ({
|
|
2215
|
+
objective: item.objective,
|
|
2216
|
+
description: item.description <span class="branch-0 cbranch-no" title="branch not covered" >|| ''</span>
|
|
2217
|
+
})),
|
|
2218
|
+
do_not_discuss: (tiersData[tier].do_not_discuss <span class="branch-0 cbranch-no" title="branch not covered" >|| [])</span>.map(item => ({
|
|
2219
|
+
topic: item.topic,
|
|
2220
|
+
reason: item.reason <span class="branch-0 cbranch-no" title="branch not covered" >|| ''</span>
|
|
2221
|
+
})),
|
|
2222
|
+
allowed_tools: dedupeStringList(
|
|
2223
|
+
(tiersData[tier].allowed_tools || []).map(tool => normalizeToolName(tool)).filter(Boolean),
|
|
2224
|
+
80
|
|
2225
|
+
)
|
|
2226
|
+
};
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
const manifest = {
|
|
2230
|
+
version: 2,
|
|
2231
|
+
generated_at: now,
|
|
2232
|
+
updated_at: now,
|
|
2233
|
+
tiers: cleanTiers,
|
|
2234
|
+
never_disclose: data.never_disclose || ['API keys', 'Other users\' data', 'Financial figures'],
|
|
2235
|
+
personality_notes: data.personality_notes || ''
|
|
2236
|
+
};
|
|
2237
|
+
|
|
2238
|
+
return { valid: true, manifest, errors: [] };
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
/**
|
|
2242
|
+
* Read context files from an OpenClaw workspace directory.
|
|
2243
|
+
* Returns { user, heartbeat, soul, skill, claude, memory, skills } with file contents or empty strings.
|
|
2244
|
+
*/
|
|
2245
|
+
function readContextFiles(workspaceDir) {
|
|
2246
|
+
const read = (filename) => {
|
|
2247
|
+
try {
|
|
2248
|
+
const filePath = path.join(workspaceDir, filename);
|
|
2249
|
+
if (fs.existsSync(filePath)) {
|
|
2250
|
+
return fs.readFileSync(filePath, 'utf8');
|
|
2251
|
+
}
|
|
2252
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (e) {}</span>
|
|
2253
|
+
return '';
|
|
2254
|
+
};
|
|
2255
|
+
|
|
2256
|
+
// Read primary files
|
|
2257
|
+
const result = {
|
|
2258
|
+
user: read('USER.md'),
|
|
2259
|
+
heartbeat: read('HEARTBEAT.md'),
|
|
2260
|
+
soul: read('SOUL.md'),
|
|
2261
|
+
skill: read('SKILL.md'),
|
|
2262
|
+
claude: read('CLAUDE.md'),
|
|
2263
|
+
skills: ''
|
|
2264
|
+
};
|
|
2265
|
+
|
|
2266
|
+
// Scan memory/*.md
|
|
2267
|
+
const memoryDir = path.join(workspaceDir, 'memory');
|
|
2268
|
+
result.memory = '';
|
|
2269
|
+
if (fs.existsSync(memoryDir)) {
|
|
2270
|
+
try {
|
|
2271
|
+
const files = fs.readdirSync(memoryDir).filter(f => f.endsWith('.md'));
|
|
2272
|
+
result.memory = files.map(f => {
|
|
2273
|
+
try { return fs.readFileSync(path.join(memoryDir, f), 'utf8'); }
|
|
2274
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > catch (e) { return ''; }</span>
|
|
2275
|
+
}).filter(Boolean).join('\n---\n');
|
|
2276
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (e) {}</span>
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
return result;
|
|
2280
|
+
}
|
|
2281
|
+
|
|
2282
|
+
/**
|
|
2283
|
+
* Generate the extraction prompt that instructs an agent on exactly what
|
|
2284
|
+
* structured disclosure data to return.
|
|
2285
|
+
*
|
|
2286
|
+
* @param {Object} [availableFiles] - Map of filename to truthy if present
|
|
2287
|
+
* @returns {string} The instruction prompt for the agent
|
|
2288
|
+
*/
|
|
2289
|
+
function buildExtractionPrompt(availableFiles) {
|
|
2290
|
+
let fileSection;
|
|
2291
|
+
if (availableFiles && Object.keys(availableFiles).length > 0) {
|
|
2292
|
+
const fileList = Object.entries(availableFiles)
|
|
2293
|
+
.filter(([, present]) => present)
|
|
2294
|
+
.map(([name]) => ` - ${name}`)
|
|
2295
|
+
.join('\n') <span class="branch-0 cbranch-no" title="branch not covered" >|| ' (none detected)';</span>
|
|
2296
|
+
fileSection = `### Available workspace files\n${fileList}\n\nRead the available files above and extract disclosure topics.`;
|
|
2297
|
+
} else {
|
|
2298
|
+
fileSection = `### Context sources to scan
|
|
2299
|
+
|
|
2300
|
+
**Primary sources (workspace files):**
|
|
2301
|
+
- USER.md — owner identity, bio, interests
|
|
2302
|
+
- SOUL.md — values, personality, communication style
|
|
2303
|
+
- memory/*.md — may contain relevant context
|
|
2304
|
+
- Skip HEARTBEAT.md, SKILL.md, CLAUDE.md (agent instructions, not owner info)
|
|
2305
|
+
|
|
2306
|
+
**If workspace files are missing or empty, scan these additional sources:**
|
|
2307
|
+
- ~/.gitconfig — name, email, identity hints
|
|
2308
|
+
- Environment: whoami, hostname, $USER, $HOME
|
|
2309
|
+
- ~/.config/ — installed tools hint at owner's work
|
|
2310
|
+
- ~/.ssh/config — project/server names may reveal domains
|
|
2311
|
+
- Any README.md files in common locations
|
|
2312
|
+
- Shell history patterns (languages, tools used)
|
|
2313
|
+
- Installed CLIs (what's in PATH)
|
|
2314
|
+
|
|
2315
|
+
**Inference from system state:**
|
|
2316
|
+
- Programming languages installed → likely a developer
|
|
2317
|
+
- Cloud CLIs (aws, gcloud, az) → infrastructure/devops
|
|
2318
|
+
- Design tools → creative work
|
|
2319
|
+
- Data tools (jupyter, pandas) → data science
|
|
2320
|
+
- Server hostname → may indicate role or project
|
|
2321
|
+
|
|
2322
|
+
Use ALL available context to build a reasonable disclosure profile. If truly nothing exists, create a minimal placeholder with "New agent setup - owner details pending" and suggest what info the owner should provide.`;
|
|
2323
|
+
}
|
|
2324
|
+
|
|
2325
|
+
const jsonBlock = `\`\`\`json
|
|
2326
|
+
{
|
|
2327
|
+
"owner_name": "The human owner's real name (extracted from USER.md, git config, etc.)",
|
|
2328
|
+
"agent_name": "The agent's display name (extracted from USER.md or workspace context)",
|
|
2329
|
+
"tiers": {
|
|
2330
|
+
"public": {
|
|
2331
|
+
"topics": [
|
|
2332
|
+
{ "topic": "Short label (max 160 chars)", "description": "Longer description of the topic" }
|
|
2333
|
+
],
|
|
2334
|
+
"objectives": [
|
|
2335
|
+
{ "objective": "What you want to achieve", "description": "Longer description of this goal" }
|
|
2336
|
+
],
|
|
2337
|
+
"do_not_discuss": [
|
|
2338
|
+
{ "topic": "Topic to avoid", "reason": "Why this should be redirected" }
|
|
2339
|
+
],
|
|
2340
|
+
"allowed_tools": ["Read", "Grep", "Glob"]
|
|
2341
|
+
},
|
|
2342
|
+
"friends": {
|
|
2343
|
+
"topics": [],
|
|
2344
|
+
"objectives": [],
|
|
2345
|
+
"do_not_discuss": [],
|
|
2346
|
+
"allowed_tools": ["Bash(readonly)", "Read", "Grep", "Glob", "WebSearch", "WebFetch"]
|
|
2347
|
+
},
|
|
2348
|
+
"family": {
|
|
2349
|
+
"topics": [],
|
|
2350
|
+
"objectives": [],
|
|
2351
|
+
"do_not_discuss": [],
|
|
2352
|
+
"allowed_tools": ["Bash", "Read", "Grep", "Glob", "WebSearch", "WebFetch"]
|
|
2353
|
+
}
|
|
2354
|
+
},
|
|
2355
|
+
"never_disclose": ["API keys", "Credentials", "Financial figures"],
|
|
2356
|
+
"personality_notes": "Brief description of communication style"
|
|
2357
|
+
}
|
|
2358
|
+
\`\`\``;
|
|
2359
|
+
|
|
2360
|
+
return `## A2A Disclosure Extraction
|
|
2361
|
+
|
|
2362
|
+
You are helping the owner set up their A2A disclosure profile — the topics and information their agent is willing to discuss with other agents at different trust levels.
|
|
2363
|
+
|
|
2364
|
+
${fileSection}
|
|
2365
|
+
|
|
2366
|
+
Focus on what the OWNER cares about, works on, and wants to discuss — NOT on agent instructions, code documentation, or operational tasks.
|
|
2367
|
+
|
|
2368
|
+
### Tier Inheritance
|
|
2369
|
+
|
|
2370
|
+
- **public** — base tier, anyone can see these
|
|
2371
|
+
- **friends** — inherits all PUBLIC topics/objectives, plus additional friend-only items
|
|
2372
|
+
- **family** — inherits all FRIENDS and PUBLIC items, plus additional family-only items
|
|
2373
|
+
|
|
2374
|
+
Family callers see everything. Friends see friends + public. Public callers see only public.
|
|
2375
|
+
|
|
2376
|
+
### What to extract for each tier
|
|
2377
|
+
|
|
2378
|
+
**topics** — Things the owner is interested in or working on:
|
|
2379
|
+
- Professional role and expertise
|
|
2380
|
+
- Current projects and interests
|
|
2381
|
+
- Hobbies and activities
|
|
2382
|
+
- Max 8 topics per tier
|
|
2383
|
+
|
|
2384
|
+
**objectives** — What the owner wants to achieve in conversations:
|
|
2385
|
+
- Networking goals
|
|
2386
|
+
- Collaboration interests
|
|
2387
|
+
- Opportunities they're seeking
|
|
2388
|
+
- Max 4 objectives per tier
|
|
2389
|
+
|
|
2390
|
+
**do_not_discuss** — Topics to redirect or decline (can be empty):
|
|
2391
|
+
- Personal matters (for public tier)
|
|
2392
|
+
- Sensitive subjects
|
|
2393
|
+
- Max 3 per tier
|
|
2394
|
+
|
|
2395
|
+
**allowed_tools** — Tools this tier can use during calls:
|
|
2396
|
+
- Choose only the minimum tools needed for that tier's topics/objectives
|
|
2397
|
+
- Use exact tool names: Bash, Bash(readonly), Read, Grep, Glob, WebSearch, WebFetch
|
|
2398
|
+
- Public should usually stay read-only
|
|
2399
|
+
- Family can include broader tooling when justified
|
|
2400
|
+
|
|
2401
|
+
Also identify:
|
|
2402
|
+
- **never_disclose** — information that should NEVER be shared regardless of tier (API keys, credentials, financial data, etc.)
|
|
2403
|
+
- **personality_notes** — a 1-2 sentence description of the owner's communication style
|
|
2404
|
+
|
|
2405
|
+
### What NOT to extract
|
|
2406
|
+
|
|
2407
|
+
Do NOT include as topics:
|
|
2408
|
+
- Code snippets, CLI commands, or technical documentation
|
|
2409
|
+
- URLs or file paths
|
|
2410
|
+
- Agent instructions or operational tasks (e.g., "post 50 comments/day")
|
|
2411
|
+
- Markdown formatting artifacts (bold markers, backticks)
|
|
2412
|
+
- Anything from HEARTBEAT.md (these are agent tasks, not disclosure topics)
|
|
2413
|
+
|
|
2414
|
+
### Required JSON format
|
|
2415
|
+
|
|
2416
|
+
Return ONLY valid JSON in this exact structure:
|
|
2417
|
+
|
|
2418
|
+
${jsonBlock}
|
|
2419
|
+
|
|
2420
|
+
### Rules
|
|
2421
|
+
|
|
2422
|
+
1. Each "topic" string must be a short, human-readable label (max 160 chars)
|
|
2423
|
+
2. Each "description" string explains the topic more fully (max 500 chars)
|
|
2424
|
+
3. Topics should be things a person would discuss, not technical artifacts
|
|
2425
|
+
4. Higher tiers inherit lower-tier items automatically — only add NEW items at each tier
|
|
2426
|
+
5. Present this to the owner for review before submitting
|
|
2427
|
+
6. The owner may edit, remove, or add items before final submission`;
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
module.exports = {
|
|
2431
|
+
loadManifest,
|
|
2432
|
+
saveManifest,
|
|
2433
|
+
getTopicsForTier,
|
|
2434
|
+
formatTopicsForPrompt,
|
|
2435
|
+
generateDefaultManifest,
|
|
2436
|
+
readContextFiles,
|
|
2437
|
+
validateDisclosureSubmission,
|
|
2438
|
+
isTechnicalContent,
|
|
2439
|
+
buildExtractionPrompt,
|
|
2440
|
+
MANIFEST_FILE
|
|
2441
|
+
};
|
|
2442
|
+
</pre></td></tr></table></pre>
|
|
2443
|
+
|
|
2444
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2445
|
+
</div><!-- /wrapper -->
|
|
2446
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2447
|
+
Code coverage generated by
|
|
2448
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2449
|
+
at 2026-03-03T22:25:10.857Z
|
|
2450
|
+
</div>
|
|
2451
|
+
<script src="../../prettify.js"></script>
|
|
2452
|
+
<script>
|
|
2453
|
+
window.onload = function () {
|
|
2454
|
+
prettyPrint();
|
|
2455
|
+
};
|
|
2456
|
+
</script>
|
|
2457
|
+
<script src="../../sorter.js"></script>
|
|
2458
|
+
<script src="../../block-navigation.js"></script>
|
|
2459
|
+
</body>
|
|
2460
|
+
</html>
|
|
2461
|
+
|