@stream-io/video-client 0.0.1-alpha.10
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/LICENSE +219 -0
- package/README.md +14 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +296 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/Batcher.ts.html +214 -0
- package/coverage/lcov-report/src/CallDropScheduler.ts.html +661 -0
- package/coverage/lcov-report/src/StreamSfuClient.ts.html +640 -0
- package/coverage/lcov-report/src/StreamVideoClient.ts.html +1594 -0
- package/coverage/lcov-report/src/config/defaultConfigs.ts.html +130 -0
- package/coverage/lcov-report/src/config/index.html +116 -0
- package/coverage/lcov-report/src/coordinator/StreamCoordinatorClient.ts.html +430 -0
- package/coverage/lcov-report/src/coordinator/connection/base64.ts.html +325 -0
- package/coverage/lcov-report/src/coordinator/connection/client.ts.html +2527 -0
- package/coverage/lcov-report/src/coordinator/connection/connection.ts.html +2335 -0
- package/coverage/lcov-report/src/coordinator/connection/connection_fallback.ts.html +802 -0
- package/coverage/lcov-report/src/coordinator/connection/errors.ts.html +295 -0
- package/coverage/lcov-report/src/coordinator/connection/index.html +251 -0
- package/coverage/lcov-report/src/coordinator/connection/insights.ts.html +349 -0
- package/coverage/lcov-report/src/coordinator/connection/signing.ts.html +397 -0
- package/coverage/lcov-report/src/coordinator/connection/token_manager.ts.html +565 -0
- package/coverage/lcov-report/src/coordinator/connection/types.ts.html +418 -0
- package/coverage/lcov-report/src/coordinator/connection/utils.ts.html +529 -0
- package/coverage/lcov-report/src/coordinator/index.html +116 -0
- package/coverage/lcov-report/src/events/call.ts.html +583 -0
- package/coverage/lcov-report/src/events/index.html +161 -0
- package/coverage/lcov-report/src/events/internal.ts.html +226 -0
- package/coverage/lcov-report/src/events/participant.ts.html +376 -0
- package/coverage/lcov-report/src/events/speaker.ts.html +271 -0
- package/coverage/lcov-report/src/gen/google/protobuf/index.html +131 -0
- package/coverage/lcov-report/src/gen/google/protobuf/struct.ts.html +1528 -0
- package/coverage/lcov-report/src/gen/google/protobuf/timestamp.ts.html +958 -0
- package/coverage/lcov-report/src/gen/video/sfu/event/events.ts.html +5971 -0
- package/coverage/lcov-report/src/gen/video/sfu/event/index.html +116 -0
- package/coverage/lcov-report/src/gen/video/sfu/models/index.html +116 -0
- package/coverage/lcov-report/src/gen/video/sfu/models/models.ts.html +3271 -0
- package/coverage/lcov-report/src/index.html +161 -0
- package/coverage/lcov-report/src/rpc/index.html +131 -0
- package/coverage/lcov-report/src/rpc/index.ts.html +91 -0
- package/coverage/lcov-report/src/rpc/latency.ts.html +214 -0
- package/coverage/lcov-report/src/rtc/Call.ts.html +1840 -0
- package/coverage/lcov-report/src/rtc/CallMetadata.ts.html +157 -0
- package/coverage/lcov-report/src/rtc/Dispatcher.ts.html +223 -0
- package/coverage/lcov-report/src/rtc/IceTrickleBuffer.ts.html +148 -0
- package/coverage/lcov-report/src/rtc/callEventHandlers.ts.html +196 -0
- package/coverage/lcov-report/src/rtc/codecs.ts.html +268 -0
- package/coverage/lcov-report/src/rtc/helpers/iceCandidate.ts.html +133 -0
- package/coverage/lcov-report/src/rtc/helpers/index.html +131 -0
- package/coverage/lcov-report/src/rtc/helpers/tracks.ts.html +139 -0
- package/coverage/lcov-report/src/rtc/index.html +251 -0
- package/coverage/lcov-report/src/rtc/publisher.ts.html +1000 -0
- package/coverage/lcov-report/src/rtc/signal.ts.html +187 -0
- package/coverage/lcov-report/src/rtc/subscriber.ts.html +340 -0
- package/coverage/lcov-report/src/rtc/videoLayers.ts.html +394 -0
- package/coverage/lcov-report/src/stats/index.html +116 -0
- package/coverage/lcov-report/src/stats/state-store-stats-reporter.ts.html +1177 -0
- package/coverage/lcov-report/src/store/index.html +146 -0
- package/coverage/lcov-report/src/store/index.ts.html +91 -0
- package/coverage/lcov-report/src/store/rxUtils.ts.html +211 -0
- package/coverage/lcov-report/src/store/stateStore.ts.html +1108 -0
- package/coverage/lcov.info +11463 -0
- package/coverage/tmp/coverage-2131-1675959950516-2.json +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +8636 -0
- package/dist/index.js.map +1 -0
- package/dist/src/Batcher.d.ts +12 -0
- package/dist/src/CallDropScheduler.d.ts +44 -0
- package/dist/src/StreamSfuClient.d.ts +25 -0
- package/dist/src/StreamVideoClient.d.ts +145 -0
- package/dist/src/__tests__/StreamVideoClient.test.d.ts +1 -0
- package/dist/src/config/defaultConfigs.d.ts +2 -0
- package/dist/src/config/types.d.ts +29 -0
- package/dist/src/coordinator/StreamCoordinatorClient.d.ts +19 -0
- package/dist/src/coordinator/connection/base64.d.ts +2 -0
- package/dist/src/coordinator/connection/client.d.ts +174 -0
- package/dist/src/coordinator/connection/connection.d.ts +139 -0
- package/dist/src/coordinator/connection/connection_fallback.d.ts +38 -0
- package/dist/src/coordinator/connection/errors.d.ts +16 -0
- package/dist/src/coordinator/connection/events.d.ts +10 -0
- package/dist/src/coordinator/connection/insights.d.ts +58 -0
- package/dist/src/coordinator/connection/signing.d.ts +30 -0
- package/dist/src/coordinator/connection/token_manager.d.ts +39 -0
- package/dist/src/coordinator/connection/types.d.ts +87 -0
- package/dist/src/coordinator/connection/utils.d.ts +25 -0
- package/dist/src/devices.d.ts +79 -0
- package/dist/src/events/call.d.ts +26 -0
- package/dist/src/events/internal.d.ts +8 -0
- package/dist/src/events/participant.d.ts +21 -0
- package/dist/src/events/speaker.d.ts +10 -0
- package/dist/src/gen/coordinator/index.d.ts +1973 -0
- package/dist/src/gen/google/protobuf/descriptor.d.ts +1650 -0
- package/dist/src/gen/google/protobuf/duration.d.ts +113 -0
- package/dist/src/gen/google/protobuf/struct.d.ts +184 -0
- package/dist/src/gen/google/protobuf/timestamp.d.ts +158 -0
- package/dist/src/gen/video/coordinator/broadcast_v1/broadcast.d.ts +66 -0
- package/dist/src/gen/video/coordinator/call_v1/call.d.ts +254 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.d.ts +351 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/client_rpc.d.ts +1488 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/envelopes.d.ts +143 -0
- package/dist/src/gen/video/coordinator/client_v1_rpc/websocket.d.ts +292 -0
- package/dist/src/gen/video/coordinator/edge_v1/edge.d.ts +183 -0
- package/dist/src/gen/video/coordinator/event_v1/event.d.ts +411 -0
- package/dist/src/gen/video/coordinator/geofence_v1/geofence.d.ts +63 -0
- package/dist/src/gen/video/coordinator/member_v1/member.d.ts +59 -0
- package/dist/src/gen/video/coordinator/participant_v1/participant.d.ts +103 -0
- package/dist/src/gen/video/coordinator/push_v1/push.d.ts +240 -0
- package/dist/src/gen/video/coordinator/stat_v1/stat.d.ts +308 -0
- package/dist/src/gen/video/coordinator/user_v1/user.d.ts +112 -0
- package/dist/src/gen/video/coordinator/utils_v1/utils.d.ts +47 -0
- package/dist/src/gen/video/sfu/event/events.d.ts +736 -0
- package/dist/src/gen/video/sfu/models/models.d.ts +460 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.client.d.ts +89 -0
- package/dist/src/gen/video/sfu/signal_rpc/signal.d.ts +320 -0
- package/dist/src/helpers/browsers.d.ts +8 -0
- package/dist/src/helpers/sound-detector.d.ts +34 -0
- package/dist/src/rpc/createClient.d.ts +10 -0
- package/dist/src/rpc/index.d.ts +2 -0
- package/dist/src/rpc/latency.d.ts +9 -0
- package/dist/src/rtc/Call.d.ts +180 -0
- package/dist/src/rtc/CallMetadata.d.ts +9 -0
- package/dist/src/rtc/Dispatcher.d.ts +9 -0
- package/dist/src/rtc/IceTrickleBuffer.d.ts +11 -0
- package/dist/src/rtc/callEventHandlers.d.ts +5 -0
- package/dist/src/rtc/codecs.d.ts +2 -0
- package/dist/src/rtc/helpers/iceCandidate.d.ts +2 -0
- package/dist/src/rtc/helpers/tracks.d.ts +3 -0
- package/dist/src/rtc/publisher.d.ts +53 -0
- package/dist/src/rtc/signal.d.ts +5 -0
- package/dist/src/rtc/subscriber.d.ts +7 -0
- package/dist/src/rtc/types.d.ts +84 -0
- package/dist/src/rtc/videoLayers.d.ts +17 -0
- package/dist/src/stats/coordinator-stats-reporter.d.ts +10 -0
- package/dist/src/stats/state-store-stats-reporter.d.ts +57 -0
- package/dist/src/stats/types.d.ts +42 -0
- package/dist/src/store/index.d.ts +2 -0
- package/dist/src/store/rxUtils.d.ts +18 -0
- package/dist/src/store/stateStore.d.ts +182 -0
- package/generate-openapi.sh +32 -0
- package/index.ts +31 -0
- package/openapitools.json +7 -0
- package/package.json +54 -0
- package/rollup.config.mjs +48 -0
- package/src/Batcher.ts +43 -0
- package/src/CallDropScheduler.ts +192 -0
- package/src/StreamSfuClient.ts +185 -0
- package/src/StreamVideoClient.ts +503 -0
- package/src/__tests__/StreamVideoClient.test.ts +83 -0
- package/src/config/defaultConfigs.ts +15 -0
- package/src/config/types.ts +30 -0
- package/src/coordinator/StreamCoordinatorClient.ts +115 -0
- package/src/coordinator/connection/base64.ts +80 -0
- package/src/coordinator/connection/client.ts +814 -0
- package/src/coordinator/connection/connection.ts +750 -0
- package/src/coordinator/connection/connection_fallback.ts +239 -0
- package/src/coordinator/connection/errors.ts +70 -0
- package/src/coordinator/connection/events.ts +13 -0
- package/src/coordinator/connection/insights.ts +88 -0
- package/src/coordinator/connection/signing.ts +104 -0
- package/src/coordinator/connection/token_manager.ts +160 -0
- package/src/coordinator/connection/types.ts +111 -0
- package/src/coordinator/connection/utils.ts +148 -0
- package/src/devices.ts +266 -0
- package/src/events/call.ts +166 -0
- package/src/events/internal.ts +47 -0
- package/src/events/participant.ts +97 -0
- package/src/events/speaker.ts +62 -0
- package/src/gen/coordinator/index.ts +1956 -0
- package/src/gen/google/protobuf/descriptor.ts +3466 -0
- package/src/gen/google/protobuf/duration.ts +232 -0
- package/src/gen/google/protobuf/struct.ts +481 -0
- package/src/gen/google/protobuf/timestamp.ts +291 -0
- package/src/gen/video/coordinator/broadcast_v1/broadcast.ts +154 -0
- package/src/gen/video/coordinator/call_v1/call.ts +651 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.client.ts +463 -0
- package/src/gen/video/coordinator/client_v1_rpc/client_rpc.ts +3819 -0
- package/src/gen/video/coordinator/client_v1_rpc/envelopes.ts +424 -0
- package/src/gen/video/coordinator/client_v1_rpc/websocket.ts +719 -0
- package/src/gen/video/coordinator/edge_v1/edge.ts +532 -0
- package/src/gen/video/coordinator/event_v1/event.ts +1171 -0
- package/src/gen/video/coordinator/geofence_v1/geofence.ts +128 -0
- package/src/gen/video/coordinator/member_v1/member.ts +138 -0
- package/src/gen/video/coordinator/participant_v1/participant.ts +261 -0
- package/src/gen/video/coordinator/push_v1/push.ts +651 -0
- package/src/gen/video/coordinator/stat_v1/stat.ts +656 -0
- package/src/gen/video/coordinator/user_v1/user.ts +277 -0
- package/src/gen/video/coordinator/utils_v1/utils.ts +98 -0
- package/src/gen/video/sfu/event/events.ts +1962 -0
- package/src/gen/video/sfu/models/models.ts +1062 -0
- package/src/gen/video/sfu/signal_rpc/signal.client.ts +108 -0
- package/src/gen/video/sfu/signal_rpc/signal.ts +906 -0
- package/src/helpers/browsers.ts +13 -0
- package/src/helpers/sound-detector.ts +85 -0
- package/src/rpc/createClient.ts +50 -0
- package/src/rpc/index.ts +2 -0
- package/src/rpc/latency.ts +43 -0
- package/src/rtc/Call.ts +585 -0
- package/src/rtc/CallMetadata.ts +24 -0
- package/src/rtc/Dispatcher.ts +46 -0
- package/src/rtc/IceTrickleBuffer.ts +21 -0
- package/src/rtc/callEventHandlers.ts +37 -0
- package/src/rtc/codecs.ts +61 -0
- package/src/rtc/helpers/iceCandidate.ts +16 -0
- package/src/rtc/helpers/tracks.ts +18 -0
- package/src/rtc/publisher.ts +305 -0
- package/src/rtc/signal.ts +34 -0
- package/src/rtc/subscriber.ts +85 -0
- package/src/rtc/types.ts +105 -0
- package/src/rtc/videoLayers.ts +103 -0
- package/src/stats/coordinator-stats-reporter.ts +167 -0
- package/src/stats/state-store-stats-reporter.ts +364 -0
- package/src/stats/types.ts +46 -0
- package/src/store/index.ts +2 -0
- package/src/store/rxUtils.ts +42 -0
- package/src/store/stateStore.ts +341 -0
- package/tsconfig.json +25 -0
- package/typedoc.json +11 -0
- package/vite.config.ts +11 -0
|
@@ -0,0 +1,2335 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/coordinator/connection/connection.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../index.html">All files</a> / <a href="index.html">src/coordinator/connection</a> connection.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">5.86% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>44/750</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/1</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/4</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">5.86% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>44/750</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>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
817
|
+
<span class="cline-any cline-yes">1x</span>
|
|
818
|
+
<span class="cline-any cline-yes">1x</span>
|
|
819
|
+
<span class="cline-any cline-yes">1x</span>
|
|
820
|
+
<span class="cline-any cline-yes">1x</span>
|
|
821
|
+
<span class="cline-any cline-yes">1x</span>
|
|
822
|
+
<span class="cline-any cline-yes">1x</span>
|
|
823
|
+
<span class="cline-any cline-yes">1x</span>
|
|
824
|
+
<span class="cline-any cline-yes">1x</span>
|
|
825
|
+
<span class="cline-any cline-yes">1x</span>
|
|
826
|
+
<span class="cline-any cline-yes">1x</span>
|
|
827
|
+
<span class="cline-any cline-yes">1x</span>
|
|
828
|
+
<span class="cline-any cline-yes">1x</span>
|
|
829
|
+
<span class="cline-any cline-yes">1x</span>
|
|
830
|
+
<span class="cline-any cline-yes">1x</span>
|
|
831
|
+
<span class="cline-any cline-yes">1x</span>
|
|
832
|
+
<span class="cline-any cline-yes">1x</span>
|
|
833
|
+
<span class="cline-any cline-yes">1x</span>
|
|
834
|
+
<span class="cline-any cline-yes">1x</span>
|
|
835
|
+
<span class="cline-any cline-yes">1x</span>
|
|
836
|
+
<span class="cline-any cline-yes">1x</span>
|
|
837
|
+
<span class="cline-any cline-yes">1x</span>
|
|
838
|
+
<span class="cline-any cline-no"> </span>
|
|
839
|
+
<span class="cline-any cline-no"> </span>
|
|
840
|
+
<span class="cline-any cline-yes">1x</span>
|
|
841
|
+
<span class="cline-any cline-yes">1x</span>
|
|
842
|
+
<span class="cline-any cline-yes">1x</span>
|
|
843
|
+
<span class="cline-any cline-no"> </span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-yes">1x</span>
|
|
846
|
+
<span class="cline-any cline-yes">1x</span>
|
|
847
|
+
<span class="cline-any cline-yes">1x</span>
|
|
848
|
+
<span class="cline-any cline-yes">1x</span>
|
|
849
|
+
<span class="cline-any cline-yes">1x</span>
|
|
850
|
+
<span class="cline-any cline-yes">1x</span>
|
|
851
|
+
<span class="cline-any cline-yes">1x</span>
|
|
852
|
+
<span class="cline-any cline-yes">1x</span>
|
|
853
|
+
<span class="cline-any cline-yes">1x</span>
|
|
854
|
+
<span class="cline-any cline-yes">1x</span>
|
|
855
|
+
<span class="cline-any cline-yes">1x</span>
|
|
856
|
+
<span class="cline-any cline-yes">1x</span>
|
|
857
|
+
<span class="cline-any cline-yes">1x</span>
|
|
858
|
+
<span class="cline-any cline-yes">1x</span>
|
|
859
|
+
<span class="cline-any cline-yes">1x</span>
|
|
860
|
+
<span class="cline-any cline-yes">1x</span>
|
|
861
|
+
<span class="cline-any cline-yes">1x</span>
|
|
862
|
+
<span class="cline-any cline-yes">1x</span>
|
|
863
|
+
<span class="cline-any cline-yes">1x</span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-no"> </span>
|
|
874
|
+
<span class="cline-any cline-no"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-no"> </span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-no"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-no"> </span>
|
|
909
|
+
<span class="cline-any cline-no"> </span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-no"> </span>
|
|
919
|
+
<span class="cline-any cline-no"> </span>
|
|
920
|
+
<span class="cline-any cline-no"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-no"> </span>
|
|
923
|
+
<span class="cline-any cline-no"> </span>
|
|
924
|
+
<span class="cline-any cline-no"> </span>
|
|
925
|
+
<span class="cline-any cline-no"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-no"> </span>
|
|
928
|
+
<span class="cline-any cline-no"> </span>
|
|
929
|
+
<span class="cline-any cline-no"> </span>
|
|
930
|
+
<span class="cline-any cline-no"> </span>
|
|
931
|
+
<span class="cline-any cline-no"> </span>
|
|
932
|
+
<span class="cline-any cline-no"> </span>
|
|
933
|
+
<span class="cline-any cline-no"> </span>
|
|
934
|
+
<span class="cline-any cline-no"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-no"> </span>
|
|
937
|
+
<span class="cline-any cline-no"> </span>
|
|
938
|
+
<span class="cline-any cline-no"> </span>
|
|
939
|
+
<span class="cline-any cline-no"> </span>
|
|
940
|
+
<span class="cline-any cline-no"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-no"> </span>
|
|
944
|
+
<span class="cline-any cline-no"> </span>
|
|
945
|
+
<span class="cline-any cline-no"> </span>
|
|
946
|
+
<span class="cline-any cline-no"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-no"> </span>
|
|
950
|
+
<span class="cline-any cline-no"> </span>
|
|
951
|
+
<span class="cline-any cline-no"> </span>
|
|
952
|
+
<span class="cline-any cline-no"> </span>
|
|
953
|
+
<span class="cline-any cline-no"> </span>
|
|
954
|
+
<span class="cline-any cline-no"> </span>
|
|
955
|
+
<span class="cline-any cline-no"> </span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-no"> </span>
|
|
958
|
+
<span class="cline-any cline-no"> </span>
|
|
959
|
+
<span class="cline-any cline-no"> </span>
|
|
960
|
+
<span class="cline-any cline-no"> </span>
|
|
961
|
+
<span class="cline-any cline-no"> </span>
|
|
962
|
+
<span class="cline-any cline-no"> </span>
|
|
963
|
+
<span class="cline-any cline-no"> </span>
|
|
964
|
+
<span class="cline-any cline-no"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-no"> </span>
|
|
967
|
+
<span class="cline-any cline-no"> </span>
|
|
968
|
+
<span class="cline-any cline-no"> </span>
|
|
969
|
+
<span class="cline-any cline-no"> </span>
|
|
970
|
+
<span class="cline-any cline-no"> </span>
|
|
971
|
+
<span class="cline-any cline-no"> </span>
|
|
972
|
+
<span class="cline-any cline-no"> </span>
|
|
973
|
+
<span class="cline-any cline-no"> </span>
|
|
974
|
+
<span class="cline-any cline-no"> </span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-no"> </span>
|
|
977
|
+
<span class="cline-any cline-no"> </span>
|
|
978
|
+
<span class="cline-any cline-no"> </span>
|
|
979
|
+
<span class="cline-any cline-no"> </span>
|
|
980
|
+
<span class="cline-any cline-no"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-no"> </span>
|
|
985
|
+
<span class="cline-any cline-no"> </span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-no"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-no"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-no"> </span>
|
|
999
|
+
<span class="cline-any cline-no"> </span>
|
|
1000
|
+
<span class="cline-any cline-no"> </span>
|
|
1001
|
+
<span class="cline-any cline-no"> </span>
|
|
1002
|
+
<span class="cline-any cline-no"> </span>
|
|
1003
|
+
<span class="cline-any cline-no"> </span>
|
|
1004
|
+
<span class="cline-any cline-no"> </span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-no"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-no"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-no"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-no"> </span>
|
|
1131
|
+
<span class="cline-any cline-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-no"> </span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-no"> </span>
|
|
1170
|
+
<span class="cline-any cline-no"> </span>
|
|
1171
|
+
<span class="cline-any cline-no"> </span>
|
|
1172
|
+
<span class="cline-any cline-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-no"> </span>
|
|
1196
|
+
<span class="cline-any cline-no"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-no"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-no"> </span>
|
|
1211
|
+
<span class="cline-any cline-no"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-no"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-no"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-no"> </span>
|
|
1279
|
+
<span class="cline-any cline-no"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-no"> </span>
|
|
1282
|
+
<span class="cline-any cline-no"> </span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-no"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-no"> </span>
|
|
1314
|
+
<span class="cline-any cline-no"> </span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-no"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-no"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-no"> </span>
|
|
1372
|
+
<span class="cline-any cline-no"> </span>
|
|
1373
|
+
<span class="cline-any cline-no"> </span>
|
|
1374
|
+
<span class="cline-any cline-no"> </span>
|
|
1375
|
+
<span class="cline-any cline-no"> </span>
|
|
1376
|
+
<span class="cline-any cline-no"> </span>
|
|
1377
|
+
<span class="cline-any cline-no"> </span>
|
|
1378
|
+
<span class="cline-any cline-no"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-no"> </span>
|
|
1382
|
+
<span class="cline-any cline-no"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-no"> </span>
|
|
1385
|
+
<span class="cline-any cline-no"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-no"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-no"> </span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-no"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-no"> </span>
|
|
1416
|
+
<span class="cline-any cline-no"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-no"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-no"> </span>
|
|
1429
|
+
<span class="cline-any cline-no"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-no"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-no"> </span>
|
|
1452
|
+
<span class="cline-any cline-no"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-no"> </span>
|
|
1456
|
+
<span class="cline-any cline-no"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-no"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-no"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-no"> </span>
|
|
1468
|
+
<span class="cline-any cline-no"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-no"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-no"> </span>
|
|
1475
|
+
<span class="cline-any cline-no"> </span>
|
|
1476
|
+
<span class="cline-any cline-no"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-no"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-no"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-no"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-no"> </span>
|
|
1493
|
+
<span class="cline-any cline-no"> </span>
|
|
1494
|
+
<span class="cline-any cline-no"> </span>
|
|
1495
|
+
<span class="cline-any cline-no"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-no"> </span>
|
|
1498
|
+
<span class="cline-any cline-no"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-no"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-no"> </span>
|
|
1505
|
+
<span class="cline-any cline-no"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-no"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-no"> </span>
|
|
1513
|
+
<span class="cline-any cline-no"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-no"> </span>
|
|
1518
|
+
<span class="cline-any cline-no"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-no"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-no"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-no"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-no"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-no"> </span>
|
|
1543
|
+
<span class="cline-any cline-no"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-no"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-no"> </span>
|
|
1552
|
+
<span class="cline-any cline-no"> </span>
|
|
1553
|
+
<span class="cline-any cline-no"> </span>
|
|
1554
|
+
<span class="cline-any cline-no"> </span>
|
|
1555
|
+
<span class="cline-any cline-no"> </span>
|
|
1556
|
+
<span class="cline-any cline-no"> </span>
|
|
1557
|
+
<span class="cline-any cline-no"> </span>
|
|
1558
|
+
<span class="cline-any cline-no"> </span>
|
|
1559
|
+
<span class="cline-any cline-no"> </span>
|
|
1560
|
+
<span class="cline-any cline-no"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import WebSocket from 'isomorphic-ws';
|
|
1567
|
+
import { StreamClient } from './client';
|
|
1568
|
+
import {
|
|
1569
|
+
buildWsFatalInsight,
|
|
1570
|
+
buildWsSuccessAfterFailureInsight,
|
|
1571
|
+
postInsights,
|
|
1572
|
+
} from './insights';
|
|
1573
|
+
import {
|
|
1574
|
+
addConnectionEventListeners,
|
|
1575
|
+
chatCodes,
|
|
1576
|
+
convertErrorToJson,
|
|
1577
|
+
randomId,
|
|
1578
|
+
removeConnectionEventListeners,
|
|
1579
|
+
retryInterval,
|
|
1580
|
+
sleep,
|
|
1581
|
+
} from './utils';
|
|
1582
|
+
import type { ConnectAPIResponse, ConnectionOpen, LogLevel, UR } from './types';
|
|
1583
|
+
import type { VideoWSAuthMessageRequest } from '../../gen/coordinator';
|
|
1584
|
+
|
|
1585
|
+
// Type guards to check WebSocket error type
|
|
1586
|
+
const isCloseEvent = (
|
|
1587
|
+
<span class="fstat-no" title="function not covered" > res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent,</span>
|
|
1588
|
+
<span class="cstat-no" title="statement not covered" >): res is WebSocket.CloseEvent =></span>
|
|
1589
|
+
<span class="cstat-no" title="statement not covered" > (res as WebSocket.CloseEvent).code !== undefined;</span>
|
|
1590
|
+
|
|
1591
|
+
const isErrorEvent = (
|
|
1592
|
+
<span class="fstat-no" title="function not covered" > res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent,</span>
|
|
1593
|
+
<span class="cstat-no" title="statement not covered" >): res is WebSocket.ErrorEvent =></span>
|
|
1594
|
+
<span class="cstat-no" title="statement not covered" > (res as WebSocket.ErrorEvent).error !== undefined;</span>
|
|
1595
|
+
|
|
1596
|
+
/**
|
|
1597
|
+
* StableWSConnection - A WS connection that reconnects upon failure.
|
|
1598
|
+
* - the browser will sometimes report that you're online or offline
|
|
1599
|
+
* - the WS connection can break and fail (there is a 30s health check)
|
|
1600
|
+
* - sometimes your WS connection will seem to work while the user is in fact offline
|
|
1601
|
+
* - to speed up online/offline detection you can use the window.addEventListener('offline');
|
|
1602
|
+
*
|
|
1603
|
+
* There are 4 ways in which a connection can become unhealthy:
|
|
1604
|
+
* - websocket.onerror is called
|
|
1605
|
+
* - websocket.onclose is called
|
|
1606
|
+
* - the health check fails and no event is received for ~40 seconds
|
|
1607
|
+
* - the browser indicates the connection is now offline
|
|
1608
|
+
*
|
|
1609
|
+
* There are 2 assumptions we make about the server:
|
|
1610
|
+
* - state can be recovered by querying the channel again
|
|
1611
|
+
* - if the servers fails to publish a message to the client, the WS connection is destroyed
|
|
1612
|
+
*/
|
|
1613
|
+
export <span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >class StableWSConnection {</span></span>
|
|
1614
|
+
<span class="cstat-no" title="statement not covered" > // local vars</span>
|
|
1615
|
+
<span class="cstat-no" title="statement not covered" > connectionID?: string;</span>
|
|
1616
|
+
<span class="cstat-no" title="statement not covered" > connectionOpen?: ConnectAPIResponse;</span>
|
|
1617
|
+
<span class="cstat-no" title="statement not covered" > consecutiveFailures: number;</span>
|
|
1618
|
+
<span class="cstat-no" title="statement not covered" > pingInterval: number;</span>
|
|
1619
|
+
<span class="cstat-no" title="statement not covered" > healthCheckTimeoutRef?: NodeJS.Timeout;</span>
|
|
1620
|
+
<span class="cstat-no" title="statement not covered" > isConnecting: boolean;</span>
|
|
1621
|
+
<span class="cstat-no" title="statement not covered" > isDisconnected: boolean;</span>
|
|
1622
|
+
<span class="cstat-no" title="statement not covered" > isHealthy: boolean;</span>
|
|
1623
|
+
<span class="cstat-no" title="statement not covered" > isResolved?: boolean;</span>
|
|
1624
|
+
<span class="cstat-no" title="statement not covered" > lastEvent: Date | null;</span>
|
|
1625
|
+
<span class="cstat-no" title="statement not covered" > connectionCheckTimeout: number;</span>
|
|
1626
|
+
<span class="cstat-no" title="statement not covered" > connectionCheckTimeoutRef?: NodeJS.Timeout;</span>
|
|
1627
|
+
<span class="cstat-no" title="statement not covered" > rejectPromise?: (</span>
|
|
1628
|
+
<span class="cstat-no" title="statement not covered" > reason?: Error & {</span>
|
|
1629
|
+
<span class="cstat-no" title="statement not covered" > code?: string | number;</span>
|
|
1630
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure?: boolean;</span>
|
|
1631
|
+
<span class="cstat-no" title="statement not covered" > StatusCode?: string | number;</span>
|
|
1632
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
1633
|
+
<span class="cstat-no" title="statement not covered" > ) => void;</span>
|
|
1634
|
+
<span class="cstat-no" title="statement not covered" > requestID: string | undefined;</span>
|
|
1635
|
+
<span class="cstat-no" title="statement not covered" > resolvePromise?: (value: ConnectionOpen) => void;</span>
|
|
1636
|
+
<span class="cstat-no" title="statement not covered" > totalFailures: number;</span>
|
|
1637
|
+
<span class="cstat-no" title="statement not covered" > ws?: WebSocket;</span>
|
|
1638
|
+
<span class="cstat-no" title="statement not covered" > wsID: number;</span>
|
|
1639
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1640
|
+
<span class="cstat-no" title="statement not covered" > token = '';</span>
|
|
1641
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1642
|
+
<span class="cstat-no" title="statement not covered" > client: StreamClient;</span>
|
|
1643
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1644
|
+
<span class="cstat-no" title="statement not covered" > constructor(client: StreamClient) {</span>
|
|
1645
|
+
<span class="cstat-no" title="statement not covered" > this.client = client;</span>
|
|
1646
|
+
<span class="cstat-no" title="statement not covered" > /** consecutive failures influence the duration of the timeout */</span>
|
|
1647
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures = 0;</span>
|
|
1648
|
+
<span class="cstat-no" title="statement not covered" > /** keep track of the total number of failures */</span>
|
|
1649
|
+
<span class="cstat-no" title="statement not covered" > this.totalFailures = 0;</span>
|
|
1650
|
+
<span class="cstat-no" title="statement not covered" > /** We only make 1 attempt to reconnect at the same time.. */</span>
|
|
1651
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
1652
|
+
<span class="cstat-no" title="statement not covered" > /** To avoid reconnect if client is disconnected */</span>
|
|
1653
|
+
<span class="cstat-no" title="statement not covered" > this.isDisconnected = false;</span>
|
|
1654
|
+
<span class="cstat-no" title="statement not covered" > /** Boolean that indicates if the connection promise is resolved */</span>
|
|
1655
|
+
<span class="cstat-no" title="statement not covered" > this.isResolved = false;</span>
|
|
1656
|
+
<span class="cstat-no" title="statement not covered" > /** Boolean that indicates if we have a working connection to the server */</span>
|
|
1657
|
+
<span class="cstat-no" title="statement not covered" > this.isHealthy = false;</span>
|
|
1658
|
+
<span class="cstat-no" title="statement not covered" > /** Incremented when a new WS connection is made */</span>
|
|
1659
|
+
<span class="cstat-no" title="statement not covered" > this.wsID = 1;</span>
|
|
1660
|
+
<span class="cstat-no" title="statement not covered" > /** Store the last event time for health checks */</span>
|
|
1661
|
+
<span class="cstat-no" title="statement not covered" > this.lastEvent = null;</span>
|
|
1662
|
+
<span class="cstat-no" title="statement not covered" > /** Send a health check message every 25 seconds */</span>
|
|
1663
|
+
<span class="cstat-no" title="statement not covered" > this.pingInterval = 25 * 1000;</span>
|
|
1664
|
+
<span class="cstat-no" title="statement not covered" > this.connectionCheckTimeout = this.pingInterval + 10 * 1000;</span>
|
|
1665
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1666
|
+
<span class="cstat-no" title="statement not covered" > addConnectionEventListeners(this.onlineStatusChanged);</span>
|
|
1667
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1668
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1669
|
+
<span class="cstat-no" title="statement not covered" > _log(msg: string, extra: UR = {}, level: LogLevel = 'info') {</span>
|
|
1670
|
+
<span class="cstat-no" title="statement not covered" > console.log(msg, extra);</span>
|
|
1671
|
+
<span class="cstat-no" title="statement not covered" > this.client.logger(level, 'connection:' + msg, {</span>
|
|
1672
|
+
<span class="cstat-no" title="statement not covered" > tags: ['connection'],</span>
|
|
1673
|
+
<span class="cstat-no" title="statement not covered" > ...extra,</span>
|
|
1674
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1675
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1676
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1677
|
+
<span class="cstat-no" title="statement not covered" > setClient = (client: StreamClient) => {</span>
|
|
1678
|
+
<span class="cstat-no" title="statement not covered" > this.client = client;</span>
|
|
1679
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1680
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1681
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1682
|
+
<span class="cstat-no" title="statement not covered" > * connect - Connect to the WS URL</span>
|
|
1683
|
+
<span class="cstat-no" title="statement not covered" > * the default 15s timeout allows between 2~3 tries</span>
|
|
1684
|
+
<span class="cstat-no" title="statement not covered" > * @return {ConnectAPIResponse<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received</span>
|
|
1685
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1686
|
+
<span class="cstat-no" title="statement not covered" > async connect(timeout = 15000) {</span>
|
|
1687
|
+
<span class="cstat-no" title="statement not covered" > if (this.isConnecting) {</span>
|
|
1688
|
+
<span class="cstat-no" title="statement not covered" > throw Error(</span>
|
|
1689
|
+
<span class="cstat-no" title="statement not covered" > `You've called connect twice, can only attempt 1 connection at the time`,</span>
|
|
1690
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1691
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1692
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1693
|
+
<span class="cstat-no" title="statement not covered" > this.isDisconnected = false;</span>
|
|
1694
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1695
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1696
|
+
<span class="cstat-no" title="statement not covered" > const healthCheck = await this._connect();</span>
|
|
1697
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures = 0;</span>
|
|
1698
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1699
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1700
|
+
<span class="cstat-no" title="statement not covered" > `connect() - Established ws connection with healthcheck: ${healthCheck}`,</span>
|
|
1701
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1702
|
+
<span class="cstat-no" title="statement not covered" > } catch (error) {</span>
|
|
1703
|
+
<span class="cstat-no" title="statement not covered" > this.isHealthy = false;</span>
|
|
1704
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures += 1;</span>
|
|
1705
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1706
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
1707
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1708
|
+
<span class="cstat-no" title="statement not covered" > error.code === chatCodes.TOKEN_EXPIRED &&</span>
|
|
1709
|
+
<span class="cstat-no" title="statement not covered" > !this.client.tokenManager.isStatic()</span>
|
|
1710
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
1711
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1712
|
+
<span class="cstat-no" title="statement not covered" > 'connect() - WS failure due to expired token, so going to try to reload token and reconnect',</span>
|
|
1713
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1714
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect({ refreshToken: true });</span>
|
|
1715
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1716
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1717
|
+
<span class="cstat-no" title="statement not covered" > if (!error.isWSFailure) {</span>
|
|
1718
|
+
<span class="cstat-no" title="statement not covered" > // API rejected the connection and we should not retry</span>
|
|
1719
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1720
|
+
<span class="cstat-no" title="statement not covered" > JSON.stringify({</span>
|
|
1721
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1722
|
+
<span class="cstat-no" title="statement not covered" > code: error.code,</span>
|
|
1723
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1724
|
+
<span class="cstat-no" title="statement not covered" > StatusCode: error.StatusCode,</span>
|
|
1725
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1726
|
+
<span class="cstat-no" title="statement not covered" > message: error.message,</span>
|
|
1727
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1728
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure: error.isWSFailure,</span>
|
|
1729
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1730
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1731
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1732
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1733
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1734
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1735
|
+
<span class="cstat-no" title="statement not covered" > return await this._waitForHealthy(timeout);</span>
|
|
1736
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1737
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1738
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1739
|
+
<span class="cstat-no" title="statement not covered" > * _waitForHealthy polls the promise connection to see if its resolved until it times out</span>
|
|
1740
|
+
<span class="cstat-no" title="statement not covered" > * the default 15s timeout allows between 2~3 tries</span>
|
|
1741
|
+
<span class="cstat-no" title="statement not covered" > * @param timeout duration(ms)</span>
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > async _waitForHealthy(timeout = 15000) {</span>
|
|
1744
|
+
<span class="cstat-no" title="statement not covered" > return Promise.race([</span>
|
|
1745
|
+
<span class="cstat-no" title="statement not covered" > (async () => {</span>
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" > const interval = 50; // ms</span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" > for (let i = 0; i <= timeout; i += interval) {</span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" > return await this.connectionOpen;</span>
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" > } catch (error: any) {</span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > if (i === timeout) {</span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > JSON.stringify({</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" > code: error.code,</span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" > StatusCode: error.StatusCode,</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" > message: error.message,</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure: error.isWSFailure,</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > await sleep(interval);</span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > })(),</span>
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" > (async () => {</span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" > await sleep(timeout);</span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" > JSON.stringify({</span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" > code: '',</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > StatusCode: '',</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" > message: 'initial WS connection could not be established',</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure: true,</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" > }),</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" > })(),</span>
|
|
1777
|
+
<span class="cstat-no" title="statement not covered" > ]);</span>
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" > * Builds and returns the url for websocket.</span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > * @private</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > * @returns url string</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" > _buildUrl = () => {</span>
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" > const params = new URLSearchParams();</span>
|
|
1787
|
+
<span class="cstat-no" title="statement not covered" > // const qs = encodeURIComponent(this.client._buildWSPayload(this.requestID));</span>
|
|
1788
|
+
<span class="cstat-no" title="statement not covered" > // params.set('json', qs);</span>
|
|
1789
|
+
<span class="cstat-no" title="statement not covered" > params.set('api_key', this.client.key);</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > params.set('stream-auth-type', this.client.getAuthType());</span>
|
|
1791
|
+
<span class="cstat-no" title="statement not covered" > params.set('X-Stream-Client', this.client.getUserAgent());</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > // params.append('authorization', this.client._getToken()!);</span>
|
|
1793
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" > return `${this.client.wsBaseURL}/connect?${params.toString()}`;</span>
|
|
1795
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > * disconnect - Disconnect the connection and doesn't recover...</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" > disconnect(timeout?: number) {</span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > `disconnect() - Closing the websocket connection for wsID ${this.wsID}`,</span>
|
|
1804
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1806
|
+
<span class="cstat-no" title="statement not covered" > this.wsID += 1;</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
1808
|
+
<span class="cstat-no" title="statement not covered" > this.isDisconnected = true;</span>
|
|
1809
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1810
|
+
<span class="cstat-no" title="statement not covered" > // start by removing all the listeners</span>
|
|
1811
|
+
<span class="cstat-no" title="statement not covered" > if (this.healthCheckTimeoutRef) {</span>
|
|
1812
|
+
<span class="cstat-no" title="statement not covered" > clearInterval(this.healthCheckTimeoutRef);</span>
|
|
1813
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1814
|
+
<span class="cstat-no" title="statement not covered" > if (this.connectionCheckTimeoutRef) {</span>
|
|
1815
|
+
<span class="cstat-no" title="statement not covered" > clearInterval(this.connectionCheckTimeoutRef);</span>
|
|
1816
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1817
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1818
|
+
<span class="cstat-no" title="statement not covered" > removeConnectionEventListeners(this.onlineStatusChanged);</span>
|
|
1819
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1820
|
+
<span class="cstat-no" title="statement not covered" > this.isHealthy = false;</span>
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1822
|
+
<span class="cstat-no" title="statement not covered" > // remove ws handlers...</span>
|
|
1823
|
+
<span class="cstat-no" title="statement not covered" > if (this.ws && this.ws.removeAllListeners) {</span>
|
|
1824
|
+
<span class="cstat-no" title="statement not covered" > this.ws.removeAllListeners();</span>
|
|
1825
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1826
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1827
|
+
<span class="cstat-no" title="statement not covered" > let isClosedPromise: Promise<void>;</span>
|
|
1828
|
+
<span class="cstat-no" title="statement not covered" > // and finally close...</span>
|
|
1829
|
+
<span class="cstat-no" title="statement not covered" > // Assigning to local here because we will remove it from this before the</span>
|
|
1830
|
+
<span class="cstat-no" title="statement not covered" > // promise resolves.</span>
|
|
1831
|
+
<span class="cstat-no" title="statement not covered" > const { ws } = this;</span>
|
|
1832
|
+
<span class="cstat-no" title="statement not covered" > if (ws && ws.close && ws.readyState === ws.OPEN) {</span>
|
|
1833
|
+
<span class="cstat-no" title="statement not covered" > isClosedPromise = new Promise((resolve) => {</span>
|
|
1834
|
+
<span class="cstat-no" title="statement not covered" > const onclose = (event: WebSocket.CloseEvent) => {</span>
|
|
1835
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1836
|
+
<span class="cstat-no" title="statement not covered" > `disconnect() - resolving isClosedPromise ${</span>
|
|
1837
|
+
<span class="cstat-no" title="statement not covered" > event ? 'with' : 'without'</span>
|
|
1838
|
+
<span class="cstat-no" title="statement not covered" > } close frame`,</span>
|
|
1839
|
+
<span class="cstat-no" title="statement not covered" > { event },</span>
|
|
1840
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1841
|
+
<span class="cstat-no" title="statement not covered" > resolve();</span>
|
|
1842
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1843
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1844
|
+
<span class="cstat-no" title="statement not covered" > ws.onclose = onclose;</span>
|
|
1845
|
+
<span class="cstat-no" title="statement not covered" > // In case we don't receive close frame websocket server in time,</span>
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > // lets not wait for more than 1 seconds.</span>
|
|
1847
|
+
<span class="cstat-no" title="statement not covered" > setTimeout(onclose, timeout != null ? timeout : 1000);</span>
|
|
1848
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1849
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1850
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1851
|
+
<span class="cstat-no" title="statement not covered" > `disconnect() - Manually closed connection by calling client.disconnect()`,</span>
|
|
1852
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1853
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1854
|
+
<span class="cstat-no" title="statement not covered" > ws.close(</span>
|
|
1855
|
+
<span class="cstat-no" title="statement not covered" > chatCodes.WS_CLOSED_SUCCESS,</span>
|
|
1856
|
+
<span class="cstat-no" title="statement not covered" > 'Manually closed connection by calling client.disconnect()',</span>
|
|
1857
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1858
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1859
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1860
|
+
<span class="cstat-no" title="statement not covered" > `disconnect() - ws connection doesn't exist or it is already closed.`,</span>
|
|
1861
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1862
|
+
<span class="cstat-no" title="statement not covered" > isClosedPromise = Promise.resolve();</span>
|
|
1863
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1864
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1865
|
+
<span class="cstat-no" title="statement not covered" > delete this.ws;</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1867
|
+
<span class="cstat-no" title="statement not covered" > return isClosedPromise;</span>
|
|
1868
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1869
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1870
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1871
|
+
<span class="cstat-no" title="statement not covered" > * _connect - Connect to the WS endpoint</span>
|
|
1872
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1873
|
+
<span class="cstat-no" title="statement not covered" > * @return {ConnectAPIResponse<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received</span>
|
|
1874
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1875
|
+
<span class="cstat-no" title="statement not covered" > async _connect() {</span>
|
|
1876
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
1877
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting ||</span>
|
|
1878
|
+
<span class="cstat-no" title="statement not covered" > (this.isDisconnected && this.client.options.enableWSFallback)</span>
|
|
1879
|
+
<span class="cstat-no" title="statement not covered" > )</span>
|
|
1880
|
+
<span class="cstat-no" title="statement not covered" > return; // simply ignore _connect if it's currently trying to connect</span>
|
|
1881
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = true;</span>
|
|
1882
|
+
<span class="cstat-no" title="statement not covered" > this.requestID = randomId();</span>
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" > this.client.insightMetrics.connectionStartTimestamp = new Date().getTime();</span>
|
|
1884
|
+
<span class="cstat-no" title="statement not covered" > let isTokenReady = false;</span>
|
|
1885
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1886
|
+
<span class="cstat-no" title="statement not covered" > this._log(`_connect() - waiting for token`);</span>
|
|
1887
|
+
<span class="cstat-no" title="statement not covered" > await this.client.tokenManager.tokenReady();</span>
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" > isTokenReady = true;</span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" > // token provider has failed before, so try again</span>
|
|
1891
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1892
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1893
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1894
|
+
<span class="cstat-no" title="statement not covered" > if (!isTokenReady) {</span>
|
|
1895
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
1896
|
+
<span class="cstat-no" title="statement not covered" > `_connect() - tokenProvider failed before, so going to retry`,</span>
|
|
1897
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1898
|
+
<span class="cstat-no" title="statement not covered" > await this.client.tokenManager.loadToken();</span>
|
|
1899
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1900
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1901
|
+
<span class="cstat-no" title="statement not covered" > this._setupConnectionPromise();</span>
|
|
1902
|
+
<span class="cstat-no" title="statement not covered" > const wsURL = this._buildUrl();</span>
|
|
1903
|
+
<span class="cstat-no" title="statement not covered" > this._log(`_connect() - Connecting to ${wsURL}`, {</span>
|
|
1904
|
+
<span class="cstat-no" title="statement not covered" > wsURL,</span>
|
|
1905
|
+
<span class="cstat-no" title="statement not covered" > requestID: this.requestID,</span>
|
|
1906
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1907
|
+
<span class="cstat-no" title="statement not covered" > this.ws = new WebSocket(wsURL);</span>
|
|
1908
|
+
<span class="cstat-no" title="statement not covered" > this.ws.onopen = this.onopen.bind(this, this.wsID);</span>
|
|
1909
|
+
<span class="cstat-no" title="statement not covered" > this.ws.onclose = this.onclose.bind(this, this.wsID);</span>
|
|
1910
|
+
<span class="cstat-no" title="statement not covered" > this.ws.onerror = this.onerror.bind(this, this.wsID);</span>
|
|
1911
|
+
<span class="cstat-no" title="statement not covered" > this.ws.onmessage = this.onmessage.bind(this, this.wsID);</span>
|
|
1912
|
+
<span class="cstat-no" title="statement not covered" > const response = await this.connectionOpen;</span>
|
|
1913
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
1914
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1915
|
+
<span class="cstat-no" title="statement not covered" > if (response) {</span>
|
|
1916
|
+
<span class="cstat-no" title="statement not covered" > this.connectionID = response.connection_id;</span>
|
|
1917
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
1918
|
+
<span class="cstat-no" title="statement not covered" > this.client.insightMetrics.wsConsecutiveFailures > 0 &&</span>
|
|
1919
|
+
<span class="cstat-no" title="statement not covered" > this.client.options.enableInsights</span>
|
|
1920
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" > postInsights(</span>
|
|
1922
|
+
<span class="cstat-no" title="statement not covered" > 'ws_success_after_failure',</span>
|
|
1923
|
+
<span class="cstat-no" title="statement not covered" > buildWsSuccessAfterFailureInsight(</span>
|
|
1924
|
+
<span class="cstat-no" title="statement not covered" > this as unknown as StableWSConnection,</span>
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" > ),</span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > this.client.insightMetrics.wsConsecutiveFailures = 0;</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" > return response;</span>
|
|
1930
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1931
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1932
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" > // @ts-ignore</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" > this._log(`_connect() - Error - `, err);</span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > if (this.client.options.enableInsights) {</span>
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" > this.client.insightMetrics.wsConsecutiveFailures++;</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > this.client.insightMetrics.wsTotalFailures++;</span>
|
|
1938
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > const insights = buildWsFatalInsight(</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > this as unknown as StableWSConnection,</span>
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" > convertErrorToJson(err as Error),</span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > postInsights?.('ws_fatal', insights);</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" > * _reconnect - Retry the connection to WS endpoint</span>
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1952
|
+
<span class="cstat-no" title="statement not covered" > * @param {{ interval?: number; refreshToken?: boolean }} options Following options are available</span>
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > * - `interval` {int} number of ms that function should wait before reconnecting</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > * - `refreshToken` {boolean} reload/refresh user token be refreshed before attempting reconnection.</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > async _reconnect(</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > options: { interval?: number; refreshToken?: boolean } = {},</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" > ): Promise<void> {</span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Initiating the reconnect');</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1962
|
+
<span class="cstat-no" title="statement not covered" > // only allow 1 connection at the time</span>
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > if (this.isConnecting || this.isHealthy) {</span>
|
|
1964
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Abort (1) since already connecting or healthy');</span>
|
|
1965
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1966
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1968
|
+
<span class="cstat-no" title="statement not covered" > // reconnect in case of on error or on close</span>
|
|
1969
|
+
<span class="cstat-no" title="statement not covered" > // also reconnect if the health check cycle fails</span>
|
|
1970
|
+
<span class="cstat-no" title="statement not covered" > let interval = options.interval;</span>
|
|
1971
|
+
<span class="cstat-no" title="statement not covered" > if (!interval) {</span>
|
|
1972
|
+
<span class="cstat-no" title="statement not covered" > interval = retryInterval(this.consecutiveFailures);</span>
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > // reconnect, or try again after a little while...</span>
|
|
1975
|
+
<span class="cstat-no" title="statement not covered" > await sleep(interval);</span>
|
|
1976
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1977
|
+
<span class="cstat-no" title="statement not covered" > // Check once again if by some other call to _reconnect is active or connection is</span>
|
|
1978
|
+
<span class="cstat-no" title="statement not covered" > // already restored, then no need to proceed.</span>
|
|
1979
|
+
<span class="cstat-no" title="statement not covered" > if (this.isConnecting || this.isHealthy) {</span>
|
|
1980
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Abort (2) since already connecting or healthy');</span>
|
|
1981
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1982
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1983
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1984
|
+
<span class="cstat-no" title="statement not covered" > if (this.isDisconnected /* && this.client.options.enableWSFallback */) {</span>
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Abort (3) since disconnect() is called');</span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Destroying current WS connection');</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" > // cleanup the old connection</span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > this._destroyCurrentWSConnection();</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1994
|
+
<span class="cstat-no" title="statement not covered" > if (options.refreshToken) {</span>
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > await this.client.tokenManager.loadToken();</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > await this._connect();</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Waiting for recoverCallBack');</span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > // await this.client.recoverState();</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - Finished recoverCallBack');</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures = 0;</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" > } catch (error: any) {</span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" > this.isHealthy = false;</span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures += 1;</span>
|
|
2008
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > error.code === chatCodes.TOKEN_EXPIRED &&</span>
|
|
2010
|
+
<span class="cstat-no" title="statement not covered" > !this.client.tokenManager.isStatic()</span>
|
|
2011
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
2012
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
2013
|
+
<span class="cstat-no" title="statement not covered" > '_reconnect() - WS failure due to expired token, so going to try to reload token and reconnect',</span>
|
|
2014
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2015
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" > return this._reconnect({ refreshToken: true });</span>
|
|
2017
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2018
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2019
|
+
<span class="cstat-no" title="statement not covered" > // reconnect on WS failures, don't reconnect if there is a code bug</span>
|
|
2020
|
+
<span class="cstat-no" title="statement not covered" > if (error.isWSFailure) {</span>
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - WS failure, so going to try to reconnect');</span>
|
|
2022
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2023
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect();</span>
|
|
2024
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2025
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2026
|
+
<span class="cstat-no" title="statement not covered" > this._log('_reconnect() - == END ==');</span>
|
|
2027
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2028
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2029
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2030
|
+
<span class="cstat-no" title="statement not covered" > * onlineStatusChanged - this function is called when the browser connects or disconnects from the internet.</span>
|
|
2031
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2032
|
+
<span class="cstat-no" title="statement not covered" > * @param {Event} event Event with type online or offline</span>
|
|
2033
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2034
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2035
|
+
<span class="cstat-no" title="statement not covered" > onlineStatusChanged = (event: Event) => {</span>
|
|
2036
|
+
<span class="cstat-no" title="statement not covered" > if (event.type === 'offline') {</span>
|
|
2037
|
+
<span class="cstat-no" title="statement not covered" > // mark the connection as down</span>
|
|
2038
|
+
<span class="cstat-no" title="statement not covered" > this._log('onlineStatusChanged() - Status changing to offline');</span>
|
|
2039
|
+
<span class="cstat-no" title="statement not covered" > this._setHealth(false);</span>
|
|
2040
|
+
<span class="cstat-no" title="statement not covered" > } else if (event.type === 'online') {</span>
|
|
2041
|
+
<span class="cstat-no" title="statement not covered" > // retry right now...</span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" > // We check this.isHealthy, not sure if it's always</span>
|
|
2043
|
+
<span class="cstat-no" title="statement not covered" > // smart to create a new WS connection if the old one is still up and running.</span>
|
|
2044
|
+
<span class="cstat-no" title="statement not covered" > // it's possible we didn't miss any messages, so this process is just expensive and not needed.</span>
|
|
2045
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
2046
|
+
<span class="cstat-no" title="statement not covered" > `onlineStatusChanged() - Status changing to online. isHealthy: ${this.isHealthy}`,</span>
|
|
2047
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2048
|
+
<span class="cstat-no" title="statement not covered" > if (!this.isHealthy) {</span>
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect({ interval: 10 });</span>
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2051
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2052
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > onopen = (wsID: number) => {</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > if (this.wsID !== wsID) return;</span>
|
|
2056
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2057
|
+
<span class="cstat-no" title="statement not covered" > const user = this.client.user;</span>
|
|
2058
|
+
<span class="cstat-no" title="statement not covered" > if (!user) {</span>
|
|
2059
|
+
<span class="cstat-no" title="statement not covered" > console.error(`User not set, can't connect to WS`);</span>
|
|
2060
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2061
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > const token = this.client._getToken();</span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > if (!token) {</span>
|
|
2065
|
+
<span class="cstat-no" title="statement not covered" > console.error(`Token not set, can't connect authenticate`);</span>
|
|
2066
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2067
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2068
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2069
|
+
<span class="cstat-no" title="statement not covered" > const authMessage: VideoWSAuthMessageRequest = {</span>
|
|
2070
|
+
<span class="cstat-no" title="statement not covered" > token,</span>
|
|
2071
|
+
<span class="cstat-no" title="statement not covered" > user_details: {</span>
|
|
2072
|
+
<span class="cstat-no" title="statement not covered" > id: user.id,</span>
|
|
2073
|
+
<span class="cstat-no" title="statement not covered" > role: user.role,</span>
|
|
2074
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
2075
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2076
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2077
|
+
<span class="cstat-no" title="statement not covered" > this.ws?.send(JSON.stringify(authMessage));</span>
|
|
2078
|
+
<span class="cstat-no" title="statement not covered" > this._log('onopen() - onopen callback', { wsID });</span>
|
|
2079
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2080
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2081
|
+
<span class="cstat-no" title="statement not covered" > onmessage = (wsID: number, event: WebSocket.MessageEvent) => {</span>
|
|
2082
|
+
<span class="cstat-no" title="statement not covered" > if (this.wsID !== wsID) return;</span>
|
|
2083
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2084
|
+
<span class="cstat-no" title="statement not covered" > this._log('onmessage() - onmessage callback', { event, wsID });</span>
|
|
2085
|
+
<span class="cstat-no" title="statement not covered" > const data = typeof event.data === 'string' ? JSON.parse(event.data) : null;</span>
|
|
2086
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2087
|
+
<span class="cstat-no" title="statement not covered" > console.log('Received data', data);</span>
|
|
2088
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2089
|
+
<span class="cstat-no" title="statement not covered" > // we wait till the first message before we consider the connection open..</span>
|
|
2090
|
+
<span class="cstat-no" title="statement not covered" > // the reason for this is that auth errors and similar errors trigger a ws.onopen and immediately</span>
|
|
2091
|
+
<span class="cstat-no" title="statement not covered" > // after that a ws.onclose..</span>
|
|
2092
|
+
<span class="cstat-no" title="statement not covered" > if (!this.isResolved && data) {</span>
|
|
2093
|
+
<span class="cstat-no" title="statement not covered" > this.isResolved = true;</span>
|
|
2094
|
+
<span class="cstat-no" title="statement not covered" > if (data.error) {</span>
|
|
2095
|
+
<span class="cstat-no" title="statement not covered" > this.rejectPromise?.(this._errorFromWSEvent(data, false));</span>
|
|
2096
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2097
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > this.resolvePromise?.(data);</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" > this._setHealth(true);</span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > // trigger the event..</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > this.lastEvent = new Date();</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > if (data && data.type === 'health.check') {</span>
|
|
2107
|
+
<span class="cstat-no" title="statement not covered" > this.scheduleNextPing();</span>
|
|
2108
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2109
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2110
|
+
<span class="cstat-no" title="statement not covered" > this.client.handleEvent(event);</span>
|
|
2111
|
+
<span class="cstat-no" title="statement not covered" > this.scheduleConnectionCheck();</span>
|
|
2112
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2114
|
+
<span class="cstat-no" title="statement not covered" > onclose = (wsID: number, event: WebSocket.CloseEvent) => {</span>
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" > if (this.wsID !== wsID) return;</span>
|
|
2116
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2117
|
+
<span class="cstat-no" title="statement not covered" > this._log('onclose() - onclose callback - ' + event.code, { event, wsID });</span>
|
|
2118
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > if (event.code === chatCodes.WS_CLOSED_SUCCESS) {</span>
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" > // this is a permanent error raised by stream..</span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > // usually caused by invalid auth details</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > const error = new Error(</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > `WS connection reject with error ${event.reason}`,</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > ) as Error & WebSocket.CloseEvent;</span>
|
|
2125
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2126
|
+
<span class="cstat-no" title="statement not covered" > error.reason = event.reason;</span>
|
|
2127
|
+
<span class="cstat-no" title="statement not covered" > error.code = event.code;</span>
|
|
2128
|
+
<span class="cstat-no" title="statement not covered" > error.wasClean = event.wasClean;</span>
|
|
2129
|
+
<span class="cstat-no" title="statement not covered" > error.target = event.target;</span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > this.rejectPromise?.(error);</span>
|
|
2132
|
+
<span class="cstat-no" title="statement not covered" > this._log(`onclose() - WS connection reject with error ${event.reason}`, {</span>
|
|
2133
|
+
<span class="cstat-no" title="statement not covered" > event,</span>
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures += 1;</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > this.totalFailures += 1;</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > this._setHealth(false);</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > this.rejectPromise?.(this._errorFromWSEvent(event));</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > this._log(`onclose() - WS connection closed. Calling reconnect ...`, {</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" > event,</span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2146
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2147
|
+
<span class="cstat-no" title="statement not covered" > // reconnect if its an abnormal failure</span>
|
|
2148
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect();</span>
|
|
2149
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2150
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2152
|
+
<span class="cstat-no" title="statement not covered" > onerror = (wsID: number, event: WebSocket.ErrorEvent) => {</span>
|
|
2153
|
+
<span class="cstat-no" title="statement not covered" > if (this.wsID !== wsID) return;</span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2155
|
+
<span class="cstat-no" title="statement not covered" > this.consecutiveFailures += 1;</span>
|
|
2156
|
+
<span class="cstat-no" title="statement not covered" > this.totalFailures += 1;</span>
|
|
2157
|
+
<span class="cstat-no" title="statement not covered" > this._setHealth(false);</span>
|
|
2158
|
+
<span class="cstat-no" title="statement not covered" > this.isConnecting = false;</span>
|
|
2159
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2160
|
+
<span class="cstat-no" title="statement not covered" > this.rejectPromise?.(this._errorFromWSEvent(event));</span>
|
|
2161
|
+
<span class="cstat-no" title="statement not covered" > this._log(`onerror() - WS connection resulted into error`, { event });</span>
|
|
2162
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2163
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect();</span>
|
|
2164
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2165
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2166
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2167
|
+
<span class="cstat-no" title="statement not covered" > * _setHealth - Sets the connection to healthy or unhealthy.</span>
|
|
2168
|
+
<span class="cstat-no" title="statement not covered" > * Broadcasts an event in case the connection status changed.</span>
|
|
2169
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2170
|
+
<span class="cstat-no" title="statement not covered" > * @param {boolean} healthy boolean indicating if the connection is healthy or not</span>
|
|
2171
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2172
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2173
|
+
<span class="cstat-no" title="statement not covered" > _setHealth = (healthy: boolean) => {</span>
|
|
2174
|
+
<span class="cstat-no" title="statement not covered" > if (healthy === this.isHealthy) return;</span>
|
|
2175
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2176
|
+
<span class="cstat-no" title="statement not covered" > this.isHealthy = healthy;</span>
|
|
2177
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" > if (this.isHealthy) {</span>
|
|
2179
|
+
<span class="cstat-no" title="statement not covered" > this.client.dispatchEvent({</span>
|
|
2180
|
+
<span class="cstat-no" title="statement not covered" > type: 'connection.changed',</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" > online: this.isHealthy,</span>
|
|
2182
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2183
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2184
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2186
|
+
<span class="cstat-no" title="statement not covered" > // we're offline, wait few seconds and fire and event if still offline</span>
|
|
2187
|
+
<span class="cstat-no" title="statement not covered" > setTimeout(() => {</span>
|
|
2188
|
+
<span class="cstat-no" title="statement not covered" > if (this.isHealthy) return;</span>
|
|
2189
|
+
<span class="cstat-no" title="statement not covered" > this.client.dispatchEvent({</span>
|
|
2190
|
+
<span class="cstat-no" title="statement not covered" > type: 'connection.changed',</span>
|
|
2191
|
+
<span class="cstat-no" title="statement not covered" > online: this.isHealthy,</span>
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2193
|
+
<span class="cstat-no" title="statement not covered" > }, 5000);</span>
|
|
2194
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2195
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2196
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2197
|
+
<span class="cstat-no" title="statement not covered" > * _errorFromWSEvent - Creates an error object for the WS event</span>
|
|
2198
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2199
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2200
|
+
<span class="cstat-no" title="statement not covered" > _errorFromWSEvent = (</span>
|
|
2201
|
+
<span class="cstat-no" title="statement not covered" > event: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent,</span>
|
|
2202
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure = true,</span>
|
|
2203
|
+
<span class="cstat-no" title="statement not covered" > ) => {</span>
|
|
2204
|
+
<span class="cstat-no" title="statement not covered" > let code;</span>
|
|
2205
|
+
<span class="cstat-no" title="statement not covered" > let statusCode;</span>
|
|
2206
|
+
<span class="cstat-no" title="statement not covered" > let message;</span>
|
|
2207
|
+
<span class="cstat-no" title="statement not covered" > if (isCloseEvent(event)) {</span>
|
|
2208
|
+
<span class="cstat-no" title="statement not covered" > code = event.code;</span>
|
|
2209
|
+
<span class="cstat-no" title="statement not covered" > statusCode = 'unknown';</span>
|
|
2210
|
+
<span class="cstat-no" title="statement not covered" > message = event.reason;</span>
|
|
2211
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2212
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2213
|
+
<span class="cstat-no" title="statement not covered" > if (isErrorEvent(event)) {</span>
|
|
2214
|
+
<span class="cstat-no" title="statement not covered" > code = event.error.code;</span>
|
|
2215
|
+
<span class="cstat-no" title="statement not covered" > statusCode = event.error.StatusCode;</span>
|
|
2216
|
+
<span class="cstat-no" title="statement not covered" > message = event.error.message;</span>
|
|
2217
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2218
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2219
|
+
<span class="cstat-no" title="statement not covered" > // Keeping this `warn` level log, to avoid cluttering of error logs from ws failures.</span>
|
|
2220
|
+
<span class="cstat-no" title="statement not covered" > this._log(</span>
|
|
2221
|
+
<span class="cstat-no" title="statement not covered" > `_errorFromWSEvent() - WS failed with code ${code}`,</span>
|
|
2222
|
+
<span class="cstat-no" title="statement not covered" > { event },</span>
|
|
2223
|
+
<span class="cstat-no" title="statement not covered" > 'warn',</span>
|
|
2224
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2225
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2226
|
+
<span class="cstat-no" title="statement not covered" > const error = new Error(</span>
|
|
2227
|
+
<span class="cstat-no" title="statement not covered" > `WS failed with code ${code} and reason - ${message}`,</span>
|
|
2228
|
+
<span class="cstat-no" title="statement not covered" > ) as Error & {</span>
|
|
2229
|
+
<span class="cstat-no" title="statement not covered" > code?: string | number;</span>
|
|
2230
|
+
<span class="cstat-no" title="statement not covered" > isWSFailure?: boolean;</span>
|
|
2231
|
+
<span class="cstat-no" title="statement not covered" > StatusCode?: string | number;</span>
|
|
2232
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2233
|
+
<span class="cstat-no" title="statement not covered" > error.code = code;</span>
|
|
2234
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2235
|
+
<span class="cstat-no" title="statement not covered" > * StatusCode does not exist on any event types but has been left</span>
|
|
2236
|
+
<span class="cstat-no" title="statement not covered" > * as is to preserve JS functionality during the TS implementation</span>
|
|
2237
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2238
|
+
<span class="cstat-no" title="statement not covered" > error.StatusCode = statusCode;</span>
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" > error.isWSFailure = isWSFailure;</span>
|
|
2240
|
+
<span class="cstat-no" title="statement not covered" > return error;</span>
|
|
2241
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2242
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2244
|
+
<span class="cstat-no" title="statement not covered" > * _destroyCurrentWSConnection - Removes the current WS connection</span>
|
|
2245
|
+
<span class="cstat-no" title="statement not covered" > *</span>
|
|
2246
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2247
|
+
<span class="cstat-no" title="statement not covered" > _destroyCurrentWSConnection() {</span>
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" > // increment the ID, meaning we will ignore all messages from the old</span>
|
|
2249
|
+
<span class="cstat-no" title="statement not covered" > // ws connection from now on.</span>
|
|
2250
|
+
<span class="cstat-no" title="statement not covered" > this.wsID += 1;</span>
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2252
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2253
|
+
<span class="cstat-no" title="statement not covered" > this?.ws?.removeAllListeners();</span>
|
|
2254
|
+
<span class="cstat-no" title="statement not covered" > this?.ws?.close();</span>
|
|
2255
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
2256
|
+
<span class="cstat-no" title="statement not covered" > // we don't care</span>
|
|
2257
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2258
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2259
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2260
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2261
|
+
<span class="cstat-no" title="statement not covered" > * _setupPromise - sets up the this.connectOpen promise</span>
|
|
2262
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" > _setupConnectionPromise = () => {</span>
|
|
2264
|
+
<span class="cstat-no" title="statement not covered" > this.isResolved = false;</span>
|
|
2265
|
+
<span class="cstat-no" title="statement not covered" > /** a promise that is resolved once ws.open is called */</span>
|
|
2266
|
+
<span class="cstat-no" title="statement not covered" > this.connectionOpen = new Promise<ConnectionOpen>((resolve, reject) => {</span>
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > this.resolvePromise = resolve;</span>
|
|
2268
|
+
<span class="cstat-no" title="statement not covered" > this.rejectPromise = reject;</span>
|
|
2269
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2270
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2271
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2272
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2273
|
+
<span class="cstat-no" title="statement not covered" > * Schedules a next health check ping for websocket.</span>
|
|
2274
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2275
|
+
<span class="cstat-no" title="statement not covered" > scheduleNextPing = () => {</span>
|
|
2276
|
+
<span class="cstat-no" title="statement not covered" > if (this.healthCheckTimeoutRef) {</span>
|
|
2277
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(this.healthCheckTimeoutRef);</span>
|
|
2278
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2279
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" > // 30 seconds is the recommended interval (messenger uses this)</span>
|
|
2281
|
+
<span class="cstat-no" title="statement not covered" > this.healthCheckTimeoutRef = setTimeout(() => {</span>
|
|
2282
|
+
<span class="cstat-no" title="statement not covered" > // send the healthcheck..., server replies with a health check event</span>
|
|
2283
|
+
<span class="cstat-no" title="statement not covered" > const data = [{ type: 'health.check', client_id: this.client.clientID }];</span>
|
|
2284
|
+
<span class="cstat-no" title="statement not covered" > // try to send on the connection</span>
|
|
2285
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" > this.ws?.send(JSON.stringify(data));</span>
|
|
2287
|
+
<span class="cstat-no" title="statement not covered" > } catch (e) {</span>
|
|
2288
|
+
<span class="cstat-no" title="statement not covered" > // error will already be detected elsewhere</span>
|
|
2289
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" > }, this.pingInterval);</span>
|
|
2291
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2292
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2293
|
+
<span class="cstat-no" title="statement not covered" > /**</span>
|
|
2294
|
+
<span class="cstat-no" title="statement not covered" > * scheduleConnectionCheck - schedules a check for time difference between last received event and now.</span>
|
|
2295
|
+
<span class="cstat-no" title="statement not covered" > * If the difference is more than 35 seconds, it means our health check logic has failed and websocket needs</span>
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > * to be reconnected.</span>
|
|
2297
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
2298
|
+
<span class="cstat-no" title="statement not covered" > scheduleConnectionCheck = () => {</span>
|
|
2299
|
+
<span class="cstat-no" title="statement not covered" > if (this.connectionCheckTimeoutRef) {</span>
|
|
2300
|
+
<span class="cstat-no" title="statement not covered" > clearTimeout(this.connectionCheckTimeoutRef);</span>
|
|
2301
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2302
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2303
|
+
<span class="cstat-no" title="statement not covered" > this.connectionCheckTimeoutRef = setTimeout(() => {</span>
|
|
2304
|
+
<span class="cstat-no" title="statement not covered" > const now = new Date();</span>
|
|
2305
|
+
<span class="cstat-no" title="statement not covered" > if (</span>
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" > this.lastEvent &&</span>
|
|
2307
|
+
<span class="cstat-no" title="statement not covered" > now.getTime() - this.lastEvent.getTime() > this.connectionCheckTimeout</span>
|
|
2308
|
+
<span class="cstat-no" title="statement not covered" > ) {</span>
|
|
2309
|
+
<span class="cstat-no" title="statement not covered" > this._log('scheduleConnectionCheck - going to reconnect');</span>
|
|
2310
|
+
<span class="cstat-no" title="statement not covered" > this._setHealth(false);</span>
|
|
2311
|
+
<span class="cstat-no" title="statement not covered" > this._reconnect();</span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2313
|
+
<span class="cstat-no" title="statement not covered" > }, this.connectionCheckTimeout);</span>
|
|
2314
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >}</span></span>
|
|
2316
|
+
</pre></td></tr></table></pre>
|
|
2317
|
+
|
|
2318
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2319
|
+
</div><!-- /wrapper -->
|
|
2320
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2321
|
+
Code coverage generated by
|
|
2322
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2323
|
+
at 2023-02-09T16:25:50.250Z
|
|
2324
|
+
</div>
|
|
2325
|
+
<script src="../../../prettify.js"></script>
|
|
2326
|
+
<script>
|
|
2327
|
+
window.onload = function () {
|
|
2328
|
+
prettyPrint();
|
|
2329
|
+
};
|
|
2330
|
+
</script>
|
|
2331
|
+
<script src="../../../sorter.js"></script>
|
|
2332
|
+
<script src="../../../block-navigation.js"></script>
|
|
2333
|
+
</body>
|
|
2334
|
+
</html>
|
|
2335
|
+
|