apostrophe 2.220.9 → 2.221.0

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 (194) hide show
  1. package/.nyc_output/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
  2. package/.nyc_output/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
  3. package/.nyc_output/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
  4. package/.nyc_output/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
  5. package/.nyc_output/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
  6. package/.nyc_output/processinfo/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
  7. package/.nyc_output/processinfo/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
  8. package/.nyc_output/processinfo/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
  9. package/.nyc_output/processinfo/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
  10. package/.nyc_output/processinfo/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
  11. package/.nyc_output/processinfo/index.json +1 -0
  12. package/CHANGELOG.md +12 -0
  13. package/coverage/a3/defaults.js.html +253 -0
  14. package/coverage/a3/index.html +131 -0
  15. package/coverage/a3/index.js.html +2338 -0
  16. package/coverage/a3/lib/escape-host.js.html +109 -0
  17. package/coverage/a3/lib/index.html +176 -0
  18. package/coverage/a3/lib/mongodb-connect.js.html +250 -0
  19. package/coverage/a3/lib/moog-require.js.html +790 -0
  20. package/coverage/a3/lib/moog.js.html +1711 -0
  21. package/coverage/a3/lib/opentelemetry.js.html +517 -0
  22. package/coverage/a3/modules/@apostrophecms/admin-bar/index.html +116 -0
  23. package/coverage/a3/modules/@apostrophecms/admin-bar/index.js.html +931 -0
  24. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.html +116 -0
  25. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.js.html +115 -0
  26. package/coverage/a3/modules/@apostrophecms/any-page-type/index.html +116 -0
  27. package/coverage/a3/modules/@apostrophecms/any-page-type/index.js.html +1105 -0
  28. package/coverage/a3/modules/@apostrophecms/archive-page/index.html +116 -0
  29. package/coverage/a3/modules/@apostrophecms/archive-page/index.js.html +97 -0
  30. package/coverage/a3/modules/@apostrophecms/area/index.html +116 -0
  31. package/coverage/a3/modules/@apostrophecms/area/index.js.html +2104 -0
  32. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/area.js.html +469 -0
  33. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/index.html +131 -0
  34. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/widget.js.html +286 -0
  35. package/coverage/a3/modules/@apostrophecms/asset/index.html +116 -0
  36. package/coverage/a3/modules/@apostrophecms/asset/index.js.html +3982 -0
  37. package/coverage/a3/modules/@apostrophecms/asset/lib/globalIcons.js.html +346 -0
  38. package/coverage/a3/modules/@apostrophecms/asset/lib/index.html +116 -0
  39. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/index.html +131 -0
  40. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.scss.js.html +289 -0
  41. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js.html +148 -0
  42. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/index.html +116 -0
  43. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/index.html +131 -0
  44. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.es5.js.html +184 -0
  45. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.scss.js.html +238 -0
  46. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/utils.js.html +958 -0
  47. package/coverage/a3/modules/@apostrophecms/attachment/index.html +116 -0
  48. package/coverage/a3/modules/@apostrophecms/attachment/index.js.html +3676 -0
  49. package/coverage/a3/modules/@apostrophecms/attachment/lib/index.html +116 -0
  50. package/coverage/a3/modules/@apostrophecms/attachment/lib/legacy-migrations.js.html +205 -0
  51. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/index.html +116 -0
  52. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/rescale.js.html +328 -0
  53. package/coverage/a3/modules/@apostrophecms/busy/index.html +116 -0
  54. package/coverage/a3/modules/@apostrophecms/busy/index.js.html +145 -0
  55. package/coverage/a3/modules/@apostrophecms/cache/index.html +116 -0
  56. package/coverage/a3/modules/@apostrophecms/cache/index.js.html +424 -0
  57. package/coverage/a3/modules/@apostrophecms/db/index.html +116 -0
  58. package/coverage/a3/modules/@apostrophecms/db/index.js.html +640 -0
  59. package/coverage/a3/modules/@apostrophecms/doc/index.html +116 -0
  60. package/coverage/a3/modules/@apostrophecms/doc/index.js.html +3937 -0
  61. package/coverage/a3/modules/@apostrophecms/doc/lib/index.html +116 -0
  62. package/coverage/a3/modules/@apostrophecms/doc/lib/legacy-migrations.js.html +622 -0
  63. package/coverage/a3/modules/@apostrophecms/doc-type/index.html +116 -0
  64. package/coverage/a3/modules/@apostrophecms/doc-type/index.js.html +8638 -0
  65. package/coverage/a3/modules/@apostrophecms/doc-type/lib/autocomplete.js.html +319 -0
  66. package/coverage/a3/modules/@apostrophecms/doc-type/lib/index.html +116 -0
  67. package/coverage/a3/modules/@apostrophecms/email/index.html +116 -0
  68. package/coverage/a3/modules/@apostrophecms/email/index.js.html +301 -0
  69. package/coverage/a3/modules/@apostrophecms/error/index.html +116 -0
  70. package/coverage/a3/modules/@apostrophecms/error/index.js.html +202 -0
  71. package/coverage/a3/modules/@apostrophecms/express/index.html +116 -0
  72. package/coverage/a3/modules/@apostrophecms/express/index.js.html +2116 -0
  73. package/coverage/a3/modules/@apostrophecms/file/index.html +116 -0
  74. package/coverage/a3/modules/@apostrophecms/file/index.js.html +367 -0
  75. package/coverage/a3/modules/@apostrophecms/file-tag/index.html +116 -0
  76. package/coverage/a3/modules/@apostrophecms/file-tag/index.js.html +127 -0
  77. package/coverage/a3/modules/@apostrophecms/global/index.html +116 -0
  78. package/coverage/a3/modules/@apostrophecms/global/index.js.html +535 -0
  79. package/coverage/a3/modules/@apostrophecms/home-page/index.html +116 -0
  80. package/coverage/a3/modules/@apostrophecms/home-page/index.js.html +94 -0
  81. package/coverage/a3/modules/@apostrophecms/html-widget/index.html +116 -0
  82. package/coverage/a3/modules/@apostrophecms/html-widget/index.js.html +271 -0
  83. package/coverage/a3/modules/@apostrophecms/http/index.html +116 -0
  84. package/coverage/a3/modules/@apostrophecms/http/index.js.html +976 -0
  85. package/coverage/a3/modules/@apostrophecms/i18n/index.html +116 -0
  86. package/coverage/a3/modules/@apostrophecms/i18n/index.js.html +2083 -0
  87. package/coverage/a3/modules/@apostrophecms/image/index.html +116 -0
  88. package/coverage/a3/modules/@apostrophecms/image/index.js.html +1486 -0
  89. package/coverage/a3/modules/@apostrophecms/image-tag/index.html +116 -0
  90. package/coverage/a3/modules/@apostrophecms/image-tag/index.js.html +127 -0
  91. package/coverage/a3/modules/@apostrophecms/image-widget/index.html +116 -0
  92. package/coverage/a3/modules/@apostrophecms/image-widget/index.js.html +145 -0
  93. package/coverage/a3/modules/@apostrophecms/job/index.html +116 -0
  94. package/coverage/a3/modules/@apostrophecms/job/index.js.html +1321 -0
  95. package/coverage/a3/modules/@apostrophecms/launder/index.html +116 -0
  96. package/coverage/a3/modules/@apostrophecms/launder/index.js.html +124 -0
  97. package/coverage/a3/modules/@apostrophecms/lock/index.html +116 -0
  98. package/coverage/a3/modules/@apostrophecms/lock/index.js.html +676 -0
  99. package/coverage/a3/modules/@apostrophecms/login/index.html +116 -0
  100. package/coverage/a3/modules/@apostrophecms/login/index.js.html +2617 -0
  101. package/coverage/a3/modules/@apostrophecms/migration/index.html +116 -0
  102. package/coverage/a3/modules/@apostrophecms/migration/index.js.html +970 -0
  103. package/coverage/a3/modules/@apostrophecms/modal/index.html +116 -0
  104. package/coverage/a3/modules/@apostrophecms/modal/index.js.html +193 -0
  105. package/coverage/a3/modules/@apostrophecms/module/index.html +116 -0
  106. package/coverage/a3/modules/@apostrophecms/module/index.js.html +2500 -0
  107. package/coverage/a3/modules/@apostrophecms/module/lib/events.js.html +547 -0
  108. package/coverage/a3/modules/@apostrophecms/module/lib/index.html +116 -0
  109. package/coverage/a3/modules/@apostrophecms/notification/index.html +116 -0
  110. package/coverage/a3/modules/@apostrophecms/notification/index.js.html +1315 -0
  111. package/coverage/a3/modules/@apostrophecms/oembed/index.html +116 -0
  112. package/coverage/a3/modules/@apostrophecms/oembed/index.js.html +781 -0
  113. package/coverage/a3/modules/@apostrophecms/oembed/lib/index.html +161 -0
  114. package/coverage/a3/modules/@apostrophecms/oembed/lib/infogram.js.html +178 -0
  115. package/coverage/a3/modules/@apostrophecms/oembed/lib/vimeo.js.html +124 -0
  116. package/coverage/a3/modules/@apostrophecms/oembed/lib/wufoo.js.html +256 -0
  117. package/coverage/a3/modules/@apostrophecms/oembed/lib/youtube.js.html +322 -0
  118. package/coverage/a3/modules/@apostrophecms/oembed-field/index.html +116 -0
  119. package/coverage/a3/modules/@apostrophecms/oembed-field/index.js.html +268 -0
  120. package/coverage/a3/modules/@apostrophecms/page/index.html +116 -0
  121. package/coverage/a3/modules/@apostrophecms/page/index.js.html +6955 -0
  122. package/coverage/a3/modules/@apostrophecms/page/lib/index.html +116 -0
  123. package/coverage/a3/modules/@apostrophecms/page/lib/legacy-migrations.js.html +568 -0
  124. package/coverage/a3/modules/@apostrophecms/page-type/index.html +116 -0
  125. package/coverage/a3/modules/@apostrophecms/page-type/index.js.html +1501 -0
  126. package/coverage/a3/modules/@apostrophecms/pager/index.html +116 -0
  127. package/coverage/a3/modules/@apostrophecms/pager/index.js.html +232 -0
  128. package/coverage/a3/modules/@apostrophecms/permission/index.html +116 -0
  129. package/coverage/a3/modules/@apostrophecms/permission/index.js.html +1057 -0
  130. package/coverage/a3/modules/@apostrophecms/permission/lib/index.html +116 -0
  131. package/coverage/a3/modules/@apostrophecms/permission/lib/legacy-migrations.js.html +160 -0
  132. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.html +116 -0
  133. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.js.html +1051 -0
  134. package/coverage/a3/modules/@apostrophecms/piece-type/index.html +116 -0
  135. package/coverage/a3/modules/@apostrophecms/piece-type/index.js.html +3103 -0
  136. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.html +116 -0
  137. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.js.html +157 -0
  138. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.html +116 -0
  139. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.js.html +1363 -0
  140. package/coverage/a3/modules/@apostrophecms/schema/index.html +116 -0
  141. package/coverage/a3/modules/@apostrophecms/schema/index.js.html +4603 -0
  142. package/coverage/a3/modules/@apostrophecms/schema/lib/addFieldTypes.js.html +3502 -0
  143. package/coverage/a3/modules/@apostrophecms/schema/lib/index.html +131 -0
  144. package/coverage/a3/modules/@apostrophecms/schema/lib/joinr.js.html +703 -0
  145. package/coverage/a3/modules/@apostrophecms/search/index.html +116 -0
  146. package/coverage/a3/modules/@apostrophecms/search/index.js.html +1222 -0
  147. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.html +116 -0
  148. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.js.html +343 -0
  149. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.html +116 -0
  150. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.js.html +595 -0
  151. package/coverage/a3/modules/@apostrophecms/task/index.html +116 -0
  152. package/coverage/a3/modules/@apostrophecms/task/index.js.html +1147 -0
  153. package/coverage/a3/modules/@apostrophecms/template/index.html +116 -0
  154. package/coverage/a3/modules/@apostrophecms/template/index.js.html +2731 -0
  155. package/coverage/a3/modules/@apostrophecms/template/lib/bundlesLoader.js.html +559 -0
  156. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/component.js.html +310 -0
  157. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/fragment.js.html +325 -0
  158. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/index.html +146 -0
  159. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/render.js.html +490 -0
  160. package/coverage/a3/modules/@apostrophecms/template/lib/index.html +131 -0
  161. package/coverage/a3/modules/@apostrophecms/template/lib/nunjucksLoader.js.html +658 -0
  162. package/coverage/a3/modules/@apostrophecms/ui/index.html +116 -0
  163. package/coverage/a3/modules/@apostrophecms/ui/index.js.html +181 -0
  164. package/coverage/a3/modules/@apostrophecms/uploadfs/index.html +116 -0
  165. package/coverage/a3/modules/@apostrophecms/uploadfs/index.js.html +286 -0
  166. package/coverage/a3/modules/@apostrophecms/url/index.html +116 -0
  167. package/coverage/a3/modules/@apostrophecms/url/index.js.html +733 -0
  168. package/coverage/a3/modules/@apostrophecms/user/index.html +116 -0
  169. package/coverage/a3/modules/@apostrophecms/user/index.js.html +1684 -0
  170. package/coverage/a3/modules/@apostrophecms/user/lib/index.html +116 -0
  171. package/coverage/a3/modules/@apostrophecms/user/lib/legacy-migrations.js.html +157 -0
  172. package/coverage/a3/modules/@apostrophecms/util/index.html +116 -0
  173. package/coverage/a3/modules/@apostrophecms/util/index.js.html +3424 -0
  174. package/coverage/a3/modules/@apostrophecms/util/lib/index.html +116 -0
  175. package/coverage/a3/modules/@apostrophecms/util/lib/logger.js.html +319 -0
  176. package/coverage/a3/modules/@apostrophecms/video-widget/index.html +116 -0
  177. package/coverage/a3/modules/@apostrophecms/video-widget/index.js.html +178 -0
  178. package/coverage/a3/modules/@apostrophecms/widget-type/index.html +116 -0
  179. package/coverage/a3/modules/@apostrophecms/widget-type/index.js.html +1225 -0
  180. package/coverage/a3/test-lib/index.html +131 -0
  181. package/coverage/a3/test-lib/test.js.html +232 -0
  182. package/coverage/a3/test-lib/util.js.html +373 -0
  183. package/coverage/base.css +224 -0
  184. package/coverage/block-navigation.js +87 -0
  185. package/coverage/favicon.png +0 -0
  186. package/coverage/index.html +1256 -0
  187. package/coverage/prettify.css +1 -0
  188. package/coverage/prettify.js +2 -0
  189. package/coverage/sort-arrow-sprite.png +0 -0
  190. package/coverage/sorter.js +196 -0
  191. package/lib/modules/apostrophe-assets/index.js +3 -1
  192. package/lib/modules/apostrophe-pages/lib/api.js +8 -6
  193. package/package.json +1 -1
  194. package/test/package.json +0 -75
@@ -0,0 +1,2104 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for a3/modules/@apostrophecms/area/index.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">a3/modules/@apostrophecms/area</a> index.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">60.97% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>150/246</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">53.64% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>81/151</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">70% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>35/50</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">60.49% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>147/243</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 oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">90x</span>
740
+ <span class="cline-any cline-yes">90x</span>
741
+ <span class="cline-any cline-yes">90x</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-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-yes">90x</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-yes">90x</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-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">90x</span>
765
+ <span class="cline-any cline-yes">90x</span>
766
+ <span class="cline-any cline-yes">90x</span>
767
+ <span class="cline-any cline-yes">90x</span>
768
+ <span class="cline-any cline-yes">90x</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-yes">90x</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-no">&nbsp;</span>
776
+ <span class="cline-any cline-no">&nbsp;</span>
777
+ <span class="cline-any cline-no">&nbsp;</span>
778
+ <span class="cline-any cline-no">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-no">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
798
+ <span class="cline-any cline-no">&nbsp;</span>
799
+ <span class="cline-any cline-no">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
806
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-yes">90x</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-yes">90x</span>
820
+ <span class="cline-any cline-yes">375x</span>
821
+ <span class="cline-any cline-yes">90x</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-yes">90x</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">375x</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-yes">423x</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-no">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-no">&nbsp;</span>
847
+ <span class="cline-any cline-no">&nbsp;</span>
848
+ <span class="cline-any cline-no">&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-yes">8x</span>
853
+ <span class="cline-any cline-yes">44x</span>
854
+ <span class="cline-any cline-yes">8x</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-yes">8x</span>
858
+ <span class="cline-any cline-yes">8x</span>
859
+ <span class="cline-any cline-yes">8x</span>
860
+ <span class="cline-any cline-yes">8x</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-yes">8x</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-yes">8x</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-yes">8x</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-yes">8x</span>
873
+ <span class="cline-any cline-yes">8x</span>
874
+ <span class="cline-any cline-no">&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-yes">8x</span>
882
+ <span class="cline-any cline-yes">12x</span>
883
+ <span class="cline-any cline-yes">12x</span>
884
+ <span class="cline-any cline-yes">12x</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-yes">8x</span>
893
+ <span class="cline-any cline-yes">8x</span>
894
+ <span class="cline-any cline-yes">8x</span>
895
+ <span class="cline-any cline-yes">10x</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-yes">8x</span>
899
+ <span class="cline-any cline-yes">8x</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-yes">8x</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-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-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-yes">1x</span>
920
+ <span class="cline-any cline-yes">1x</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-yes">1x</span>
923
+ <span class="cline-any cline-yes">2x</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-yes">2x</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-yes">2x</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-yes">4x</span>
931
+ <span class="cline-any cline-no">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-yes">4x</span>
936
+ <span class="cline-any cline-yes">4x</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-yes">4x</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">4x</span>
944
+ <span class="cline-any cline-yes">2x</span>
945
+ <span class="cline-any cline-yes">2x</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-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-yes">2x</span>
950
+ <span class="cline-any cline-yes">2x</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-yes">2x</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-yes">2x</span>
956
+ <span class="cline-any cline-yes">2x</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-yes">2x</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-yes">2x</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-yes">2x</span>
965
+ <span class="cline-any cline-yes">2x</span>
966
+ <span class="cline-any cline-yes">2x</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-yes">6x</span>
971
+ <span class="cline-any cline-yes">6x</span>
972
+ <span class="cline-any cline-yes">6x</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-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-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">44x</span>
993
+ <span class="cline-any cline-yes">44x</span>
994
+ <span class="cline-any cline-yes">44x</span>
995
+ <span class="cline-any cline-yes">44x</span>
996
+ <span class="cline-any cline-yes">44x</span>
997
+ <span class="cline-any cline-yes">77x</span>
998
+ <span class="cline-any cline-yes">77x</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-yes">77x</span>
1002
+ <span class="cline-any cline-yes">77x</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-yes">77x</span>
1007
+ <span class="cline-any cline-yes">77x</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-yes">1x</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-yes">76x</span>
1013
+ <span class="cline-any cline-yes">76x</span>
1014
+ <span class="cline-any cline-yes">76x</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1030
+ <span class="cline-any cline-yes">76x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">44x</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">44x</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-no">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-no">&nbsp;</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-no">&nbsp;</span>
1052
+ <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-no">&nbsp;</span>
1066
+ <span class="cline-any cline-no">&nbsp;</span>
1067
+ <span class="cline-any cline-no">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-no">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&nbsp;</span>
1073
+ <span class="cline-any cline-no">&nbsp;</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-no">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-no">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-no">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-yes">5640x</span>
1113
+ <span class="cline-any cline-yes">140654x</span>
1114
+ <span class="cline-any cline-yes">196x</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-no">&nbsp;</span>
1126
+ <span class="cline-any cline-no">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-no">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-neutral">&nbsp;</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-yes">5x</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-yes">70x</span>
1159
+ <span class="cline-any cline-yes">50x</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-yes">20x</span>
1162
+ <span class="cline-any cline-yes">10x</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-yes">10x</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-yes">5x</span>
1167
+ <span class="cline-any cline-yes">5x</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-yes">5x</span>
1171
+ <span class="cline-any cline-yes">70x</span>
1172
+ <span class="cline-any cline-yes">10x</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-yes">5x</span>
1176
+ <span class="cline-any cline-yes">1x</span>
1177
+ <span class="cline-any cline-yes">2x</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-yes">4x</span>
1181
+ <span class="cline-any cline-yes">4x</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-neutral">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-yes">2x</span>
1207
+ <span class="cline-any cline-yes">2x</span>
1208
+ <span class="cline-any cline-yes">2x</span>
1209
+ <span class="cline-any cline-yes">2x</span>
1210
+ <span class="cline-any cline-yes">2x</span>
1211
+ <span class="cline-any cline-yes">1x</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-yes">1x</span>
1214
+ <span class="cline-any cline-yes">1x</span>
1215
+ <span class="cline-any cline-no">&nbsp;</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-yes">1x</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-yes">1x</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-neutral">&nbsp;</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-yes">1x</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-yes">1x</span>
1234
+ <span class="cline-any cline-yes">1x</span>
1235
+ <span class="cline-any cline-yes">1x</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-yes">1x</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-yes">78x</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-yes">78x</span>
1252
+ <span class="cline-any cline-yes">78x</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
1269
+ <span class="cline-any cline-neutral">&nbsp;</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-yes">52x</span>
1273
+ <span class="cline-any cline-yes">6x</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-yes">46x</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-yes">52x</span>
1279
+ <span class="cline-any cline-yes">37x</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-yes">15x</span>
1282
+ <span class="cline-any cline-yes">7x</span>
1283
+ <span class="cline-any cline-yes">7x</span>
1284
+ <span class="cline-any cline-yes">7x</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-no">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-yes">29x</span>
1292
+ <span class="cline-any cline-yes">29x</span>
1293
+ <span class="cline-any cline-yes">29x</span>
1294
+ <span class="cline-any cline-yes">29x</span>
1295
+ <span class="cline-any cline-yes">29x</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-yes">29x</span>
1298
+ <span class="cline-any cline-yes">121x</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-yes">121x</span>
1301
+ <span class="cline-any cline-yes">121x</span>
1302
+ <span class="cline-any cline-yes">121x</span>
1303
+ <span class="cline-any cline-yes">121x</span>
1304
+ <span class="cline-any cline-yes">121x</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-yes">29x</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-yes">90x</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-neutral">&nbsp;</span>
1324
+ <span class="cline-any cline-neutral">&nbsp;</span>
1325
+ <span class="cline-any cline-neutral">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-no">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-neutral">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-neutral">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-yes">90x</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-neutral">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
1359
+ <span class="cline-any cline-neutral">&nbsp;</span>
1360
+ <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-neutral">&nbsp;</span>
1362
+ <span class="cline-any cline-neutral">&nbsp;</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-no">&nbsp;</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-neutral">&nbsp;</span>
1368
+ <span class="cline-any cline-neutral">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-neutral">&nbsp;</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-neutral">&nbsp;</span>
1379
+ <span class="cline-any cline-neutral">&nbsp;</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-neutral">&nbsp;</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-no">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-neutral">&nbsp;</span>
1386
+ <span class="cline-any cline-neutral">&nbsp;</span>
1387
+ <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-neutral">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-neutral">&nbsp;</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-no">&nbsp;</span>
1397
+ <span class="cline-any cline-no">&nbsp;</span>
1398
+ <span class="cline-any cline-neutral">&nbsp;</span>
1399
+ <span class="cline-any cline-no">&nbsp;</span>
1400
+ <span class="cline-any cline-neutral">&nbsp;</span>
1401
+ <span class="cline-any cline-no">&nbsp;</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-neutral">&nbsp;</span>
1406
+ <span class="cline-any cline-yes">90x</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const _ = require('lodash');
1413
+ const deep = require('deep-get-set');
1414
+ const { stripIndent } = require('common-tags');
1415
+ &nbsp;
1416
+ // An area is a series of zero or more widgets, in which users can add
1417
+ // and remove widgets and drag them to reorder them. This module implements
1418
+ // areas, with the help of a query builder in the doc module. This module also
1419
+ // provides browser-side support for invoking the players of widgets in an area and for editing areas.
1420
+ &nbsp;
1421
+ module.exports = {
1422
+ options: { alias: 'area' },
1423
+ init(self) {
1424
+ // These properties have special meaning in Apostrophe docs and are not
1425
+ // acceptable for use as top-level area names
1426
+ self.forbiddenAreas = [
1427
+ '_id',
1428
+ 'title',
1429
+ 'slug',
1430
+ 'titleSort',
1431
+ 'docPermissions',
1432
+ 'type',
1433
+ 'path',
1434
+ 'rank',
1435
+ 'level'
1436
+ ];
1437
+ self.widgetManagers = {};
1438
+ self.richTextWidgetTypes = [];
1439
+ self.widgetManagers = {};
1440
+ self.enableBrowserData();
1441
+ self.addDeduplicateWidgetIdsMigration();
1442
+ },
1443
+ apiRoutes(self) {
1444
+ return {
1445
+ post: {
1446
+ <span class="fstat-no" title="function not covered" > as</span>ync renderWidget(req) {
1447
+ let widget = <span class="cstat-no" title="statement not covered" >typeof req.body.widget === 'object' ? req.body.widget : {};</span>
1448
+ const areaFieldId = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.areaFieldId);</span>
1449
+ const type = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.type);</span>
1450
+ const _docId = <span class="cstat-no" title="statement not covered" >self.apos.launder.id(req.body._docId);</span>
1451
+ const field = <span class="cstat-no" title="statement not covered" >self.apos.schema.getFieldById(areaFieldId);</span>
1452
+ &nbsp;
1453
+ <span class="cstat-no" title="statement not covered" > if (!field) {</span>
1454
+ <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
1455
+ }
1456
+ &nbsp;
1457
+ let options = <span class="cstat-no" title="statement not covered" >field.options &amp;&amp; field.options.widgets &amp;&amp; field.options.widgets[type];</span>
1458
+ &nbsp;
1459
+ <span class="cstat-no" title="statement not covered" > options = options || {};</span>
1460
+ const manager = <span class="cstat-no" title="statement not covered" >self.getWidgetManager(type);</span>
1461
+ <span class="cstat-no" title="statement not covered" > if (!manager) {</span>
1462
+ <span class="cstat-no" title="statement not covered" > self.warnMissingWidgetType(type);</span>
1463
+ <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
1464
+ }
1465
+ <span class="cstat-no" title="statement not covered" > widget = await sanitize(widget);</span>
1466
+ <span class="cstat-no" title="statement not covered" > widget._edit = true;</span>
1467
+ <span class="cstat-no" title="statement not covered" > widget._docId = _docId;</span>
1468
+ // So that carrying out relationship loading again can yield results
1469
+ // (the idsStorage must be populated as if we were saving)
1470
+ <span class="cstat-no" title="statement not covered" > self.apos.schema.prepareForStorage(req, widget);</span>
1471
+ <span class="cstat-no" title="statement not covered" > await load();</span>
1472
+ <span class="cstat-no" title="statement not covered" > return render();</span>
1473
+ async function <span class="fstat-no" title="function not covered" >sanitize(</span>widget) {
1474
+ <span class="cstat-no" title="statement not covered" > return manager.sanitize(req, widget, options);</span>
1475
+ }
1476
+ async function <span class="fstat-no" title="function not covered" >load(</span>) {
1477
+ // Hint to call nested widget loaders as if it were a doc
1478
+ <span class="cstat-no" title="statement not covered" > widget._virtual = true;</span>
1479
+ <span class="cstat-no" title="statement not covered" > return manager.loadIfSuitable(req, [ widget ]);</span>
1480
+ }
1481
+ async function <span class="fstat-no" title="function not covered" >render(</span>) {
1482
+ <span class="cstat-no" title="statement not covered" > return self.renderWidget(req, type, widget, options);</span>
1483
+ }
1484
+ }
1485
+ }
1486
+ };
1487
+ },
1488
+ handlers(self) {
1489
+ return {
1490
+ 'apostrophe:modulesRegistered': {
1491
+ getRichTextWidgetTypes() {
1492
+ _.each(self.widgetManagers, function (manager, name) {
1493
+ if (manager.getRichText) {
1494
+ self.richTextWidgetTypes.push(name);
1495
+ }
1496
+ });
1497
+ }
1498
+ }
1499
+ };
1500
+ },
1501
+ methods(self) {
1502
+ return {
1503
+ // Set the manager object for the given widget type name. The manager is
1504
+ // expected to provide `sanitize`, `output` and `load` methods. Normally
1505
+ // this method is called for you when you extend the `@apostrophecms/widget-type`
1506
+ // module, which is recommended.
1507
+ setWidgetManager(name, manager) {
1508
+ self.widgetManagers[name] = manager;
1509
+ },
1510
+ // Get the manager object for the given widget type name.
1511
+ getWidgetManager(name) {
1512
+ return self.widgetManagers[name];
1513
+ },
1514
+ // Print warning message about a missing widget type — only once per run per type.
1515
+ <span class="fstat-no" title="function not covered" > wa</span>rnMissingWidgetType(name) {
1516
+ <span class="cstat-no" title="statement not covered" > if (!self.missingWidgetTypes) {</span>
1517
+ <span class="cstat-no" title="statement not covered" > self.missingWidgetTypes = {};</span>
1518
+ }
1519
+ <span class="cstat-no" title="statement not covered" > if (!self.missingWidgetTypes[name]) {</span>
1520
+ <span class="cstat-no" title="statement not covered" > self.apos.util.error('WARNING: widget type ' + name + ' exists in content but is not configured');</span>
1521
+ <span class="cstat-no" title="statement not covered" > self.missingWidgetTypes[name] = true;</span>
1522
+ }
1523
+ },
1524
+ prepForRender(area, context, fieldName) {
1525
+ const manager = self.apos.util.getManagerOf(context);
1526
+ const field = manager.schema.find(field =&gt; field.name === fieldName);
1527
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!field) {
1528
+ <span class="cstat-no" title="statement not covered" > throw new Error(`The requested ${context.metaType} has no field named ${fieldName}. In Apostrophe 3.x, areas must be part of the schema for each page or piece type.`);</span>
1529
+ }
1530
+ area._fieldId = field._id;
1531
+ area._docId = context._docId || ((context.metaType === 'doc') ? context._id : <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>;
1532
+ area._edit = context._edit;
1533
+ return area;
1534
+ },
1535
+ // Render the given `area` object via `area.html`, with the given `context`
1536
+ // which may be omitted. Called for you by the `{% area %} custom tag.
1537
+ async renderArea(req, area, _with) {
1538
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!area._id) {
1539
+ <span class="cstat-no" title="statement not covered" > throw new Error('All areas must have an _id property in A3.x. Area details:\n\n' + JSON.stringify(area));</span>
1540
+ }
1541
+ const choices = [];
1542
+ &nbsp;
1543
+ const field = self.apos.schema.getFieldById(area._fieldId);
1544
+ &nbsp;
1545
+ const options = field.options;
1546
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!options) {
1547
+ <span class="cstat-no" title="statement not covered" > throw new Error(stripIndent`</span>
1548
+ The area field ${field.name} has no options property.
1549
+ &nbsp;
1550
+ You probably forgot to nest the widgets property
1551
+ in an options property.
1552
+ `);
1553
+ }
1554
+ _.each(options.widgets, function (options, name) {
1555
+ const manager = self.widgetManagers[name];
1556
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (manager) {
1557
+ choices.push({
1558
+ name: name,
1559
+ icon: manager.options.icon,
1560
+ label: options.addLabel || manager.label || <span class="branch-2 cbranch-no" title="branch not covered" >`No label for ${name}`</span>
1561
+ });
1562
+ }
1563
+ });
1564
+ // Guarantee that `items` at least exists
1565
+ area.items = area.items || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1566
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (area._docId) {
1567
+ for (const item of area.items) {
1568
+ item._docId = area._docId;
1569
+ }
1570
+ }
1571
+ const canEdit = area._edit &amp;&amp; (options.edit !== false) &amp;&amp; req.query.aposEdit;
1572
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (canEdit) {
1573
+ // Ease of access to image URLs. When not editing we
1574
+ // just use the helpers
1575
+ <span class="cstat-no" title="statement not covered" > self.apos.attachment.all(area, { annotate: true });</span>
1576
+ }
1577
+ return self.render(req, 'area', {
1578
+ // TODO filter area to exclude big relationship objects, but
1579
+ // not so sloppy this time please
1580
+ area,
1581
+ field,
1582
+ options,
1583
+ choices,
1584
+ _with,
1585
+ canEdit
1586
+ });
1587
+ },
1588
+ // Replace documents' area objects with rendered HTML for each area.
1589
+ // This is used by GET requests including the `render-areas` query
1590
+ // parameter. `within` is an array of Apostrophe documents.
1591
+ async renderDocsAreas(req, within) {
1592
+ within = Array.isArray(within) ? within : <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1593
+ let index = 0;
1594
+ // Loop over the docs in the array passed in.
1595
+ for (const doc of within) {
1596
+ const rendered = [];
1597
+ &nbsp;
1598
+ const areasToRender = {};
1599
+ // Walk the document's areas and stash the areas for rendering later.
1600
+ self.walk(doc, async function (area, dotPath) {
1601
+ // If this area is the child of another area, then we only want
1602
+ // to render the parent area.
1603
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (rendered.findIndex(path =&gt; dotPath.startsWith(`${path}.`)) &gt; -1) {
1604
+ <span class="cstat-no" title="statement not covered" > return;</span>
1605
+ }
1606
+ // We're only rendering areas on the document, not ancestor or
1607
+ // child page documents.
1608
+ const regex = /^_(ancestors|children)|\._(ancestors|children)/;
1609
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (dotPath.match(regex)) {
1610
+ <span class="cstat-no" title="statement not covered" > return;</span>
1611
+ }
1612
+ &nbsp;
1613
+ const parent = findParent(doc, dotPath);
1614
+ // Only render areas whose parent has a metaType, which is required
1615
+ // to find the area options.
1616
+ if (parent &amp;&amp; parent.metaType) {
1617
+ rendered.push(dotPath);
1618
+ areasToRender[dotPath] = area;
1619
+ }
1620
+ });
1621
+ // Now go over the stashed areas and render their areas into HTML.
1622
+ for (const path of Object.keys(areasToRender)) {
1623
+ const parent = findParent(doc, path);
1624
+ &nbsp;
1625
+ await render(areasToRender[path], path, parent);
1626
+ }
1627
+ &nbsp;
1628
+ within[index] = doc;
1629
+ index++;
1630
+ }
1631
+ &nbsp;
1632
+ async function render(area, path, context, opts) {
1633
+ const preppedArea = self.prepForRender(area, context, path);
1634
+ &nbsp;
1635
+ const areaRendered = await self.apos.area.renderArea(req, preppedArea, context);
1636
+ &nbsp;
1637
+ deep(context, `${path}._rendered`, areaRendered);
1638
+ deep(context, `${path}._fieldId`, undefined);
1639
+ deep(context, `${path}.items`, undefined);
1640
+ }
1641
+ &nbsp;
1642
+ function findParent(doc, dotPath) {
1643
+ const pathSplit = dotPath.split('.');
1644
+ const parentDotPath = pathSplit.slice(0, pathSplit.length - 1).join('.');
1645
+ return deep(doc, parentDotPath) || doc;
1646
+ }
1647
+ },
1648
+ // Sanitize an input array of items intended to become
1649
+ // the `items` property of an area. Invokes the
1650
+ // sanitize method for each widget manager. Widgets
1651
+ // with no manager are discarded. Invoked for you by
1652
+ // the routes that save areas and by the implementation
1653
+ // of the `area` schema field type.
1654
+ //
1655
+ // The `options` parameter contains the area-level
1656
+ // options to sanitize against. Thus h5 can be legal
1657
+ // in one rich text widget and not in another.
1658
+ //
1659
+ // If any errors occur sanitizing the individual widgets,
1660
+ // an array of errors with `path` and `error` properties
1661
+ // is thrown.
1662
+ //
1663
+ // Returns a new array of sanitized items.
1664
+ async sanitizeItems(req, items, options) {
1665
+ options = options || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
1666
+ const result = [];
1667
+ const errors = [];
1668
+ const widgetsOptions = options.widgets || <span class="branch-1 cbranch-no" title="branch not covered" >{};</span>
1669
+ for (let i = 0; i &lt; items.length; i++) {
1670
+ const item = items[i];
1671
+ <span class="missing-if-branch" title="if path not taken" >I</span>if ((item == null) || typeof item !== 'object' || typeof item.type !== 'string') {
1672
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1673
+ }
1674
+ const manager = self.getWidgetManager(item.type);
1675
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!manager) {
1676
+ <span class="cstat-no" title="statement not covered" > self.warnMissingWidgetType(item.type);</span>
1677
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1678
+ }
1679
+ const widgetOptions = widgetsOptions[item.type];
1680
+ if (!widgetOptions) {
1681
+ // This widget is not specified for this area at all
1682
+ continue;
1683
+ }
1684
+ let newItem;
1685
+ try {
1686
+ newItem = await manager.sanitize(req, item, widgetOptions);
1687
+ newItem._id = self.apos.launder.id(item._id) || self.apos.util.generateId();
1688
+ } catch (e) {
1689
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(e)) {</span>
1690
+ <span class="cstat-no" title="statement not covered" > for (const error of e) {</span>
1691
+ <span class="cstat-no" title="statement not covered" > errors.push({</span>
1692
+ path: i + '.' + error.path,
1693
+ error: error.error
1694
+ });
1695
+ }
1696
+ } else {
1697
+ <span class="cstat-no" title="statement not covered" > errors.push({</span>
1698
+ path: i,
1699
+ error: e
1700
+ });
1701
+ }
1702
+ }
1703
+ result.push(newItem);
1704
+ }
1705
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (errors.length) {
1706
+ <span class="cstat-no" title="statement not covered" > throw errors;</span>
1707
+ } else {
1708
+ return result;
1709
+ }
1710
+ },
1711
+ // Renders markup for a widget of the given `type`. The actual
1712
+ // content of the widget is passed in `data`. Returns html on
1713
+ // success. Invoked by the `render-widget` route, which is used
1714
+ // to update a widget on the page after it is saved, or for
1715
+ // preview when editing.
1716
+ <span class="fstat-no" title="function not covered" > as</span>ync renderWidget(req, type, data, options) {
1717
+ const manager = <span class="cstat-no" title="statement not covered" >self.getWidgetManager(type);</span>
1718
+ <span class="cstat-no" title="statement not covered" > if (!manager) {</span>
1719
+ // No manager available - possibly a stale widget in the database
1720
+ // of a type no longer in the project
1721
+ <span class="cstat-no" title="statement not covered" > self.warnMissingWidgetType(type);</span>
1722
+ <span class="cstat-no" title="statement not covered" > return '';</span>
1723
+ }
1724
+ <span class="cstat-no" title="statement not covered" > data.type = type;</span>
1725
+ <span class="cstat-no" title="statement not covered" > return manager.output(req, data, options);</span>
1726
+ },
1727
+ // Update or create an area at the specified
1728
+ // dot path in the document with the specified
1729
+ // id, if we have permission to do so. The change is
1730
+ // saved in the database. The
1731
+ // `items` array is NOT sanitized here; you should call
1732
+ // `sanitizeItems` first. Called for you by the
1733
+ // `save-area` route.
1734
+ <span class="fstat-no" title="function not covered" > as</span>ync saveArea(req, docId, dotPath, items) {
1735
+ const doc = <span class="cstat-no" title="statement not covered" >await find();</span>
1736
+ <span class="cstat-no" title="statement not covered" > return update(doc);</span>
1737
+ async function <span class="fstat-no" title="function not covered" >find(</span>) {
1738
+ const doc = <span class="cstat-no" title="statement not covered" >await self.apos.doc.find(req, { _id: docId }).permission('edit').toObject();</span>
1739
+ <span class="cstat-no" title="statement not covered" > if (!doc) {</span>
1740
+ <span class="cstat-no" title="statement not covered" > throw self.apos.error('notfound');</span>
1741
+ }
1742
+ <span class="cstat-no" title="statement not covered" > return doc;</span>
1743
+ }
1744
+ async function <span class="fstat-no" title="function not covered" >update(</span>doc) {
1745
+ const components = <span class="cstat-no" title="statement not covered" >dotPath.split(/\./);</span>
1746
+ <span class="cstat-no" title="statement not covered" > if (_.includes(self.forbiddenAreas, components[0])) {</span>
1747
+ <span class="cstat-no" title="statement not covered" > throw self.apos.error('forbidden');</span>
1748
+ }
1749
+ // If it's not a top level property, it's
1750
+ // always okay - unless it already exists
1751
+ // and is not an area.
1752
+ <span class="cstat-no" title="statement not covered" > if (components.length &gt; 1) {</span>
1753
+ const existing = <span class="cstat-no" title="statement not covered" >deep(doc, dotPath);</span>
1754
+ <span class="cstat-no" title="statement not covered" > if (existing &amp;&amp; existing.metaType !== 'area') {</span>
1755
+ <span class="cstat-no" title="statement not covered" > throw self.apos.error('forbidden');</span>
1756
+ }
1757
+ }
1758
+ const existingArea = <span class="cstat-no" title="statement not covered" >deep(doc, dotPath);</span>
1759
+ const existingItems = <span class="cstat-no" title="statement not covered" >existingArea &amp;&amp; (existingArea.items || []);</span>
1760
+ <span class="cstat-no" title="statement not covered" > if (_.isEqual(self.apos.util.clonePermanent(items), self.apos.util.clonePermanent(existingItems))) {</span>
1761
+ // No real change — don't waste a version and clutter the database.
1762
+ // Sometimes only the server-side sanitizers can tell accurately that
1763
+ // nothing has changed. -Tom
1764
+ <span class="cstat-no" title="statement not covered" > return;</span>
1765
+ }
1766
+ <span class="cstat-no" title="statement not covered" > deep(doc, dotPath, {</span>
1767
+ metaType: 'area',
1768
+ items: items
1769
+ });
1770
+ <span class="cstat-no" title="statement not covered" > return self.apos.doc.update(req, doc);</span>
1771
+ }
1772
+ },
1773
+ // Walk the areas in a doc. Your iterator function is invoked once
1774
+ // for each area found, and receives the
1775
+ // area object and the dot-notation path to that object.
1776
+ // note that areas can be deeply nested in docs via
1777
+ // array schemas.
1778
+ //
1779
+ // If the iterator explicitly returns `false`, the area
1780
+ // is *removed* from the page object, otherwise no
1781
+ // modifications are made. This happens in memory only;
1782
+ // the database is not modified.
1783
+ walk(doc, iterator) {
1784
+ // o = object/doc, k = key, v = value
1785
+ return self.apos.doc.walk(doc, function (o, k, v, dotPath) {
1786
+ if (v &amp;&amp; v.metaType === 'area') {
1787
+ return iterator(v, dotPath);
1788
+ }
1789
+ });
1790
+ },
1791
+ // If the schema corresponding to the given doc's
1792
+ // `type` property has an `options` property for the
1793
+ // given field `name`, return that property. This is used
1794
+ // to conveniently default to the `options` already configured
1795
+ // for a particular area in the schema when working with
1796
+ // `@apostrophecms/piece-type` in a page template.
1797
+ <span class="fstat-no" title="function not covered" > ge</span>tSchemaOptions(doc, name) {
1798
+ const manager = <span class="cstat-no" title="statement not covered" >self.apos.doc.getManager(doc.type);</span>
1799
+ <span class="cstat-no" title="statement not covered" > if (!manager) {</span>
1800
+ // This happens if we try to find the schema options for an area in
1801
+ // a widget or something else that isn't a top level doc type, or
1802
+ // the projection did not include type.
1803
+ //
1804
+ // TODO: a better solution to the entire option-forwarding problem? -Tom
1805
+ <span class="cstat-no" title="statement not covered" > return {};</span>
1806
+ }
1807
+ const schema = <span class="cstat-no" title="statement not covered" >manager.schema;</span>
1808
+ const field = <span class="cstat-no" title="statement not covered" >_.find(schema, 'name', name);</span>
1809
+ <span class="cstat-no" title="statement not covered" > if (!(field &amp;&amp; field.options)) {</span>
1810
+ <span class="cstat-no" title="statement not covered" > return {};</span>
1811
+ }
1812
+ <span class="cstat-no" title="statement not covered" > return field.options;</span>
1813
+ },
1814
+ // Returns the rich text markup of all rich text widgets
1815
+ // within the provided doc or area, concatenated as a single string.
1816
+ //
1817
+ // By default the rich text contents of the widgets are joined with
1818
+ // a newline between. You may pass your own `options.delimiter` string if
1819
+ // you wish a different delimiter or the empty string. You may also pass
1820
+ // an HTML element name like `div` via `options.wrapper` to wrap each
1821
+ // one in a `&lt;div&gt;...&lt;/div&gt;` block. Of course, there may already be a div
1822
+ // in the rich txt (but then again there may not).
1823
+ //
1824
+ // Also available as a helper via `apos.area.richText(area, options)` in templates.
1825
+ //
1826
+ // Content will be retrieved from any widget type that supplies a
1827
+ // `getRichText` method.
1828
+ richText(within, options) {
1829
+ options = options || {};
1830
+ function test(attachment) {
1831
+ if (!attachment || typeof attachment !== 'object') {
1832
+ return false;
1833
+ }
1834
+ if (!_.includes(self.richTextWidgetTypes, attachment.type)) {
1835
+ return false;
1836
+ }
1837
+ return true;
1838
+ }
1839
+ const winners = [];
1840
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!within) {
1841
+ <span class="cstat-no" title="statement not covered" > return '';</span>
1842
+ }
1843
+ self.apos.doc.walk(within, function (o, key, value, dotPath, ancestors) {
1844
+ if (test(value)) {
1845
+ winners.push(value);
1846
+ }
1847
+ });
1848
+ if (options.wrapper) {
1849
+ return _.map(winners, function (winner) {
1850
+ return '&lt;' + options.wrapper + '&gt;' + winner.content + '&lt;/' + options.wrapper + '&gt;';
1851
+ }).join('');
1852
+ }
1853
+ const delimiter = options.delimiter !== undefined ? options.delimiter : '\n';
1854
+ return _.map(winners, 'content').join(delimiter);
1855
+ },
1856
+ // Returns the plaintext contents of all rich text widgets
1857
+ // within the provided doc or area, concatenated as a single string.
1858
+ //
1859
+ // By default the rich text contents of the various widgets are joined with
1860
+ // a newline between. You may pass your own `options.delimiter` string if
1861
+ // you wish a different delimiter or the empty string.
1862
+ //
1863
+ // Whitespace is trimmed off the leading and trailing edges of the string, and
1864
+ // consecutive newlines are condensed to one, to better match reasonable expectations
1865
+ // re: text that began as HTML.
1866
+ //
1867
+ // Pass `options.limit` to limit the number of characters. This method will
1868
+ // return fewer characters in order to avoid cutting off in mid-word.
1869
+ //
1870
+ // By default, three periods (`...`) follow a truncated string. If you prefer,
1871
+ // set `options.ellipsis` to a different suffix, which may be the empty string
1872
+ // if you wish.
1873
+ //
1874
+ // Also available as a helper via `apos.area.plaintext(area, options)` in templates.
1875
+ //
1876
+ // Content will be retrieved from any widget type that supplies a
1877
+ // `getRichText` method.
1878
+ plaintext(within, options) {
1879
+ options = options || {};
1880
+ const richText = self.richText(within, options);
1881
+ let plaintext = self.apos.util.htmlToPlaintext(richText).trim();
1882
+ plaintext = plaintext.replace(/\n+/g, '\n');
1883
+ if (!options.limit) {
1884
+ return plaintext;
1885
+ }
1886
+ let ellipsis = '...';
1887
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.ellipsis !== undefined) {
1888
+ <span class="cstat-no" title="statement not covered" > ellipsis = options.ellipsis;</span>
1889
+ }
1890
+ return self.apos.util.truncatePlaintext(plaintext, options.limit, ellipsis);
1891
+ },
1892
+ // Very handy for imports of all kinds: convert plaintext to an area with
1893
+ // one `@apostrophecms/rich-text` widget if it is not blank, otherwise an empty area. null and
1894
+ // undefined are tolerated and converted to empty areas.
1895
+ fromPlaintext(plaintext) {
1896
+ return self.fromRichText(self.apos.util.escapeHtml(plaintext, true));
1897
+ },
1898
+ // Convert HTML to an area with one '@apostrophecms/rich-text' widget, otherwise
1899
+ // an empty area. null and undefined are tolerated and converted to empty areas.
1900
+ fromRichText(html) {
1901
+ const area = {
1902
+ metaType: 'area',
1903
+ items: [],
1904
+ _id: self.apos.util.generateId()
1905
+ };
1906
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (html &amp;&amp; html.length) {
1907
+ html = html.toString();
1908
+ area.items.push({
1909
+ _id: self.apos.util.generateId(),
1910
+ type: '@apostrophecms/rich-text',
1911
+ content: html
1912
+ });
1913
+ }
1914
+ return area;
1915
+ },
1916
+ // Load widgets which were deferred until as late as possible. Only
1917
+ // comes into play if `req.deferWidgetLoading` was set to true for
1918
+ // the request. Invoked after the last `pageBeforeSend` handler, and
1919
+ // also at the end of the `@apostrophecms/global` middleware.
1920
+ async loadDeferredWidgets(req) {
1921
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!req.deferWidgetLoading) {
1922
+ <span class="cstat-no" title="statement not covered" > return;</span>
1923
+ }
1924
+ req.loadingDeferredWidgets = true;
1925
+ for (const type of _.keys(req.deferredWidgets)) {
1926
+ const manager = <span class="cstat-no" title="statement not covered" >self.getWidgetManager(type);</span>
1927
+ <span class="cstat-no" title="statement not covered" > if (!manager) {</span>
1928
+ <span class="cstat-no" title="statement not covered" > self.warnMissingWidgetType(type);</span>
1929
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1930
+ }
1931
+ <span class="cstat-no" title="statement not covered" > await manager.loadIfSuitable(req, req.deferredWidgets[type]);</span>
1932
+ }
1933
+ },
1934
+ // Returns true if the named area in the given `doc` is empty.
1935
+ //
1936
+ // Alternate syntax: `{ area: doc.areaname, ... more options }`
1937
+ //
1938
+ // An area is empty if it has no widgets in it, or when
1939
+ // all of the widgets in it return true when their
1940
+ // `isEmpty()` methods are interrogated. For instance,
1941
+ // if an area only contains a rich text widget and that
1942
+ // widget. A widget with no `isEmpty()` method is never empty.
1943
+ isEmpty(doc, name) {
1944
+ let area;
1945
+ if (arguments.length === 2) {
1946
+ area = doc[name];
1947
+ } else {
1948
+ // "doc" is an options object
1949
+ area = doc.area;
1950
+ }
1951
+ if (!area) {
1952
+ return true;
1953
+ }
1954
+ return !_.some(area.items, function (item) {
1955
+ const manager = self.getWidgetManager(item.type);
1956
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (manager &amp;&amp; manager.isEmpty) {
1957
+ return !manager.isEmpty(item);
1958
+ } else {
1959
+ <span class="cstat-no" title="statement not covered" > return true;</span>
1960
+ }
1961
+ });
1962
+ },
1963
+ getBrowserData(req) {
1964
+ const widgets = {};
1965
+ const widgetEditors = {};
1966
+ const widgetManagers = {};
1967
+ const widgetIsContextual = {};
1968
+ const contextualWidgetDefaultData = {};
1969
+ &nbsp;
1970
+ _.each(self.widgetManagers, function (manager, name) {
1971
+ const browserData = manager.getBrowserData(req);
1972
+ &nbsp;
1973
+ widgets[name] = (browserData &amp;&amp; browserData.components &amp;&amp; browserData.components.widget) || 'AposWidget';
1974
+ widgetEditors[name] = (browserData &amp;&amp; browserData.components &amp;&amp; browserData.components.widgetEditor) || 'AposWidgetEditor';
1975
+ widgetManagers[name] = manager.__meta.name;
1976
+ widgetIsContextual[name] = manager.options.contextual;
1977
+ contextualWidgetDefaultData[name] = manager.options.defaultData;
1978
+ });
1979
+ &nbsp;
1980
+ return {
1981
+ components: {
1982
+ editor: 'AposAreaEditor',
1983
+ widgets,
1984
+ widgetEditors
1985
+ },
1986
+ widgetIsContextual,
1987
+ contextualWidgetDefaultData,
1988
+ widgetManagers,
1989
+ action: self.action
1990
+ };
1991
+ },
1992
+ async addDeduplicateWidgetIdsMigration() {
1993
+ self.apos.migration.add('deduplicate-widget-ids', <span class="fstat-no" title="function not covered" >()</span> =&gt; {
1994
+ // Make them globally unique because that is easiest to
1995
+ // definitely get correct for this one-time migration, although
1996
+ // there is no guarantee that widget ids are unique between
1997
+ // separate documents going forward. The guarantee is that they
1998
+ // will be unique within documents
1999
+ const seen = <span class="cstat-no" title="statement not covered" >new Set();</span>
2000
+ <span class="cstat-no" title="statement not covered" > return self.apos.migration.eachWidget({}, <span class="fstat-no" title="function not covered" >as</span>ync (doc, widget, dotPath) =&gt; {</span>
2001
+ <span class="cstat-no" title="statement not covered" > if ((!widget._id) || seen.has(widget._id)) {</span>
2002
+ const _id = <span class="cstat-no" title="statement not covered" >self.apos.util.generateId();</span>
2003
+ <span class="cstat-no" title="statement not covered" > return self.apos.doc.db.updateOne({</span>
2004
+ _id: doc._id
2005
+ }, {
2006
+ $set: {
2007
+ [`${dotPath}._id`]: _id
2008
+ }
2009
+ });
2010
+ } else {
2011
+ <span class="cstat-no" title="statement not covered" > seen.add(widget._id);</span>
2012
+ }
2013
+ });
2014
+ });
2015
+ }
2016
+ };
2017
+ },
2018
+ helpers(self) {
2019
+ return {
2020
+ // Returns the rich text markup of all `@apostrophecms/rich-text` widgets
2021
+ // within the provided doc or area, concatenated as a single string. In future this method
2022
+ // may improve to return the content of other widgets that consider themselves primarily
2023
+ // providers of rich text, such as subclasses of `@apostrophecms/rich-text`,
2024
+ // which will **not** be regarded as a bc break. However it will never return images, videos, etc.
2025
+ //
2026
+ // By default the rich text contents of the widgets are joined with
2027
+ // a newline between. You may pass your own `options.delimiter` string if
2028
+ // you wish a different delimiter or the empty string. You may also pass
2029
+ // an HTML element name like `div` via `options.wrapper` to wrap each
2030
+ // one in a `&lt;div&gt;...&lt;/div&gt;` block. Of course, there may already be a div
2031
+ // in the rich txt (but then again there may not).
2032
+ //
2033
+ // Content will be retrieved from any widget type that supplies a
2034
+ // `getRichText` method.
2035
+ richText: <span class="fstat-no" title="function not covered" >fu</span>nction (within, options) {
2036
+ // Use the safe filter so that the markup doesn't get double-escaped by nunjucks
2037
+ <span class="cstat-no" title="statement not covered" > return self.apos.template.safe(self.richText(within, options));</span>
2038
+ },
2039
+ // Returns the plaintext contents of all rich text widgets
2040
+ // within the provided doc or area, concatenated as a single string.
2041
+ //
2042
+ // By default the rich text contents of the various widgets are joined with
2043
+ // a newline between. You may pass your own `options.delimiter` string if
2044
+ // you wish a different delimiter or the empty string.
2045
+ //
2046
+ // Pass `options.limit` to limit the number of characters. This method will
2047
+ // return fewer characters in order to avoid cutting off in mid-word.
2048
+ //
2049
+ // By default, three periods (`...`) follow a truncated string. If you prefer,
2050
+ // set `options.ellipsis` to a different suffix, which may be the empty string
2051
+ // if you wish.
2052
+ //
2053
+ // Content will be retrieved from any widget type that supplies a
2054
+ // `getRichText` method.
2055
+ plaintext: <span class="fstat-no" title="function not covered" >fu</span>nction (within, options) {
2056
+ <span class="cstat-no" title="statement not covered" > return self.plaintext(within, options);</span>
2057
+ },
2058
+ // Returns true if the named area in the given `doc` is empty.
2059
+ //
2060
+ // Alternate syntax: `{ area: doc.areaname, ... more options }`
2061
+ //
2062
+ // An area is empty if it has no widgets in it, or when
2063
+ // all of the widgets in it return true when their
2064
+ // `isEmpty()` methods are interrogated. For instance,
2065
+ // if an area only contains a rich text widget and that
2066
+ // widget. A widget with no `isEmpty()` method is never empty.
2067
+ isEmpty: <span class="fstat-no" title="function not covered" >fu</span>nction (doc, name) {
2068
+ let area;
2069
+ <span class="cstat-no" title="statement not covered" > if (!name) {</span>
2070
+ <span class="cstat-no" title="statement not covered" > area = doc.area;</span>
2071
+ } else {
2072
+ <span class="cstat-no" title="statement not covered" > area = doc[name];</span>
2073
+ }
2074
+ <span class="cstat-no" title="statement not covered" > return self.isEmpty({ area: area });</span>
2075
+ }
2076
+ };
2077
+ },
2078
+ customTags(self) {
2079
+ return {
2080
+ area: require('./lib/custom-tags/area.js')(self),
2081
+ widget: require('./lib/custom-tags/widget.js')(self)
2082
+ };
2083
+ }
2084
+ };
2085
+ &nbsp;</pre></td></tr></table></pre>
2086
+
2087
+ <div class='push'></div><!-- for sticky footer -->
2088
+ </div><!-- /wrapper -->
2089
+ <div class='footer quiet pad2 space-top1 center small'>
2090
+ Code coverage generated by
2091
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2092
+ at Wed Jun 08 2022 11:06:49 GMT+0200 (Central European Summer Time)
2093
+ </div>
2094
+ <script src="../../../../prettify.js"></script>
2095
+ <script>
2096
+ window.onload = function () {
2097
+ prettyPrint();
2098
+ };
2099
+ </script>
2100
+ <script src="../../../../sorter.js"></script>
2101
+ <script src="../../../../block-navigation.js"></script>
2102
+ </body>
2103
+ </html>
2104
+