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.
- package/.nyc_output/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
- package/.nyc_output/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
- package/.nyc_output/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
- package/.nyc_output/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
- package/.nyc_output/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
- package/.nyc_output/processinfo/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
- package/.nyc_output/processinfo/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
- package/.nyc_output/processinfo/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
- package/.nyc_output/processinfo/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
- package/.nyc_output/processinfo/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/CHANGELOG.md +12 -0
- package/coverage/a3/defaults.js.html +253 -0
- package/coverage/a3/index.html +131 -0
- package/coverage/a3/index.js.html +2338 -0
- package/coverage/a3/lib/escape-host.js.html +109 -0
- package/coverage/a3/lib/index.html +176 -0
- package/coverage/a3/lib/mongodb-connect.js.html +250 -0
- package/coverage/a3/lib/moog-require.js.html +790 -0
- package/coverage/a3/lib/moog.js.html +1711 -0
- package/coverage/a3/lib/opentelemetry.js.html +517 -0
- package/coverage/a3/modules/@apostrophecms/admin-bar/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/admin-bar/index.js.html +931 -0
- package/coverage/a3/modules/@apostrophecms/any-doc-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/any-doc-type/index.js.html +115 -0
- package/coverage/a3/modules/@apostrophecms/any-page-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/any-page-type/index.js.html +1105 -0
- package/coverage/a3/modules/@apostrophecms/archive-page/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/archive-page/index.js.html +97 -0
- package/coverage/a3/modules/@apostrophecms/area/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/area/index.js.html +2104 -0
- package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/area.js.html +469 -0
- package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/index.html +131 -0
- package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/widget.js.html +286 -0
- package/coverage/a3/modules/@apostrophecms/asset/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/asset/index.js.html +3982 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/globalIcons.js.html +346 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/index.html +131 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.scss.js.html +289 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js.html +148 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/index.html +131 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.es5.js.html +184 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.scss.js.html +238 -0
- package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/utils.js.html +958 -0
- package/coverage/a3/modules/@apostrophecms/attachment/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/attachment/index.js.html +3676 -0
- package/coverage/a3/modules/@apostrophecms/attachment/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/attachment/lib/legacy-migrations.js.html +205 -0
- package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/rescale.js.html +328 -0
- package/coverage/a3/modules/@apostrophecms/busy/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/busy/index.js.html +145 -0
- package/coverage/a3/modules/@apostrophecms/cache/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/cache/index.js.html +424 -0
- package/coverage/a3/modules/@apostrophecms/db/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/db/index.js.html +640 -0
- package/coverage/a3/modules/@apostrophecms/doc/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/doc/index.js.html +3937 -0
- package/coverage/a3/modules/@apostrophecms/doc/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/doc/lib/legacy-migrations.js.html +622 -0
- package/coverage/a3/modules/@apostrophecms/doc-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/doc-type/index.js.html +8638 -0
- package/coverage/a3/modules/@apostrophecms/doc-type/lib/autocomplete.js.html +319 -0
- package/coverage/a3/modules/@apostrophecms/doc-type/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/email/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/email/index.js.html +301 -0
- package/coverage/a3/modules/@apostrophecms/error/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/error/index.js.html +202 -0
- package/coverage/a3/modules/@apostrophecms/express/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/express/index.js.html +2116 -0
- package/coverage/a3/modules/@apostrophecms/file/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/file/index.js.html +367 -0
- package/coverage/a3/modules/@apostrophecms/file-tag/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/file-tag/index.js.html +127 -0
- package/coverage/a3/modules/@apostrophecms/global/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/global/index.js.html +535 -0
- package/coverage/a3/modules/@apostrophecms/home-page/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/home-page/index.js.html +94 -0
- package/coverage/a3/modules/@apostrophecms/html-widget/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/html-widget/index.js.html +271 -0
- package/coverage/a3/modules/@apostrophecms/http/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/http/index.js.html +976 -0
- package/coverage/a3/modules/@apostrophecms/i18n/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/i18n/index.js.html +2083 -0
- package/coverage/a3/modules/@apostrophecms/image/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/image/index.js.html +1486 -0
- package/coverage/a3/modules/@apostrophecms/image-tag/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/image-tag/index.js.html +127 -0
- package/coverage/a3/modules/@apostrophecms/image-widget/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/image-widget/index.js.html +145 -0
- package/coverage/a3/modules/@apostrophecms/job/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/job/index.js.html +1321 -0
- package/coverage/a3/modules/@apostrophecms/launder/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/launder/index.js.html +124 -0
- package/coverage/a3/modules/@apostrophecms/lock/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/lock/index.js.html +676 -0
- package/coverage/a3/modules/@apostrophecms/login/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/login/index.js.html +2617 -0
- package/coverage/a3/modules/@apostrophecms/migration/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/migration/index.js.html +970 -0
- package/coverage/a3/modules/@apostrophecms/modal/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/modal/index.js.html +193 -0
- package/coverage/a3/modules/@apostrophecms/module/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/module/index.js.html +2500 -0
- package/coverage/a3/modules/@apostrophecms/module/lib/events.js.html +547 -0
- package/coverage/a3/modules/@apostrophecms/module/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/notification/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/notification/index.js.html +1315 -0
- package/coverage/a3/modules/@apostrophecms/oembed/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/oembed/index.js.html +781 -0
- package/coverage/a3/modules/@apostrophecms/oembed/lib/index.html +161 -0
- package/coverage/a3/modules/@apostrophecms/oembed/lib/infogram.js.html +178 -0
- package/coverage/a3/modules/@apostrophecms/oembed/lib/vimeo.js.html +124 -0
- package/coverage/a3/modules/@apostrophecms/oembed/lib/wufoo.js.html +256 -0
- package/coverage/a3/modules/@apostrophecms/oembed/lib/youtube.js.html +322 -0
- package/coverage/a3/modules/@apostrophecms/oembed-field/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/oembed-field/index.js.html +268 -0
- package/coverage/a3/modules/@apostrophecms/page/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/page/index.js.html +6955 -0
- package/coverage/a3/modules/@apostrophecms/page/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/page/lib/legacy-migrations.js.html +568 -0
- package/coverage/a3/modules/@apostrophecms/page-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/page-type/index.js.html +1501 -0
- package/coverage/a3/modules/@apostrophecms/pager/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/pager/index.js.html +232 -0
- package/coverage/a3/modules/@apostrophecms/permission/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/permission/index.js.html +1057 -0
- package/coverage/a3/modules/@apostrophecms/permission/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/permission/lib/legacy-migrations.js.html +160 -0
- package/coverage/a3/modules/@apostrophecms/piece-page-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/piece-page-type/index.js.html +1051 -0
- package/coverage/a3/modules/@apostrophecms/piece-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/piece-type/index.js.html +3103 -0
- package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.js.html +157 -0
- package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.js.html +1363 -0
- package/coverage/a3/modules/@apostrophecms/schema/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/schema/index.js.html +4603 -0
- package/coverage/a3/modules/@apostrophecms/schema/lib/addFieldTypes.js.html +3502 -0
- package/coverage/a3/modules/@apostrophecms/schema/lib/index.html +131 -0
- package/coverage/a3/modules/@apostrophecms/schema/lib/joinr.js.html +703 -0
- package/coverage/a3/modules/@apostrophecms/search/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/search/index.js.html +1222 -0
- package/coverage/a3/modules/@apostrophecms/soft-redirect/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/soft-redirect/index.js.html +343 -0
- package/coverage/a3/modules/@apostrophecms/submitted-draft/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/submitted-draft/index.js.html +595 -0
- package/coverage/a3/modules/@apostrophecms/task/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/task/index.js.html +1147 -0
- package/coverage/a3/modules/@apostrophecms/template/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/template/index.js.html +2731 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/bundlesLoader.js.html +559 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/component.js.html +310 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/fragment.js.html +325 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/index.html +146 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/render.js.html +490 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/index.html +131 -0
- package/coverage/a3/modules/@apostrophecms/template/lib/nunjucksLoader.js.html +658 -0
- package/coverage/a3/modules/@apostrophecms/ui/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/ui/index.js.html +181 -0
- package/coverage/a3/modules/@apostrophecms/uploadfs/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/uploadfs/index.js.html +286 -0
- package/coverage/a3/modules/@apostrophecms/url/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/url/index.js.html +733 -0
- package/coverage/a3/modules/@apostrophecms/user/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/user/index.js.html +1684 -0
- package/coverage/a3/modules/@apostrophecms/user/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/user/lib/legacy-migrations.js.html +157 -0
- package/coverage/a3/modules/@apostrophecms/util/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/util/index.js.html +3424 -0
- package/coverage/a3/modules/@apostrophecms/util/lib/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/util/lib/logger.js.html +319 -0
- package/coverage/a3/modules/@apostrophecms/video-widget/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/video-widget/index.js.html +178 -0
- package/coverage/a3/modules/@apostrophecms/widget-type/index.html +116 -0
- package/coverage/a3/modules/@apostrophecms/widget-type/index.js.html +1225 -0
- package/coverage/a3/test-lib/index.html +131 -0
- package/coverage/a3/test-lib/test.js.html +232 -0
- package/coverage/a3/test-lib/util.js.html +373 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +1256 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/lib/modules/apostrophe-assets/index.js +3 -1
- package/lib/modules/apostrophe-pages/lib/api.js +8 -6
- package/package.json +1 -1
- package/test/package.json +0 -75
|
@@ -0,0 +1,1315 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for a3/modules/@apostrophecms/notification/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/notification</a> index.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">19.58% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>19/97</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">3.17% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>2/63</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">33.33% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>9/27</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">19.35% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>18/93</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 low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
477
|
+
<span class="cline-any cline-neutral"> </span>
|
|
478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
479
|
+
<span class="cline-any cline-neutral"> </span>
|
|
480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
483
|
+
<span class="cline-any cline-neutral"> </span>
|
|
484
|
+
<span class="cline-any cline-neutral"> </span>
|
|
485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-neutral"> </span>
|
|
489
|
+
<span class="cline-any cline-neutral"> </span>
|
|
490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
494
|
+
<span class="cline-any cline-yes">90x</span>
|
|
495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
496
|
+
<span class="cline-any cline-yes">90x</span>
|
|
497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
500
|
+
<span class="cline-any cline-neutral"> </span>
|
|
501
|
+
<span class="cline-any cline-neutral"> </span>
|
|
502
|
+
<span class="cline-any cline-yes">90x</span>
|
|
503
|
+
<span class="cline-any cline-yes">90x</span>
|
|
504
|
+
<span class="cline-any cline-yes">90x</span>
|
|
505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
506
|
+
<span class="cline-any cline-yes">90x</span>
|
|
507
|
+
<span class="cline-any cline-neutral"> </span>
|
|
508
|
+
<span class="cline-any cline-neutral"> </span>
|
|
509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
511
|
+
<span class="cline-any cline-neutral"> </span>
|
|
512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
516
|
+
<span class="cline-any cline-neutral"> </span>
|
|
517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
519
|
+
<span class="cline-any cline-neutral"> </span>
|
|
520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
521
|
+
<span class="cline-any cline-neutral"> </span>
|
|
522
|
+
<span class="cline-any cline-neutral"> </span>
|
|
523
|
+
<span class="cline-any cline-neutral"> </span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-neutral"> </span>
|
|
527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-no"> </span>
|
|
529
|
+
<span class="cline-any cline-no"> </span>
|
|
530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
531
|
+
<span class="cline-any cline-no"> </span>
|
|
532
|
+
<span class="cline-any cline-no"> </span>
|
|
533
|
+
<span class="cline-any cline-no"> </span>
|
|
534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
535
|
+
<span class="cline-any cline-no"> </span>
|
|
536
|
+
<span class="cline-any cline-neutral"> </span>
|
|
537
|
+
<span class="cline-any cline-no"> </span>
|
|
538
|
+
<span class="cline-any cline-no"> </span>
|
|
539
|
+
<span class="cline-any cline-neutral"> </span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-no"> </span>
|
|
542
|
+
<span class="cline-any cline-no"> </span>
|
|
543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
548
|
+
<span class="cline-any cline-no"> </span>
|
|
549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
552
|
+
<span class="cline-any cline-no"> </span>
|
|
553
|
+
<span class="cline-any cline-no"> </span>
|
|
554
|
+
<span class="cline-any cline-no"> </span>
|
|
555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
557
|
+
<span class="cline-any cline-no"> </span>
|
|
558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
565
|
+
<span class="cline-any cline-no"> </span>
|
|
566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-no"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-neutral"> </span>
|
|
571
|
+
<span class="cline-any cline-neutral"> </span>
|
|
572
|
+
<span class="cline-any cline-neutral"> </span>
|
|
573
|
+
<span class="cline-any cline-neutral"> </span>
|
|
574
|
+
<span class="cline-any cline-no"> </span>
|
|
575
|
+
<span class="cline-any cline-no"> </span>
|
|
576
|
+
<span class="cline-any cline-no"> </span>
|
|
577
|
+
<span class="cline-any cline-no"> </span>
|
|
578
|
+
<span class="cline-any cline-no"> </span>
|
|
579
|
+
<span class="cline-any cline-no"> </span>
|
|
580
|
+
<span class="cline-any cline-no"> </span>
|
|
581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
582
|
+
<span class="cline-any cline-no"> </span>
|
|
583
|
+
<span class="cline-any cline-no"> </span>
|
|
584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
587
|
+
<span class="cline-any cline-no"> </span>
|
|
588
|
+
<span class="cline-any cline-neutral"> </span>
|
|
589
|
+
<span class="cline-any cline-neutral"> </span>
|
|
590
|
+
<span class="cline-any cline-neutral"> </span>
|
|
591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
592
|
+
<span class="cline-any cline-neutral"> </span>
|
|
593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
594
|
+
<span class="cline-any cline-no"> </span>
|
|
595
|
+
<span class="cline-any cline-neutral"> </span>
|
|
596
|
+
<span class="cline-any cline-neutral"> </span>
|
|
597
|
+
<span class="cline-any cline-neutral"> </span>
|
|
598
|
+
<span class="cline-any cline-neutral"> </span>
|
|
599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
600
|
+
<span class="cline-any cline-neutral"> </span>
|
|
601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
602
|
+
<span class="cline-any cline-neutral"> </span>
|
|
603
|
+
<span class="cline-any cline-no"> </span>
|
|
604
|
+
<span class="cline-any cline-no"> </span>
|
|
605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
606
|
+
<span class="cline-any cline-no"> </span>
|
|
607
|
+
<span class="cline-any cline-no"> </span>
|
|
608
|
+
<span class="cline-any cline-no"> </span>
|
|
609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
610
|
+
<span class="cline-any cline-no"> </span>
|
|
611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
612
|
+
<span class="cline-any cline-no"> </span>
|
|
613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
615
|
+
<span class="cline-any cline-no"> </span>
|
|
616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
619
|
+
<span class="cline-any cline-no"> </span>
|
|
620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
622
|
+
<span class="cline-any cline-no"> </span>
|
|
623
|
+
<span class="cline-any cline-no"> </span>
|
|
624
|
+
<span class="cline-any cline-no"> </span>
|
|
625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
635
|
+
<span class="cline-any cline-no"> </span>
|
|
636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-yes">90x</span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-no"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-no"> </span>
|
|
649
|
+
<span class="cline-any cline-no"> </span>
|
|
650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
651
|
+
<span class="cline-any cline-no"> </span>
|
|
652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
662
|
+
<span class="cline-any cline-no"> </span>
|
|
663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-no"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
673
|
+
<span class="cline-any cline-yes">90x</span>
|
|
674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
675
|
+
<span class="cline-any cline-yes">29x</span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-no"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
763
|
+
<span class="cline-any cline-no"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
773
|
+
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-no"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-neutral"> </span>
|
|
783
|
+
<span class="cline-any cline-neutral"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-yes">2x</span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-yes">2x</span>
|
|
793
|
+
<span class="cline-any cline-neutral"> </span>
|
|
794
|
+
<span class="cline-any cline-yes">2x</span>
|
|
795
|
+
<span class="cline-any cline-yes">2x</span>
|
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-yes">2x</span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
816
|
+
<span class="cline-any cline-yes">2x</span>
|
|
817
|
+
<span class="cline-any cline-no"> </span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-yes">2x</span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
826
|
+
<span class="cline-any cline-neutral"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-no"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-neutral"> </span>
|
|
840
|
+
<span class="cline-any cline-neutral"> </span>
|
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
843
|
+
<span class="cline-any cline-neutral"> </span>
|
|
844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-no"> </span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-neutral"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-yes">90x</span>
|
|
874
|
+
<span class="cline-any cline-yes">90x</span>
|
|
875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// This module provides a framework for triggering notifications
|
|
887
|
+
// within the Apostrophe admin UI. Notifications may be triggered
|
|
888
|
+
// either on the browser or the server side, via `apos.notice`.
|
|
889
|
+
//
|
|
890
|
+
// ## Options
|
|
891
|
+
//
|
|
892
|
+
// ### `queryInterval`: interval in milliseconds between MongoDB
|
|
893
|
+
// queries while long polling for notifications. Defaults to 500
|
|
894
|
+
// (1/2 second). Set it longer if you prefer fewer queries, however
|
|
895
|
+
// these are indexed queries on a small amount of information and
|
|
896
|
+
// should not significantly impact your app.
|
|
897
|
+
//
|
|
898
|
+
// ### `longPollingTimeout`: maximum lifetime in milliseconds of a long
|
|
899
|
+
// polling HTTP request before a response with no notifications is sent.
|
|
900
|
+
// Defaults to 10000 (10 seconds) to avoid typical proxy server timeouts.
|
|
901
|
+
// Until it times out the request will keep making MongoDB queries to
|
|
902
|
+
// see if any new notifications are available (long polling).
|
|
903
|
+
|
|
904
|
+
const delay = require('bluebird').delay;
|
|
905
|
+
|
|
906
|
+
module.exports = {
|
|
907
|
+
options: {
|
|
908
|
+
alias: 'notification'
|
|
909
|
+
},
|
|
910
|
+
extend: '@apostrophecms/module',
|
|
911
|
+
async init(self) {
|
|
912
|
+
self.apos.notify = self.trigger;
|
|
913
|
+
await self.ensureCollection();
|
|
914
|
+
self.enableBrowserData();
|
|
915
|
+
},
|
|
916
|
+
restApiRoutes: (self) => ({
|
|
917
|
+
// Poll for active notifications. Responds with:
|
|
918
|
+
//
|
|
919
|
+
// `{ notifications: [ ... ], dismissed: [ id1... ] }`
|
|
920
|
+
//
|
|
921
|
+
// Each notification has an `html` property containing
|
|
922
|
+
// its rendered, localized markup, as well as `_id`, `createdAt`
|
|
923
|
+
// and `id` (if one was provided when it was triggered).
|
|
924
|
+
//
|
|
925
|
+
// The client should provide `modifiedOnOrSince` and `seenIds` in the
|
|
926
|
+
// query. `modifiedOnOrSince` is the timestamp of the most recent
|
|
927
|
+
// notification modification time (updatedAt) the client has already seen,
|
|
928
|
+
// and `seenIds` must contain the _ids of the notifications with that
|
|
929
|
+
// exact notification time that the client has already seen, for
|
|
930
|
+
// disambiguation.
|
|
931
|
+
//
|
|
932
|
+
// Waits up to 10 seconds for new notifications (long polling),
|
|
933
|
+
// but then responds with an empty array to avoid proxy server timeouts.
|
|
934
|
+
getAll: {
|
|
935
|
+
before: 'middleware:@apostrophecms/global',
|
|
936
|
+
<span class="fstat-no" title="function not covered" > as</span>ync route(req) {
|
|
937
|
+
let modifiedOnOrSince;
|
|
938
|
+
<span class="cstat-no" title="statement not covered" > if (!(req.user && req.user._id)) {</span>
|
|
939
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
|
|
940
|
+
}
|
|
941
|
+
const start = <span class="cstat-no" title="statement not covered" >Date.now();</span>
|
|
942
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
943
|
+
<span class="cstat-no" title="statement not covered" > modifiedOnOrSince = req.query.modifiedOnOrSince && new Date(req.query.modifiedOnOrSince);</span>
|
|
944
|
+
} catch (e) {
|
|
945
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
|
|
946
|
+
}
|
|
947
|
+
const seenIds = <span class="cstat-no" title="statement not covered" >req.query.seenIds && self.apos.launder.ids(req.query.seenIds);</span>
|
|
948
|
+
<span class="cstat-no" title="statement not covered" > return await attempt();</span>
|
|
949
|
+
|
|
950
|
+
async function <span class="fstat-no" title="function not covered" >attempt(</span>) {
|
|
951
|
+
<span class="cstat-no" title="statement not covered" > if (Date.now() - start >= (self.options.longPollingTimeout || 10000)) {</span>
|
|
952
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
953
|
+
notifications: [],
|
|
954
|
+
dismissed: []
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
const { notifications, dismissed } = <span class="cstat-no" title="statement not covered" >await self.find(req, {</span>
|
|
959
|
+
modifiedOnOrSince,
|
|
960
|
+
seenIds
|
|
961
|
+
});
|
|
962
|
+
<span class="cstat-no" title="statement not covered" > if (!notifications.length && !dismissed.length) {</span>
|
|
963
|
+
<span class="cstat-no" title="statement not covered" > await delay(self.options.queryInterval || 1000);</span>
|
|
964
|
+
<span class="cstat-no" title="statement not covered" > return attempt();</span>
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
968
|
+
notifications,
|
|
969
|
+
dismissed
|
|
970
|
+
};
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
},
|
|
974
|
+
<span class="fstat-no" title="function not covered" > ge</span>tOne(req, _id) {
|
|
975
|
+
<span class="cstat-no" title="statement not covered" > return self.find(req, { displayingIds: [ _id ] });</span>
|
|
976
|
+
},
|
|
977
|
+
<span class="fstat-no" title="function not covered" > as</span>ync post(req) {
|
|
978
|
+
const type = <span class="cstat-no" title="statement not covered" >self.apos.launder.select(req.body.type, [</span>
|
|
979
|
+
'danger',
|
|
980
|
+
'warning',
|
|
981
|
+
'success',
|
|
982
|
+
'info'
|
|
983
|
+
], 'info');
|
|
984
|
+
const icon = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.icon);</span>
|
|
985
|
+
const message = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.message);</span>
|
|
986
|
+
const interpolate = <span class="cstat-no" title="statement not covered" >launderInterpolate(req.body.interpolate);</span>
|
|
987
|
+
const dismiss = <span class="cstat-no" title="statement not covered" >self.apos.launder.integer(req.body.dismiss);</span>
|
|
988
|
+
let buttons = <span class="cstat-no" title="statement not covered" >req.body.buttons;</span>
|
|
989
|
+
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(buttons)) {</span>
|
|
990
|
+
<span class="cstat-no" title="statement not covered" > buttons = null;</span>
|
|
991
|
+
} else {
|
|
992
|
+
<span class="cstat-no" title="statement not covered" > buttons = buttons.filter(<span class="fstat-no" title="function not covered" >bu</span>tton => {</span>
|
|
993
|
+
<span class="cstat-no" title="statement not covered" > return (button.type === 'event') &&</span>
|
|
994
|
+
((typeof button.name) === 'string') &&
|
|
995
|
+
((typeof button.label) === 'string') &&
|
|
996
|
+
((button.data == null) || (((typeof button.data) === 'object') && (!Array.isArray(button.data))));
|
|
997
|
+
}).map(<span class="fstat-no" title="function not covered" >bu</span>tton => (<span class="cstat-no" title="statement not covered" >{</span>
|
|
998
|
+
name: button.name,
|
|
999
|
+
data: button.data,
|
|
1000
|
+
label: button.label,
|
|
1001
|
+
type: button.type
|
|
1002
|
+
}));
|
|
1003
|
+
}
|
|
1004
|
+
<span class="cstat-no" title="statement not covered" > return self.trigger(req, message, {</span>
|
|
1005
|
+
interpolate,
|
|
1006
|
+
dismiss,
|
|
1007
|
+
icon,
|
|
1008
|
+
type,
|
|
1009
|
+
buttons
|
|
1010
|
+
});
|
|
1011
|
+
|
|
1012
|
+
function <span class="fstat-no" title="function not covered" >launderInterpolate(</span>input) {
|
|
1013
|
+
<span class="cstat-no" title="statement not covered" > if ((input == null) || ((typeof input) !== 'object')) {</span>
|
|
1014
|
+
<span class="cstat-no" title="statement not covered" > return {};</span>
|
|
1015
|
+
}
|
|
1016
|
+
const interpolate = <span class="cstat-no" title="statement not covered" >{};</span>
|
|
1017
|
+
<span class="cstat-no" title="statement not covered" > for (const [ key, val ] of Object.entries(input)) {</span>
|
|
1018
|
+
<span class="cstat-no" title="statement not covered" > if (key === 'count') {</span>
|
|
1019
|
+
// Has a special status in i18next
|
|
1020
|
+
<span class="cstat-no" title="statement not covered" > interpolate[key] = self.apos.launder.integer(val);</span>
|
|
1021
|
+
} else {
|
|
1022
|
+
<span class="cstat-no" title="statement not covered" > interpolate[key] = self.apos.launder.string(val);</span>
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
<span class="cstat-no" title="statement not covered" > return interpolate;</span>
|
|
1026
|
+
}
|
|
1027
|
+
},
|
|
1028
|
+
<span class="fstat-no" title="function not covered" > pu</span>t(req, _id) {
|
|
1029
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('unimplemented');</span>
|
|
1030
|
+
},
|
|
1031
|
+
<span class="fstat-no" title="function not covered" > pa</span>tch(req, _id) {
|
|
1032
|
+
const dismissed = <span class="cstat-no" title="statement not covered" >self.apos.launder.boolean(req.body.dismissed);</span>
|
|
1033
|
+
<span class="cstat-no" title="statement not covered" > if (dismissed) {</span>
|
|
1034
|
+
<span class="cstat-no" title="statement not covered" > return self.db.updateOne({ _id }, {</span>
|
|
1035
|
+
$set: {
|
|
1036
|
+
dismissed
|
|
1037
|
+
},
|
|
1038
|
+
$currentDate: {
|
|
1039
|
+
updatedAt: true
|
|
1040
|
+
}
|
|
1041
|
+
});
|
|
1042
|
+
}
|
|
1043
|
+
},
|
|
1044
|
+
<span class="fstat-no" title="function not covered" > de</span>lete(req, _id) {
|
|
1045
|
+
<span class="cstat-no" title="statement not covered" > return self.db.deleteMany({ _id });</span>
|
|
1046
|
+
}
|
|
1047
|
+
}),
|
|
1048
|
+
apiRoutes(self) {
|
|
1049
|
+
return {
|
|
1050
|
+
post: {
|
|
1051
|
+
// Clear a registered event on a notification to prevent it from
|
|
1052
|
+
// emitting twice. Returns `true` if the event was found and cleared.
|
|
1053
|
+
// Returns `false` if not found (because it was already cleared).
|
|
1054
|
+
':_id/clear-event': <span class="fstat-no" title="function not covered" >as</span>ync function (req) {
|
|
1055
|
+
const lockId = <span class="cstat-no" title="statement not covered" >`clear-event-${req.params._id}`;</span>
|
|
1056
|
+
|
|
1057
|
+
let response;
|
|
1058
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1059
|
+
<span class="cstat-no" title="statement not covered" > await self.apos.lock.lock(lockId);</span>
|
|
1060
|
+
|
|
1061
|
+
<span class="cstat-no" title="statement not covered" > response = await self.db.updateOne({</span>
|
|
1062
|
+
_id: req.params._id,
|
|
1063
|
+
event: {
|
|
1064
|
+
$ne: null
|
|
1065
|
+
}
|
|
1066
|
+
}, {
|
|
1067
|
+
$set: {
|
|
1068
|
+
event: null
|
|
1069
|
+
}
|
|
1070
|
+
});
|
|
1071
|
+
} catch (error) {
|
|
1072
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('notfound');</span>
|
|
1073
|
+
} finally {
|
|
1074
|
+
<span class="cstat-no" title="statement not covered" > await self.apos.lock.unlock(lockId);</span>
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
<span class="cstat-no" title="statement not covered" > return response.result.nModified > 0;</span>
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
};
|
|
1081
|
+
},
|
|
1082
|
+
methods(self) {
|
|
1083
|
+
return {
|
|
1084
|
+
getBrowserData(req) {
|
|
1085
|
+
return {
|
|
1086
|
+
action: self.action
|
|
1087
|
+
};
|
|
1088
|
+
},
|
|
1089
|
+
// Call with `req`, then a message key as found in the localization files,
|
|
1090
|
+
// followed by an `options` object if desired.
|
|
1091
|
+
//
|
|
1092
|
+
// If you do not have a `req` it is acceptable to pass a user `_id` string
|
|
1093
|
+
// in place of `req`. Someone must be the recipient.
|
|
1094
|
+
//
|
|
1095
|
+
// `message` should be a key that exists in a localization file. If it does not
|
|
1096
|
+
// it will be displayed directly as a fallback.
|
|
1097
|
+
//
|
|
1098
|
+
// `options.type` styles the notification and may be set to `error`,
|
|
1099
|
+
// `warning` or `success`. If not set, a "plain" default style is used.
|
|
1100
|
+
//
|
|
1101
|
+
// If `options.dismiss` is set to `true`, the message will auto-dismiss after 5 seconds.
|
|
1102
|
+
// If it is set to a number of seconds, it will dismiss after that number of seconds.
|
|
1103
|
+
// Otherwise it will not dismiss unless clicked.
|
|
1104
|
+
//
|
|
1105
|
+
// If `options.buttons` is present, it must be an array of objects
|
|
1106
|
+
// with `type` and `label` properties. If `type` is `'event'` then the object must have
|
|
1107
|
+
// `name` and `data` properties, and when clicked the button will trigger an
|
|
1108
|
+
// apos bus event of the given `name` with the provided `data` object. Currently
|
|
1109
|
+
// `'event'` is the only supported value for `type`.
|
|
1110
|
+
//
|
|
1111
|
+
// `options.return` will return the notification object. This is not
|
|
1112
|
+
// done otherwise to minimize risk of leaking MongoDB metadata to the
|
|
1113
|
+
// browser.
|
|
1114
|
+
//
|
|
1115
|
+
// `options.icon`, set to an active Vue Materials Icons icon name, will
|
|
1116
|
+
// set an icon on the notification.
|
|
1117
|
+
//
|
|
1118
|
+
// `options.job` can be set to an object with properties related to an
|
|
1119
|
+
// Apostrophe Job (from the @apostrophecms/job module) for the
|
|
1120
|
+
// notification to track the job's progress. These can include the job
|
|
1121
|
+
// `_id` and, for the 'completed' stage, the job `action`,
|
|
1122
|
+
// e.g., 'archive'.
|
|
1123
|
+
//
|
|
1124
|
+
// Throws an error if there is no `req.user`.
|
|
1125
|
+
//
|
|
1126
|
+
// `interpolate` may contain an object with properties to be
|
|
1127
|
+
// interpolated into the message via i18next. These can also
|
|
1128
|
+
// be passed via `options.interpolate`.
|
|
1129
|
+
//
|
|
1130
|
+
// This method is aliased as `apos.notify` for convenience.
|
|
1131
|
+
//
|
|
1132
|
+
// The method is async, and you may `await` to be certain the
|
|
1133
|
+
// notification has reached the database, but this is not mandatory.
|
|
1134
|
+
// It is a good idea when triggering a notification just before exiting
|
|
1135
|
+
// the application, as in a command line task.
|
|
1136
|
+
|
|
1137
|
+
<span class="fstat-no" title="function not covered" > as</span>ync trigger(req, message, options = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span> interpolate = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
1138
|
+
const { return: returnId, ...copiedOptions } = <span class="cstat-no" title="statement not covered" >options;</span>
|
|
1139
|
+
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > if (typeof req === 'string') {</span>
|
|
1141
|
+
// String was passed, assume it is a user _id
|
|
1142
|
+
<span class="cstat-no" title="statement not covered" > req = { user: { _id: req } };</span>
|
|
1143
|
+
}
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" > if (!req.user) {</span>
|
|
1145
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('forbidden');</span>
|
|
1146
|
+
}
|
|
1147
|
+
<span class="cstat-no" title="statement not covered" > if (!message) {</span>
|
|
1148
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('required');</span>
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
const notification = <span class="cstat-no" title="statement not covered" >{</span>
|
|
1152
|
+
_id: self.apos.util.generateId(),
|
|
1153
|
+
createdAt: new Date(),
|
|
1154
|
+
userId: req.user._id,
|
|
1155
|
+
message,
|
|
1156
|
+
icon: options.icon,
|
|
1157
|
+
interpolate: interpolate || options.interpolate || {},
|
|
1158
|
+
// Defaults to true, otherwise launder as boolean
|
|
1159
|
+
localize: has(req.body, 'localize')
|
|
1160
|
+
? self.apos.launder.boolean(req.body.localize) : true,
|
|
1161
|
+
job: options.job || null,
|
|
1162
|
+
event: options.event
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1165
|
+
<span class="cstat-no" title="statement not covered" > if (copiedOptions.dismiss === true) {</span>
|
|
1166
|
+
<span class="cstat-no" title="statement not covered" > copiedOptions.dismiss = 5;</span>
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
<span class="cstat-no" title="statement not covered" > Object.assign(notification, copiedOptions);</span>
|
|
1170
|
+
|
|
1171
|
+
// We await here rather than returning because we expressly do not
|
|
1172
|
+
// want to leak mongodb metadata to the browser
|
|
1173
|
+
<span class="cstat-no" title="statement not covered" > await self.db.updateOne(</span>
|
|
1174
|
+
notification,
|
|
1175
|
+
{
|
|
1176
|
+
$set: notification,
|
|
1177
|
+
$currentDate: {
|
|
1178
|
+
updatedAt: true
|
|
1179
|
+
}
|
|
1180
|
+
}, {
|
|
1181
|
+
upsert: true
|
|
1182
|
+
}
|
|
1183
|
+
);
|
|
1184
|
+
|
|
1185
|
+
<span class="cstat-no" title="statement not covered" > if (returnId) {</span>
|
|
1186
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1187
|
+
noteId: notification._id
|
|
1188
|
+
};
|
|
1189
|
+
}
|
|
1190
|
+
},
|
|
1191
|
+
|
|
1192
|
+
// The dismiss method accepts the following arguments:
|
|
1193
|
+
// - req: A valid req.
|
|
1194
|
+
// - noteId: The _id of an active notification.
|
|
1195
|
+
// - delay: An optional integer of milliseconds to pause before the
|
|
1196
|
+
// notification actually dismisses.
|
|
1197
|
+
async dismiss (req, noteId, delay) {
|
|
1198
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!req.user) {
|
|
1199
|
+
<span class="cstat-no" title="statement not covered" > throw self.apos.error('forbidden');</span>
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
await pause(delay);
|
|
1203
|
+
|
|
1204
|
+
try {
|
|
1205
|
+
await self.db.updateOne(
|
|
1206
|
+
{
|
|
1207
|
+
_id: noteId
|
|
1208
|
+
},
|
|
1209
|
+
{
|
|
1210
|
+
$set: {
|
|
1211
|
+
dismissed: true
|
|
1212
|
+
},
|
|
1213
|
+
$currentDate: {
|
|
1214
|
+
updatedAt: true
|
|
1215
|
+
}
|
|
1216
|
+
}, {
|
|
1217
|
+
upsert: true
|
|
1218
|
+
}
|
|
1219
|
+
);
|
|
1220
|
+
} catch (error) {
|
|
1221
|
+
// Most likely the ID did not belong to an actual notification.
|
|
1222
|
+
throw self.apos.error('invalid');
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
async function pause (delay) {
|
|
1226
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!delay) {
|
|
1227
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
|
1231
|
+
}
|
|
1232
|
+
},
|
|
1233
|
+
// Resolves with an object with `notifications` and `dismissed`
|
|
1234
|
+
// properties.
|
|
1235
|
+
//
|
|
1236
|
+
// If `options.modifiedOnOrSince` is set, notifications
|
|
1237
|
+
// greater than the timestamp are sent,
|
|
1238
|
+
// minus any notifications whose IDs are in `options.seenIds`.
|
|
1239
|
+
|
|
1240
|
+
<span class="fstat-no" title="function not covered" > as</span>ync find(req, options) {
|
|
1241
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1242
|
+
const results = <span class="cstat-no" title="statement not covered" >await self.db.find({</span>
|
|
1243
|
+
userId: req.user._id,
|
|
1244
|
+
...(options.modifiedOnOrSince && {
|
|
1245
|
+
updatedAt: {
|
|
1246
|
+
$gte: new Date(options.modifiedOnOrSince)
|
|
1247
|
+
}
|
|
1248
|
+
}),
|
|
1249
|
+
...(options.seenIds && {
|
|
1250
|
+
_id: {
|
|
1251
|
+
$nin: options.seenIds
|
|
1252
|
+
}
|
|
1253
|
+
})
|
|
1254
|
+
}).sort({ createdAt: 1 }).toArray();
|
|
1255
|
+
|
|
1256
|
+
const notifications = <span class="cstat-no" title="statement not covered" >results.filter(<span class="fstat-no" title="function not covered" >re</span>sult => <span class="cstat-no" title="statement not covered" >!result.dismissed)</span>;</span>
|
|
1257
|
+
const dismissed = <span class="cstat-no" title="statement not covered" >results.filter(<span class="fstat-no" title="function not covered" >re</span>sult => <span class="cstat-no" title="statement not covered" >result.dismissed)</span>;</span>
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > dismissed.forEach(<span class="fstat-no" title="function not covered" >el</span>ement => {</span>
|
|
1259
|
+
// 5-minute delay before deleting
|
|
1260
|
+
<span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >self.restApiRoutes.delete(req, element._id),</span> 300000);</span>
|
|
1261
|
+
});
|
|
1262
|
+
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1264
|
+
notifications,
|
|
1265
|
+
dismissed
|
|
1266
|
+
};
|
|
1267
|
+
} catch (err) {
|
|
1268
|
+
<span class="cstat-no" title="statement not covered" > if (self.apos.db.closed) {</span>
|
|
1269
|
+
// The database connection was intentionally closed,
|
|
1270
|
+
// which often triggers a race condition with
|
|
1271
|
+
// long polling requests. Send an empty response
|
|
1272
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1273
|
+
notifications: [],
|
|
1274
|
+
dismissed: []
|
|
1275
|
+
};
|
|
1276
|
+
} else {
|
|
1277
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
},
|
|
1281
|
+
|
|
1282
|
+
async ensureCollection() {
|
|
1283
|
+
self.db = self.apos.db.collection('aposNotifications');
|
|
1284
|
+
return self.db.createIndex({
|
|
1285
|
+
userId: 1,
|
|
1286
|
+
createdAt: 1
|
|
1287
|
+
});
|
|
1288
|
+
}
|
|
1289
|
+
};
|
|
1290
|
+
}
|
|
1291
|
+
};
|
|
1292
|
+
|
|
1293
|
+
function <span class="fstat-no" title="function not covered" >has(</span>o, k) {
|
|
1294
|
+
<span class="cstat-no" title="statement not covered" > return Object.prototype.hasOwnProperty.call(o, k);</span>
|
|
1295
|
+
}
|
|
1296
|
+
</pre></td></tr></table></pre>
|
|
1297
|
+
|
|
1298
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1299
|
+
</div><!-- /wrapper -->
|
|
1300
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1301
|
+
Code coverage generated by
|
|
1302
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1303
|
+
at Wed Jun 08 2022 11:06:49 GMT+0200 (Central European Summer Time)
|
|
1304
|
+
</div>
|
|
1305
|
+
<script src="../../../../prettify.js"></script>
|
|
1306
|
+
<script>
|
|
1307
|
+
window.onload = function () {
|
|
1308
|
+
prettyPrint();
|
|
1309
|
+
};
|
|
1310
|
+
</script>
|
|
1311
|
+
<script src="../../../../sorter.js"></script>
|
|
1312
|
+
<script src="../../../../block-navigation.js"></script>
|
|
1313
|
+
</body>
|
|
1314
|
+
</html>
|
|
1315
|
+
|