@underpostnet/cyberia 3.3.76 → 3.3.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.github/workflows/coverall.cyberia.ci.yml +5 -0
  2. package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
  3. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
  4. package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
  5. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
  6. package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
  7. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
  8. package/.github/workflows/engine-cyberia.ci.yml +1 -1
  9. package/CHANGELOG.md +35 -122
  10. package/CLI-HELP.md +2 -2
  11. package/Dockerfile +1 -1
  12. package/Dockerfile.dev +1 -1
  13. package/Dockerfile.test +1 -1
  14. package/README.md +1 -1
  15. package/bin/build.js +65 -10
  16. package/bin/cyberia.js +4 -4
  17. package/bin/index.js +4 -4
  18. package/conf.js +0 -1
  19. package/deploy/lib/config.sh +1 -1
  20. package/deploy/lib/host.sh +1 -1
  21. package/deployment.yaml +1 -1
  22. package/docker-compose.yml +7 -7
  23. package/docs/coverage/cyberia/api/cyberia-instance/cyberia-fallback-capture.js.html +1591 -0
  24. package/docs/coverage/cyberia/api/cyberia-instance/index.html +116 -0
  25. package/docs/coverage/cyberia/api/cyberia-server-defaults/cyberia-server-defaults.js.html +4138 -0
  26. package/docs/coverage/cyberia/api/cyberia-server-defaults/index.html +116 -0
  27. package/docs/coverage/cyberia/api/object-layer/index.html +116 -0
  28. package/docs/coverage/cyberia/api/object-layer/object-layer.model.js.html +1393 -0
  29. package/docs/coverage/cyberia/base.css +362 -0
  30. package/docs/coverage/cyberia/block-navigation.js +82 -0
  31. package/docs/coverage/cyberia/favicon.png +0 -0
  32. package/docs/coverage/cyberia/index.html +161 -0
  33. package/docs/coverage/cyberia/prettify.css +101 -0
  34. package/docs/coverage/cyberia/prettify.js +937 -0
  35. package/docs/coverage/cyberia/projects/cyberia/atlas-sprite-sheet-generator.js.html +1315 -0
  36. package/docs/coverage/cyberia/projects/cyberia/index.html +176 -0
  37. package/docs/coverage/cyberia/projects/cyberia/instance-backup.js.html +715 -0
  38. package/docs/coverage/cyberia/projects/cyberia/instance-data.js.html +2182 -0
  39. package/docs/coverage/cyberia/projects/cyberia/shape-generator.js.html +3265 -0
  40. package/docs/coverage/cyberia/projects/cyberia/stat-balance.js.html +328 -0
  41. package/docs/coverage/cyberia/sort-arrow-sprite.png +0 -0
  42. package/docs/coverage/cyberia/sorter.js +205 -0
  43. package/hardhat/package-lock.json +2 -2
  44. package/hardhat/package.json +1 -1
  45. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  46. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
  47. package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
  48. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  49. package/package.json +2 -2
  50. package/scripts/test-monitor.sh +1 -1
  51. package/src/cli/cluster.js +73 -18
  52. package/src/cli/deploy.js +211 -30
  53. package/src/cli/docker-compose.js +1 -1
  54. package/src/cli/release.js +3 -1
  55. package/src/cli/repository.js +7 -9
  56. package/src/cli/run.js +10 -3
  57. package/src/client/components/core/Badge.js +0 -1
  58. package/src/client/components/core/CssCore.js +8 -1
  59. package/src/client/components/core/Modal.js +29 -30
  60. package/src/client/components/core/ToolTip.js +15 -0
  61. package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +0 -2
  62. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +0 -4
  63. package/src/client/components/default/AppShellDefault.js +1 -4
  64. package/src/client/components/itemledger/AppShellItemledger.js +0 -2
  65. package/src/client/components/underpost/AppShellUnderpost.js +1 -1
  66. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  67. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  68. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  69. package/src/client/ssr/views/Cyberia404.js +3 -3
  70. package/src/index.js +1 -1
  71. package/src/runtime/engine-cyberia/Dockerfile +1 -1
  72. package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
  73. package/src/runtime/engine-cyberia/Dockerfile.test +1 -1
  74. package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
  75. package/src/server/network/underpost-gateway.js +113 -14
  76. package/src/server/runtime/conf.js +36 -7
  77. package/src/server/runtime/start.js +11 -2
  78. package/test/integration/infra/4-ingress/underpost-ingress.test.js +1 -1
  79. package/test/unit/catalog.test.js +13 -2
  80. package/test/unit/conf-resolution.test.js +41 -7
  81. package/test/unit/cyberia/instance-data.test.js +314 -0
  82. package/test/unit/deploy-legacy-gateway-sweep.test.js +63 -0
  83. package/test/unit/gateway-pod-fetch.test.js +95 -0
  84. package/test/unit/letsencrypt-issuer.test.js +101 -0
  85. package/test/unit/release-bump.test.js +3 -1
  86. package/test/unit/start-options.test.js +12 -0
@@ -0,0 +1,1591 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for api/cyberia-instance/cyberia-fallback-capture.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">api/cyberia-instance</a> cyberia-fallback-capture.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.79% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>151/156</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">72.22% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>91/126</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>37/37</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">99.23% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>129/130</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-neutral">&nbsp;</span>
579
+ <span class="cline-any cline-neutral">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-neutral">&nbsp;</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</span>
597
+ <span class="cline-any cline-neutral">&nbsp;</span>
598
+ <span class="cline-any cline-neutral">&nbsp;</span>
599
+ <span class="cline-any cline-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-neutral">&nbsp;</span>
607
+ <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-neutral">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-yes">1x</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-yes">1x</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-yes">1x</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-yes">1x</span>
626
+ <span class="cline-any cline-yes">308x</span>
627
+ <span class="cline-any cline-yes">1540x</span>
628
+ <span class="cline-any cline-yes">308x</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-yes">13x</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-yes">76x</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-yes">76x</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-yes">274x</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-yes">19x</span>
654
+ <span class="cline-any cline-yes">19x</span>
655
+ <span class="cline-any cline-yes">684x</span>
656
+ <span class="cline-any cline-yes">76x</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-yes">76x</span>
660
+ <span class="cline-any cline-yes">76x</span>
661
+ <span class="cline-any cline-yes">19x</span>
662
+ <span class="cline-any cline-yes">266x</span>
663
+ <span class="cline-any cline-yes">266x</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-yes">19x</span>
667
+ <span class="cline-any cline-yes">38x</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-yes">306x</span>
670
+ <span class="cline-any cline-yes">306x</span>
671
+ <span class="cline-any cline-neutral">&nbsp;</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-yes">19x</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-yes">134x</span>
683
+ <span class="cline-any cline-yes">134x</span>
684
+ <span class="cline-any cline-yes">133x</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-yes">152x</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-yes">172x</span>
698
+ <span class="cline-any cline-yes">172x</span>
699
+ <span class="cline-any cline-yes">342x</span>
700
+ <span class="cline-any cline-yes">171x</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">21x</span>
733
+ <span class="cline-any cline-yes">20x</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-yes">19x</span>
736
+ <span class="cline-any cline-yes">19x</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-yes">76x</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-yes">25156x</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-yes">19x</span>
751
+ <span class="cline-any cline-yes">21x</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-yes">76x</span>
757
+ <span class="cline-any cline-yes">266x</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-yes">21x</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-yes">21x</span>
772
+ <span class="cline-any cline-yes">21x</span>
773
+ <span class="cline-any cline-yes">21x</span>
774
+ <span class="cline-any cline-yes">134x</span>
775
+ <span class="cline-any cline-yes">134x</span>
776
+ <span class="cline-any cline-yes">1x</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-yes">19x</span>
780
+ <span class="cline-any cline-yes">19x</span>
781
+ <span class="cline-any cline-yes">19x</span>
782
+ <span class="cline-any cline-yes">172x</span>
783
+ <span class="cline-any cline-yes">172x</span>
784
+ <span class="cline-any cline-yes">1x</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-yes">19x</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-yes">19x</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-yes">323x</span>
814
+ <span class="cline-any cline-yes">19x</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-yes">14x</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-yes">14x</span>
828
+ <span class="cline-any cline-yes">868x</span>
829
+ <span class="cline-any cline-yes">868x</span>
830
+ <span class="cline-any cline-yes">868x</span>
831
+ <span class="cline-any cline-yes">743x</span>
832
+ <span class="cline-any cline-yes">743x</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">14x</span>
836
+ <span class="cline-any cline-yes">42x</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-yes">14x</span>
845
+ <span class="cline-any cline-yes">266x</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-yes">14x</span>
862
+ <span class="cline-any cline-yes">560x</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-yes">14x</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-yes">14x</span>
888
+ <span class="cline-any cline-yes">14x</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-yes">14x</span>
891
+ <span class="cline-any cline-yes">14x</span>
892
+ <span class="cline-any cline-yes">224x</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-yes">14x</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-yes">220x</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-yes">224x</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-yes">14x</span>
904
+ <span class="cline-any cline-yes">14x</span>
905
+ <span class="cline-any cline-yes">56x</span>
906
+ <span class="cline-any cline-yes">56x</span>
907
+ <span class="cline-any cline-yes">56x</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-yes">56x</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">238x</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-yes">13x</span>
930
+ <span class="cline-any cline-yes">13x</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-yes">13x</span>
933
+ <span class="cline-any cline-yes">39x</span>
934
+ <span class="cline-any cline-yes">39x</span>
935
+ <span class="cline-any cline-yes">39x</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-yes">13x</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-yes">52x</span>
941
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
+ <span class="cline-any cline-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-yes">13x</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-yes">91x</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-yes">13x</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-yes">117x</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-yes">13x</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-yes">14x</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-yes">14x</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-yes">14x</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-yes">14x</span>
986
+ <span class="cline-any cline-yes">56x</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-yes">56x</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-yes">14x</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-neutral">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-yes">14x</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-yes">14x</span>
1008
+ <span class="cline-any cline-yes">98x</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-yes">14x</span>
1015
+ <span class="cline-any cline-yes">126x</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-yes">14x</span>
1022
+ <span class="cline-any cline-yes">14x</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">14x</span>
1030
+ <span class="cline-any cline-yes">14x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">14x</span>
1033
+ <span class="cline-any cline-yes">14x</span>
1034
+ <span class="cline-any cline-yes">14x</span>
1035
+ <span class="cline-any cline-yes">2x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-yes">14x</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-yes">13x</span>
1048
+ <span class="cline-any cline-yes">1x</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-yes">14x</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-yes">335x</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-yes">336x</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-yes">14x</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
1071
+ * Fallback-world capture — materialise the in-memory procedural world into
1072
+ * MongoDB so it can be exported, versioned, and re-imported like any authored
1073
+ * instance.
1074
+ *
1075
+ * The fallback world (cyberia-fallback-world.js) is never persisted: every
1076
+ * engine process rebuilds it from code defaults at boot and serves it whenever
1077
+ * a requested instance is absent. Capturing it means writing everything that
1078
+ * in-memory world serves under a real instance code:
1079
+ *
1080
+ * - CyberiaInstance — map graph, portal edges, player spawn, item ids
1081
+ * - CyberiaMap — one document per generated map (entities included)
1082
+ * - CyberiaInstanceConf — the world's simulation config
1083
+ * - CyberiaSkill / CyberiaEntityTypeDefault / CyberiaDialogue /
1084
+ * CyberiaAction / CyberiaQuest — the content collections the fallback path
1085
+ * reads from code defaults INSTEAD of Mongo; a persisted instance reads
1086
+ * them from Mongo, so they must exist there for the capture to serve the
1087
+ * same world (see instance-data.js#fetchFullInstance).
1088
+ * - CyberiaMapAudioConf — one per captured map. The client asks for audio by
1089
+ * map code, so a namespaced capture would otherwise play nothing.
1090
+ *
1091
+ * CyberiaAudio assets are NOT captured: an asset is global, identified by its
1092
+ * code, and imported once by `cyberia audio --import`. The capture reports the
1093
+ * codes it bound that no asset carries yet.
1094
+ *
1095
+ * ObjectLayer/atlas assets are NOT generated here — they come from the asset
1096
+ * pipeline (`bin/cyberia ol &lt;ids&gt; --import`). The capture reports the missing
1097
+ * ids so the caller can stop before writing an incomplete backup.
1098
+ *
1099
+ * Map and content codes are namespaced under the instance code by default, so
1100
+ * two captures never overwrite each other's documents (map/action/quest codes
1101
+ * are globally unique). `keepFallbackCodes` preserves the raw
1102
+ * `fallback-map-*` / canonical action-quest codes instead.
1103
+ *
1104
+ * @module src/api/cyberia-instance/cyberia-fallback-capture
1105
+ */
1106
+ &nbsp;
1107
+ import { loggerFactory } from '../../server/ops/logger.js';
1108
+ import { collectReferencedItemIds } from './cyberia-fallback-world.js';
1109
+ import { collectInstanceItemIds } from './cyberia-instance-items.js';
1110
+ import { fallbackAudioConfig } from '../../projects/cyberia/seed-audio.js';
1111
+ import {
1112
+ DefaultCyberiaActions,
1113
+ DefaultCyberiaQuests,
1114
+ DefaultCyberiaDialogues,
1115
+ DefaultSkillConfig,
1116
+ ENTITY_TYPE_DEFAULTS,
1117
+ fillInstanceConfDefaults,
1118
+ } from '../cyberia-server-defaults/cyberia-server-defaults.js';
1119
+ &nbsp;
1120
+ const logger = loggerFactory(import.meta);
1121
+ &nbsp;
1122
+ const FALLBACK_MAP_CODE_PREFIX = 'fallback-map-';
1123
+ &nbsp;
1124
+ /** Mongo document keys that must never travel inside a `$set` payload. */
1125
+ const DOC_METADATA_KEYS = ['_id', '__v', 'createdAt', 'updatedAt'];
1126
+ &nbsp;
1127
+ const stripDocMetadata = (doc, extraKeys = []) =&gt; {
1128
+ const out = { ...doc };
1129
+ for (const key of [...DOC_METADATA_KEYS, ...extraKeys]) delete out[key];
1130
+ return out;
1131
+ };
1132
+ &nbsp;
1133
+ const escapeRegExp = (value) =&gt; String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&amp;');
1134
+ &nbsp;
1135
+ /** Namespaced map code for a captured fallback map (`fallback-map-2` → `X-map-2`). */
1136
+ function captureMapCode(mapCode, instanceCode) {
1137
+ const suffix = mapCode.startsWith(FALLBACK_MAP_CODE_PREFIX)
1138
+ ? mapCode.slice(FALLBACK_MAP_CODE_PREFIX.length)
1139
+ : <span class="branch-1 cbranch-no" title="branch not covered" >mapCode;</span>
1140
+ return `${instanceCode}-map-${suffix}`;
1141
+ }
1142
+ &nbsp;
1143
+ /** Namespaced action/quest code for a captured world. */
1144
+ const captureContentCode = (code, instanceCode) =&gt; `${instanceCode}-${code}`;
1145
+ &nbsp;
1146
+ /**
1147
+ * Build the code translation tables for one capture.
1148
+ *
1149
+ * @param {object} world Result of `generateFallbackWorld()`.
1150
+ * @param {string} instanceCode
1151
+ * @param {boolean} keepFallbackCodes
1152
+ * @returns {{ mapCodes: Map&lt;string,string&gt;, questCodes: Map&lt;string,string&gt;, actionCodes: Map&lt;string,string&gt; }}
1153
+ */
1154
+ function buildCaptureCodeMaps({ world, instanceCode, keepFallbackCodes, actions, quests }) {
1155
+ const mapCodes = new Map();
1156
+ const rememberMapCode = (code) =&gt; {
1157
+ if (!code || mapCodes.has(code)) return;
1158
+ mapCodes.set(code, keepFallbackCodes ? code : captureMapCode(code, instanceCode));
1159
+ };
1160
+ &nbsp;
1161
+ for (const code of world.instance?.cyberiaMapCodes || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span> rememberMapCode(code);
1162
+ for (const map of world.maps || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span> rememberMapCode(map.code);
1163
+ for (const portal of world.instance?.portals || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span> {
1164
+ rememberMapCode(portal.sourceMapCode);
1165
+ rememberMapCode(portal.targetMapCode);
1166
+ }
1167
+ &nbsp;
1168
+ const contentCodes = (docs) =&gt;
1169
+ new Map(
1170
+ (docs || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>
1171
+ .filter((doc) =&gt; doc?.code)
1172
+ .map((doc) =&gt; [doc.code, keepFallbackCodes ? doc.code : captureContentCode(doc.code, instanceCode)]),
1173
+ );
1174
+ &nbsp;
1175
+ return { mapCodes, actionCodes: contentCodes(actions), questCodes: contentCodes(quests) };
1176
+ }
1177
+ &nbsp;
1178
+ /**
1179
+ * Translate one default action into its captured form. Returns `null` when the
1180
+ * action lives on a map this world does not contain — a persisted instance
1181
+ * only ever serves actions bound to its own maps.
1182
+ */
1183
+ function captureAction(action, { mapCodes, actionCodes, questCodes }) {
1184
+ const sourceMapCode = mapCodes.get(action.sourceMapCode);
1185
+ if (!sourceMapCode) return null;
1186
+ return {
1187
+ ...action,
1188
+ code: actionCodes.get(action.code) || <span class="branch-1 cbranch-no" title="branch not covered" >action.code,</span>
1189
+ sourceMapCode,
1190
+ questDialogueCodes: (action.questDialogueCodes || []).map((entry) =&gt; ({
1191
+ ...entry,
1192
+ questCode: questCodes.get(entry.questCode) || <span class="branch-1 cbranch-no" title="branch not covered" >entry.questCode,</span>
1193
+ })),
1194
+ };
1195
+ }
1196
+ &nbsp;
1197
+ /** Translate one default quest into its captured form (`null` = foreign map). */
1198
+ function captureQuest(quest, { mapCodes, questCodes }) {
1199
+ const sourceMapCode = mapCodes.get(quest.sourceMapCode);
1200
+ if (!sourceMapCode) return null;
1201
+ const translate = (codes) =&gt; (codes || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.map((code) =&gt; questCodes.get(code) || <span class="branch-1 cbranch-no" title="branch not covered" >code)</span>;
1202
+ return {
1203
+ ...quest,
1204
+ code: questCodes.get(quest.code) || <span class="branch-1 cbranch-no" title="branch not covered" >quest.code,</span>
1205
+ sourceMapCode,
1206
+ prerequisiteCodes: translate(quest.prerequisiteCodes),
1207
+ unlocksQuestCodes: translate(quest.unlocksQuestCodes),
1208
+ };
1209
+ }
1210
+ &nbsp;
1211
+ /**
1212
+ * Pure planner: turn an in-memory fallback world into the exact set of
1213
+ * documents a capture writes. No I/O — the whole translation is testable
1214
+ * without a database.
1215
+ *
1216
+ * @param {object} params
1217
+ * @param {object} params.world Result of `generateFallbackWorld()`.
1218
+ * @param {string} params.instanceCode Code the capture is stored under.
1219
+ * @param {boolean} [params.keepFallbackCodes=false]
1220
+ * @param {Array} [params.actions=DefaultCyberiaActions]
1221
+ * @param {Array} [params.quests=DefaultCyberiaQuests]
1222
+ * @returns {{
1223
+ * instance: object, conf: object, maps: object[], actions: object[], quests: object[],
1224
+ * codeMaps: object, skippedActionCodes: string[], skippedQuestCodes: string[], itemIds: string[]
1225
+ * }}
1226
+ */
1227
+ function planFallbackCapture({
1228
+ world,
1229
+ instanceCode,
1230
+ keepFallbackCodes = false,
1231
+ actions = DefaultCyberiaActions,
1232
+ quests = DefaultCyberiaQuests,
1233
+ }) {
1234
+ if (!world?.instance || !Array.isArray(world.maps)) throw new Error('planFallbackCapture: invalid world');
1235
+ if (!instanceCode) throw new Error('planFallbackCapture: instanceCode is required');
1236
+ &nbsp;
1237
+ const codeMaps = buildCaptureCodeMaps({ world, instanceCode, keepFallbackCodes, actions, quests });
1238
+ const { mapCodes } = codeMaps;
1239
+ &nbsp;
1240
+ const maps = world.maps.map((map) =&gt; ({
1241
+ code: mapCodes.get(map.code) || <span class="branch-1 cbranch-no" title="branch not covered" >map.code,</span>
1242
+ name: map.name || <span class="branch-1 cbranch-no" title="branch not covered" >mapCodes.get(map.code) </span>|| <span class="branch-2 cbranch-no" title="branch not covered" >map.code,</span>
1243
+ description: map.description || '',
1244
+ gridX: map.gridX,
1245
+ gridY: map.gridY,
1246
+ cellWidth: map.cellWidth,
1247
+ cellHeight: map.cellHeight,
1248
+ entities: (map.entities || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.map((entity) =&gt; ({ ...entity })),
1249
+ tags: ['fallback', 'procedural', 'captured'],
1250
+ }));
1251
+ &nbsp;
1252
+ const spawn = world.instance.playerSpawn || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
1253
+ const instance = {
1254
+ code: instanceCode,
1255
+ name: instanceCode,
1256
+ description: 'Captured procedural fallback world',
1257
+ tags: ['fallback', 'procedural', 'captured'],
1258
+ cyberiaMapCodes: (world.instance.cyberiaMapCodes || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.map((code) =&gt; mapCodes.get(code) || <span class="branch-1 cbranch-no" title="branch not covered" >code)</span>,
1259
+ portals: (world.instance.portals || <span class="branch-1 cbranch-no" title="branch not covered" >[])</span>.map((portal) =&gt; ({
1260
+ ...portal,
1261
+ sourceMapCode: mapCodes.get(portal.sourceMapCode) || <span class="branch-1 cbranch-no" title="branch not covered" >portal.sourceMapCode,</span>
1262
+ targetMapCode: mapCodes.get(portal.targetMapCode) || <span class="branch-1 cbranch-no" title="branch not covered" >portal.targetMapCode,</span>
1263
+ })),
1264
+ playerSpawn: {
1265
+ ...spawn,
1266
+ ...(spawn.sourceMapCode ? { sourceMapCode: mapCodes.get(spawn.sourceMapCode) || <span class="branch-1 cbranch-no" title="branch not covered" >spawn.sourceMapCode </span>} : <span class="branch-1 cbranch-no" title="branch not covered" >{})</span>,
1267
+ },
1268
+ topologyMode: 'procedural',
1269
+ };
1270
+ &nbsp;
1271
+ const conf = { ...fillInstanceConfDefaults(world.config || <span class="branch-1 cbranch-no" title="branch not covered" >{})</span>, instanceCode };
1272
+ &nbsp;
1273
+ const capturedActions = [];
1274
+ const skippedActionCodes = [];
1275
+ for (const action of actions) {
1276
+ const captured = captureAction(action, codeMaps);
1277
+ if (captured) capturedActions.push(captured);
1278
+ else skippedActionCodes.push(action.code);
1279
+ }
1280
+ &nbsp;
1281
+ const capturedQuests = [];
1282
+ const skippedQuestCodes = [];
1283
+ for (const quest of quests) {
1284
+ const captured = captureQuest(quest, codeMaps);
1285
+ if (captured) capturedQuests.push(captured);
1286
+ else skippedQuestCodes.push(quest.code);
1287
+ }
1288
+ &nbsp;
1289
+ return {
1290
+ instance,
1291
+ conf,
1292
+ maps,
1293
+ actions: capturedActions,
1294
+ quests: capturedQuests,
1295
+ codeMaps,
1296
+ skippedActionCodes,
1297
+ skippedQuestCodes,
1298
+ itemIds: collectCaptureItemIds({ maps, actions: capturedActions, quests: capturedQuests }),
1299
+ };
1300
+ }
1301
+ &nbsp;
1302
+ /**
1303
+ * Every ObjectLayer item id the captured instance needs an atlas for: the canonical world's
1304
+ * own ids, plus what this instance names — its maps, its entity-type defaults, and the
1305
+ * vendor/assembler/quest catalogs the interact modal draws icons for.
1306
+ *
1307
+ * @returns {string[]} Sorted, de-duplicated item ids.
1308
+ */
1309
+ function collectCaptureItemIds({ maps, actions, quests, entityDefaults = [] }) {
1310
+ // The canonical world's own ids — every fallback default, including the skill triggers and
1311
+ // summoned entities DefaultSkillConfig names. What the captured instance adds on top follows
1312
+ // the same rule the export and the boot payload use.
1313
+ const ids = collectReferencedItemIds();
1314
+ // The conf references its entity-type defaults by _id, so the documents arrive resolved.
1315
+ for (const itemId of collectInstanceItemIds({ maps, entityDefaults, actions, quests })) ids.add(itemId);
1316
+ return [...ids].sort();
1317
+ }
1318
+ &nbsp;
1319
+ /**
1320
+ * Insert the content collections the fallback path serves from code defaults.
1321
+ *
1322
+ * Insert-only: an existing document is left exactly as the operator (or an
1323
+ * earlier import) left it, so a capture never silently rewrites content shared
1324
+ * with other instances. Returns per-collection insert counts.
1325
+ */
1326
+ async function seedMissingContentDefaults({ CyberiaSkill, CyberiaEntityTypeDefault, CyberiaDialogue }) {
1327
+ const inserted = { skills: 0, entityTypeDefaults: 0, dialogues: 0 };
1328
+ &nbsp;
1329
+ const insertIfMissing = async (Model, filter, doc, counterKey) =&gt; {
1330
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Model) <span class="cstat-no" title="statement not covered" >return;</span>
1331
+ const existing = await Model.findOne(filter).lean();
1332
+ if (existing) return;
1333
+ await Model.create(doc);
1334
+ inserted[counterKey]++;
1335
+ };
1336
+ &nbsp;
1337
+ for (const skill of DefaultSkillConfig) {
1338
+ await insertIfMissing(
1339
+ CyberiaSkill,
1340
+ { triggerItemId: skill.triggerItemId },
1341
+ { triggerItemId: skill.triggerItemId, logicEventIds: skill.logicEventIds || <span class="branch-1 cbranch-no" title="branch not covered" >[],</span> skills: skill.skills || <span class="branch-1 cbranch-no" title="branch not covered" >[] </span>},
1342
+ 'skills',
1343
+ );
1344
+ }
1345
+ &nbsp;
1346
+ for (const entityDefault of ENTITY_TYPE_DEFAULTS) {
1347
+ await insertIfMissing(
1348
+ CyberiaEntityTypeDefault,
1349
+ { entityType: entityDefault.entityType, liveItemIds: entityDefault.liveItemIds || <span class="branch-1 cbranch-no" title="branch not covered" >[] </span>},
1350
+ {
1351
+ entityType: entityDefault.entityType,
1352
+ liveItemIds: entityDefault.liveItemIds || <span class="branch-1 cbranch-no" title="branch not covered" >[],</span>
1353
+ deadItemIds: entityDefault.deadItemIds || <span class="branch-1 cbranch-no" title="branch not covered" >[],</span>
1354
+ dropItemIds: entityDefault.dropItemIds || [],
1355
+ inventoryItemsIds: entityDefault.inventoryItemsIds || [],
1356
+ overrideItemsIdsState: entityDefault.overrideItemsIdsState || [],
1357
+ behavior: entityDefault.behavior || '',
1358
+ },
1359
+ 'entityTypeDefaults',
1360
+ );
1361
+ }
1362
+ &nbsp;
1363
+ for (const dialogue of DefaultCyberiaDialogues) {
1364
+ await insertIfMissing(
1365
+ CyberiaDialogue,
1366
+ { code: dialogue.code, order: dialogue.order },
1367
+ { ...dialogue },
1368
+ 'dialogues',
1369
+ );
1370
+ }
1371
+ &nbsp;
1372
+ return inserted;
1373
+ }
1374
+ &nbsp;
1375
+ /**
1376
+ * Write the audio configuration of the captured maps.
1377
+ *
1378
+ * Audio reaches the client per map code, so a world captured under namespaced codes needs its
1379
+ * bindings rewritten under those codes — the same reason the actions and quests are re-coded.
1380
+ * Only codes an imported asset actually carries are bound: a binding to an absent asset would be
1381
+ * a dangling name, and the caller is told which ones are missing instead.
1382
+ *
1383
+ * @param {object} params
1384
+ * @param {object} params.models - `{ CyberiaMapAudioConf, CyberiaAudio }`.
1385
+ * @param {object} params.plan - Result of `planFallbackCapture()`.
1386
+ * @returns {Promise&lt;{audioConfs: number, missingAudioCodes: string[]}&gt;}
1387
+ */
1388
+ async function captureAudioConfig({ models, plan }) {
1389
+ const { CyberiaMapAudioConf, CyberiaAudio } = models;
1390
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!CyberiaMapAudioConf) <span class="cstat-no" title="statement not covered" >return { audioConfs: 0, missingAudioCodes: [] };</span>
1391
+ &nbsp;
1392
+ const config = fallbackAudioConfig();
1393
+ const bound = new Set(
1394
+ [...config.events.map(({ audioCode }) =&gt; audioCode), ...config.maps.map(({ defaultMusic }) =&gt; defaultMusic)].filter(
1395
+ Boolean,
1396
+ ),
1397
+ );
1398
+ const present = new Set(
1399
+ CyberiaAudio
1400
+ ? (await CyberiaAudio.find({ code: { $in: [...bound] } }, { code: 1 }).lean()).map((doc) =&gt; doc.code)
1401
+ : <span class="branch-1 cbranch-no" title="branch not covered" >[],</span>
1402
+ );
1403
+ const events = config.events.filter(({ audioCode }) =&gt; present.has(audioCode));
1404
+ &nbsp;
1405
+ let audioConfs = 0;
1406
+ for (const map of config.maps) {
1407
+ const mapCode = plan.codeMaps.mapCodes.get(map.mapCode);
1408
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!mapCode) <span class="cstat-no" title="statement not covered" >continue;</span>
1409
+ await CyberiaMapAudioConf.findOneAndUpdate(
1410
+ { mapCode },
1411
+ {
1412
+ $set: {
1413
+ defaultMusic: present.has(map.defaultMusic) ? map.defaultMusic : '',
1414
+ settings: config.settings,
1415
+ events,
1416
+ },
1417
+ },
1418
+ { upsert: true },
1419
+ );
1420
+ audioConfs++;
1421
+ }
1422
+ return { audioConfs, missingAudioCodes: [...bound].filter((code) =&gt; !present.has(code)).sort() };
1423
+ }
1424
+ &nbsp;
1425
+ /**
1426
+ * Remove documents that a larger previous capture left in this capture's own
1427
+ * namespace. Touches only codes prefixed with the instance code, and never runs
1428
+ * in `keepFallbackCodes` mode, where the codes are the shared canonical ones.
1429
+ */
1430
+ async function pruneStaleCaptureDocs({ models, instanceCode, plan }) {
1431
+ const namespace = new RegExp(`^${escapeRegExp(instanceCode)}-`);
1432
+ const pruned = { maps: 0, actions: 0, quests: 0 };
1433
+ &nbsp;
1434
+ const prune = async (Model, keepCodes, counterKey) =&gt; {
1435
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Model) <span class="cstat-no" title="statement not covered" >return;</span>
1436
+ const result = await Model.deleteMany({ code: { $regex: namespace, $nin: keepCodes } });
1437
+ pruned[counterKey] = result?.deletedCount || 0;
1438
+ };
1439
+ &nbsp;
1440
+ await prune(
1441
+ models.CyberiaMap,
1442
+ plan.maps.map((map) =&gt; map.code),
1443
+ 'maps',
1444
+ );
1445
+ await prune(
1446
+ models.CyberiaAction,
1447
+ plan.actions.map((action) =&gt; action.code),
1448
+ 'actions',
1449
+ );
1450
+ await prune(
1451
+ models.CyberiaQuest,
1452
+ plan.quests.map((quest) =&gt; quest.code),
1453
+ 'quests',
1454
+ );
1455
+ &nbsp;
1456
+ return pruned;
1457
+ }
1458
+ &nbsp;
1459
+ /**
1460
+ * Materialise an in-memory fallback world into MongoDB under `instanceCode`.
1461
+ *
1462
+ * Idempotent: every write is an upsert keyed by the document's natural code,
1463
+ * so re-running a capture converges on the same state. Nothing is deleted
1464
+ * except stale documents inside this capture's own code namespace.
1465
+ *
1466
+ * @param {object} params
1467
+ * @param {object} params.models `{ CyberiaInstance, CyberiaInstanceConf, CyberiaMap, CyberiaAction,
1468
+ * CyberiaQuest, CyberiaSkill, CyberiaEntityTypeDefault,
1469
+ * CyberiaDialogue, CyberiaMapAudioConf, CyberiaAudio,
1470
+ * ObjectLayer }`
1471
+ * @param {object} params.world Result of `generateFallbackWorld()`.
1472
+ * @param {string} params.instanceCode
1473
+ * @param {boolean} [params.keepFallbackCodes=false]
1474
+ * @returns {Promise&lt;{plan: object, inserted: object, pruned: object, missingObjectLayerItemIds: string[]}&gt;}
1475
+ */
1476
+ async function captureFallbackWorld({ models, world, instanceCode, keepFallbackCodes = false }) {
1477
+ const plan = planFallbackCapture({ world, instanceCode, keepFallbackCodes });
1478
+ &nbsp;
1479
+ // Conf first: the instance document carries the ObjectId ref to it.
1480
+ const confDoc = await models.CyberiaInstanceConf.findOneAndUpdate(
1481
+ { instanceCode },
1482
+ { $set: stripDocMetadata(plan.conf, ['instanceCode']) },
1483
+ { upsert: true, returnDocument: 'after' },
1484
+ );
1485
+ logger.info('Captured CyberiaInstanceConf', { instanceCode });
1486
+ &nbsp;
1487
+ for (const map of plan.maps) {
1488
+ await models.CyberiaMap.findOneAndUpdate(
1489
+ { code: map.code },
1490
+ { $set: stripDocMetadata(map, ['code']) },
1491
+ { upsert: true },
1492
+ );
1493
+ }
1494
+ logger.info(`Captured ${plan.maps.length} CyberiaMap document(s)`, { codes: plan.maps.map((m) =&gt; m.code) });
1495
+ &nbsp;
1496
+ await models.CyberiaInstance.findOneAndUpdate(
1497
+ { code: instanceCode },
1498
+ {
1499
+ $set: {
1500
+ ...stripDocMetadata(plan.instance, ['code']),
1501
+ ...(confDoc?._id ? { conf: confDoc._id } : <span class="branch-1 cbranch-no" title="branch not covered" >{})</span>,
1502
+ },
1503
+ $setOnInsert: { status: 'unlisted' },
1504
+ },
1505
+ { upsert: true },
1506
+ );
1507
+ logger.info('Captured CyberiaInstance', { code: instanceCode, maps: plan.instance.cyberiaMapCodes.length });
1508
+ &nbsp;
1509
+ for (const action of plan.actions) {
1510
+ await models.CyberiaAction.findOneAndUpdate(
1511
+ { code: action.code },
1512
+ { $set: stripDocMetadata(action, ['code']) },
1513
+ { upsert: true },
1514
+ );
1515
+ }
1516
+ for (const quest of plan.quests) {
1517
+ await models.CyberiaQuest.findOneAndUpdate(
1518
+ { code: quest.code },
1519
+ { $set: stripDocMetadata(quest, ['code']) },
1520
+ { upsert: true },
1521
+ );
1522
+ }
1523
+ logger.info(`Captured ${plan.actions.length} CyberiaAction and ${plan.quests.length} CyberiaQuest document(s)`);
1524
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (plan.skippedActionCodes.length &gt; 0 || plan.skippedQuestCodes.length &gt; 0) {
1525
+ <span class="cstat-no" title="statement not covered" > logger.warn('Skipped mission content bound to maps outside the captured world', {</span>
1526
+ actions: plan.skippedActionCodes,
1527
+ quests: plan.skippedQuestCodes,
1528
+ });
1529
+ }
1530
+ &nbsp;
1531
+ const inserted = await seedMissingContentDefaults(models);
1532
+ logger.info('Seeded missing content defaults', inserted);
1533
+ &nbsp;
1534
+ const audio = await captureAudioConfig({ models, plan });
1535
+ logger.info(`Captured ${audio.audioConfs} CyberiaMapAudioConf document(s)`);
1536
+ if (audio.missingAudioCodes.length &gt; 0) {
1537
+ logger.warn(
1538
+ 'Audio codes with no imported CyberiaAudio document were left unbound — ' +
1539
+ 'run `node bin/cyberia run-workflow seed-audio` to record and import them',
1540
+ { codes: audio.missingAudioCodes },
1541
+ );
1542
+ }
1543
+ &nbsp;
1544
+ // `keepFallbackCodes` reuses the globally shared canonical codes, so nothing
1545
+ // in that namespace belongs exclusively to this capture.
1546
+ const pruned = keepFallbackCodes
1547
+ ? { maps: 0, actions: 0, quests: 0 }
1548
+ : await pruneStaleCaptureDocs({ models, instanceCode, plan });
1549
+ if (pruned.maps || pruned.actions || pruned.quests)
1550
+ logger.info('Pruned stale documents from a previous capture', pruned);
1551
+ &nbsp;
1552
+ const presentItemIds = new Set(
1553
+ (await models.ObjectLayer.find({ 'data.item.id': { $in: plan.itemIds } }, { 'data.item.id': 1 }).lean()).map(
1554
+ (doc) =&gt; doc.data?.item?.id,
1555
+ ),
1556
+ );
1557
+ const missingObjectLayerItemIds = plan.itemIds.filter((id) =&gt; !presentItemIds.has(id));
1558
+ &nbsp;
1559
+ return { plan, inserted, pruned, audio, missingObjectLayerItemIds };
1560
+ }
1561
+ &nbsp;
1562
+ export {
1563
+ planFallbackCapture,
1564
+ captureAudioConfig,
1565
+ captureFallbackWorld,
1566
+ collectCaptureItemIds,
1567
+ captureMapCode,
1568
+ captureContentCode,
1569
+ seedMissingContentDefaults,
1570
+ FALLBACK_MAP_CODE_PREFIX,
1571
+ };
1572
+ &nbsp;</pre></td></tr></table></pre>
1573
+
1574
+ <div class='push'></div><!-- for sticky footer -->
1575
+ </div><!-- /wrapper -->
1576
+ <div class='footer quiet pad2 space-top1 center small'>
1577
+ Code coverage generated by
1578
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1579
+ at 2026-09-13T20:21:13.226Z
1580
+ </div>
1581
+ <script src="../../prettify.js"></script>
1582
+ <script>
1583
+ window.onload = function () {
1584
+ prettyPrint();
1585
+ };
1586
+ </script>
1587
+ <script src="../../sorter.js"></script>
1588
+ <script src="../../block-navigation.js"></script>
1589
+ </body>
1590
+ </html>
1591
+