@budibase/worker 2.3.16 → 2.3.17-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/__mocks__/node-fetch.ts +23 -0
  2. package/jest-testcontainers-config.js +8 -0
  3. package/jest.config.ts +3 -2
  4. package/package.json +8 -6
  5. package/src/api/routes/global/tests/auth.spec.ts +30 -22
  6. package/src/api/routes/global/tests/configs.spec.ts +114 -94
  7. package/src/api/routes/global/tests/roles.spec.ts +19 -14
  8. package/src/api/routes/global/tests/users.spec.ts +33 -34
  9. package/src/ddApm.ts +7 -0
  10. package/src/elasticApm.ts +10 -0
  11. package/src/index.ts +6 -7
  12. package/src/sdk/users/users.ts +0 -1
  13. package/src/tests/TestConfiguration.ts +41 -11
  14. package/src/tests/api/auth.ts +7 -3
  15. package/src/tests/api/configs.ts +2 -2
  16. package/src/tests/api/users.ts +2 -2
  17. package/src/tests/jestSetup.ts +9 -2
  18. package/src/tests/structures/index.ts +0 -2
  19. package/coverage/clover.xml +0 -2199
  20. package/coverage/coverage-final.json +0 -84
  21. package/coverage/lcov-report/base.css +0 -224
  22. package/coverage/lcov-report/block-navigation.js +0 -87
  23. package/coverage/lcov-report/favicon.png +0 -0
  24. package/coverage/lcov-report/index.html +0 -431
  25. package/coverage/lcov-report/prettify.css +0 -1
  26. package/coverage/lcov-report/prettify.js +0 -2
  27. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  28. package/coverage/lcov-report/sorter.js +0 -196
  29. package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +0 -934
  30. package/coverage/lcov-report/src/api/controllers/global/configs.ts.html +0 -1348
  31. package/coverage/lcov-report/src/api/controllers/global/email.ts.html +0 -196
  32. package/coverage/lcov-report/src/api/controllers/global/events.ts.html +0 -136
  33. package/coverage/lcov-report/src/api/controllers/global/index.html +0 -251
  34. package/coverage/lcov-report/src/api/controllers/global/license.ts.html +0 -187
  35. package/coverage/lcov-report/src/api/controllers/global/roles.ts.html +0 -283
  36. package/coverage/lcov-report/src/api/controllers/global/self.ts.html +0 -577
  37. package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +0 -316
  38. package/coverage/lcov-report/src/api/controllers/global/users.ts.html +0 -838
  39. package/coverage/lcov-report/src/api/controllers/global/workspaces.ts.html +0 -244
  40. package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +0 -148
  41. package/coverage/lcov-report/src/api/controllers/system/environment.ts.html +0 -124
  42. package/coverage/lcov-report/src/api/controllers/system/index.html +0 -191
  43. package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +0 -124
  44. package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +0 -124
  45. package/coverage/lcov-report/src/api/controllers/system/status.ts.html +0 -133
  46. package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +0 -154
  47. package/coverage/lcov-report/src/api/index.html +0 -116
  48. package/coverage/lcov-report/src/api/index.ts.html +0 -595
  49. package/coverage/lcov-report/src/api/routes/global/auth.ts.html +0 -349
  50. package/coverage/lcov-report/src/api/routes/global/configs.ts.html +0 -457
  51. package/coverage/lcov-report/src/api/routes/global/email.ts.html +0 -193
  52. package/coverage/lcov-report/src/api/routes/global/events.ts.html +0 -109
  53. package/coverage/lcov-report/src/api/routes/global/index.html +0 -251
  54. package/coverage/lcov-report/src/api/routes/global/license.ts.html +0 -124
  55. package/coverage/lcov-report/src/api/routes/global/roles.ts.html +0 -133
  56. package/coverage/lcov-report/src/api/routes/global/self.ts.html +0 -139
  57. package/coverage/lcov-report/src/api/routes/global/templates.ts.html +0 -196
  58. package/coverage/lcov-report/src/api/routes/global/users.ts.html +0 -475
  59. package/coverage/lcov-report/src/api/routes/global/workspaces.ts.html +0 -196
  60. package/coverage/lcov-report/src/api/routes/index.html +0 -116
  61. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -202
  62. package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +0 -142
  63. package/coverage/lcov-report/src/api/routes/system/environment.ts.html +0 -109
  64. package/coverage/lcov-report/src/api/routes/system/index.html +0 -191
  65. package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +0 -142
  66. package/coverage/lcov-report/src/api/routes/system/restore.ts.html +0 -109
  67. package/coverage/lcov-report/src/api/routes/system/status.ts.html +0 -109
  68. package/coverage/lcov-report/src/api/routes/system/tenants.ts.html +0 -124
  69. package/coverage/lcov-report/src/api/routes/validation/index.html +0 -131
  70. package/coverage/lcov-report/src/api/routes/validation/index.ts.html +0 -88
  71. package/coverage/lcov-report/src/api/routes/validation/users.ts.html +0 -235
  72. package/coverage/lcov-report/src/constants/index.html +0 -116
  73. package/coverage/lcov-report/src/constants/index.ts.html +0 -637
  74. package/coverage/lcov-report/src/constants/templates/index.html +0 -116
  75. package/coverage/lcov-report/src/constants/templates/index.ts.html +0 -316
  76. package/coverage/lcov-report/src/db/index.html +0 -116
  77. package/coverage/lcov-report/src/db/index.ts.html +0 -115
  78. package/coverage/lcov-report/src/environment.ts.html +0 -388
  79. package/coverage/lcov-report/src/index.html +0 -131
  80. package/coverage/lcov-report/src/index.ts.html +0 -394
  81. package/coverage/lcov-report/src/middleware/cloudRestricted.ts.html +0 -139
  82. package/coverage/lcov-report/src/middleware/index.html +0 -116
  83. package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +0 -145
  84. package/coverage/lcov-report/src/migrations/functions/index.html +0 -116
  85. package/coverage/lcov-report/src/migrations/index.html +0 -116
  86. package/coverage/lcov-report/src/migrations/index.ts.html +0 -271
  87. package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +0 -262
  88. package/coverage/lcov-report/src/sdk/accounts/index.html +0 -131
  89. package/coverage/lcov-report/src/sdk/accounts/index.ts.html +0 -88
  90. package/coverage/lcov-report/src/sdk/index.html +0 -116
  91. package/coverage/lcov-report/src/sdk/index.ts.html +0 -106
  92. package/coverage/lcov-report/src/sdk/users/events.ts.html +0 -601
  93. package/coverage/lcov-report/src/sdk/users/index.html +0 -146
  94. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -88
  95. package/coverage/lcov-report/src/sdk/users/users.ts.html +0 -1999
  96. package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +0 -1075
  97. package/coverage/lcov-report/src/tests/api/accounts.ts.html +0 -160
  98. package/coverage/lcov-report/src/tests/api/auth.ts.html +0 -220
  99. package/coverage/lcov-report/src/tests/api/base.ts.html +0 -133
  100. package/coverage/lcov-report/src/tests/api/configs.ts.html +0 -226
  101. package/coverage/lcov-report/src/tests/api/email.ts.html +0 -148
  102. package/coverage/lcov-report/src/tests/api/environment.ts.html +0 -130
  103. package/coverage/lcov-report/src/tests/api/groups.ts.html +0 -163
  104. package/coverage/lcov-report/src/tests/api/index.html +0 -356
  105. package/coverage/lcov-report/src/tests/api/index.ts.html +0 -238
  106. package/coverage/lcov-report/src/tests/api/license.ts.html +0 -136
  107. package/coverage/lcov-report/src/tests/api/migrations.ts.html +0 -151
  108. package/coverage/lcov-report/src/tests/api/restore.ts.html +0 -127
  109. package/coverage/lcov-report/src/tests/api/roles.ts.html +0 -181
  110. package/coverage/lcov-report/src/tests/api/self.ts.html +0 -163
  111. package/coverage/lcov-report/src/tests/api/status.ts.html +0 -121
  112. package/coverage/lcov-report/src/tests/api/templates.ts.html +0 -175
  113. package/coverage/lcov-report/src/tests/api/tenants.ts.html +0 -130
  114. package/coverage/lcov-report/src/tests/api/users.ts.html +0 -514
  115. package/coverage/lcov-report/src/tests/controllers.ts.html +0 -100
  116. package/coverage/lcov-report/src/tests/index.html +0 -146
  117. package/coverage/lcov-report/src/tests/index.ts.html +0 -103
  118. package/coverage/lcov-report/src/tests/mocks/email.ts.html +0 -115
  119. package/coverage/lcov-report/src/tests/mocks/index.html +0 -131
  120. package/coverage/lcov-report/src/tests/mocks/index.ts.html +0 -106
  121. package/coverage/lcov-report/src/tests/structures/configs.ts.html +0 -313
  122. package/coverage/lcov-report/src/tests/structures/groups.ts.html +0 -118
  123. package/coverage/lcov-report/src/tests/structures/index.html +0 -161
  124. package/coverage/lcov-report/src/tests/structures/index.ts.html +0 -151
  125. package/coverage/lcov-report/src/tests/structures/users.ts.html +0 -196
  126. package/coverage/lcov-report/src/utilities/appService.ts.html +0 -208
  127. package/coverage/lcov-report/src/utilities/email.ts.html +0 -850
  128. package/coverage/lcov-report/src/utilities/fileSystem.ts.html +0 -100
  129. package/coverage/lcov-report/src/utilities/index.html +0 -206
  130. package/coverage/lcov-report/src/utilities/index.ts.html +0 -112
  131. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -424
  132. package/coverage/lcov-report/src/utilities/templates.ts.html +0 -232
  133. package/coverage/lcov-report/src/utilities/users.ts.html +0 -133
  134. package/coverage/lcov.info +0 -4187
@@ -1,1999 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/sdk/users/users.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/sdk/users</a> users.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">87% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>241/277</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">77.5% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>62/80</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">84.61% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>44/52</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">88.04% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>221/251</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 high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a>
607
- <a name='L542'></a><a href='#L542'>542</a>
608
- <a name='L543'></a><a href='#L543'>543</a>
609
- <a name='L544'></a><a href='#L544'>544</a>
610
- <a name='L545'></a><a href='#L545'>545</a>
611
- <a name='L546'></a><a href='#L546'>546</a>
612
- <a name='L547'></a><a href='#L547'>547</a>
613
- <a name='L548'></a><a href='#L548'>548</a>
614
- <a name='L549'></a><a href='#L549'>549</a>
615
- <a name='L550'></a><a href='#L550'>550</a>
616
- <a name='L551'></a><a href='#L551'>551</a>
617
- <a name='L552'></a><a href='#L552'>552</a>
618
- <a name='L553'></a><a href='#L553'>553</a>
619
- <a name='L554'></a><a href='#L554'>554</a>
620
- <a name='L555'></a><a href='#L555'>555</a>
621
- <a name='L556'></a><a href='#L556'>556</a>
622
- <a name='L557'></a><a href='#L557'>557</a>
623
- <a name='L558'></a><a href='#L558'>558</a>
624
- <a name='L559'></a><a href='#L559'>559</a>
625
- <a name='L560'></a><a href='#L560'>560</a>
626
- <a name='L561'></a><a href='#L561'>561</a>
627
- <a name='L562'></a><a href='#L562'>562</a>
628
- <a name='L563'></a><a href='#L563'>563</a>
629
- <a name='L564'></a><a href='#L564'>564</a>
630
- <a name='L565'></a><a href='#L565'>565</a>
631
- <a name='L566'></a><a href='#L566'>566</a>
632
- <a name='L567'></a><a href='#L567'>567</a>
633
- <a name='L568'></a><a href='#L568'>568</a>
634
- <a name='L569'></a><a href='#L569'>569</a>
635
- <a name='L570'></a><a href='#L570'>570</a>
636
- <a name='L571'></a><a href='#L571'>571</a>
637
- <a name='L572'></a><a href='#L572'>572</a>
638
- <a name='L573'></a><a href='#L573'>573</a>
639
- <a name='L574'></a><a href='#L574'>574</a>
640
- <a name='L575'></a><a href='#L575'>575</a>
641
- <a name='L576'></a><a href='#L576'>576</a>
642
- <a name='L577'></a><a href='#L577'>577</a>
643
- <a name='L578'></a><a href='#L578'>578</a>
644
- <a name='L579'></a><a href='#L579'>579</a>
645
- <a name='L580'></a><a href='#L580'>580</a>
646
- <a name='L581'></a><a href='#L581'>581</a>
647
- <a name='L582'></a><a href='#L582'>582</a>
648
- <a name='L583'></a><a href='#L583'>583</a>
649
- <a name='L584'></a><a href='#L584'>584</a>
650
- <a name='L585'></a><a href='#L585'>585</a>
651
- <a name='L586'></a><a href='#L586'>586</a>
652
- <a name='L587'></a><a href='#L587'>587</a>
653
- <a name='L588'></a><a href='#L588'>588</a>
654
- <a name='L589'></a><a href='#L589'>589</a>
655
- <a name='L590'></a><a href='#L590'>590</a>
656
- <a name='L591'></a><a href='#L591'>591</a>
657
- <a name='L592'></a><a href='#L592'>592</a>
658
- <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a>
662
- <a name='L597'></a><a href='#L597'>597</a>
663
- <a name='L598'></a><a href='#L598'>598</a>
664
- <a name='L599'></a><a href='#L599'>599</a>
665
- <a name='L600'></a><a href='#L600'>600</a>
666
- <a name='L601'></a><a href='#L601'>601</a>
667
- <a name='L602'></a><a href='#L602'>602</a>
668
- <a name='L603'></a><a href='#L603'>603</a>
669
- <a name='L604'></a><a href='#L604'>604</a>
670
- <a name='L605'></a><a href='#L605'>605</a>
671
- <a name='L606'></a><a href='#L606'>606</a>
672
- <a name='L607'></a><a href='#L607'>607</a>
673
- <a name='L608'></a><a href='#L608'>608</a>
674
- <a name='L609'></a><a href='#L609'>609</a>
675
- <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a>
677
- <a name='L612'></a><a href='#L612'>612</a>
678
- <a name='L613'></a><a href='#L613'>613</a>
679
- <a name='L614'></a><a href='#L614'>614</a>
680
- <a name='L615'></a><a href='#L615'>615</a>
681
- <a name='L616'></a><a href='#L616'>616</a>
682
- <a name='L617'></a><a href='#L617'>617</a>
683
- <a name='L618'></a><a href='#L618'>618</a>
684
- <a name='L619'></a><a href='#L619'>619</a>
685
- <a name='L620'></a><a href='#L620'>620</a>
686
- <a name='L621'></a><a href='#L621'>621</a>
687
- <a name='L622'></a><a href='#L622'>622</a>
688
- <a name='L623'></a><a href='#L623'>623</a>
689
- <a name='L624'></a><a href='#L624'>624</a>
690
- <a name='L625'></a><a href='#L625'>625</a>
691
- <a name='L626'></a><a href='#L626'>626</a>
692
- <a name='L627'></a><a href='#L627'>627</a>
693
- <a name='L628'></a><a href='#L628'>628</a>
694
- <a name='L629'></a><a href='#L629'>629</a>
695
- <a name='L630'></a><a href='#L630'>630</a>
696
- <a name='L631'></a><a href='#L631'>631</a>
697
- <a name='L632'></a><a href='#L632'>632</a>
698
- <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a>
700
- <a name='L635'></a><a href='#L635'>635</a>
701
- <a name='L636'></a><a href='#L636'>636</a>
702
- <a name='L637'></a><a href='#L637'>637</a>
703
- <a name='L638'></a><a href='#L638'>638</a>
704
- <a name='L639'></a><a href='#L639'>639</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">18x</span>
705
- <span class="cline-any cline-yes">18x</span>
706
- <span class="cline-any cline-yes">18x</span>
707
- <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-neutral">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-neutral">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-yes">18x</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-yes">18x</span>
739
- <span class="cline-any cline-yes">18x</span>
740
- <span class="cline-any cline-yes">18x</span>
741
- <span class="cline-any cline-yes">18x</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-yes">18x</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-yes">18x</span>
746
- <span class="cline-any cline-yes">1x</span>
747
- <span class="cline-any cline-yes">1x</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-yes">2x</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-yes">18x</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-yes">18x</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-no">&nbsp;</span>
783
- <span class="cline-any cline-no">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-no">&nbsp;</span>
794
- <span class="cline-any cline-neutral">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-yes">18x</span>
804
- <span class="cline-any cline-yes">10x</span>
805
- <span class="cline-any cline-yes">10x</span>
806
- <span class="cline-any cline-yes">10x</span>
807
- <span class="cline-any cline-yes">10x</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-yes">10x</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-yes">18x</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-yes">95x</span>
828
- <span class="cline-any cline-yes">95x</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-yes">95x</span>
832
- <span class="cline-any cline-yes">93x</span>
833
- <span class="cline-any cline-yes">2x</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-no">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-yes">95x</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-yes">95x</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-neutral">&nbsp;</span>
849
- <span class="cline-any cline-neutral">&nbsp;</span>
850
- <span class="cline-any cline-yes">95x</span>
851
- <span class="cline-any cline-yes">1x</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-yes">95x</span>
855
- <span class="cline-any cline-yes">84x</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-yes">95x</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-yes">18x</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-yes">90x</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-neutral">&nbsp;</span>
870
- <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-yes">90x</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-yes">18x</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-yes">90x</span>
880
- <span class="cline-any cline-yes">90x</span>
881
- <span class="cline-any cline-yes">90x</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-yes">90x</span>
888
- <span class="cline-any cline-yes">90x</span>
889
- <span class="cline-any cline-yes">90x</span>
890
- <span class="cline-any cline-yes">1x</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-yes">96x</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-yes">94x</span>
901
- <span class="cline-any cline-yes">87x</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-yes">94x</span>
904
- <span class="cline-any cline-yes">87x</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-yes">94x</span>
907
- <span class="cline-any cline-yes">94x</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-yes">94x</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-yes">94x</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-yes">94x</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-yes">13x</span>
919
- <span class="cline-any cline-yes">13x</span>
920
- <span class="cline-any cline-yes">12x</span>
921
- <span class="cline-any cline-yes">1x</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-yes">11x</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-yes">2x</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-yes">1x</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-neutral">&nbsp;</span>
932
- <span class="cline-any cline-neutral">&nbsp;</span>
933
- <span class="cline-any cline-yes">93x</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-yes">82x</span>
936
- <span class="cline-any cline-yes">82x</span>
937
- <span class="cline-any cline-yes">3x</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-yes">90x</span>
942
- <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-yes">89x</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-yes">89x</span>
946
- <span class="cline-any cline-yes">1x</span>
947
- <span class="cline-any cline-yes">1x</span>
948
- <span class="cline-any cline-yes">1x</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-neutral">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-yes">89x</span>
954
- <span class="cline-any cline-yes">89x</span>
955
- <span class="cline-any cline-yes">77x</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-yes">77x</span>
958
- <span class="cline-any cline-no">&nbsp;</span>
959
- <span class="cline-any cline-no">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-neutral">&nbsp;</span>
963
- <span class="cline-any cline-neutral">&nbsp;</span>
964
- <span class="cline-any cline-yes">89x</span>
965
- <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-yes">89x</span>
967
- <span class="cline-any cline-yes">89x</span>
968
- <span class="cline-any cline-neutral">&nbsp;</span>
969
- <span class="cline-any cline-yes">89x</span>
970
- <span class="cline-any cline-yes">89x</span>
971
- <span class="cline-any cline-yes">89x</span>
972
- <span class="cline-any cline-neutral">&nbsp;</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-yes">89x</span>
975
- <span class="cline-any cline-neutral">&nbsp;</span>
976
- <span class="cline-any cline-yes">89x</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-yes">89x</span>
979
- <span class="cline-any cline-neutral">&nbsp;</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-neutral">&nbsp;</span>
984
- <span class="cline-any cline-no">&nbsp;</span>
985
- <span class="cline-any cline-no">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</span>
987
- <span class="cline-any cline-no">&nbsp;</span>
988
- <span class="cline-any cline-neutral">&nbsp;</span>
989
- <span class="cline-any cline-neutral">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-yes">18x</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-neutral">&nbsp;</span>
997
- <span class="cline-any cline-yes">95x</span>
998
- <span class="cline-any cline-yes">95x</span>
999
- <span class="cline-any cline-yes">42x</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-neutral">&nbsp;</span>
1002
- <span class="cline-any cline-neutral">&nbsp;</span>
1003
- <span class="cline-any cline-yes">95x</span>
1004
- <span class="cline-any cline-neutral">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-neutral">&nbsp;</span>
1007
- <span class="cline-any cline-yes">18x</span>
1008
- <span class="cline-any cline-yes">16x</span>
1009
- <span class="cline-any cline-yes">11x</span>
1010
- <span class="cline-any cline-neutral">&nbsp;</span>
1011
- <span class="cline-any cline-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-yes">11x</span>
1015
- <span class="cline-any cline-neutral">&nbsp;</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-neutral">&nbsp;</span>
1018
- <span class="cline-any cline-yes">11x</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-neutral">&nbsp;</span>
1022
- <span class="cline-any cline-neutral">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-yes">18x</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-yes">16x</span>
1030
- <span class="cline-any cline-yes">11x</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-yes">11x</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-neutral">&nbsp;</span>
1038
- <span class="cline-any cline-yes">11x</span>
1039
- <span class="cline-any cline-neutral">&nbsp;</span>
1040
- <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">18x</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-neutral">&nbsp;</span>
1048
- <span class="cline-any cline-yes">16x</span>
1049
- <span class="cline-any cline-yes">11x</span>
1050
- <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-neutral">&nbsp;</span>
1052
- <span class="cline-any cline-neutral">&nbsp;</span>
1053
- <span class="cline-any cline-neutral">&nbsp;</span>
1054
- <span class="cline-any cline-yes">11x</span>
1055
- <span class="cline-any cline-neutral">&nbsp;</span>
1056
- <span class="cline-any cline-neutral">&nbsp;</span>
1057
- <span class="cline-any cline-neutral">&nbsp;</span>
1058
- <span class="cline-any cline-yes">11x</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-neutral">&nbsp;</span>
1061
- <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-neutral">&nbsp;</span>
1063
- <span class="cline-any cline-neutral">&nbsp;</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-neutral">&nbsp;</span>
1067
- <span class="cline-any cline-neutral">&nbsp;</span>
1068
- <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-neutral">&nbsp;</span>
1071
- <span class="cline-any cline-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-yes">18x</span>
1073
- <span class="cline-any cline-yes">11x</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-yes">11x</span>
1076
- <span class="cline-any cline-yes">11x</span>
1077
- <span class="cline-any cline-neutral">&nbsp;</span>
1078
- <span class="cline-any cline-yes">11x</span>
1079
- <span class="cline-any cline-yes">11x</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1081
- <span class="cline-any cline-yes">11x</span>
1082
- <span class="cline-any cline-yes">11x</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-yes">11x</span>
1085
- <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-yes">18x</span>
1088
- <span class="cline-any cline-neutral">&nbsp;</span>
1089
- <span class="cline-any cline-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-neutral">&nbsp;</span>
1091
- <span class="cline-any cline-yes">6x</span>
1092
- <span class="cline-any cline-neutral">&nbsp;</span>
1093
- <span class="cline-any cline-yes">6x</span>
1094
- <span class="cline-any cline-yes">6x</span>
1095
- <span class="cline-any cline-neutral">&nbsp;</span>
1096
- <span class="cline-any cline-yes">10x</span>
1097
- <span class="cline-any cline-yes">6x</span>
1098
- <span class="cline-any cline-yes">6x</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-yes">6x</span>
1101
- <span class="cline-any cline-yes">10x</span>
1102
- <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-yes">6x</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-neutral">&nbsp;</span>
1106
- <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-yes">4x</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-yes">4x</span>
1112
- <span class="cline-any cline-neutral">&nbsp;</span>
1113
- <span class="cline-any cline-yes">6x</span>
1114
- <span class="cline-any cline-yes">6x</span>
1115
- <span class="cline-any cline-neutral">&nbsp;</span>
1116
- <span class="cline-any cline-neutral">&nbsp;</span>
1117
- <span class="cline-any cline-neutral">&nbsp;</span>
1118
- <span class="cline-any cline-yes">6x</span>
1119
- <span class="cline-any cline-yes">6x</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-neutral">&nbsp;</span>
1127
- <span class="cline-any cline-neutral">&nbsp;</span>
1128
- <span class="cline-any cline-neutral">&nbsp;</span>
1129
- <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-neutral">&nbsp;</span>
1131
- <span class="cline-any cline-yes">6x</span>
1132
- <span class="cline-any cline-yes">6x</span>
1133
- <span class="cline-any cline-neutral">&nbsp;</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-yes">6x</span>
1136
- <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-yes">6x</span>
1139
- <span class="cline-any cline-yes">6x</span>
1140
- <span class="cline-any cline-yes">6x</span>
1141
- <span class="cline-any cline-neutral">&nbsp;</span>
1142
- <span class="cline-any cline-neutral">&nbsp;</span>
1143
- <span class="cline-any cline-yes">6x</span>
1144
- <span class="cline-any cline-yes">6x</span>
1145
- <span class="cline-any cline-neutral">&nbsp;</span>
1146
- <span class="cline-any cline-neutral">&nbsp;</span>
1147
- <span class="cline-any cline-neutral">&nbsp;</span>
1148
- <span class="cline-any cline-neutral">&nbsp;</span>
1149
- <span class="cline-any cline-neutral">&nbsp;</span>
1150
- <span class="cline-any cline-neutral">&nbsp;</span>
1151
- <span class="cline-any cline-yes">6x</span>
1152
- <span class="cline-any cline-yes">6x</span>
1153
- <span class="cline-any cline-yes">6x</span>
1154
- <span class="cline-any cline-yes">6x</span>
1155
- <span class="cline-any cline-no">&nbsp;</span>
1156
- <span class="cline-any cline-neutral">&nbsp;</span>
1157
- <span class="cline-any cline-yes">6x</span>
1158
- <span class="cline-any cline-neutral">&nbsp;</span>
1159
- <span class="cline-any cline-neutral">&nbsp;</span>
1160
- <span class="cline-any cline-yes">6x</span>
1161
- <span class="cline-any cline-neutral">&nbsp;</span>
1162
- <span class="cline-any cline-neutral">&nbsp;</span>
1163
- <span class="cline-any cline-neutral">&nbsp;</span>
1164
- <span class="cline-any cline-neutral">&nbsp;</span>
1165
- <span class="cline-any cline-neutral">&nbsp;</span>
1166
- <span class="cline-any cline-neutral">&nbsp;</span>
1167
- <span class="cline-any cline-neutral">&nbsp;</span>
1168
- <span class="cline-any cline-neutral">&nbsp;</span>
1169
- <span class="cline-any cline-yes">18x</span>
1170
- <span class="cline-any cline-neutral">&nbsp;</span>
1171
- <span class="cline-any cline-neutral">&nbsp;</span>
1172
- <span class="cline-any cline-yes">2x</span>
1173
- <span class="cline-any cline-yes">2x</span>
1174
- <span class="cline-any cline-yes">2x</span>
1175
- <span class="cline-any cline-yes">2x</span>
1176
- <span class="cline-any cline-no">&nbsp;</span>
1177
- <span class="cline-any cline-neutral">&nbsp;</span>
1178
- <span class="cline-any cline-neutral">&nbsp;</span>
1179
- <span class="cline-any cline-yes">2x</span>
1180
- <span class="cline-any cline-yes">2x</span>
1181
- <span class="cline-any cline-yes">1x</span>
1182
- <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-neutral">&nbsp;</span>
1184
- <span class="cline-any cline-neutral">&nbsp;</span>
1185
- <span class="cline-any cline-neutral">&nbsp;</span>
1186
- <span class="cline-any cline-yes">18x</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-yes">2x</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-yes">2x</span>
1192
- <span class="cline-any cline-neutral">&nbsp;</span>
1193
- <span class="cline-any cline-neutral">&nbsp;</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-neutral">&nbsp;</span>
1196
- <span class="cline-any cline-neutral">&nbsp;</span>
1197
- <span class="cline-any cline-yes">2x</span>
1198
- <span class="cline-any cline-yes">2x</span>
1199
- <span class="cline-any cline-yes">1x</span>
1200
- <span class="cline-any cline-neutral">&nbsp;</span>
1201
- <span class="cline-any cline-yes">1x</span>
1202
- <span class="cline-any cline-neutral">&nbsp;</span>
1203
- <span class="cline-any cline-neutral">&nbsp;</span>
1204
- <span class="cline-any cline-neutral">&nbsp;</span>
1205
- <span class="cline-any cline-neutral">&nbsp;</span>
1206
- <span class="cline-any cline-neutral">&nbsp;</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-neutral">&nbsp;</span>
1209
- <span class="cline-any cline-yes">2x</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-neutral">&nbsp;</span>
1212
- <span class="cline-any cline-neutral">&nbsp;</span>
1213
- <span class="cline-any cline-yes">2x</span>
1214
- <span class="cline-any cline-neutral">&nbsp;</span>
1215
- <span class="cline-any cline-yes">3x</span>
1216
- <span class="cline-any cline-neutral">&nbsp;</span>
1217
- <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-neutral">&nbsp;</span>
1219
- <span class="cline-any cline-neutral">&nbsp;</span>
1220
- <span class="cline-any cline-yes">3x</span>
1221
- <span class="cline-any cline-neutral">&nbsp;</span>
1222
- <span class="cline-any cline-neutral">&nbsp;</span>
1223
- <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-yes">2x</span>
1225
- <span class="cline-any cline-yes">2x</span>
1226
- <span class="cline-any cline-yes">3x</span>
1227
- <span class="cline-any cline-neutral">&nbsp;</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-neutral">&nbsp;</span>
1231
- <span class="cline-any cline-yes">2x</span>
1232
- <span class="cline-any cline-yes">2x</span>
1233
- <span class="cline-any cline-yes">3x</span>
1234
- <span class="cline-any cline-yes">3x</span>
1235
- <span class="cline-any cline-neutral">&nbsp;</span>
1236
- <span class="cline-any cline-neutral">&nbsp;</span>
1237
- <span class="cline-any cline-neutral">&nbsp;</span>
1238
- <span class="cline-any cline-yes">2x</span>
1239
- <span class="cline-any cline-yes">3x</span>
1240
- <span class="cline-any cline-yes">3x</span>
1241
- <span class="cline-any cline-yes">3x</span>
1242
- <span class="cline-any cline-neutral">&nbsp;</span>
1243
- <span class="cline-any cline-no">&nbsp;</span>
1244
- <span class="cline-any cline-neutral">&nbsp;</span>
1245
- <span class="cline-any cline-neutral">&nbsp;</span>
1246
- <span class="cline-any cline-neutral">&nbsp;</span>
1247
- <span class="cline-any cline-neutral">&nbsp;</span>
1248
- <span class="cline-any cline-neutral">&nbsp;</span>
1249
- <span class="cline-any cline-neutral">&nbsp;</span>
1250
- <span class="cline-any cline-neutral">&nbsp;</span>
1251
- <span class="cline-any cline-yes">2x</span>
1252
- <span class="cline-any cline-neutral">&nbsp;</span>
1253
- <span class="cline-any cline-neutral">&nbsp;</span>
1254
- <span class="cline-any cline-yes">18x</span>
1255
- <span class="cline-any cline-yes">4x</span>
1256
- <span class="cline-any cline-yes">4x</span>
1257
- <span class="cline-any cline-yes">4x</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-yes">4x</span>
1260
- <span class="cline-any cline-neutral">&nbsp;</span>
1261
- <span class="cline-any cline-yes">4x</span>
1262
- <span class="cline-any cline-yes">4x</span>
1263
- <span class="cline-any cline-yes">4x</span>
1264
- <span class="cline-any cline-yes">1x</span>
1265
- <span class="cline-any cline-no">&nbsp;</span>
1266
- <span class="cline-any cline-neutral">&nbsp;</span>
1267
- <span class="cline-any cline-yes">1x</span>
1268
- <span class="cline-any cline-neutral">&nbsp;</span>
1269
- <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-neutral">&nbsp;</span>
1271
- <span class="cline-any cline-neutral">&nbsp;</span>
1272
- <span class="cline-any cline-yes">3x</span>
1273
- <span class="cline-any cline-neutral">&nbsp;</span>
1274
- <span class="cline-any cline-yes">3x</span>
1275
- <span class="cline-any cline-neutral">&nbsp;</span>
1276
- <span class="cline-any cline-yes">3x</span>
1277
- <span class="cline-any cline-yes">3x</span>
1278
- <span class="cline-any cline-yes">3x</span>
1279
- <span class="cline-any cline-neutral">&nbsp;</span>
1280
- <span class="cline-any cline-yes">3x</span>
1281
- <span class="cline-any cline-neutral">&nbsp;</span>
1282
- <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-yes">18x</span>
1284
- <span class="cline-any cline-yes">3x</span>
1285
- <span class="cline-any cline-yes">3x</span>
1286
- <span class="cline-any cline-yes">3x</span>
1287
- <span class="cline-any cline-yes">3x</span>
1288
- <span class="cline-any cline-yes">3x</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
- <span class="cline-any cline-yes">3x</span>
1291
- <span class="cline-any cline-neutral">&nbsp;</span>
1292
- <span class="cline-any cline-neutral">&nbsp;</span>
1293
- <span class="cline-any cline-yes">18x</span>
1294
- <span class="cline-any cline-neutral">&nbsp;</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-yes">5x</span>
1297
- <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-neutral">&nbsp;</span>
1299
- <span class="cline-any cline-neutral">&nbsp;</span>
1300
- <span class="cline-any cline-neutral">&nbsp;</span>
1301
- <span class="cline-any cline-yes">6x</span>
1302
- <span class="cline-any cline-yes">5x</span>
1303
- <span class="cline-any cline-neutral">&nbsp;</span>
1304
- <span class="cline-any cline-neutral">&nbsp;</span>
1305
- <span class="cline-any cline-yes">5x</span>
1306
- <span class="cline-any cline-yes">6x</span>
1307
- <span class="cline-any cline-yes">2x</span>
1308
- <span class="cline-any cline-neutral">&nbsp;</span>
1309
- <span class="cline-any cline-yes">4x</span>
1310
- <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-neutral">&nbsp;</span>
1312
- <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-yes">5x</span>
1314
- <span class="cline-any cline-neutral">&nbsp;</span>
1315
- <span class="cline-any cline-neutral">&nbsp;</span>
1316
- <span class="cline-any cline-yes">5x</span>
1317
- <span class="cline-any cline-yes">5x</span>
1318
- <span class="cline-any cline-yes">4x</span>
1319
- <span class="cline-any cline-yes">4x</span>
1320
- <span class="cline-any cline-yes">4x</span>
1321
- <span class="cline-any cline-yes">2x</span>
1322
- <span class="cline-any cline-neutral">&nbsp;</span>
1323
- <span class="cline-any cline-yes">4x</span>
1324
- <span class="cline-any cline-yes">4x</span>
1325
- <span class="cline-any cline-neutral">&nbsp;</span>
1326
- <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-yes">4x</span>
1329
- <span class="cline-any cline-yes">4x</span>
1330
- <span class="cline-any cline-yes">4x</span>
1331
- <span class="cline-any cline-neutral">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-no">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-neutral">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-neutral">&nbsp;</span>
1338
- <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-neutral">&nbsp;</span>
1340
- <span class="cline-any cline-yes">5x</span>
1341
- <span class="cline-any cline-neutral">&nbsp;</span>
1342
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import env from "../../environment"
1343
- import * as apps from "../../utilities/appService"
1344
- import * as eventHelpers from "./events"
1345
- import {
1346
- accounts,
1347
- cache,
1348
- constants,
1349
- db as dbUtils,
1350
- deprovisioning,
1351
- events,
1352
- HTTPError,
1353
- migrations,
1354
- sessions,
1355
- tenancy,
1356
- users as usersCore,
1357
- utils,
1358
- ViewName,
1359
- } from "@budibase/backend-core"
1360
- import {
1361
- AccountMetadata,
1362
- AllDocsResponse,
1363
- BulkUserResponse,
1364
- CloudAccount,
1365
- CreateUserResponse,
1366
- InviteUsersRequest,
1367
- InviteUsersResponse,
1368
- MigrationType,
1369
- PlatformUser,
1370
- PlatformUserByEmail,
1371
- RowResponse,
1372
- SearchUsersRequest,
1373
- User,
1374
- ThirdPartyUser,
1375
- isUser,
1376
- } from "@budibase/types"
1377
- import { sendEmail } from "../../utilities/email"
1378
- import { EmailTemplatePurpose } from "../../constants"
1379
- import { groups as groupsSdk } from "@budibase/pro"
1380
- &nbsp;
1381
- const PAGE_LIMIT = 8
1382
- &nbsp;
1383
- export const allUsers = async () =&gt; {
1384
- const db = tenancy.getGlobalDB()
1385
- const response = await db.allDocs(
1386
- dbUtils.getGlobalUserParams(null, {
1387
- include_docs: true,
1388
- })
1389
- )
1390
- return response.rows.map((row: any) =&gt; row.doc)
1391
- }
1392
- &nbsp;
1393
- export const <span class="cstat-no" title="statement not covered" >countUsersByApp<span class="fstat-no" title="function not covered" > </span>= <span class="fstat-no" title="function not covered" >a</span>sync (a</span>ppId: string) =&gt; {
1394
- let response: any = <span class="cstat-no" title="statement not covered" >await usersCore.searchGlobalUsersByApp(appId, {})</span>
1395
- <span class="cstat-no" title="statement not covered" > return {</span>
1396
- userCount: response.length,
1397
- }
1398
- }
1399
- &nbsp;
1400
- export const <span class="cstat-no" title="statement not covered" >paginatedUsers<span class="fstat-no" title="function not covered" > </span>= <span class="fstat-no" title="function not covered" >a</span>sync ({</span>
1401
- page,
1402
- email,
1403
- appId,
1404
- userIds,
1405
- }: SearchUsersRequest = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> =&gt; {
1406
- const db = <span class="cstat-no" title="statement not covered" >tenancy.getGlobalDB()</span>
1407
- // get one extra document, to have the next page
1408
- const opts: any = <span class="cstat-no" title="statement not covered" >{</span>
1409
- include_docs: true,
1410
- limit: PAGE_LIMIT + 1,
1411
- }
1412
- // add a startkey if the page was specified (anchor)
1413
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (page) {</span>
1414
- <span class="cstat-no" title="statement not covered" > opts.startkey = page</span>
1415
- }
1416
- // property specifies what to use for the page/anchor
1417
- let userList,
1418
- property = <span class="cstat-no" title="statement not covered" >"_id",</span>
1419
- getKey
1420
- <span class="cstat-no" title="statement not covered" > if (appId) {</span>
1421
- <span class="cstat-no" title="statement not covered" > userList = await usersCore.searchGlobalUsersByApp(appId, opts)</span>
1422
- <span class="cstat-no" title="statement not covered" > getKey = <span class="fstat-no" title="function not covered" >(d</span>oc: any) =&gt; <span class="cstat-no" title="statement not covered" >usersCore.getGlobalUserByAppPage(appId, doc)</span></span>
1423
- } else <span class="cstat-no" title="statement not covered" >if (email) {</span>
1424
- <span class="cstat-no" title="statement not covered" > userList = await usersCore.searchGlobalUsersByEmail(email, opts)</span>
1425
- <span class="cstat-no" title="statement not covered" > property = "email"</span>
1426
- } else {
1427
- // no search, query allDocs
1428
- const response = <span class="cstat-no" title="statement not covered" >await db.allDocs(dbUtils.getGlobalUserParams(null, opts))</span>
1429
- <span class="cstat-no" title="statement not covered" > userList = response.rows.map(<span class="fstat-no" title="function not covered" >(r</span>ow: any) =&gt; <span class="cstat-no" title="statement not covered" >row.doc)</span></span>
1430
- }
1431
- <span class="cstat-no" title="statement not covered" > return dbUtils.pagination(userList, PAGE_LIMIT, {</span>
1432
- paginate: true,
1433
- property,
1434
- getKey,
1435
- })
1436
- }
1437
- &nbsp;
1438
- /**
1439
- * Gets a user by ID from the global database, based on the current tenancy.
1440
- */
1441
- export const getUser = async (userId: string) =&gt; {
1442
- const db = tenancy.getGlobalDB()
1443
- let user = await db.get(userId)
1444
- if (user) {
1445
- delete user.password
1446
- }
1447
- return user
1448
- }
1449
- &nbsp;
1450
- export interface SaveUserOpts {
1451
- hashPassword?: boolean
1452
- requirePassword?: boolean
1453
- currentUserId?: string
1454
- }
1455
- &nbsp;
1456
- const buildUser = async (
1457
- user: User | ThirdPartyUser,
1458
- opts: SaveUserOpts = <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1459
- hashPassword: true,
1460
- requirePassword: true,
1461
- },
1462
- tenantId: string,
1463
- dbUser?: any
1464
- ): Promise&lt;User&gt; =&gt; {
1465
- let fullUser = user as User
1466
- let { password, _id } = fullUser
1467
- &nbsp;
1468
- let hashedPassword
1469
- if (password) {
1470
- hashedPassword = opts.hashPassword ? await utils.hash(password) : <span class="branch-1 cbranch-no" title="branch not covered" >password</span>
1471
- } else if (dbUser) {
1472
- hashedPassword = dbUser.password
1473
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (opts.requirePassword) {
1474
- <span class="cstat-no" title="statement not covered" > throw "Password must be specified."</span>
1475
- }
1476
- &nbsp;
1477
- _id = _id || dbUtils.generateGlobalUserID()
1478
- &nbsp;
1479
- fullUser = {
1480
- createdAt: Date.now(),
1481
- ...dbUser,
1482
- ...fullUser,
1483
- _id,
1484
- password: hashedPassword,
1485
- tenantId,
1486
- }
1487
- // make sure the roles object is always present
1488
- if (!fullUser.roles) {
1489
- fullUser.roles = {}
1490
- }
1491
- // add the active status to a user if its not provided
1492
- if (fullUser.status == null) {
1493
- fullUser.status = constants.UserStatus.ACTIVE
1494
- }
1495
- &nbsp;
1496
- return fullUser
1497
- }
1498
- &nbsp;
1499
- // lookup, could be email or userId, either will return a doc
1500
- export const <span class="cstat-no" title="statement not covered" >getPlatformUser<span class="fstat-no" title="function not covered" > </span>= a</span>sync (
1501
- identifier: string
1502
- ): Promise&lt;PlatformUser | null&gt; =&gt; {
1503
- // use the view here and allow to find anyone regardless of casing
1504
- // Use lowercase to ensure email login is case insensitive
1505
- const response = dbUtils.queryPlatformView(
1506
- ViewName.PLATFORM_USERS_LOWERCASE,
1507
- {
1508
- keys: [identifier.toLowerCase()],
1509
- include_docs: true,
1510
- }
1511
- ) as Promise&lt;PlatformUser&gt;
1512
- return response
1513
- }
1514
- &nbsp;
1515
- const validateUniqueUser = async (email: string, tenantId: string) =&gt; {
1516
- // check budibase users in other tenants
1517
- if (env.MULTI_TENANCY) {
1518
- const tenantUser = await getPlatformUser(email)
1519
- <span class="missing-if-branch" title="if path not taken" >I</span>if (tenantUser != null &amp;&amp; tenantUser.tenantId !== tenantId) {
1520
- <span class="cstat-no" title="statement not covered" > throw `Unavailable`</span>
1521
- }
1522
- }
1523
- &nbsp;
1524
- // check root account users in account portal
1525
- if (!env.SELF_HOSTED &amp;&amp; !env.DISABLE_ACCOUNT_PORTAL) {
1526
- const account = await accounts.getAccount(email)
1527
- if (account &amp;&amp; account.verified &amp;&amp; account.tenantId !== tenantId) {
1528
- throw `Unavailable`
1529
- }
1530
- }
1531
- }
1532
- &nbsp;
1533
- export const save = async (
1534
- user: User | ThirdPartyUser,
1535
- opts: SaveUserOpts = {}
1536
- ): Promise&lt;CreateUserResponse&gt; =&gt; {
1537
- // default booleans to true
1538
- if (opts.hashPassword == null) {
1539
- opts.hashPassword = true
1540
- }
1541
- if (opts.requirePassword == null) {
1542
- opts.requirePassword = true
1543
- }
1544
- const tenantId = tenancy.getTenantId()
1545
- const db = tenancy.getGlobalDB()
1546
- &nbsp;
1547
- let { email, _id, userGroups = [] } = user
1548
- &nbsp;
1549
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!email &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!_id) {</span>
1550
- <span class="cstat-no" title="statement not covered" > throw new Error("_id or email is required")</span>
1551
- }
1552
- &nbsp;
1553
- let dbUser: User | undefined
1554
- if (_id) {
1555
- // try to get existing user from db
1556
- try {
1557
- dbUser = (await db.get(_id)) as User
1558
- if (email &amp;&amp; dbUser.email !== email) {
1559
- throw "Email address cannot be changed"
1560
- }
1561
- email = dbUser.email
1562
- } catch (e: any) {
1563
- if (e.status === 404) {
1564
- // do nothing, save this new user with the id specified - required for SSO auth
1565
- } else {
1566
- throw e
1567
- }
1568
- }
1569
- }
1570
- &nbsp;
1571
- if (!dbUser &amp;&amp; email) {
1572
- // no id was specified - load from email instead
1573
- dbUser = await usersCore.getGlobalUserByEmail(email)
1574
- if (dbUser &amp;&amp; dbUser._id !== _id) {
1575
- throw `Unavailable`
1576
- }
1577
- }
1578
- &nbsp;
1579
- await validateUniqueUser(email, tenantId)
1580
- &nbsp;
1581
- let builtUser = await buildUser(user, opts, tenantId, dbUser)
1582
- // don't allow a user to update its own roles/perms
1583
- if (opts.currentUserId &amp;&amp; opts.currentUserId === dbUser?._id) {
1584
- builtUser.builder = dbUser.builder
1585
- builtUser.admin = dbUser.admin
1586
- builtUser.roles = dbUser.roles
1587
- }
1588
- &nbsp;
1589
- // make sure we set the _id field for a new user
1590
- // Also if this is a new user, associate groups with them
1591
- let groupPromises = []
1592
- if (!_id) {
1593
- _id = builtUser._id!
1594
- &nbsp;
1595
- <span class="missing-if-branch" title="if path not taken" >I</span>if (userGroups.length &gt; 0) {
1596
- <span class="cstat-no" title="statement not covered" > for (let groupId of userGroups) {</span>
1597
- <span class="cstat-no" title="statement not covered" > groupPromises.push(groupsSdk.addUsers(groupId, [_id]))</span>
1598
- }
1599
- }
1600
- }
1601
- &nbsp;
1602
- try {
1603
- // save the user to db
1604
- let response = await db.put(builtUser)
1605
- builtUser._rev = response.rev
1606
- &nbsp;
1607
- await eventHelpers.handleSaveEvents(builtUser, dbUser)
1608
- await addTenant(tenantId, _id, email)
1609
- await cache.user.invalidateUser(response.id)
1610
- &nbsp;
1611
- // let server know to sync user
1612
- await apps.syncUserInApps(_id, dbUser)
1613
- &nbsp;
1614
- await Promise.all(groupPromises)
1615
- &nbsp;
1616
- return {
1617
- _id: response.id,
1618
- _rev: response.rev,
1619
- email,
1620
- }
1621
- } catch (err: any) {
1622
- <span class="cstat-no" title="statement not covered" > if (err.status === 409) {</span>
1623
- <span class="cstat-no" title="statement not covered" > throw "User exists already"</span>
1624
- } else {
1625
- <span class="cstat-no" title="statement not covered" > throw err</span>
1626
- }
1627
- }
1628
- }
1629
- &nbsp;
1630
- export const <span class="cstat-no" title="statement not covered" >addTenant<span class="fstat-no" title="function not covered" > </span>= a</span>sync (
1631
- tenantId: string,
1632
- _id: string,
1633
- email: string
1634
- ) =&gt; {
1635
- if (env.MULTI_TENANCY) {
1636
- const afterCreateTenant = () =&gt;
1637
- migrations.backPopulateMigrations({
1638
- type: MigrationType.GLOBAL,
1639
- tenantId,
1640
- })
1641
- await tenancy.tryAddTenant(tenantId, _id, email, afterCreateTenant)
1642
- }
1643
- }
1644
- &nbsp;
1645
- const getExistingTenantUsers = async (emails: string[]): Promise&lt;User[]&gt; =&gt; {
1646
- const lcEmails = emails.map(email =&gt; email.toLowerCase())
1647
- const params = {
1648
- keys: lcEmails,
1649
- include_docs: true,
1650
- }
1651
- &nbsp;
1652
- const opts = {
1653
- arrayResponse: true,
1654
- }
1655
- &nbsp;
1656
- return dbUtils.queryGlobalView(
1657
- ViewName.USER_BY_EMAIL,
1658
- params,
1659
- undefined,
1660
- opts
1661
- ) as Promise&lt;User[]&gt;
1662
- }
1663
- &nbsp;
1664
- const getExistingPlatformUsers = async (
1665
- emails: string[]
1666
- ): Promise&lt;PlatformUserByEmail[]&gt; =&gt; {
1667
- const lcEmails = emails.map(email =&gt; email.toLowerCase())
1668
- const params = {
1669
- keys: lcEmails,
1670
- include_docs: true,
1671
- }
1672
- &nbsp;
1673
- const opts = {
1674
- arrayResponse: true,
1675
- }
1676
- return dbUtils.queryPlatformView(
1677
- ViewName.PLATFORM_USERS_LOWERCASE,
1678
- params,
1679
- opts
1680
- ) as Promise&lt;PlatformUserByEmail[]&gt;
1681
- }
1682
- &nbsp;
1683
- const getExistingAccounts = async (
1684
- emails: string[]
1685
- ): Promise&lt;AccountMetadata[]&gt; =&gt; {
1686
- const lcEmails = emails.map(email =&gt; email.toLowerCase())
1687
- const params = {
1688
- keys: lcEmails,
1689
- include_docs: true,
1690
- }
1691
- &nbsp;
1692
- const opts = {
1693
- arrayResponse: true,
1694
- }
1695
- &nbsp;
1696
- return dbUtils.queryPlatformView(
1697
- ViewName.ACCOUNT_BY_EMAIL,
1698
- params,
1699
- opts
1700
- ) as Promise&lt;AccountMetadata[]&gt;
1701
- }
1702
- &nbsp;
1703
- /**
1704
- * Apply a system-wide search on emails:
1705
- * - in tenant
1706
- * - cross tenant
1707
- * - accounts
1708
- * return an array of emails that match the supplied emails.
1709
- */
1710
- const searchExistingEmails = async (emails: string[]) =&gt; {
1711
- let matchedEmails: string[] = []
1712
- &nbsp;
1713
- const existingTenantUsers = await getExistingTenantUsers(emails)
1714
- matchedEmails.push(...existingTenantUsers.map(user =&gt; user.email))
1715
- &nbsp;
1716
- const existingPlatformUsers = await getExistingPlatformUsers(emails)
1717
- matchedEmails.push(...existingPlatformUsers.map(user =&gt; user._id!))
1718
- &nbsp;
1719
- const existingAccounts = await getExistingAccounts(emails)
1720
- matchedEmails.push(...existingAccounts.map(account =&gt; account.email))
1721
- &nbsp;
1722
- return [...new Set(matchedEmails.map(email =&gt; email.toLowerCase()))]
1723
- }
1724
- &nbsp;
1725
- export const bulkCreate = async (
1726
- newUsersRequested: User[],
1727
- groups: string[]
1728
- ): Promise&lt;BulkUserResponse["created"]&gt; =&gt; {
1729
- const tenantId = tenancy.getTenantId()
1730
- &nbsp;
1731
- let usersToSave: any[] = []
1732
- let newUsers: any[] = []
1733
- &nbsp;
1734
- const emails = newUsersRequested.map((user: User) =&gt; user.email)
1735
- const existingEmails = await searchExistingEmails(emails)
1736
- const unsuccessful: { email: string; reason: string }[] = []
1737
- &nbsp;
1738
- for (const newUser of newUsersRequested) {
1739
- if (
1740
- newUsers.find(
1741
- (x: User) =&gt; x.email.toLowerCase() === newUser.email.toLowerCase()
1742
- ) ||
1743
- existingEmails.includes(newUser.email.toLowerCase())
1744
- ) {
1745
- unsuccessful.push({
1746
- email: newUser.email,
1747
- reason: `Unavailable`,
1748
- })
1749
- continue
1750
- }
1751
- newUser.userGroups = groups
1752
- newUsers.push(newUser)
1753
- }
1754
- &nbsp;
1755
- // create the promises array that will be called by bulkDocs
1756
- newUsers.forEach((user: any) =&gt; {
1757
- usersToSave.push(
1758
- buildUser(
1759
- user,
1760
- {
1761
- hashPassword: true,
1762
- requirePassword: user.requirePassword,
1763
- },
1764
- tenantId
1765
- )
1766
- )
1767
- })
1768
- &nbsp;
1769
- const usersToBulkSave = await Promise.all(usersToSave)
1770
- await usersCore.bulkUpdateGlobalUsers(usersToBulkSave)
1771
- &nbsp;
1772
- // Post-processing of bulk added users, e.g. events and cache operations
1773
- for (const user of usersToBulkSave) {
1774
- // TODO: Refactor to bulk insert users into the info db
1775
- // instead of relying on looping tenant creation
1776
- await addTenant(tenantId, user._id, user.email)
1777
- await eventHelpers.handleSaveEvents(user, undefined)
1778
- await apps.syncUserInApps(user._id)
1779
- }
1780
- &nbsp;
1781
- const saved = usersToBulkSave.map(user =&gt; {
1782
- return {
1783
- _id: user._id,
1784
- email: user.email,
1785
- }
1786
- })
1787
- &nbsp;
1788
- // now update the groups
1789
- if (Array.isArray(saved) &amp;&amp; groups) {
1790
- const groupPromises = []
1791
- const createdUserIds = saved.map(user =&gt; user._id)
1792
- for (let groupId of groups) {
1793
- <span class="cstat-no" title="statement not covered" > groupPromises.push(groupsSdk.addUsers(groupId, createdUserIds))</span>
1794
- }
1795
- await Promise.all(groupPromises)
1796
- }
1797
- &nbsp;
1798
- return {
1799
- successful: saved,
1800
- unsuccessful,
1801
- }
1802
- }
1803
- &nbsp;
1804
- /**
1805
- * For the given user id's, return the account holder if it is in the ids.
1806
- */
1807
- const getAccountHolderFromUserIds = async (
1808
- userIds: string[]
1809
- ): Promise&lt;CloudAccount | undefined&gt; =&gt; {
1810
- if (!env.SELF_HOSTED &amp;&amp; !env.DISABLE_ACCOUNT_PORTAL) {
1811
- const tenantId = tenancy.getTenantId()
1812
- const account = await accounts.getAccountByTenantId(tenantId)
1813
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!account) {
1814
- <span class="cstat-no" title="statement not covered" > throw new Error(`Account not found for tenantId=${tenantId}`)</span>
1815
- }
1816
- &nbsp;
1817
- const budibaseUserId = account.budibaseUserId
1818
- if (userIds.includes(budibaseUserId)) {
1819
- return account
1820
- }
1821
- }
1822
- }
1823
- &nbsp;
1824
- export const bulkDelete = async (
1825
- userIds: string[]
1826
- ): Promise&lt;BulkUserResponse["deleted"]&gt; =&gt; {
1827
- const db = tenancy.getGlobalDB()
1828
- &nbsp;
1829
- const response: BulkUserResponse["deleted"] = {
1830
- successful: [],
1831
- unsuccessful: [],
1832
- }
1833
- &nbsp;
1834
- // remove the account holder from the delete request if present
1835
- const account = await getAccountHolderFromUserIds(userIds)
1836
- if (account) {
1837
- userIds = userIds.filter(u =&gt; u !== account.budibaseUserId)
1838
- // mark user as unsuccessful
1839
- response.unsuccessful.push({
1840
- _id: account.budibaseUserId,
1841
- email: account.email,
1842
- reason: "Account holder cannot be deleted",
1843
- })
1844
- }
1845
- &nbsp;
1846
- // Get users and delete
1847
- const allDocsResponse: AllDocsResponse&lt;User&gt; = await db.allDocs({
1848
- include_docs: true,
1849
- keys: userIds,
1850
- })
1851
- const usersToDelete: User[] = allDocsResponse.rows.map(
1852
- (user: RowResponse&lt;User&gt;) =&gt; {
1853
- return user.doc
1854
- }
1855
- )
1856
- &nbsp;
1857
- // Delete from DB
1858
- const toDelete = usersToDelete.map(user =&gt; ({
1859
- ...user,
1860
- _deleted: true,
1861
- }))
1862
- const dbResponse = await usersCore.bulkUpdateGlobalUsers(toDelete)
1863
- for (let user of usersToDelete) {
1864
- await bulkDeleteProcessing(user)
1865
- }
1866
- &nbsp;
1867
- // Build Response
1868
- // index users by id
1869
- const userIndex: { [key: string]: User } = {}
1870
- usersToDelete.reduce((prev, current) =&gt; {
1871
- prev[current._id!] = current
1872
- return prev
1873
- }, userIndex)
1874
- &nbsp;
1875
- // add the successful and unsuccessful users to response
1876
- dbResponse.forEach(item =&gt; {
1877
- const email = userIndex[item.id].email
1878
- if (item.ok) {
1879
- response.successful.push({ _id: item.id, email })
1880
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
1881
- <span class="cstat-no" title="statement not covered" > response.unsuccessful.push({</span>
1882
- _id: item.id,
1883
- email,
1884
- reason: "Database error",
1885
- })
1886
- }
1887
- })
1888
- &nbsp;
1889
- return response
1890
- }
1891
- &nbsp;
1892
- export const destroy = async (id: string, currentUser: any) =&gt; {
1893
- const db = tenancy.getGlobalDB()
1894
- const dbUser = await db.get(id)
1895
- const userId = dbUser._id as string
1896
- &nbsp;
1897
- if (!env.SELF_HOSTED &amp;&amp; !env.DISABLE_ACCOUNT_PORTAL) {
1898
- // root account holder can't be deleted from inside budibase
1899
- const email = dbUser.email
1900
- const account = await accounts.getAccount(email)
1901
- if (account) {
1902
- <span class="missing-if-branch" title="if path not taken" >I</span>if (email === currentUser.email) {
1903
- <span class="cstat-no" title="statement not covered" > throw new HTTPError('Please visit "Account" to delete this user', 400)</span>
1904
- } else {
1905
- throw new HTTPError("Account holder cannot be deleted", 400)
1906
- }
1907
- }
1908
- }
1909
- &nbsp;
1910
- await deprovisioning.removeUserFromInfoDB(dbUser)
1911
- &nbsp;
1912
- await db.remove(userId, dbUser._rev)
1913
- &nbsp;
1914
- await eventHelpers.handleDeleteEvents(dbUser)
1915
- await cache.user.invalidateUser(userId)
1916
- await sessions.invalidateSessions(userId, { reason: "deletion" })
1917
- // let server know to sync user
1918
- await apps.syncUserInApps(userId, dbUser)
1919
- }
1920
- &nbsp;
1921
- const bulkDeleteProcessing = async (dbUser: User) =&gt; {
1922
- const userId = dbUser._id as string
1923
- await deprovisioning.removeUserFromInfoDB(dbUser)
1924
- await eventHelpers.handleDeleteEvents(dbUser)
1925
- await cache.user.invalidateUser(userId)
1926
- await sessions.invalidateSessions(userId, { reason: "bulk-deletion" })
1927
- // let server know to sync user
1928
- await apps.syncUserInApps(userId, dbUser)
1929
- }
1930
- &nbsp;
1931
- export const invite = async (
1932
- users: InviteUsersRequest
1933
- ): Promise&lt;InviteUsersResponse&gt; =&gt; {
1934
- const response: InviteUsersResponse = {
1935
- successful: [],
1936
- unsuccessful: [],
1937
- }
1938
- &nbsp;
1939
- const matchedEmails = await searchExistingEmails(users.map(u =&gt; u.email))
1940
- const newUsers = []
1941
- &nbsp;
1942
- // separate duplicates from new users
1943
- for (let user of users) {
1944
- if (matchedEmails.includes(user.email)) {
1945
- response.unsuccessful.push({ email: user.email, reason: "Unavailable" })
1946
- } else {
1947
- newUsers.push(user)
1948
- }
1949
- }
1950
- // overwrite users with new only
1951
- users = newUsers
1952
- &nbsp;
1953
- // send the emails for new users
1954
- const tenantId = tenancy.getTenantId()
1955
- for (let user of users) {
1956
- try {
1957
- let userInfo = user.userInfo
1958
- if (!userInfo) {
1959
- userInfo = {}
1960
- }
1961
- userInfo.tenantId = tenantId
1962
- const opts: any = {
1963
- subject: "{{ company }} platform invitation",
1964
- info: userInfo,
1965
- }
1966
- await sendEmail(user.email, EmailTemplatePurpose.INVITATION, opts)
1967
- response.successful.push({ email: user.email })
1968
- await events.user.invited()
1969
- } catch (e) {
1970
- <span class="cstat-no" title="statement not covered" > console.error(`Failed to send email invitation email=${user.email}`, e)</span>
1971
- <span class="cstat-no" title="statement not covered" > response.unsuccessful.push({</span>
1972
- email: user.email,
1973
- reason: "Failed to send email",
1974
- })
1975
- }
1976
- }
1977
- &nbsp;
1978
- return response
1979
- }
1980
- &nbsp;</pre></td></tr></table></pre>
1981
-
1982
- <div class='push'></div><!-- for sticky footer -->
1983
- </div><!-- /wrapper -->
1984
- <div class='footer quiet pad2 space-top1 center small'>
1985
- Code coverage generated by
1986
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1987
- at Wed Feb 15 2023 15:06:34 GMT+0000 (Coordinated Universal Time)
1988
- </div>
1989
- <script src="../../../prettify.js"></script>
1990
- <script>
1991
- window.onload = function () {
1992
- prettyPrint();
1993
- };
1994
- </script>
1995
- <script src="../../../sorter.js"></script>
1996
- <script src="../../../block-navigation.js"></script>
1997
- </body>
1998
- </html>
1999
-